tristate "Asus"
depends on LEDS_CLASS
depends on ASUS_WMI || ASUS_WMI=n
++ +++ select POWER_SUPPLY
---help---
Support for Asus notebook built-in keyboard and touchpad via i2c, and
the Asus Republic of Gamers laptop keyboard special keys.
Supported devices:
- Cougar 500k Gaming Keyboard
++++ +++config HID_MACALLY
++++ +++ tristate "Macally devices"
++++ +++ depends on HID
++++ +++ help
++++ +++ Support for Macally devices that are not fully compliant with the
++++ +++ HID standard.
++++ +++
++++ +++ supported devices:
++++ +++ - Macally ikey keyboard
++++ +++
config HID_PRODIKEYS
tristate "Prodikeys PC-MIDI Keyboard support"
depends on HID && SND
config HID_LOGITECH_DJ
tristate "Logitech Unifying receivers full support"
+++ ++++ depends on USB_HID
depends on HIDRAW
depends on HID_LOGITECH
select HID_LOGITECH_HIDPP
Say Y here if you want to use the THQ uDraw gaming tablet for
the PS3.
+++++++ config HID_U2FZERO
+++++++ tristate "U2F Zero LED and RNG support"
+++++++ depends on USB_HID
+++++++ depends on LEDS_CLASS
+++++++ depends on HW_RANDOM
+++++++ help
+++++++ Support for the LED of the U2F Zero device.
+++++++
+++++++ U2F Zero supports custom commands for blinking the LED
+++++++ and getting data from the internal hardware RNG.
+++++++ The internal hardware can be used to feed the enthropy pool.
+++++++
+++++++ U2F Zero only supports blinking its LED, so this driver doesn't
+++++++ allow setting the brightness to anything but 1, which will
+++++++ trigger a single blink and immediately reset to back 0.
+++++++
config HID_WACOM
tristate "Wacom Intuos/Graphire tablet support (USB)"
depends on USB_HID
obj-$(CONFIG_HID_LOGITECH) += hid-logitech.o
obj-$(CONFIG_HID_LOGITECH_DJ) += hid-logitech-dj.o
obj-$(CONFIG_HID_LOGITECH_HIDPP) += hid-logitech-hidpp.o
++++ +++obj-$(CONFIG_HID_MACALLY) += hid-macally.o
obj-$(CONFIG_HID_MAGICMOUSE) += hid-magicmouse.o
obj-$(CONFIG_HID_MALTRON) += hid-maltron.o
obj-$(CONFIG_HID_MAYFLASH) += hid-mf.o
obj-$(CONFIG_HID_TIVO) += hid-tivo.o
obj-$(CONFIG_HID_TOPSEED) += hid-topseed.o
obj-$(CONFIG_HID_TWINHAN) += hid-twinhan.o
+++++++ obj-$(CONFIG_HID_U2FZERO) += hid-u2fzero.o
hid-uclogic-objs := hid-uclogic-core.o \
hid-uclogic-rdesc.o \
hid-uclogic-params.o
obj-$(CONFIG_I2C_HID) += i2c-hid/
obj-$(CONFIG_INTEL_ISH_HID) += intel-ish-hid/
++ +++++obj-$(INTEL_ISH_FIRMWARE_DOWNLOADER) += intel-ish-hid/
#include <linux/vmalloc.h>
#include <linux/sched.h>
#include <linux/semaphore.h>
+ ++++++#include <linux/async.h>
#include <linux/hid.h>
#include <linux/hiddev.h>
* Add a usage to the temporary parser table.
*/
- ------static int hid_add_usage(struct hid_parser *parser, unsigned usage)
+ ++++++static int hid_add_usage(struct hid_parser *parser, unsigned usage, u8 size)
{
if (parser->local.usage_index >= HID_MAX_USAGES) {
hid_err(parser->device, "usage index exceeded\n");
return -1;
}
parser->local.usage[parser->local.usage_index] = usage;
+ ++++++ parser->local.usage_size[parser->local.usage_index] = size;
parser->local.collection_index[parser->local.usage_index] =
parser->collection_stack_ptr ?
parser->collection_stack[parser->collection_stack_ptr - 1] : 0;
return 0;
}
- ------ if (item->size <= 2)
- ------ data = (parser->global.usage_page << 16) + data;
- ------
- ------ return hid_add_usage(parser, data);
+ ++++++ return hid_add_usage(parser, data, item->size);
case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:
return 0;
}
- ------ if (item->size <= 2)
- ------ data = (parser->global.usage_page << 16) + data;
- ------
parser->local.usage_minimum = data;
return 0;
return 0;
}
- ------ if (item->size <= 2)
- ------ data = (parser->global.usage_page << 16) + data;
- ------
count = data - parser->local.usage_minimum;
if (count + parser->local.usage_index >= HID_MAX_USAGES) {
/*
}
for (n = parser->local.usage_minimum; n <= data; n++)
- ------ if (hid_add_usage(parser, n)) {
+ ++++++ if (hid_add_usage(parser, n, item->size)) {
dbg_hid("hid_add_usage failed\n");
return -1;
}
return 0;
}
+ ++++++/*
+ ++++++ * Concatenate Usage Pages into Usages where relevant:
+ ++++++ * As per specification, 6.2.2.8: "When the parser encounters a main item it
+ ++++++ * concatenates the last declared Usage Page with a Usage to form a complete
+ ++++++ * usage value."
+ ++++++ */
+ ++++++
+ ++++++static void hid_concatenate_usage_page(struct hid_parser *parser)
+ ++++++{
+ ++++++ int i;
+ ++++++
+ ++++++ for (i = 0; i < parser->local.usage_index; i++)
+ ++++++ if (parser->local.usage_size[i] <= 2)
+ ++++++ parser->local.usage[i] += parser->global.usage_page << 16;
+ ++++++}
+ ++++++
/*
* Process a main item.
*/
__u32 data;
int ret;
+ ++++++ hid_concatenate_usage_page(parser);
+ ++++++
data = item_udata(item);
switch (item->tag) {
__u32 data;
int i;
+ ++++++ hid_concatenate_usage_page(parser);
+ ++++++
data = item_udata(item);
switch (item->tag) {
u32 hid_field_extract(const struct hid_device *hid, u8 *report,
unsigned offset, unsigned n)
{
-- --- if (n > 32) {
-- --- hid_warn(hid, "hid_field_extract() called with n (%d) > 32! (%s)\n",
++ +++ if (n > 256) {
++ +++ hid_warn(hid, "hid_field_extract() called with n (%d) > 256! (%s)\n",
n, current->comm);
-- --- n = 32;
++ +++ n = 256;
}
return __extract(report, offset, n);
* Implement a generic .request() callback, using .raw_request()
* DO NOT USE in hid drivers directly, but through hid_hw_request instead.
*/
-------void __hid_request(struct hid_device *hid, struct hid_report *report,
+++++++int __hid_request(struct hid_device *hid, struct hid_report *report,
int reqtype)
{
char *buf;
buf = hid_alloc_report_buf(report, GFP_KERNEL);
if (!buf)
------- return;
+++++++ return -ENOMEM;
len = hid_report_len(report);
if (reqtype == HID_REQ_GET_REPORT)
hid_input_report(hid, report->type, buf, ret, 0);
+++++++ ret = 0;
+++++++
out:
kfree(buf);
+++++++ return ret;
}
EXPORT_SYMBOL_GPL(__hid_request);
dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus,
hdev->vendor, hdev->product, atomic_inc_return(&id));
+ ++++++ /*
+ ++++++ * Try loading the module for the device before the add, so that we do
+ ++++++ * not first have hid-generic binding only to have it replaced
+ ++++++ * immediately afterwards with a specialized driver.
+ ++++++ */
+ ++++++ if (!current_is_async())
+ ++++++ request_module("hid:b%04Xg%04Xv%08Xp%08X", hdev->bus,
+ ++++++ hdev->group, hdev->vendor, hdev->product);
+ ++++++
hid_debug_register(hdev, dev_name(&hdev->dev));
ret = device_add(&hdev->dev);
if (!ret)
#define USB_DEVICE_ID_CYGNAL_RADIO_SI470X 0x818a
#define USB_DEVICE_ID_FOCALTECH_FTXXXX_MULTITOUCH 0x81b9
#define USB_DEVICE_ID_CYGNAL_CP2112 0xea90
+++++++ #define USB_DEVICE_ID_U2F_ZERO 0x8acf
#define USB_DEVICE_ID_CYGNAL_RADIO_SI4713 0x8244
#define USB_DEVICE_ID_S510_RECEIVER_2 0xc517
#define USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500 0xc512
#define USB_DEVICE_ID_MX3000_RECEIVER 0xc513
+++ ++++#define USB_DEVICE_ID_LOGITECH_27MHZ_MOUSE_RECEIVER 0xc51b
#define USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER 0xc52b
+++ ++++#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER 0xc52f
#define USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2 0xc532
+++ ++++#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_2 0xc534
+++ ++++#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_GAMING 0xc539
#define USB_DEVICE_ID_SPACETRAVELLER 0xc623
#define USB_DEVICE_ID_SPACENAVIGATOR 0xc626
#define USB_DEVICE_ID_DINOVO_DESKTOP 0xc704
#define USB_DEVICE_ID_SINO_LITE_CONTROLLER 0x3008
#define USB_VENDOR_ID_SOLID_YEAR 0x060b
++++ +++#define USB_DEVICE_ID_MACALLY_IKEY_KEYBOARD 0x0001
#define USB_DEVICE_ID_COUGAR_500K_GAMING_KEYBOARD 0x500a
#define USB_DEVICE_ID_COUGAR_700K_GAMING_KEYBOARD 0x700a
#define USB_DEVICE_ID_SYNAPTICS_HD 0x0ac3
#define USB_DEVICE_ID_SYNAPTICS_QUAD_HD 0x1ac3
#define USB_DEVICE_ID_SYNAPTICS_TP_V103 0x5710
-#define I2C_DEVICE_ID_SYNAPTICS_7E7E 0x7e7e
#define USB_VENDOR_ID_TEXAS_INSTRUMENTS 0x2047
#define USB_DEVICE_ID_TEXAS_INSTRUMENTS_LENOVO_YOGA 0x0855
#define HID_GROUP_WACOM 0x0101
#define HID_GROUP_LOGITECH_DJ_DEVICE 0x0102
#define HID_GROUP_STEAM 0x0103
+++ ++++#define HID_GROUP_LOGITECH_27MHZ_DEVICE 0x0104
/*
* HID protocol status
struct hid_local {
unsigned usage[HID_MAX_USAGES]; /* usage array */
+ ++++++ u8 usage_size[HID_MAX_USAGES]; /* usage size array */
unsigned collection_index[HID_MAX_USAGES]; /* collection index array */
unsigned usage_index;
unsigned usage_minimum;
unsigned int hidinput_count_leds(struct hid_device *hid);
__s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code);
void hid_output_report(struct hid_report *report, __u8 *data);
-------void __hid_request(struct hid_device *hid, struct hid_report *rep, int reqtype);
+++++++int __hid_request(struct hid_device *hid, struct hid_report *rep, int reqtype);
u8 *hid_alloc_report_buf(struct hid_report *report, gfp_t flags);
struct hid_device *hid_allocate_device(void);
struct hid_report *hid_register_report(struct hid_device *device,