aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-01-14 19:20:42 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2016-01-14 19:20:42 -0500
commitc2848f2eef4dd08b0fd2a8eba1694fd8e77ddb67 (patch)
tree8e84e3cc86074aabd3d2ea9c48e33221bc01d4fe
parent75f26df6ae6f8787fc6198609c8be17400a69e25 (diff)
parent83f1bfd6f57c422da70d1e296df1becc35c868be (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
Pull HID updates from Jiri Kosina: - appoint Benjamin Tissoires as co-maintainer / designated reviewer - sysfs report_descriptor visibility fix for unclaimed devices, from Andy Lutomirski - suspend/resume fixes for Sony driver from Frank Praznik - IRQ deadlock fix from Ioan-Adrian Ratiu - hid-i2c fixes affecting (at least) Yoga 900 from Mika Westerberg and Srinivas Pandruvada - a lot of new device support (especially, but not limited to, Wacom) and assorted small misc fixes - almost complete G920 support; the only bit that is missing is switching the device to HID mode automatically; Simon Wood and Michal Maly are working on it. * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid: (46 commits) Revert "INPUT: xpad: switch Logitech G920 Wheel into HID mode" HID: sensor-hub: Add quirk for Lenovo Yoga 900 with ITE Chips HID: Add new PID for Microchip Pick16F1454 HID: wacom: Use correct report to query pen ID from INTUOSHT2 devices HID: i2c-hid: Prevent sending reports from racing with device reset HID: use kobj_to_dev() HID: wiimote: use dev_to_wii() HID: add a new helper to_hid_driver() HID: use to_hid_device() HID: move to_hid_device() to hid.h HID: usbhid: use to_usb_device HID: corsair: Convert to use module_hid_driver HID: input: ignore the battery in OKLICK Laser BTmouse HID: wacom: Fix pad button range for CINTIQ_COMPANION_2 HID: wacom: Fix touchring value reporting HID: wacom: Report 'strip2' values in ABS_RY HID: wacom: Limit touchstrip data to 13 bits HID: wacom: bitwise vs logical ORs HID: wacom: Apply lowres quirk to BAMBOO_TOUCH devices HID: enable hid device to suspend/resume asynchronously ...
-rw-r--r--MAINTAINERS2
-rw-r--r--drivers/hid/hid-core.c49
-rw-r--r--drivers/hid/hid-corsair.c13
-rw-r--r--drivers/hid/hid-cp2112.c8
-rw-r--r--drivers/hid/hid-debug.c4
-rw-r--r--drivers/hid/hid-gt683r.c8
-rw-r--r--drivers/hid/hid-ids.h3
-rw-r--r--drivers/hid/hid-input.c21
-rw-r--r--drivers/hid/hid-lenovo.c36
-rw-r--r--drivers/hid/hid-lg4ff.c6
-rw-r--r--drivers/hid/hid-logitech-hidpp.c286
-rw-r--r--drivers/hid/hid-multitouch.c24
-rw-r--r--drivers/hid/hid-ntrig.c32
-rw-r--r--drivers/hid/hid-picolcd_leds.c4
-rw-r--r--drivers/hid/hid-prodikeys.c12
-rw-r--r--drivers/hid/hid-roccat-arvo.c6
-rw-r--r--drivers/hid/hid-roccat-common.c6
-rw-r--r--drivers/hid/hid-roccat-isku.c6
-rw-r--r--drivers/hid/hid-roccat-kone.c12
-rw-r--r--drivers/hid/hid-roccat-koneplus.c12
-rw-r--r--drivers/hid/hid-roccat-kovaplus.c12
-rw-r--r--drivers/hid/hid-roccat-lua.c4
-rw-r--r--drivers/hid/hid-roccat-pyra.c15
-rw-r--r--drivers/hid/hid-sensor-hub.c3
-rw-r--r--drivers/hid/hid-sony.c107
-rw-r--r--drivers/hid/hid-steelseries.c8
-rw-r--r--drivers/hid/hid-wiimote-modules.c8
-rw-r--r--drivers/hid/hid-wiimote.h3
-rw-r--r--drivers/hid/i2c-hid/i2c-hid.c22
-rw-r--r--drivers/hid/usbhid/hid-core.c6
-rw-r--r--drivers/hid/usbhid/usbhid.h2
-rw-r--r--drivers/hid/wacom_sys.c23
-rw-r--r--drivers/hid/wacom_wac.c617
-rw-r--r--drivers/hid/wacom_wac.h5
-rw-r--r--include/linux/hid.h8
35 files changed, 819 insertions, 574 deletions
diff --git a/MAINTAINERS b/MAINTAINERS
index ab68d0597542..5696e08918f2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -4984,6 +4984,7 @@ F: arch/*/include/asm/suspend*.h
4984 4984
4985HID CORE LAYER 4985HID CORE LAYER
4986M: Jiri Kosina <jikos@kernel.org> 4986M: Jiri Kosina <jikos@kernel.org>
4987R: Benjamin Tissoires <benjamin.tissoires@redhat.com>
4987L: linux-input@vger.kernel.org 4988L: linux-input@vger.kernel.org
4988T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git 4989T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git
4989S: Maintained 4990S: Maintained
@@ -11162,6 +11163,7 @@ F: include/linux/usb/gadget*
11162 11163
11163USB HID/HIDBP DRIVERS (USB KEYBOARDS, MICE, REMOTE CONTROLS, ...) 11164USB HID/HIDBP DRIVERS (USB KEYBOARDS, MICE, REMOTE CONTROLS, ...)
11164M: Jiri Kosina <jikos@kernel.org> 11165M: Jiri Kosina <jikos@kernel.org>
11166R: Benjamin Tissoires <benjamin.tissoires@redhat.com>
11165L: linux-usb@vger.kernel.org 11167L: linux-usb@vger.kernel.org
11166T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git 11168T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git
11167S: Maintained 11169S: Maintained
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index c6f7a694f67a..7e89288b1537 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -625,7 +625,7 @@ static void hid_close_report(struct hid_device *device)
625 625
626static void hid_device_release(struct device *dev) 626static void hid_device_release(struct device *dev)
627{ 627{
628 struct hid_device *hid = container_of(dev, struct hid_device, dev); 628 struct hid_device *hid = to_hid_device(dev);
629 629
630 hid_close_report(hid); 630 hid_close_report(hid);
631 kfree(hid->dev_rdesc); 631 kfree(hid->dev_rdesc);
@@ -1571,8 +1571,8 @@ read_report_descriptor(struct file *filp, struct kobject *kobj,
1571 struct bin_attribute *attr, 1571 struct bin_attribute *attr,
1572 char *buf, loff_t off, size_t count) 1572 char *buf, loff_t off, size_t count)
1573{ 1573{
1574 struct device *dev = container_of(kobj, struct device, kobj); 1574 struct device *dev = kobj_to_dev(kobj);
1575 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 1575 struct hid_device *hdev = to_hid_device(dev);
1576 1576
1577 if (off >= hdev->rsize) 1577 if (off >= hdev->rsize)
1578 return 0; 1578 return 0;
@@ -1589,7 +1589,7 @@ static ssize_t
1589show_country(struct device *dev, struct device_attribute *attr, 1589show_country(struct device *dev, struct device_attribute *attr,
1590 char *buf) 1590 char *buf)
1591{ 1591{
1592 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 1592 struct hid_device *hdev = to_hid_device(dev);
1593 1593
1594 return sprintf(buf, "%02x\n", hdev->country & 0xff); 1594 return sprintf(buf, "%02x\n", hdev->country & 0xff);
1595} 1595}
@@ -1691,11 +1691,6 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
1691 hid_warn(hdev, 1691 hid_warn(hdev,
1692 "can't create sysfs country code attribute err: %d\n", ret); 1692 "can't create sysfs country code attribute err: %d\n", ret);
1693 1693
1694 ret = device_create_bin_file(&hdev->dev, &dev_bin_attr_report_desc);
1695 if (ret)
1696 hid_warn(hdev,
1697 "can't create sysfs report descriptor attribute err: %d\n", ret);
1698
1699 hid_info(hdev, "%s: %s HID v%x.%02x %s [%s] on %s\n", 1694 hid_info(hdev, "%s: %s HID v%x.%02x %s [%s] on %s\n",
1700 buf, bus, hdev->version >> 8, hdev->version & 0xff, 1695 buf, bus, hdev->version >> 8, hdev->version & 0xff,
1701 type, hdev->name, hdev->phys); 1696 type, hdev->name, hdev->phys);
@@ -1707,7 +1702,6 @@ EXPORT_SYMBOL_GPL(hid_connect);
1707void hid_disconnect(struct hid_device *hdev) 1702void hid_disconnect(struct hid_device *hdev)
1708{ 1703{
1709 device_remove_file(&hdev->dev, &dev_attr_country); 1704 device_remove_file(&hdev->dev, &dev_attr_country);
1710 device_remove_bin_file(&hdev->dev, &dev_bin_attr_report_desc);
1711 if (hdev->claimed & HID_CLAIMED_INPUT) 1705 if (hdev->claimed & HID_CLAIMED_INPUT)
1712 hidinput_disconnect(hdev); 1706 hidinput_disconnect(hdev);
1713 if (hdev->claimed & HID_CLAIMED_HIDDEV) 1707 if (hdev->claimed & HID_CLAIMED_HIDDEV)
@@ -1902,6 +1896,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
1902 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD) }, 1896 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD) },
1903 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2_2) }, 1897 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2_2) },
1904 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G29_WHEEL) }, 1898 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G29_WHEEL) },
1899 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G920_WHEEL) },
1905 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_F3D) }, 1900 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_F3D) },
1906 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_FFG ) }, 1901 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_FFG ) },
1907 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FORCE3D_PRO) }, 1902 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FORCE3D_PRO) },
@@ -2076,7 +2071,7 @@ struct hid_dynid {
2076static ssize_t store_new_id(struct device_driver *drv, const char *buf, 2071static ssize_t store_new_id(struct device_driver *drv, const char *buf,
2077 size_t count) 2072 size_t count)
2078{ 2073{
2079 struct hid_driver *hdrv = container_of(drv, struct hid_driver, driver); 2074 struct hid_driver *hdrv = to_hid_driver(drv);
2080 struct hid_dynid *dynid; 2075 struct hid_dynid *dynid;
2081 __u32 bus, vendor, product; 2076 __u32 bus, vendor, product;
2082 unsigned long driver_data = 0; 2077 unsigned long driver_data = 0;
@@ -2138,17 +2133,16 @@ static const struct hid_device_id *hid_match_device(struct hid_device *hdev,
2138 2133
2139static int hid_bus_match(struct device *dev, struct device_driver *drv) 2134static int hid_bus_match(struct device *dev, struct device_driver *drv)
2140{ 2135{
2141 struct hid_driver *hdrv = container_of(drv, struct hid_driver, driver); 2136 struct hid_driver *hdrv = to_hid_driver(drv);
2142 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 2137 struct hid_device *hdev = to_hid_device(dev);
2143 2138
2144 return hid_match_device(hdev, hdrv) != NULL; 2139 return hid_match_device(hdev, hdrv) != NULL;
2145} 2140}
2146 2141
2147static int hid_device_probe(struct device *dev) 2142static int hid_device_probe(struct device *dev)
2148{ 2143{
2149 struct hid_driver *hdrv = container_of(dev->driver, 2144 struct hid_driver *hdrv = to_hid_driver(dev->driver);
2150 struct hid_driver, driver); 2145 struct hid_device *hdev = to_hid_device(dev);
2151 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
2152 const struct hid_device_id *id; 2146 const struct hid_device_id *id;
2153 int ret = 0; 2147 int ret = 0;
2154 2148
@@ -2190,7 +2184,7 @@ unlock_driver_lock:
2190 2184
2191static int hid_device_remove(struct device *dev) 2185static int hid_device_remove(struct device *dev)
2192{ 2186{
2193 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 2187 struct hid_device *hdev = to_hid_device(dev);
2194 struct hid_driver *hdrv; 2188 struct hid_driver *hdrv;
2195 int ret = 0; 2189 int ret = 0;
2196 2190
@@ -2223,12 +2217,9 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
2223 char *buf) 2217 char *buf)
2224{ 2218{
2225 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 2219 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
2226 int len;
2227
2228 len = snprintf(buf, PAGE_SIZE, "hid:b%04Xg%04Xv%08Xp%08X\n",
2229 hdev->bus, hdev->group, hdev->vendor, hdev->product);
2230 2220
2231 return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len; 2221 return scnprintf(buf, PAGE_SIZE, "hid:b%04Xg%04Xv%08Xp%08X\n",
2222 hdev->bus, hdev->group, hdev->vendor, hdev->product);
2232} 2223}
2233static DEVICE_ATTR_RO(modalias); 2224static DEVICE_ATTR_RO(modalias);
2234 2225
@@ -2236,11 +2227,19 @@ static struct attribute *hid_dev_attrs[] = {
2236 &dev_attr_modalias.attr, 2227 &dev_attr_modalias.attr,
2237 NULL, 2228 NULL,
2238}; 2229};
2239ATTRIBUTE_GROUPS(hid_dev); 2230static struct bin_attribute *hid_dev_bin_attrs[] = {
2231 &dev_bin_attr_report_desc,
2232 NULL
2233};
2234static const struct attribute_group hid_dev_group = {
2235 .attrs = hid_dev_attrs,
2236 .bin_attrs = hid_dev_bin_attrs,
2237};
2238__ATTRIBUTE_GROUPS(hid_dev);
2240 2239
2241static int hid_uevent(struct device *dev, struct kobj_uevent_env *env) 2240static int hid_uevent(struct device *dev, struct kobj_uevent_env *env)
2242{ 2241{
2243 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 2242 struct hid_device *hdev = to_hid_device(dev);
2244 2243
2245 if (add_uevent_var(env, "HID_ID=%04X:%08X:%08X", 2244 if (add_uevent_var(env, "HID_ID=%04X:%08X:%08X",
2246 hdev->bus, hdev->vendor, hdev->product)) 2245 hdev->bus, hdev->vendor, hdev->product))
@@ -2408,6 +2407,7 @@ static const struct hid_device_id hid_ignore_list[] = {
2408 { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1) }, 2407 { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1) },
2409 { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT2) }, 2408 { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT2) },
2410 { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICK16F1454) }, 2409 { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICK16F1454) },
2410 { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICK16F1454_V2) },
2411 { HID_USB_DEVICE(USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR, USB_DEVICE_ID_N_S_HARMONY) }, 2411 { HID_USB_DEVICE(USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR, USB_DEVICE_ID_N_S_HARMONY) },
2412 { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100) }, 2412 { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100) },
2413 { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 20) }, 2413 { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 20) },
@@ -2660,6 +2660,7 @@ struct hid_device *hid_allocate_device(void)
2660 device_initialize(&hdev->dev); 2660 device_initialize(&hdev->dev);
2661 hdev->dev.release = hid_device_release; 2661 hdev->dev.release = hid_device_release;
2662 hdev->dev.bus = &hid_bus_type; 2662 hdev->dev.bus = &hid_bus_type;
2663 device_enable_async_suspend(&hdev->dev);
2663 2664
2664 hid_close_report(hdev); 2665 hid_close_report(hdev);
2665 2666
diff --git a/drivers/hid/hid-corsair.c b/drivers/hid/hid-corsair.c
index bcefb9ebb026..58551964ce86 100644
--- a/drivers/hid/hid-corsair.c
+++ b/drivers/hid/hid-corsair.c
@@ -655,18 +655,7 @@ static struct hid_driver corsair_driver = {
655 .input_mapping = corsair_input_mapping, 655 .input_mapping = corsair_input_mapping,
656}; 656};
657 657
658static int __init corsair_init(void) 658module_hid_driver(corsair_driver);
659{
660 return hid_register_driver(&corsair_driver);
661}
662
663static void corsair_exit(void)
664{
665 hid_unregister_driver(&corsair_driver);
666}
667
668module_init(corsair_init);
669module_exit(corsair_exit);
670 659
671MODULE_LICENSE("GPL"); 660MODULE_LICENSE("GPL");
672MODULE_AUTHOR("Clement Vuchener"); 661MODULE_AUTHOR("Clement Vuchener");
diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c
index 7afc3fcc122c..7c38bfa05fac 100644
--- a/drivers/hid/hid-cp2112.c
+++ b/drivers/hid/hid-cp2112.c
@@ -807,7 +807,7 @@ static ssize_t name##_store(struct device *kdev, \
807 struct device_attribute *attr, const char *buf, \ 807 struct device_attribute *attr, const char *buf, \
808 size_t count) \ 808 size_t count) \
809{ \ 809{ \
810 struct hid_device *hdev = container_of(kdev, struct hid_device, dev); \ 810 struct hid_device *hdev = to_hid_device(kdev); \
811 struct cp2112_usb_config_report cfg; \ 811 struct cp2112_usb_config_report cfg; \
812 int ret = cp2112_get_usb_config(hdev, &cfg); \ 812 int ret = cp2112_get_usb_config(hdev, &cfg); \
813 if (ret) \ 813 if (ret) \
@@ -822,7 +822,7 @@ static ssize_t name##_store(struct device *kdev, \
822static ssize_t name##_show(struct device *kdev, \ 822static ssize_t name##_show(struct device *kdev, \
823 struct device_attribute *attr, char *buf) \ 823 struct device_attribute *attr, char *buf) \
824{ \ 824{ \
825 struct hid_device *hdev = container_of(kdev, struct hid_device, dev); \ 825 struct hid_device *hdev = to_hid_device(kdev); \
826 struct cp2112_usb_config_report cfg; \ 826 struct cp2112_usb_config_report cfg; \
827 int ret = cp2112_get_usb_config(hdev, &cfg); \ 827 int ret = cp2112_get_usb_config(hdev, &cfg); \
828 if (ret) \ 828 if (ret) \
@@ -887,7 +887,7 @@ static ssize_t pstr_store(struct device *kdev,
887 struct device_attribute *kattr, const char *buf, 887 struct device_attribute *kattr, const char *buf,
888 size_t count) 888 size_t count)
889{ 889{
890 struct hid_device *hdev = container_of(kdev, struct hid_device, dev); 890 struct hid_device *hdev = to_hid_device(kdev);
891 struct cp2112_pstring_attribute *attr = 891 struct cp2112_pstring_attribute *attr =
892 container_of(kattr, struct cp2112_pstring_attribute, attr); 892 container_of(kattr, struct cp2112_pstring_attribute, attr);
893 struct cp2112_string_report report; 893 struct cp2112_string_report report;
@@ -918,7 +918,7 @@ static ssize_t pstr_store(struct device *kdev,
918static ssize_t pstr_show(struct device *kdev, 918static ssize_t pstr_show(struct device *kdev,
919 struct device_attribute *kattr, char *buf) 919 struct device_attribute *kattr, char *buf)
920{ 920{
921 struct hid_device *hdev = container_of(kdev, struct hid_device, dev); 921 struct hid_device *hdev = to_hid_device(kdev);
922 struct cp2112_pstring_attribute *attr = 922 struct cp2112_pstring_attribute *attr =
923 container_of(kattr, struct cp2112_pstring_attribute, attr); 923 container_of(kattr, struct cp2112_pstring_attribute, attr);
924 struct cp2112_string_report report; 924 struct cp2112_string_report report;
diff --git a/drivers/hid/hid-debug.c b/drivers/hid/hid-debug.c
index 2886b645ced7..acfb522a432a 100644
--- a/drivers/hid/hid-debug.c
+++ b/drivers/hid/hid-debug.c
@@ -659,13 +659,13 @@ EXPORT_SYMBOL_GPL(hid_dump_device);
659/* enqueue string to 'events' ring buffer */ 659/* enqueue string to 'events' ring buffer */
660void hid_debug_event(struct hid_device *hdev, char *buf) 660void hid_debug_event(struct hid_device *hdev, char *buf)
661{ 661{
662 int i; 662 unsigned i;
663 struct hid_debug_list *list; 663 struct hid_debug_list *list;
664 unsigned long flags; 664 unsigned long flags;
665 665
666 spin_lock_irqsave(&hdev->debug_list_lock, flags); 666 spin_lock_irqsave(&hdev->debug_list_lock, flags);
667 list_for_each_entry(list, &hdev->debug_list, node) { 667 list_for_each_entry(list, &hdev->debug_list, node) {
668 for (i = 0; i < strlen(buf); i++) 668 for (i = 0; buf[i]; i++)
669 list->hid_debug_buf[(list->tail + i) % HID_DEBUG_BUFSIZE] = 669 list->hid_debug_buf[(list->tail + i) % HID_DEBUG_BUFSIZE] =
670 buf[i]; 670 buf[i];
671 list->tail = (list->tail + i) % HID_DEBUG_BUFSIZE; 671 list->tail = (list->tail + i) % HID_DEBUG_BUFSIZE;
diff --git a/drivers/hid/hid-gt683r.c b/drivers/hid/hid-gt683r.c
index 0d6f135e266c..a298fbd8db6b 100644
--- a/drivers/hid/hid-gt683r.c
+++ b/drivers/hid/hid-gt683r.c
@@ -70,7 +70,7 @@ static void gt683r_brightness_set(struct led_classdev *led_cdev,
70{ 70{
71 int i; 71 int i;
72 struct device *dev = led_cdev->dev->parent; 72 struct device *dev = led_cdev->dev->parent;
73 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 73 struct hid_device *hdev = to_hid_device(dev);
74 struct gt683r_led *led = hid_get_drvdata(hdev); 74 struct gt683r_led *led = hid_get_drvdata(hdev);
75 75
76 for (i = 0; i < GT683R_LED_COUNT; i++) { 76 for (i = 0; i < GT683R_LED_COUNT; i++) {
@@ -89,8 +89,7 @@ static ssize_t mode_show(struct device *dev,
89 char *buf) 89 char *buf)
90{ 90{
91 u8 sysfs_mode; 91 u8 sysfs_mode;
92 struct hid_device *hdev = container_of(dev->parent, 92 struct hid_device *hdev = to_hid_device(dev->parent);
93 struct hid_device, dev);
94 struct gt683r_led *led = hid_get_drvdata(hdev); 93 struct gt683r_led *led = hid_get_drvdata(hdev);
95 94
96 if (led->mode == GT683R_LED_NORMAL) 95 if (led->mode == GT683R_LED_NORMAL)
@@ -108,8 +107,7 @@ static ssize_t mode_store(struct device *dev,
108 const char *buf, size_t count) 107 const char *buf, size_t count)
109{ 108{
110 u8 sysfs_mode; 109 u8 sysfs_mode;
111 struct hid_device *hdev = container_of(dev->parent, 110 struct hid_device *hdev = to_hid_device(dev->parent);
112 struct hid_device, dev);
113 struct gt683r_led *led = hid_get_drvdata(hdev); 111 struct gt683r_led *led = hid_get_drvdata(hdev);
114 112
115 113
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 8b78a7f1f779..b6ff6e78ac54 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -510,6 +510,7 @@
510#define USB_VENDOR_ID_ITE 0x048d 510#define USB_VENDOR_ID_ITE 0x048d
511#define USB_DEVICE_ID_ITE_LENOVO_YOGA 0x8386 511#define USB_DEVICE_ID_ITE_LENOVO_YOGA 0x8386
512#define USB_DEVICE_ID_ITE_LENOVO_YOGA2 0x8350 512#define USB_DEVICE_ID_ITE_LENOVO_YOGA2 0x8350
513#define USB_DEVICE_ID_ITE_LENOVO_YOGA900 0x8396
513 514
514#define USB_VENDOR_ID_JABRA 0x0b0e 515#define USB_VENDOR_ID_JABRA 0x0b0e
515#define USB_DEVICE_ID_JABRA_SPEAK_410 0x0412 516#define USB_DEVICE_ID_JABRA_SPEAK_410 0x0412
@@ -615,6 +616,7 @@
615#define USB_DEVICE_ID_LOGITECH_RUMBLEPAD2 0xc218 616#define USB_DEVICE_ID_LOGITECH_RUMBLEPAD2 0xc218
616#define USB_DEVICE_ID_LOGITECH_RUMBLEPAD2_2 0xc219 617#define USB_DEVICE_ID_LOGITECH_RUMBLEPAD2_2 0xc219
617#define USB_DEVICE_ID_LOGITECH_G29_WHEEL 0xc24f 618#define USB_DEVICE_ID_LOGITECH_G29_WHEEL 0xc24f
619#define USB_DEVICE_ID_LOGITECH_G920_WHEEL 0xc262
618#define USB_DEVICE_ID_LOGITECH_WINGMAN_F3D 0xc283 620#define USB_DEVICE_ID_LOGITECH_WINGMAN_F3D 0xc283
619#define USB_DEVICE_ID_LOGITECH_FORCE3D_PRO 0xc286 621#define USB_DEVICE_ID_LOGITECH_FORCE3D_PRO 0xc286
620#define USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940 0xc287 622#define USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940 0xc287
@@ -664,6 +666,7 @@
664#define USB_DEVICE_ID_PICOLCD 0xc002 666#define USB_DEVICE_ID_PICOLCD 0xc002
665#define USB_DEVICE_ID_PICOLCD_BOOTLOADER 0xf002 667#define USB_DEVICE_ID_PICOLCD_BOOTLOADER 0xf002
666#define USB_DEVICE_ID_PICK16F1454 0x0042 668#define USB_DEVICE_ID_PICK16F1454 0x0042
669#define USB_DEVICE_ID_PICK16F1454_V2 0xf2f7
667 670
668#define USB_VENDOR_ID_MICROSOFT 0x045e 671#define USB_VENDOR_ID_MICROSOFT 0x045e
669#define USB_DEVICE_ID_SIDEWINDER_GV 0x003b 672#define USB_DEVICE_ID_SIDEWINDER_GV 0x003b
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
index 2ba6bf69b7d0..bcfaf32d9e5e 100644
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -303,6 +303,7 @@ static enum power_supply_property hidinput_battery_props[] = {
303 303
304#define HID_BATTERY_QUIRK_PERCENT (1 << 0) /* always reports percent */ 304#define HID_BATTERY_QUIRK_PERCENT (1 << 0) /* always reports percent */
305#define HID_BATTERY_QUIRK_FEATURE (1 << 1) /* ask for feature report */ 305#define HID_BATTERY_QUIRK_FEATURE (1 << 1) /* ask for feature report */
306#define HID_BATTERY_QUIRK_IGNORE (1 << 2) /* completely ignore the battery */
306 307
307static const struct hid_device_id hid_battery_quirks[] = { 308static const struct hid_device_id hid_battery_quirks[] = {
308 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, 309 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
@@ -320,6 +321,9 @@ static const struct hid_device_id hid_battery_quirks[] = {
320 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, 321 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
321 USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI), 322 USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI),
322 HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE }, 323 HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE },
324 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM,
325 USB_DEVICE_ID_ELECOM_BM084),
326 HID_BATTERY_QUIRK_IGNORE },
323 {} 327 {}
324}; 328};
325 329
@@ -408,6 +412,14 @@ static bool hidinput_setup_battery(struct hid_device *dev, unsigned report_type,
408 if (dev->battery != NULL) 412 if (dev->battery != NULL)
409 goto out; /* already initialized? */ 413 goto out; /* already initialized? */
410 414
415 quirks = find_battery_quirk(dev);
416
417 hid_dbg(dev, "device %x:%x:%x %d quirks %d\n",
418 dev->bus, dev->vendor, dev->product, dev->version, quirks);
419
420 if (quirks & HID_BATTERY_QUIRK_IGNORE)
421 goto out;
422
411 psy_desc = kzalloc(sizeof(*psy_desc), GFP_KERNEL); 423 psy_desc = kzalloc(sizeof(*psy_desc), GFP_KERNEL);
412 if (psy_desc == NULL) 424 if (psy_desc == NULL)
413 goto out; 425 goto out;
@@ -424,11 +436,6 @@ static bool hidinput_setup_battery(struct hid_device *dev, unsigned report_type,
424 psy_desc->use_for_apm = 0; 436 psy_desc->use_for_apm = 0;
425 psy_desc->get_property = hidinput_get_battery_property; 437 psy_desc->get_property = hidinput_get_battery_property;
426 438
427 quirks = find_battery_quirk(dev);
428
429 hid_dbg(dev, "device %x:%x:%x %d quirks %d\n",
430 dev->bus, dev->vendor, dev->product, dev->version, quirks);
431
432 min = field->logical_minimum; 439 min = field->logical_minimum;
433 max = field->logical_maximum; 440 max = field->logical_maximum;
434 441
@@ -960,6 +967,10 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
960 goto ignore; 967 goto ignore;
961 968
962 case HID_UP_LOGIVENDOR: 969 case HID_UP_LOGIVENDOR:
970 /* intentional fallback */
971 case HID_UP_LOGIVENDOR2:
972 /* intentional fallback */
973 case HID_UP_LOGIVENDOR3:
963 goto ignore; 974 goto ignore;
964 975
965 case HID_UP_PID: 976 case HID_UP_PID:
diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c
index 8979f1fd5208..0125e356bd8d 100644
--- a/drivers/hid/hid-lenovo.c
+++ b/drivers/hid/hid-lenovo.c
@@ -220,7 +220,7 @@ static ssize_t attr_fn_lock_show_cptkbd(struct device *dev,
220 struct device_attribute *attr, 220 struct device_attribute *attr,
221 char *buf) 221 char *buf)
222{ 222{
223 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 223 struct hid_device *hdev = to_hid_device(dev);
224 struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev); 224 struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev);
225 225
226 return snprintf(buf, PAGE_SIZE, "%u\n", cptkbd_data->fn_lock); 226 return snprintf(buf, PAGE_SIZE, "%u\n", cptkbd_data->fn_lock);
@@ -231,7 +231,7 @@ static ssize_t attr_fn_lock_store_cptkbd(struct device *dev,
231 const char *buf, 231 const char *buf,
232 size_t count) 232 size_t count)
233{ 233{
234 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 234 struct hid_device *hdev = to_hid_device(dev);
235 struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev); 235 struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev);
236 int value; 236 int value;
237 237
@@ -250,7 +250,7 @@ static ssize_t attr_sensitivity_show_cptkbd(struct device *dev,
250 struct device_attribute *attr, 250 struct device_attribute *attr,
251 char *buf) 251 char *buf)
252{ 252{
253 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 253 struct hid_device *hdev = to_hid_device(dev);
254 struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev); 254 struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev);
255 255
256 return snprintf(buf, PAGE_SIZE, "%u\n", 256 return snprintf(buf, PAGE_SIZE, "%u\n",
@@ -262,7 +262,7 @@ static ssize_t attr_sensitivity_store_cptkbd(struct device *dev,
262 const char *buf, 262 const char *buf,
263 size_t count) 263 size_t count)
264{ 264{
265 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 265 struct hid_device *hdev = to_hid_device(dev);
266 struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev); 266 struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev);
267 int value; 267 int value;
268 268
@@ -387,7 +387,7 @@ static ssize_t attr_press_to_select_show_tpkbd(struct device *dev,
387 struct device_attribute *attr, 387 struct device_attribute *attr,
388 char *buf) 388 char *buf)
389{ 389{
390 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 390 struct hid_device *hdev = to_hid_device(dev);
391 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev); 391 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
392 392
393 return snprintf(buf, PAGE_SIZE, "%u\n", data_pointer->press_to_select); 393 return snprintf(buf, PAGE_SIZE, "%u\n", data_pointer->press_to_select);
@@ -398,7 +398,7 @@ static ssize_t attr_press_to_select_store_tpkbd(struct device *dev,
398 const char *buf, 398 const char *buf,
399 size_t count) 399 size_t count)
400{ 400{
401 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 401 struct hid_device *hdev = to_hid_device(dev);
402 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev); 402 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
403 int value; 403 int value;
404 404
@@ -417,7 +417,7 @@ static ssize_t attr_dragging_show_tpkbd(struct device *dev,
417 struct device_attribute *attr, 417 struct device_attribute *attr,
418 char *buf) 418 char *buf)
419{ 419{
420 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 420 struct hid_device *hdev = to_hid_device(dev);
421 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev); 421 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
422 422
423 return snprintf(buf, PAGE_SIZE, "%u\n", data_pointer->dragging); 423 return snprintf(buf, PAGE_SIZE, "%u\n", data_pointer->dragging);
@@ -428,7 +428,7 @@ static ssize_t attr_dragging_store_tpkbd(struct device *dev,
428 const char *buf, 428 const char *buf,
429 size_t count) 429 size_t count)
430{ 430{
431 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 431 struct hid_device *hdev = to_hid_device(dev);
432 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev); 432 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
433 int value; 433 int value;
434 434
@@ -447,7 +447,7 @@ static ssize_t attr_release_to_select_show_tpkbd(struct device *dev,
447 struct device_attribute *attr, 447 struct device_attribute *attr,
448 char *buf) 448 char *buf)
449{ 449{
450 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 450 struct hid_device *hdev = to_hid_device(dev);
451 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev); 451 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
452 452
453 return snprintf(buf, PAGE_SIZE, "%u\n", data_pointer->release_to_select); 453 return snprintf(buf, PAGE_SIZE, "%u\n", data_pointer->release_to_select);
@@ -458,7 +458,7 @@ static ssize_t attr_release_to_select_store_tpkbd(struct device *dev,
458 const char *buf, 458 const char *buf,
459 size_t count) 459 size_t count)
460{ 460{
461 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 461 struct hid_device *hdev = to_hid_device(dev);
462 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev); 462 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
463 int value; 463 int value;
464 464
@@ -477,7 +477,7 @@ static ssize_t attr_select_right_show_tpkbd(struct device *dev,
477 struct device_attribute *attr, 477 struct device_attribute *attr,
478 char *buf) 478 char *buf)
479{ 479{
480 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 480 struct hid_device *hdev = to_hid_device(dev);
481 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev); 481 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
482 482
483 return snprintf(buf, PAGE_SIZE, "%u\n", data_pointer->select_right); 483 return snprintf(buf, PAGE_SIZE, "%u\n", data_pointer->select_right);
@@ -488,7 +488,7 @@ static ssize_t attr_select_right_store_tpkbd(struct device *dev,
488 const char *buf, 488 const char *buf,
489 size_t count) 489 size_t count)
490{ 490{
491 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 491 struct hid_device *hdev = to_hid_device(dev);
492 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev); 492 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
493 int value; 493 int value;
494 494
@@ -507,7 +507,7 @@ static ssize_t attr_sensitivity_show_tpkbd(struct device *dev,
507 struct device_attribute *attr, 507 struct device_attribute *attr,
508 char *buf) 508 char *buf)
509{ 509{
510 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 510 struct hid_device *hdev = to_hid_device(dev);
511 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev); 511 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
512 512
513 return snprintf(buf, PAGE_SIZE, "%u\n", 513 return snprintf(buf, PAGE_SIZE, "%u\n",
@@ -519,7 +519,7 @@ static ssize_t attr_sensitivity_store_tpkbd(struct device *dev,
519 const char *buf, 519 const char *buf,
520 size_t count) 520 size_t count)
521{ 521{
522 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 522 struct hid_device *hdev = to_hid_device(dev);
523 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev); 523 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
524 int value; 524 int value;
525 525
@@ -536,7 +536,7 @@ static ssize_t attr_press_speed_show_tpkbd(struct device *dev,
536 struct device_attribute *attr, 536 struct device_attribute *attr,
537 char *buf) 537 char *buf)
538{ 538{
539 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 539 struct hid_device *hdev = to_hid_device(dev);
540 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev); 540 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
541 541
542 return snprintf(buf, PAGE_SIZE, "%u\n", 542 return snprintf(buf, PAGE_SIZE, "%u\n",
@@ -548,7 +548,7 @@ static ssize_t attr_press_speed_store_tpkbd(struct device *dev,
548 const char *buf, 548 const char *buf,
549 size_t count) 549 size_t count)
550{ 550{
551 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 551 struct hid_device *hdev = to_hid_device(dev);
552 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev); 552 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
553 int value; 553 int value;
554 554
@@ -609,7 +609,7 @@ static enum led_brightness lenovo_led_brightness_get_tpkbd(
609 struct led_classdev *led_cdev) 609 struct led_classdev *led_cdev)
610{ 610{
611 struct device *dev = led_cdev->dev->parent; 611 struct device *dev = led_cdev->dev->parent;
612 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 612 struct hid_device *hdev = to_hid_device(dev);
613 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev); 613 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
614 int led_nr = 0; 614 int led_nr = 0;
615 615
@@ -625,7 +625,7 @@ static void lenovo_led_brightness_set_tpkbd(struct led_classdev *led_cdev,
625 enum led_brightness value) 625 enum led_brightness value)
626{ 626{
627 struct device *dev = led_cdev->dev->parent; 627 struct device *dev = led_cdev->dev->parent;
628 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 628 struct hid_device *hdev = to_hid_device(dev);
629 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev); 629 struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
630 struct hid_report *report; 630 struct hid_report *report;
631 int led_nr = 0; 631 int led_nr = 0;
diff --git a/drivers/hid/hid-lg4ff.c b/drivers/hid/hid-lg4ff.c
index fbddcb37ae98..af3a8ec8a746 100644
--- a/drivers/hid/hid-lg4ff.c
+++ b/drivers/hid/hid-lg4ff.c
@@ -33,8 +33,6 @@
33#include "hid-lg4ff.h" 33#include "hid-lg4ff.h"
34#include "hid-ids.h" 34#include "hid-ids.h"
35 35
36#define to_hid_device(pdev) container_of(pdev, struct hid_device, dev)
37
38#define LG4FF_MMODE_IS_MULTIMODE 0 36#define LG4FF_MMODE_IS_MULTIMODE 0
39#define LG4FF_MMODE_SWITCHED 1 37#define LG4FF_MMODE_SWITCHED 1
40#define LG4FF_MMODE_NOT_MULTIMODE 2 38#define LG4FF_MMODE_NOT_MULTIMODE 2
@@ -1020,7 +1018,7 @@ static void lg4ff_led_set_brightness(struct led_classdev *led_cdev,
1020 enum led_brightness value) 1018 enum led_brightness value)
1021{ 1019{
1022 struct device *dev = led_cdev->dev->parent; 1020 struct device *dev = led_cdev->dev->parent;
1023 struct hid_device *hid = container_of(dev, struct hid_device, dev); 1021 struct hid_device *hid = to_hid_device(dev);
1024 struct lg_drv_data *drv_data = hid_get_drvdata(hid); 1022 struct lg_drv_data *drv_data = hid_get_drvdata(hid);
1025 struct lg4ff_device_entry *entry; 1023 struct lg4ff_device_entry *entry;
1026 int i, state = 0; 1024 int i, state = 0;
@@ -1055,7 +1053,7 @@ static void lg4ff_led_set_brightness(struct led_classdev *led_cdev,
1055static enum led_brightness lg4ff_led_get_brightness(struct led_classdev *led_cdev) 1053static enum led_brightness lg4ff_led_get_brightness(struct led_classdev *led_cdev)
1056{ 1054{
1057 struct device *dev = led_cdev->dev->parent; 1055 struct device *dev = led_cdev->dev->parent;
1058 struct hid_device *hid = container_of(dev, struct hid_device, dev); 1056 struct hid_device *hid = to_hid_device(dev);
1059 struct lg_drv_data *drv_data = hid_get_drvdata(hid); 1057 struct lg_drv_data *drv_data = hid_get_drvdata(hid);
1060 struct lg4ff_device_entry *entry; 1058 struct lg4ff_device_entry *entry;
1061 int i, value = 0; 1059 int i, value = 0;
diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c
index 5fd97860aec4..bd2ab476c65e 100644
--- a/drivers/hid/hid-logitech-hidpp.c
+++ b/drivers/hid/hid-logitech-hidpp.c
@@ -40,18 +40,22 @@ MODULE_PARM_DESC(disable_tap_to_click,
40 40
41#define REPORT_ID_HIDPP_SHORT 0x10 41#define REPORT_ID_HIDPP_SHORT 0x10
42#define REPORT_ID_HIDPP_LONG 0x11 42#define REPORT_ID_HIDPP_LONG 0x11
43#define REPORT_ID_HIDPP_VERY_LONG 0x12
43 44
44#define HIDPP_REPORT_SHORT_LENGTH 7 45#define HIDPP_REPORT_SHORT_LENGTH 7
45#define HIDPP_REPORT_LONG_LENGTH 20 46#define HIDPP_REPORT_LONG_LENGTH 20
47#define HIDPP_REPORT_VERY_LONG_LENGTH 64
46 48
47#define HIDPP_QUIRK_CLASS_WTP BIT(0) 49#define HIDPP_QUIRK_CLASS_WTP BIT(0)
48#define HIDPP_QUIRK_CLASS_M560 BIT(1) 50#define HIDPP_QUIRK_CLASS_M560 BIT(1)
49#define HIDPP_QUIRK_CLASS_K400 BIT(2) 51#define HIDPP_QUIRK_CLASS_K400 BIT(2)
52#define HIDPP_QUIRK_CLASS_G920 BIT(3)
50 53
51/* bits 2..20 are reserved for classes */ 54/* bits 2..20 are reserved for classes */
52#define HIDPP_QUIRK_CONNECT_EVENTS BIT(21) 55#define HIDPP_QUIRK_CONNECT_EVENTS BIT(21)
53#define HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS BIT(22) 56#define HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS BIT(22)
54#define HIDPP_QUIRK_NO_HIDINPUT BIT(23) 57#define HIDPP_QUIRK_NO_HIDINPUT BIT(23)
58#define HIDPP_QUIRK_FORCE_OUTPUT_REPORTS BIT(24)
55 59
56#define HIDPP_QUIRK_DELAYED_INIT (HIDPP_QUIRK_NO_HIDINPUT | \ 60#define HIDPP_QUIRK_DELAYED_INIT (HIDPP_QUIRK_NO_HIDINPUT | \
57 HIDPP_QUIRK_CONNECT_EVENTS) 61 HIDPP_QUIRK_CONNECT_EVENTS)
@@ -81,13 +85,13 @@ MODULE_PARM_DESC(disable_tap_to_click,
81struct fap { 85struct fap {
82 u8 feature_index; 86 u8 feature_index;
83 u8 funcindex_clientid; 87 u8 funcindex_clientid;
84 u8 params[HIDPP_REPORT_LONG_LENGTH - 4U]; 88 u8 params[HIDPP_REPORT_VERY_LONG_LENGTH - 4U];
85}; 89};
86 90
87struct rap { 91struct rap {
88 u8 sub_id; 92 u8 sub_id;
89 u8 reg_address; 93 u8 reg_address;
90 u8 params[HIDPP_REPORT_LONG_LENGTH - 4U]; 94 u8 params[HIDPP_REPORT_VERY_LONG_LENGTH - 4U];
91}; 95};
92 96
93struct hidpp_report { 97struct hidpp_report {
@@ -144,8 +148,11 @@ static void hidpp_connect_event(struct hidpp_device *hidpp_dev);
144static int __hidpp_send_report(struct hid_device *hdev, 148static int __hidpp_send_report(struct hid_device *hdev,
145 struct hidpp_report *hidpp_report) 149 struct hidpp_report *hidpp_report)
146{ 150{
151 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
147 int fields_count, ret; 152 int fields_count, ret;
148 153
154 hidpp = hid_get_drvdata(hdev);
155
149 switch (hidpp_report->report_id) { 156 switch (hidpp_report->report_id) {
150 case REPORT_ID_HIDPP_SHORT: 157 case REPORT_ID_HIDPP_SHORT:
151 fields_count = HIDPP_REPORT_SHORT_LENGTH; 158 fields_count = HIDPP_REPORT_SHORT_LENGTH;
@@ -153,6 +160,9 @@ static int __hidpp_send_report(struct hid_device *hdev,
153 case REPORT_ID_HIDPP_LONG: 160 case REPORT_ID_HIDPP_LONG:
154 fields_count = HIDPP_REPORT_LONG_LENGTH; 161 fields_count = HIDPP_REPORT_LONG_LENGTH;
155 break; 162 break;
163 case REPORT_ID_HIDPP_VERY_LONG:
164 fields_count = HIDPP_REPORT_VERY_LONG_LENGTH;
165 break;
156 default: 166 default:
157 return -ENODEV; 167 return -ENODEV;
158 } 168 }
@@ -163,9 +173,13 @@ static int __hidpp_send_report(struct hid_device *hdev,
163 */ 173 */
164 hidpp_report->device_index = 0xff; 174 hidpp_report->device_index = 0xff;
165 175
166 ret = hid_hw_raw_request(hdev, hidpp_report->report_id, 176 if (hidpp->quirks & HIDPP_QUIRK_FORCE_OUTPUT_REPORTS) {
167 (u8 *)hidpp_report, fields_count, HID_OUTPUT_REPORT, 177 ret = hid_hw_output_report(hdev, (u8 *)hidpp_report, fields_count);
168 HID_REQ_SET_REPORT); 178 } else {
179 ret = hid_hw_raw_request(hdev, hidpp_report->report_id,
180 (u8 *)hidpp_report, fields_count, HID_OUTPUT_REPORT,
181 HID_REQ_SET_REPORT);
182 }
169 183
170 return ret == fields_count ? 0 : -1; 184 return ret == fields_count ? 0 : -1;
171} 185}
@@ -217,8 +231,9 @@ static int hidpp_send_message_sync(struct hidpp_device *hidpp,
217 goto exit; 231 goto exit;
218 } 232 }
219 233
220 if (response->report_id == REPORT_ID_HIDPP_LONG && 234 if ((response->report_id == REPORT_ID_HIDPP_LONG ||
221 response->fap.feature_index == HIDPP20_ERROR) { 235 response->report_id == REPORT_ID_HIDPP_VERY_LONG) &&
236 response->fap.feature_index == HIDPP20_ERROR) {
222 ret = response->fap.params[1]; 237 ret = response->fap.params[1];
223 dbg_hid("%s:got hidpp 2.0 error %02X\n", __func__, ret); 238 dbg_hid("%s:got hidpp 2.0 error %02X\n", __func__, ret);
224 goto exit; 239 goto exit;
@@ -243,7 +258,11 @@ static int hidpp_send_fap_command_sync(struct hidpp_device *hidpp,
243 message = kzalloc(sizeof(struct hidpp_report), GFP_KERNEL); 258 message = kzalloc(sizeof(struct hidpp_report), GFP_KERNEL);
244 if (!message) 259 if (!message)
245 return -ENOMEM; 260 return -ENOMEM;
246 message->report_id = REPORT_ID_HIDPP_LONG; 261
262 if (param_count > (HIDPP_REPORT_LONG_LENGTH - 4))
263 message->report_id = REPORT_ID_HIDPP_VERY_LONG;
264 else
265 message->report_id = REPORT_ID_HIDPP_LONG;
247 message->fap.feature_index = feat_index; 266 message->fap.feature_index = feat_index;
248 message->fap.funcindex_clientid = funcindex_clientid; 267 message->fap.funcindex_clientid = funcindex_clientid;
249 memcpy(&message->fap.params, params, param_count); 268 memcpy(&message->fap.params, params, param_count);
@@ -258,13 +277,23 @@ static int hidpp_send_rap_command_sync(struct hidpp_device *hidpp_dev,
258 struct hidpp_report *response) 277 struct hidpp_report *response)
259{ 278{
260 struct hidpp_report *message; 279 struct hidpp_report *message;
261 int ret; 280 int ret, max_count;
262 281
263 if ((report_id != REPORT_ID_HIDPP_SHORT) && 282 switch (report_id) {
264 (report_id != REPORT_ID_HIDPP_LONG)) 283 case REPORT_ID_HIDPP_SHORT:
284 max_count = HIDPP_REPORT_SHORT_LENGTH - 4;
285 break;
286 case REPORT_ID_HIDPP_LONG:
287 max_count = HIDPP_REPORT_LONG_LENGTH - 4;
288 break;
289 case REPORT_ID_HIDPP_VERY_LONG:
290 max_count = HIDPP_REPORT_VERY_LONG_LENGTH - 4;
291 break;
292 default:
265 return -EINVAL; 293 return -EINVAL;
294 }
266 295
267 if (param_count > sizeof(message->rap.params)) 296 if (param_count > max_count)
268 return -EINVAL; 297 return -EINVAL;
269 298
270 message = kzalloc(sizeof(struct hidpp_report), GFP_KERNEL); 299 message = kzalloc(sizeof(struct hidpp_report), GFP_KERNEL);
@@ -508,10 +537,19 @@ static int hidpp_devicenametype_get_device_name(struct hidpp_device *hidpp,
508 if (ret) 537 if (ret)
509 return ret; 538 return ret;
510 539
511 if (response.report_id == REPORT_ID_HIDPP_LONG) 540 switch (response.report_id) {
541 case REPORT_ID_HIDPP_VERY_LONG:
542 count = HIDPP_REPORT_VERY_LONG_LENGTH - 4;
543 break;
544 case REPORT_ID_HIDPP_LONG:
512 count = HIDPP_REPORT_LONG_LENGTH - 4; 545 count = HIDPP_REPORT_LONG_LENGTH - 4;
513 else 546 break;
547 case REPORT_ID_HIDPP_SHORT:
514 count = HIDPP_REPORT_SHORT_LENGTH - 4; 548 count = HIDPP_REPORT_SHORT_LENGTH - 4;
549 break;
550 default:
551 return -EPROTO;
552 }
515 553
516 if (len_buf < count) 554 if (len_buf < count)
517 count = len_buf; 555 count = len_buf;
@@ -1257,6 +1295,131 @@ static int k400_connect(struct hid_device *hdev, bool connected)
1257 return k400_disable_tap_to_click(hidpp); 1295 return k400_disable_tap_to_click(hidpp);
1258} 1296}
1259 1297
1298/* ------------------------------------------------------------------------- */
1299/* Logitech G920 Driving Force Racing Wheel for Xbox One */
1300/* ------------------------------------------------------------------------- */
1301
1302#define HIDPP_PAGE_G920_FORCE_FEEDBACK 0x8123
1303
1304/* Using session ID = 1 */
1305#define CMD_G920_FORCE_GET_APERTURE 0x51
1306#define CMD_G920_FORCE_SET_APERTURE 0x61
1307
1308struct g920_private_data {
1309 u8 force_feature;
1310 u16 range;
1311};
1312
1313static ssize_t g920_range_show(struct device *dev, struct device_attribute *attr,
1314 char *buf)
1315{
1316 struct hid_device *hid = to_hid_device(dev);
1317 struct hidpp_device *hidpp = hid_get_drvdata(hid);
1318 struct g920_private_data *pdata;
1319
1320 pdata = hidpp->private_data;
1321 if (!pdata) {
1322 hid_err(hid, "Private driver data not found!\n");
1323 return -EINVAL;
1324 }
1325
1326 return scnprintf(buf, PAGE_SIZE, "%u\n", pdata->range);
1327}
1328
1329static ssize_t g920_range_store(struct device *dev, struct device_attribute *attr,
1330 const char *buf, size_t count)
1331{
1332 struct hid_device *hid = to_hid_device(dev);
1333 struct hidpp_device *hidpp = hid_get_drvdata(hid);
1334 struct g920_private_data *pdata;
1335 struct hidpp_report response;
1336 u8 params[2];
1337 int ret;
1338 u16 range = simple_strtoul(buf, NULL, 10);
1339
1340 pdata = hidpp->private_data;
1341 if (!pdata) {
1342 hid_err(hid, "Private driver data not found!\n");
1343 return -EINVAL;
1344 }
1345
1346 if (range < 180)
1347 range = 180;
1348 else if (range > 900)
1349 range = 900;
1350
1351 params[0] = range >> 8;
1352 params[1] = range & 0x00FF;
1353
1354 ret = hidpp_send_fap_command_sync(hidpp, pdata->force_feature,
1355 CMD_G920_FORCE_SET_APERTURE, params, 2, &response);
1356 if (ret)
1357 return ret;
1358
1359 pdata->range = range;
1360 return count;
1361}
1362
1363static DEVICE_ATTR(range, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH, g920_range_show, g920_range_store);
1364
1365static int g920_allocate(struct hid_device *hdev)
1366{
1367 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
1368 struct g920_private_data *pdata;
1369
1370 pdata = devm_kzalloc(&hdev->dev, sizeof(struct g920_private_data),
1371 GFP_KERNEL);
1372 if (!pdata)
1373 return -ENOMEM;
1374
1375 hidpp->private_data = pdata;
1376
1377 return 0;
1378}
1379
1380static int g920_get_config(struct hidpp_device *hidpp)
1381{
1382 struct g920_private_data *pdata = hidpp->private_data;
1383 struct hidpp_report response;
1384 u8 feature_type;
1385 u8 feature_index;
1386 int ret;
1387
1388 pdata = hidpp->private_data;
1389 if (!pdata) {
1390 hid_err(hidpp->hid_dev, "Private driver data not found!\n");
1391 return -EINVAL;
1392 }
1393
1394 /* Find feature and store for later use */
1395 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_G920_FORCE_FEEDBACK,
1396 &feature_index, &feature_type);
1397 if (ret)
1398 return ret;
1399
1400 pdata->force_feature = feature_index;
1401
1402 /* Read current Range */
1403 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1404 CMD_G920_FORCE_GET_APERTURE, NULL, 0, &response);
1405 if (ret > 0) {
1406 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1407 __func__, ret);
1408 return -EPROTO;
1409 }
1410 if (ret)
1411 return ret;
1412
1413 pdata->range = get_unaligned_be16(&response.fap.params[0]);
1414
1415 /* Create sysfs interface */
1416 ret = device_create_file(&(hidpp->hid_dev->dev), &dev_attr_range);
1417 if (ret)
1418 hid_warn(hidpp->hid_dev, "Unable to create sysfs interface for \"range\", errno %d\n", ret);
1419
1420 return 0;
1421}
1422
1260/* -------------------------------------------------------------------------- */ 1423/* -------------------------------------------------------------------------- */
1261/* Generic HID++ devices */ 1424/* Generic HID++ devices */
1262/* -------------------------------------------------------------------------- */ 1425/* -------------------------------------------------------------------------- */
@@ -1276,6 +1439,25 @@ static int hidpp_input_mapping(struct hid_device *hdev, struct hid_input *hi,
1276 return 0; 1439 return 0;
1277} 1440}
1278 1441
1442static int hidpp_input_mapped(struct hid_device *hdev, struct hid_input *hi,
1443 struct hid_field *field, struct hid_usage *usage,
1444 unsigned long **bit, int *max)
1445{
1446 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
1447
1448 /* Ensure that Logitech G920 is not given a default fuzz/flat value */
1449 if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
1450 if (usage->type == EV_ABS && (usage->code == ABS_X ||
1451 usage->code == ABS_Y || usage->code == ABS_Z ||
1452 usage->code == ABS_RZ)) {
1453 field->application = HID_GD_MULTIAXIS;
1454 }
1455 }
1456
1457 return 0;
1458}
1459
1460
1279static void hidpp_populate_input(struct hidpp_device *hidpp, 1461static void hidpp_populate_input(struct hidpp_device *hidpp,
1280 struct input_dev *input, bool origin_is_hid_core) 1462 struct input_dev *input, bool origin_is_hid_core)
1281{ 1463{
@@ -1347,6 +1529,14 @@ static int hidpp_raw_event(struct hid_device *hdev, struct hid_report *report,
1347 1529
1348 /* Generic HID++ processing. */ 1530 /* Generic HID++ processing. */
1349 switch (data[0]) { 1531 switch (data[0]) {
1532 case REPORT_ID_HIDPP_VERY_LONG:
1533 if (size != HIDPP_REPORT_VERY_LONG_LENGTH) {
1534 hid_err(hdev, "received hid++ report of bad size (%d)",
1535 size);
1536 return 1;
1537 }
1538 ret = hidpp_raw_hidpp_event(hidpp, data, size);
1539 break;
1350 case REPORT_ID_HIDPP_LONG: 1540 case REPORT_ID_HIDPP_LONG:
1351 if (size != HIDPP_REPORT_LONG_LENGTH) { 1541 if (size != HIDPP_REPORT_LONG_LENGTH) {
1352 hid_err(hdev, "received hid++ report of bad size (%d)", 1542 hid_err(hdev, "received hid++ report of bad size (%d)",
@@ -1393,10 +1583,12 @@ static void hidpp_overwrite_name(struct hid_device *hdev, bool use_unifying)
1393 else 1583 else
1394 name = hidpp_get_device_name(hidpp); 1584 name = hidpp_get_device_name(hidpp);
1395 1585
1396 if (!name) 1586 if (!name) {
1397 hid_err(hdev, "unable to retrieve the name of the device"); 1587 hid_err(hdev, "unable to retrieve the name of the device");
1398 else 1588 } else {
1589 dbg_hid("HID++: Got name: %s\n", name);
1399 snprintf(hdev->name, sizeof(hdev->name), "%s", name); 1590 snprintf(hdev->name, sizeof(hdev->name), "%s", name);
1591 }
1400 1592
1401 kfree(name); 1593 kfree(name);
1402} 1594}
@@ -1547,6 +1739,10 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
1547 ret = k400_allocate(hdev); 1739 ret = k400_allocate(hdev);
1548 if (ret) 1740 if (ret)
1549 goto allocate_fail; 1741 goto allocate_fail;
1742 } else if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
1743 ret = g920_allocate(hdev);
1744 if (ret)
1745 goto allocate_fail;
1550 } 1746 }
1551 1747
1552 INIT_WORK(&hidpp->work, delayed_work_cb); 1748 INIT_WORK(&hidpp->work, delayed_work_cb);
@@ -1559,6 +1755,25 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
1559 goto hid_parse_fail; 1755 goto hid_parse_fail;
1560 } 1756 }
1561 1757
1758 if (hidpp->quirks & HIDPP_QUIRK_NO_HIDINPUT)
1759 connect_mask &= ~HID_CONNECT_HIDINPUT;
1760
1761 if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
1762 ret = hid_hw_start(hdev, connect_mask);
1763 if (ret) {
1764 hid_err(hdev, "hw start failed\n");
1765 goto hid_hw_start_fail;
1766 }
1767 ret = hid_hw_open(hdev);
1768 if (ret < 0) {
1769 dev_err(&hdev->dev, "%s:hid_hw_open returned error:%d\n",
1770 __func__, ret);
1771 hid_hw_stop(hdev);
1772 goto hid_hw_start_fail;
1773 }
1774 }
1775
1776
1562 /* Allow incoming packets */ 1777 /* Allow incoming packets */
1563 hid_device_io_start(hdev); 1778 hid_device_io_start(hdev);
1564 1779
@@ -1567,8 +1782,7 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
1567 if (!connected) { 1782 if (!connected) {
1568 ret = -ENODEV; 1783 ret = -ENODEV;
1569 hid_err(hdev, "Device not connected"); 1784 hid_err(hdev, "Device not connected");
1570 hid_device_io_stop(hdev); 1785 goto hid_hw_open_failed;
1571 goto hid_parse_fail;
1572 } 1786 }
1573 1787
1574 hid_info(hdev, "HID++ %u.%u device connected.\n", 1788 hid_info(hdev, "HID++ %u.%u device connected.\n",
@@ -1581,19 +1795,22 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
1581 if (connected && (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)) { 1795 if (connected && (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)) {
1582 ret = wtp_get_config(hidpp); 1796 ret = wtp_get_config(hidpp);
1583 if (ret) 1797 if (ret)
1584 goto hid_parse_fail; 1798 goto hid_hw_open_failed;
1799 } else if (connected && (hidpp->quirks & HIDPP_QUIRK_CLASS_G920)) {
1800 ret = g920_get_config(hidpp);
1801 if (ret)
1802 goto hid_hw_open_failed;
1585 } 1803 }
1586 1804
1587 /* Block incoming packets */ 1805 /* Block incoming packets */
1588 hid_device_io_stop(hdev); 1806 hid_device_io_stop(hdev);
1589 1807
1590 if (hidpp->quirks & HIDPP_QUIRK_NO_HIDINPUT) 1808 if (!(hidpp->quirks & HIDPP_QUIRK_CLASS_G920)) {
1591 connect_mask &= ~HID_CONNECT_HIDINPUT; 1809 ret = hid_hw_start(hdev, connect_mask);
1592 1810 if (ret) {
1593 ret = hid_hw_start(hdev, connect_mask); 1811 hid_err(hdev, "%s:hid_hw_start returned error\n", __func__);
1594 if (ret) { 1812 goto hid_hw_start_fail;
1595 hid_err(hdev, "%s:hid_hw_start returned error\n", __func__); 1813 }
1596 goto hid_hw_start_fail;
1597 } 1814 }
1598 1815
1599 if (hidpp->quirks & HIDPP_QUIRK_CONNECT_EVENTS) { 1816 if (hidpp->quirks & HIDPP_QUIRK_CONNECT_EVENTS) {
@@ -1605,6 +1822,13 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
1605 1822
1606 return ret; 1823 return ret;
1607 1824
1825hid_hw_open_failed:
1826 hid_device_io_stop(hdev);
1827 if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
1828 device_remove_file(&hdev->dev, &dev_attr_range);
1829 hid_hw_close(hdev);
1830 hid_hw_stop(hdev);
1831 }
1608hid_hw_start_fail: 1832hid_hw_start_fail:
1609hid_parse_fail: 1833hid_parse_fail:
1610 cancel_work_sync(&hidpp->work); 1834 cancel_work_sync(&hidpp->work);
@@ -1618,9 +1842,13 @@ static void hidpp_remove(struct hid_device *hdev)
1618{ 1842{
1619 struct hidpp_device *hidpp = hid_get_drvdata(hdev); 1843 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
1620 1844
1845 if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
1846 device_remove_file(&hdev->dev, &dev_attr_range);
1847 hid_hw_close(hdev);
1848 }
1849 hid_hw_stop(hdev);
1621 cancel_work_sync(&hidpp->work); 1850 cancel_work_sync(&hidpp->work);
1622 mutex_destroy(&hidpp->send_mutex); 1851 mutex_destroy(&hidpp->send_mutex);
1623 hid_hw_stop(hdev);
1624} 1852}
1625 1853
1626static const struct hid_device_id hidpp_devices[] = { 1854static const struct hid_device_id hidpp_devices[] = {
@@ -1648,6 +1876,9 @@ static const struct hid_device_id hidpp_devices[] = {
1648 1876
1649 { HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_DJ_DEVICE, 1877 { HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_DJ_DEVICE,
1650 USB_VENDOR_ID_LOGITECH, HID_ANY_ID)}, 1878 USB_VENDOR_ID_LOGITECH, HID_ANY_ID)},
1879
1880 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G920_WHEEL),
1881 .driver_data = HIDPP_QUIRK_CLASS_G920 | HIDPP_QUIRK_FORCE_OUTPUT_REPORTS},
1651 {} 1882 {}
1652}; 1883};
1653 1884
@@ -1661,6 +1892,7 @@ static struct hid_driver hidpp_driver = {
1661 .raw_event = hidpp_raw_event, 1892 .raw_event = hidpp_raw_event,
1662 .input_configured = hidpp_input_configured, 1893 .input_configured = hidpp_input_configured,
1663 .input_mapping = hidpp_input_mapping, 1894 .input_mapping = hidpp_input_mapping,
1895 .input_mapped = hidpp_input_mapped,
1664}; 1896};
1665 1897
1666module_hid_driver(hidpp_driver); 1898module_hid_driver(hidpp_driver);
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index 3d664d01305e..296d4991560e 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -272,7 +272,7 @@ static ssize_t mt_show_quirks(struct device *dev,
272 struct device_attribute *attr, 272 struct device_attribute *attr,
273 char *buf) 273 char *buf)
274{ 274{
275 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 275 struct hid_device *hdev = to_hid_device(dev);
276 struct mt_device *td = hid_get_drvdata(hdev); 276 struct mt_device *td = hid_get_drvdata(hdev);
277 277
278 return sprintf(buf, "%u\n", td->mtclass.quirks); 278 return sprintf(buf, "%u\n", td->mtclass.quirks);
@@ -282,7 +282,7 @@ static ssize_t mt_set_quirks(struct device *dev,
282 struct device_attribute *attr, 282 struct device_attribute *attr,
283 const char *buf, size_t count) 283 const char *buf, size_t count)
284{ 284{
285 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 285 struct hid_device *hdev = to_hid_device(dev);
286 struct mt_device *td = hid_get_drvdata(hdev); 286 struct mt_device *td = hid_get_drvdata(hdev);
287 287
288 unsigned long val; 288 unsigned long val;
@@ -357,8 +357,19 @@ static void mt_feature_mapping(struct hid_device *hdev,
357 break; 357 break;
358 } 358 }
359 359
360 td->inputmode = field->report->id; 360 if (td->inputmode < 0) {
361 td->inputmode_index = usage->usage_index; 361 td->inputmode = field->report->id;
362 td->inputmode_index = usage->usage_index;
363 } else {
364 /*
365 * Some elan panels wrongly declare 2 input mode
366 * features, and silently ignore when we set the
367 * value in the second field. Skip the second feature
368 * and hope for the best.
369 */
370 dev_info(&hdev->dev,
371 "Ignoring the extra HID_DG_INPUTMODE\n");
372 }
362 373
363 break; 374 break;
364 case HID_DG_CONTACTMAX: 375 case HID_DG_CONTACTMAX:
@@ -486,6 +497,11 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
486 mt_store_field(usage, td, hi); 497 mt_store_field(usage, td, hi);
487 return 1; 498 return 1;
488 case HID_DG_CONFIDENCE: 499 case HID_DG_CONFIDENCE:
500 if (cls->name == MT_CLS_WIN_8 &&
501 field->application == HID_DG_TOUCHPAD) {
502 cls->quirks &= ~MT_QUIRK_ALWAYS_VALID;
503 cls->quirks |= MT_QUIRK_VALID_IS_CONFIDENCE;
504 }
489 mt_store_field(usage, td, hi); 505 mt_store_field(usage, td, hi);
490 return 1; 506 return 1;
491 case HID_DG_TIPSWITCH: 507 case HID_DG_TIPSWITCH:
diff --git a/drivers/hid/hid-ntrig.c b/drivers/hid/hid-ntrig.c
index 756d1ef9bd99..1b0084d4af2e 100644
--- a/drivers/hid/hid-ntrig.c
+++ b/drivers/hid/hid-ntrig.c
@@ -173,7 +173,7 @@ static ssize_t show_phys_width(struct device *dev,
173 struct device_attribute *attr, 173 struct device_attribute *attr,
174 char *buf) 174 char *buf)
175{ 175{
176 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 176 struct hid_device *hdev = to_hid_device(dev);
177 struct ntrig_data *nd = hid_get_drvdata(hdev); 177 struct ntrig_data *nd = hid_get_drvdata(hdev);
178 178
179 return sprintf(buf, "%d\n", nd->sensor_physical_width); 179 return sprintf(buf, "%d\n", nd->sensor_physical_width);
@@ -185,7 +185,7 @@ static ssize_t show_phys_height(struct device *dev,
185 struct device_attribute *attr, 185 struct device_attribute *attr,
186 char *buf) 186 char *buf)
187{ 187{
188 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 188 struct hid_device *hdev = to_hid_device(dev);
189 struct ntrig_data *nd = hid_get_drvdata(hdev); 189 struct ntrig_data *nd = hid_get_drvdata(hdev);
190 190
191 return sprintf(buf, "%d\n", nd->sensor_physical_height); 191 return sprintf(buf, "%d\n", nd->sensor_physical_height);
@@ -197,7 +197,7 @@ static ssize_t show_log_width(struct device *dev,
197 struct device_attribute *attr, 197 struct device_attribute *attr,
198 char *buf) 198 char *buf)
199{ 199{
200 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 200 struct hid_device *hdev = to_hid_device(dev);
201 struct ntrig_data *nd = hid_get_drvdata(hdev); 201 struct ntrig_data *nd = hid_get_drvdata(hdev);
202 202
203 return sprintf(buf, "%d\n", nd->sensor_logical_width); 203 return sprintf(buf, "%d\n", nd->sensor_logical_width);
@@ -209,7 +209,7 @@ static ssize_t show_log_height(struct device *dev,
209 struct device_attribute *attr, 209 struct device_attribute *attr,
210 char *buf) 210 char *buf)
211{ 211{
212 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 212 struct hid_device *hdev = to_hid_device(dev);
213 struct ntrig_data *nd = hid_get_drvdata(hdev); 213 struct ntrig_data *nd = hid_get_drvdata(hdev);
214 214
215 return sprintf(buf, "%d\n", nd->sensor_logical_height); 215 return sprintf(buf, "%d\n", nd->sensor_logical_height);
@@ -221,7 +221,7 @@ static ssize_t show_min_width(struct device *dev,
221 struct device_attribute *attr, 221 struct device_attribute *attr,
222 char *buf) 222 char *buf)
223{ 223{
224 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 224 struct hid_device *hdev = to_hid_device(dev);
225 struct ntrig_data *nd = hid_get_drvdata(hdev); 225 struct ntrig_data *nd = hid_get_drvdata(hdev);
226 226
227 return sprintf(buf, "%d\n", nd->min_width * 227 return sprintf(buf, "%d\n", nd->min_width *
@@ -233,7 +233,7 @@ static ssize_t set_min_width(struct device *dev,
233 struct device_attribute *attr, 233 struct device_attribute *attr,
234 const char *buf, size_t count) 234 const char *buf, size_t count)
235{ 235{
236 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 236 struct hid_device *hdev = to_hid_device(dev);
237 struct ntrig_data *nd = hid_get_drvdata(hdev); 237 struct ntrig_data *nd = hid_get_drvdata(hdev);
238 238
239 unsigned long val; 239 unsigned long val;
@@ -256,7 +256,7 @@ static ssize_t show_min_height(struct device *dev,
256 struct device_attribute *attr, 256 struct device_attribute *attr,
257 char *buf) 257 char *buf)
258{ 258{
259 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 259 struct hid_device *hdev = to_hid_device(dev);
260 struct ntrig_data *nd = hid_get_drvdata(hdev); 260 struct ntrig_data *nd = hid_get_drvdata(hdev);
261 261
262 return sprintf(buf, "%d\n", nd->min_height * 262 return sprintf(buf, "%d\n", nd->min_height *
@@ -268,7 +268,7 @@ static ssize_t set_min_height(struct device *dev,
268 struct device_attribute *attr, 268 struct device_attribute *attr,
269 const char *buf, size_t count) 269 const char *buf, size_t count)
270{ 270{
271 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 271 struct hid_device *hdev = to_hid_device(dev);
272 struct ntrig_data *nd = hid_get_drvdata(hdev); 272 struct ntrig_data *nd = hid_get_drvdata(hdev);
273 273
274 unsigned long val; 274 unsigned long val;
@@ -292,7 +292,7 @@ static ssize_t show_activate_slack(struct device *dev,
292 struct device_attribute *attr, 292 struct device_attribute *attr,
293 char *buf) 293 char *buf)
294{ 294{
295 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 295 struct hid_device *hdev = to_hid_device(dev);
296 struct ntrig_data *nd = hid_get_drvdata(hdev); 296 struct ntrig_data *nd = hid_get_drvdata(hdev);
297 297
298 return sprintf(buf, "%d\n", nd->activate_slack); 298 return sprintf(buf, "%d\n", nd->activate_slack);
@@ -302,7 +302,7 @@ static ssize_t set_activate_slack(struct device *dev,
302 struct device_attribute *attr, 302 struct device_attribute *attr,
303 const char *buf, size_t count) 303 const char *buf, size_t count)
304{ 304{
305 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 305 struct hid_device *hdev = to_hid_device(dev);
306 struct ntrig_data *nd = hid_get_drvdata(hdev); 306 struct ntrig_data *nd = hid_get_drvdata(hdev);
307 307
308 unsigned long val; 308 unsigned long val;
@@ -325,7 +325,7 @@ static ssize_t show_activation_width(struct device *dev,
325 struct device_attribute *attr, 325 struct device_attribute *attr,
326 char *buf) 326 char *buf)
327{ 327{
328 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 328 struct hid_device *hdev = to_hid_device(dev);
329 struct ntrig_data *nd = hid_get_drvdata(hdev); 329 struct ntrig_data *nd = hid_get_drvdata(hdev);
330 330
331 return sprintf(buf, "%d\n", nd->activation_width * 331 return sprintf(buf, "%d\n", nd->activation_width *
@@ -337,7 +337,7 @@ static ssize_t set_activation_width(struct device *dev,
337 struct device_attribute *attr, 337 struct device_attribute *attr,
338 const char *buf, size_t count) 338 const char *buf, size_t count)
339{ 339{
340 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 340 struct hid_device *hdev = to_hid_device(dev);
341 struct ntrig_data *nd = hid_get_drvdata(hdev); 341 struct ntrig_data *nd = hid_get_drvdata(hdev);
342 342
343 unsigned long val; 343 unsigned long val;
@@ -361,7 +361,7 @@ static ssize_t show_activation_height(struct device *dev,
361 struct device_attribute *attr, 361 struct device_attribute *attr,
362 char *buf) 362 char *buf)
363{ 363{
364 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 364 struct hid_device *hdev = to_hid_device(dev);
365 struct ntrig_data *nd = hid_get_drvdata(hdev); 365 struct ntrig_data *nd = hid_get_drvdata(hdev);
366 366
367 return sprintf(buf, "%d\n", nd->activation_height * 367 return sprintf(buf, "%d\n", nd->activation_height *
@@ -373,7 +373,7 @@ static ssize_t set_activation_height(struct device *dev,
373 struct device_attribute *attr, 373 struct device_attribute *attr,
374 const char *buf, size_t count) 374 const char *buf, size_t count)
375{ 375{
376 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 376 struct hid_device *hdev = to_hid_device(dev);
377 struct ntrig_data *nd = hid_get_drvdata(hdev); 377 struct ntrig_data *nd = hid_get_drvdata(hdev);
378 378
379 unsigned long val; 379 unsigned long val;
@@ -397,7 +397,7 @@ static ssize_t show_deactivate_slack(struct device *dev,
397 struct device_attribute *attr, 397 struct device_attribute *attr,
398 char *buf) 398 char *buf)
399{ 399{
400 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 400 struct hid_device *hdev = to_hid_device(dev);
401 struct ntrig_data *nd = hid_get_drvdata(hdev); 401 struct ntrig_data *nd = hid_get_drvdata(hdev);
402 402
403 return sprintf(buf, "%d\n", -nd->deactivate_slack); 403 return sprintf(buf, "%d\n", -nd->deactivate_slack);
@@ -407,7 +407,7 @@ static ssize_t set_deactivate_slack(struct device *dev,
407 struct device_attribute *attr, 407 struct device_attribute *attr,
408 const char *buf, size_t count) 408 const char *buf, size_t count)
409{ 409{
410 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 410 struct hid_device *hdev = to_hid_device(dev);
411 struct ntrig_data *nd = hid_get_drvdata(hdev); 411 struct ntrig_data *nd = hid_get_drvdata(hdev);
412 412
413 unsigned long val; 413 unsigned long val;
diff --git a/drivers/hid/hid-picolcd_leds.c b/drivers/hid/hid-picolcd_leds.c
index e994f9c29012..a802b4f49c7b 100644
--- a/drivers/hid/hid-picolcd_leds.c
+++ b/drivers/hid/hid-picolcd_leds.c
@@ -66,7 +66,7 @@ static void picolcd_led_set_brightness(struct led_classdev *led_cdev,
66 int i, state = 0; 66 int i, state = 0;
67 67
68 dev = led_cdev->dev->parent; 68 dev = led_cdev->dev->parent;
69 hdev = container_of(dev, struct hid_device, dev); 69 hdev = to_hid_device(dev);
70 data = hid_get_drvdata(hdev); 70 data = hid_get_drvdata(hdev);
71 if (!data) 71 if (!data)
72 return; 72 return;
@@ -93,7 +93,7 @@ static enum led_brightness picolcd_led_get_brightness(struct led_classdev *led_c
93 int i, value = 0; 93 int i, value = 0;
94 94
95 dev = led_cdev->dev->parent; 95 dev = led_cdev->dev->parent;
96 hdev = container_of(dev, struct hid_device, dev); 96 hdev = to_hid_device(dev);
97 data = hid_get_drvdata(hdev); 97 data = hid_get_drvdata(hdev);
98 for (i = 0; i < 8; i++) 98 for (i = 0; i < 8; i++)
99 if (led_cdev == data->led[i]) { 99 if (led_cdev == data->led[i]) {
diff --git a/drivers/hid/hid-prodikeys.c b/drivers/hid/hid-prodikeys.c
index 3a207c0ac0e3..f095bf8a3aa9 100644
--- a/drivers/hid/hid-prodikeys.c
+++ b/drivers/hid/hid-prodikeys.c
@@ -103,7 +103,7 @@ MODULE_PARM_DESC(enable, "Enable for the PC-MIDI virtual audio driver");
103static ssize_t show_channel(struct device *dev, 103static ssize_t show_channel(struct device *dev,
104 struct device_attribute *attr, char *buf) 104 struct device_attribute *attr, char *buf)
105{ 105{
106 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 106 struct hid_device *hdev = to_hid_device(dev);
107 struct pk_device *pk = hid_get_drvdata(hdev); 107 struct pk_device *pk = hid_get_drvdata(hdev);
108 108
109 dbg_hid("pcmidi sysfs read channel=%u\n", pk->pm->midi_channel); 109 dbg_hid("pcmidi sysfs read channel=%u\n", pk->pm->midi_channel);
@@ -116,7 +116,7 @@ static ssize_t show_channel(struct device *dev,
116static ssize_t store_channel(struct device *dev, 116static ssize_t store_channel(struct device *dev,
117 struct device_attribute *attr, const char *buf, size_t count) 117 struct device_attribute *attr, const char *buf, size_t count)
118{ 118{
119 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 119 struct hid_device *hdev = to_hid_device(dev);
120 struct pk_device *pk = hid_get_drvdata(hdev); 120 struct pk_device *pk = hid_get_drvdata(hdev);
121 121
122 unsigned channel = 0; 122 unsigned channel = 0;
@@ -140,7 +140,7 @@ static struct device_attribute *sysfs_device_attr_channel = {
140static ssize_t show_sustain(struct device *dev, 140static ssize_t show_sustain(struct device *dev,
141 struct device_attribute *attr, char *buf) 141 struct device_attribute *attr, char *buf)
142{ 142{
143 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 143 struct hid_device *hdev = to_hid_device(dev);
144 struct pk_device *pk = hid_get_drvdata(hdev); 144 struct pk_device *pk = hid_get_drvdata(hdev);
145 145
146 dbg_hid("pcmidi sysfs read sustain=%u\n", pk->pm->midi_sustain); 146 dbg_hid("pcmidi sysfs read sustain=%u\n", pk->pm->midi_sustain);
@@ -153,7 +153,7 @@ static ssize_t show_sustain(struct device *dev,
153static ssize_t store_sustain(struct device *dev, 153static ssize_t store_sustain(struct device *dev,
154 struct device_attribute *attr, const char *buf, size_t count) 154 struct device_attribute *attr, const char *buf, size_t count)
155{ 155{
156 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 156 struct hid_device *hdev = to_hid_device(dev);
157 struct pk_device *pk = hid_get_drvdata(hdev); 157 struct pk_device *pk = hid_get_drvdata(hdev);
158 158
159 unsigned sustain = 0; 159 unsigned sustain = 0;
@@ -179,7 +179,7 @@ static struct device_attribute *sysfs_device_attr_sustain = {
179static ssize_t show_octave(struct device *dev, 179static ssize_t show_octave(struct device *dev,
180 struct device_attribute *attr, char *buf) 180 struct device_attribute *attr, char *buf)
181{ 181{
182 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 182 struct hid_device *hdev = to_hid_device(dev);
183 struct pk_device *pk = hid_get_drvdata(hdev); 183 struct pk_device *pk = hid_get_drvdata(hdev);
184 184
185 dbg_hid("pcmidi sysfs read octave=%d\n", pk->pm->midi_octave); 185 dbg_hid("pcmidi sysfs read octave=%d\n", pk->pm->midi_octave);
@@ -192,7 +192,7 @@ static ssize_t show_octave(struct device *dev,
192static ssize_t store_octave(struct device *dev, 192static ssize_t store_octave(struct device *dev,
193 struct device_attribute *attr, const char *buf, size_t count) 193 struct device_attribute *attr, const char *buf, size_t count)
194{ 194{
195 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 195 struct hid_device *hdev = to_hid_device(dev);
196 struct pk_device *pk = hid_get_drvdata(hdev); 196 struct pk_device *pk = hid_get_drvdata(hdev);
197 197
198 int octave = 0; 198 int octave = 0;
diff --git a/drivers/hid/hid-roccat-arvo.c b/drivers/hid/hid-roccat-arvo.c
index 1948208fe038..329c5d1270f9 100644
--- a/drivers/hid/hid-roccat-arvo.c
+++ b/drivers/hid/hid-roccat-arvo.c
@@ -191,8 +191,7 @@ static ssize_t arvo_sysfs_write(struct file *fp,
191 struct kobject *kobj, void const *buf, 191 struct kobject *kobj, void const *buf,
192 loff_t off, size_t count, size_t real_size, uint command) 192 loff_t off, size_t count, size_t real_size, uint command)
193{ 193{
194 struct device *dev = 194 struct device *dev = kobj_to_dev(kobj)->parent->parent;
195 container_of(kobj, struct device, kobj)->parent->parent;
196 struct arvo_device *arvo = hid_get_drvdata(dev_get_drvdata(dev)); 195 struct arvo_device *arvo = hid_get_drvdata(dev_get_drvdata(dev));
197 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 196 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
198 int retval; 197 int retval;
@@ -211,8 +210,7 @@ static ssize_t arvo_sysfs_read(struct file *fp,
211 struct kobject *kobj, void *buf, loff_t off, 210 struct kobject *kobj, void *buf, loff_t off,
212 size_t count, size_t real_size, uint command) 211 size_t count, size_t real_size, uint command)
213{ 212{
214 struct device *dev = 213 struct device *dev = kobj_to_dev(kobj)->parent->parent;
215 container_of(kobj, struct device, kobj)->parent->parent;
216 struct arvo_device *arvo = hid_get_drvdata(dev_get_drvdata(dev)); 214 struct arvo_device *arvo = hid_get_drvdata(dev_get_drvdata(dev));
217 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 215 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
218 int retval; 216 int retval;
diff --git a/drivers/hid/hid-roccat-common.c b/drivers/hid/hid-roccat-common.c
index 02e28e9f4ea7..8155ac5fede2 100644
--- a/drivers/hid/hid-roccat-common.c
+++ b/drivers/hid/hid-roccat-common.c
@@ -134,8 +134,7 @@ ssize_t roccat_common2_sysfs_read(struct file *fp, struct kobject *kobj,
134 char *buf, loff_t off, size_t count, 134 char *buf, loff_t off, size_t count,
135 size_t real_size, uint command) 135 size_t real_size, uint command)
136{ 136{
137 struct device *dev = 137 struct device *dev = kobj_to_dev(kobj)->parent->parent;
138 container_of(kobj, struct device, kobj)->parent->parent;
139 struct roccat_common2_device *roccat_dev = hid_get_drvdata(dev_get_drvdata(dev)); 138 struct roccat_common2_device *roccat_dev = hid_get_drvdata(dev_get_drvdata(dev));
140 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 139 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
141 int retval; 140 int retval;
@@ -158,8 +157,7 @@ ssize_t roccat_common2_sysfs_write(struct file *fp, struct kobject *kobj,
158 void const *buf, loff_t off, size_t count, 157 void const *buf, loff_t off, size_t count,
159 size_t real_size, uint command) 158 size_t real_size, uint command)
160{ 159{
161 struct device *dev = 160 struct device *dev = kobj_to_dev(kobj)->parent->parent;
162 container_of(kobj, struct device, kobj)->parent->parent;
163 struct roccat_common2_device *roccat_dev = hid_get_drvdata(dev_get_drvdata(dev)); 161 struct roccat_common2_device *roccat_dev = hid_get_drvdata(dev_get_drvdata(dev));
164 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 162 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
165 int retval; 163 int retval;
diff --git a/drivers/hid/hid-roccat-isku.c b/drivers/hid/hid-roccat-isku.c
index bc62ed91e451..02db537f8f3e 100644
--- a/drivers/hid/hid-roccat-isku.c
+++ b/drivers/hid/hid-roccat-isku.c
@@ -121,8 +121,7 @@ static ssize_t isku_sysfs_read(struct file *fp, struct kobject *kobj,
121 char *buf, loff_t off, size_t count, 121 char *buf, loff_t off, size_t count,
122 size_t real_size, uint command) 122 size_t real_size, uint command)
123{ 123{
124 struct device *dev = 124 struct device *dev = kobj_to_dev(kobj)->parent->parent;
125 container_of(kobj, struct device, kobj)->parent->parent;
126 struct isku_device *isku = hid_get_drvdata(dev_get_drvdata(dev)); 125 struct isku_device *isku = hid_get_drvdata(dev_get_drvdata(dev));
127 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 126 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
128 int retval; 127 int retval;
@@ -144,8 +143,7 @@ static ssize_t isku_sysfs_write(struct file *fp, struct kobject *kobj,
144 void const *buf, loff_t off, size_t count, 143 void const *buf, loff_t off, size_t count,
145 size_t real_size, uint command) 144 size_t real_size, uint command)
146{ 145{
147 struct device *dev = 146 struct device *dev = kobj_to_dev(kobj)->parent->parent;
148 container_of(kobj, struct device, kobj)->parent->parent;
149 struct isku_device *isku = hid_get_drvdata(dev_get_drvdata(dev)); 147 struct isku_device *isku = hid_get_drvdata(dev_get_drvdata(dev));
150 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 148 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
151 int retval; 149 int retval;
diff --git a/drivers/hid/hid-roccat-kone.c b/drivers/hid/hid-roccat-kone.c
index c29265055ac1..bf4675a27396 100644
--- a/drivers/hid/hid-roccat-kone.c
+++ b/drivers/hid/hid-roccat-kone.c
@@ -269,8 +269,7 @@ static int kone_get_firmware_version(struct usb_device *usb_dev, int *result)
269static ssize_t kone_sysfs_read_settings(struct file *fp, struct kobject *kobj, 269static ssize_t kone_sysfs_read_settings(struct file *fp, struct kobject *kobj,
270 struct bin_attribute *attr, char *buf, 270 struct bin_attribute *attr, char *buf,
271 loff_t off, size_t count) { 271 loff_t off, size_t count) {
272 struct device *dev = 272 struct device *dev = kobj_to_dev(kobj)->parent->parent;
273 container_of(kobj, struct device, kobj)->parent->parent;
274 struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev)); 273 struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev));
275 274
276 if (off >= sizeof(struct kone_settings)) 275 if (off >= sizeof(struct kone_settings))
@@ -294,8 +293,7 @@ static ssize_t kone_sysfs_read_settings(struct file *fp, struct kobject *kobj,
294static ssize_t kone_sysfs_write_settings(struct file *fp, struct kobject *kobj, 293static ssize_t kone_sysfs_write_settings(struct file *fp, struct kobject *kobj,
295 struct bin_attribute *attr, char *buf, 294 struct bin_attribute *attr, char *buf,
296 loff_t off, size_t count) { 295 loff_t off, size_t count) {
297 struct device *dev = 296 struct device *dev = kobj_to_dev(kobj)->parent->parent;
298 container_of(kobj, struct device, kobj)->parent->parent;
299 struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev)); 297 struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev));
300 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 298 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
301 int retval = 0, difference, old_profile; 299 int retval = 0, difference, old_profile;
@@ -332,8 +330,7 @@ static BIN_ATTR(settings, 0660, kone_sysfs_read_settings,
332static ssize_t kone_sysfs_read_profilex(struct file *fp, 330static ssize_t kone_sysfs_read_profilex(struct file *fp,
333 struct kobject *kobj, struct bin_attribute *attr, 331 struct kobject *kobj, struct bin_attribute *attr,
334 char *buf, loff_t off, size_t count) { 332 char *buf, loff_t off, size_t count) {
335 struct device *dev = 333 struct device *dev = kobj_to_dev(kobj)->parent->parent;
336 container_of(kobj, struct device, kobj)->parent->parent;
337 struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev)); 334 struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev));
338 335
339 if (off >= sizeof(struct kone_profile)) 336 if (off >= sizeof(struct kone_profile))
@@ -353,8 +350,7 @@ static ssize_t kone_sysfs_read_profilex(struct file *fp,
353static ssize_t kone_sysfs_write_profilex(struct file *fp, 350static ssize_t kone_sysfs_write_profilex(struct file *fp,
354 struct kobject *kobj, struct bin_attribute *attr, 351 struct kobject *kobj, struct bin_attribute *attr,
355 char *buf, loff_t off, size_t count) { 352 char *buf, loff_t off, size_t count) {
356 struct device *dev = 353 struct device *dev = kobj_to_dev(kobj)->parent->parent;
357 container_of(kobj, struct device, kobj)->parent->parent;
358 struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev)); 354 struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev));
359 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 355 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
360 struct kone_profile *profile; 356 struct kone_profile *profile;
diff --git a/drivers/hid/hid-roccat-koneplus.c b/drivers/hid/hid-roccat-koneplus.c
index 5e99fcdc71b9..09e8fc72aa1d 100644
--- a/drivers/hid/hid-roccat-koneplus.c
+++ b/drivers/hid/hid-roccat-koneplus.c
@@ -87,8 +87,7 @@ static ssize_t koneplus_sysfs_read(struct file *fp, struct kobject *kobj,
87 char *buf, loff_t off, size_t count, 87 char *buf, loff_t off, size_t count,
88 size_t real_size, uint command) 88 size_t real_size, uint command)
89{ 89{
90 struct device *dev = 90 struct device *dev = kobj_to_dev(kobj)->parent->parent;
91 container_of(kobj, struct device, kobj)->parent->parent;
92 struct koneplus_device *koneplus = hid_get_drvdata(dev_get_drvdata(dev)); 91 struct koneplus_device *koneplus = hid_get_drvdata(dev_get_drvdata(dev));
93 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 92 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
94 int retval; 93 int retval;
@@ -113,8 +112,7 @@ static ssize_t koneplus_sysfs_write(struct file *fp, struct kobject *kobj,
113 void const *buf, loff_t off, size_t count, 112 void const *buf, loff_t off, size_t count,
114 size_t real_size, uint command) 113 size_t real_size, uint command)
115{ 114{
116 struct device *dev = 115 struct device *dev = kobj_to_dev(kobj)->parent->parent;
117 container_of(kobj, struct device, kobj)->parent->parent;
118 struct koneplus_device *koneplus = hid_get_drvdata(dev_get_drvdata(dev)); 116 struct koneplus_device *koneplus = hid_get_drvdata(dev_get_drvdata(dev));
119 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 117 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
120 int retval; 118 int retval;
@@ -193,8 +191,7 @@ static ssize_t koneplus_sysfs_read_profilex_settings(struct file *fp,
193 struct kobject *kobj, struct bin_attribute *attr, char *buf, 191 struct kobject *kobj, struct bin_attribute *attr, char *buf,
194 loff_t off, size_t count) 192 loff_t off, size_t count)
195{ 193{
196 struct device *dev = 194 struct device *dev = kobj_to_dev(kobj)->parent->parent;
197 container_of(kobj, struct device, kobj)->parent->parent;
198 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 195 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
199 ssize_t retval; 196 ssize_t retval;
200 197
@@ -212,8 +209,7 @@ static ssize_t koneplus_sysfs_read_profilex_buttons(struct file *fp,
212 struct kobject *kobj, struct bin_attribute *attr, char *buf, 209 struct kobject *kobj, struct bin_attribute *attr, char *buf,
213 loff_t off, size_t count) 210 loff_t off, size_t count)
214{ 211{
215 struct device *dev = 212 struct device *dev = kobj_to_dev(kobj)->parent->parent;
216 container_of(kobj, struct device, kobj)->parent->parent;
217 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 213 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
218 ssize_t retval; 214 ssize_t retval;
219 215
diff --git a/drivers/hid/hid-roccat-kovaplus.c b/drivers/hid/hid-roccat-kovaplus.c
index 966047711fbf..43617fb28b87 100644
--- a/drivers/hid/hid-roccat-kovaplus.c
+++ b/drivers/hid/hid-roccat-kovaplus.c
@@ -128,8 +128,7 @@ static ssize_t kovaplus_sysfs_read(struct file *fp, struct kobject *kobj,
128 char *buf, loff_t off, size_t count, 128 char *buf, loff_t off, size_t count,
129 size_t real_size, uint command) 129 size_t real_size, uint command)
130{ 130{
131 struct device *dev = 131 struct device *dev = kobj_to_dev(kobj)->parent->parent;
132 container_of(kobj, struct device, kobj)->parent->parent;
133 struct kovaplus_device *kovaplus = hid_get_drvdata(dev_get_drvdata(dev)); 132 struct kovaplus_device *kovaplus = hid_get_drvdata(dev_get_drvdata(dev));
134 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 133 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
135 int retval; 134 int retval;
@@ -154,8 +153,7 @@ static ssize_t kovaplus_sysfs_write(struct file *fp, struct kobject *kobj,
154 void const *buf, loff_t off, size_t count, 153 void const *buf, loff_t off, size_t count,
155 size_t real_size, uint command) 154 size_t real_size, uint command)
156{ 155{
157 struct device *dev = 156 struct device *dev = kobj_to_dev(kobj)->parent->parent;
158 container_of(kobj, struct device, kobj)->parent->parent;
159 struct kovaplus_device *kovaplus = hid_get_drvdata(dev_get_drvdata(dev)); 157 struct kovaplus_device *kovaplus = hid_get_drvdata(dev_get_drvdata(dev));
160 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 158 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
161 int retval; 159 int retval;
@@ -221,8 +219,7 @@ static ssize_t kovaplus_sysfs_read_profilex_settings(struct file *fp,
221 struct kobject *kobj, struct bin_attribute *attr, char *buf, 219 struct kobject *kobj, struct bin_attribute *attr, char *buf,
222 loff_t off, size_t count) 220 loff_t off, size_t count)
223{ 221{
224 struct device *dev = 222 struct device *dev = kobj_to_dev(kobj)->parent->parent;
225 container_of(kobj, struct device, kobj)->parent->parent;
226 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 223 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
227 ssize_t retval; 224 ssize_t retval;
228 225
@@ -240,8 +237,7 @@ static ssize_t kovaplus_sysfs_read_profilex_buttons(struct file *fp,
240 struct kobject *kobj, struct bin_attribute *attr, char *buf, 237 struct kobject *kobj, struct bin_attribute *attr, char *buf,
241 loff_t off, size_t count) 238 loff_t off, size_t count)
242{ 239{
243 struct device *dev = 240 struct device *dev = kobj_to_dev(kobj)->parent->parent;
244 container_of(kobj, struct device, kobj)->parent->parent;
245 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 241 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
246 ssize_t retval; 242 ssize_t retval;
247 243
diff --git a/drivers/hid/hid-roccat-lua.c b/drivers/hid/hid-roccat-lua.c
index 65e2e76bf2fe..ac1a7313e259 100644
--- a/drivers/hid/hid-roccat-lua.c
+++ b/drivers/hid/hid-roccat-lua.c
@@ -30,7 +30,7 @@ static ssize_t lua_sysfs_read(struct file *fp, struct kobject *kobj,
30 char *buf, loff_t off, size_t count, 30 char *buf, loff_t off, size_t count,
31 size_t real_size, uint command) 31 size_t real_size, uint command)
32{ 32{
33 struct device *dev = container_of(kobj, struct device, kobj); 33 struct device *dev = kobj_to_dev(kobj);
34 struct lua_device *lua = hid_get_drvdata(dev_get_drvdata(dev)); 34 struct lua_device *lua = hid_get_drvdata(dev_get_drvdata(dev));
35 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 35 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
36 int retval; 36 int retval;
@@ -52,7 +52,7 @@ static ssize_t lua_sysfs_write(struct file *fp, struct kobject *kobj,
52 void const *buf, loff_t off, size_t count, 52 void const *buf, loff_t off, size_t count,
53 size_t real_size, uint command) 53 size_t real_size, uint command)
54{ 54{
55 struct device *dev = container_of(kobj, struct device, kobj); 55 struct device *dev = kobj_to_dev(kobj);
56 struct lua_device *lua = hid_get_drvdata(dev_get_drvdata(dev)); 56 struct lua_device *lua = hid_get_drvdata(dev_get_drvdata(dev));
57 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 57 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
58 int retval; 58 int retval;
diff --git a/drivers/hid/hid-roccat-pyra.c b/drivers/hid/hid-roccat-pyra.c
index 47d7e74231e5..b30aa7b82bf8 100644
--- a/drivers/hid/hid-roccat-pyra.c
+++ b/drivers/hid/hid-roccat-pyra.c
@@ -90,8 +90,7 @@ static ssize_t pyra_sysfs_read(struct file *fp, struct kobject *kobj,
90 char *buf, loff_t off, size_t count, 90 char *buf, loff_t off, size_t count,
91 size_t real_size, uint command) 91 size_t real_size, uint command)
92{ 92{
93 struct device *dev = 93 struct device *dev = kobj_to_dev(kobj)->parent->parent;
94 container_of(kobj, struct device, kobj)->parent->parent;
95 struct pyra_device *pyra = hid_get_drvdata(dev_get_drvdata(dev)); 94 struct pyra_device *pyra = hid_get_drvdata(dev_get_drvdata(dev));
96 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 95 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
97 int retval; 96 int retval;
@@ -116,8 +115,7 @@ static ssize_t pyra_sysfs_write(struct file *fp, struct kobject *kobj,
116 void const *buf, loff_t off, size_t count, 115 void const *buf, loff_t off, size_t count,
117 size_t real_size, uint command) 116 size_t real_size, uint command)
118{ 117{
119 struct device *dev = 118 struct device *dev = kobj_to_dev(kobj)->parent->parent;
120 container_of(kobj, struct device, kobj)->parent->parent;
121 struct pyra_device *pyra = hid_get_drvdata(dev_get_drvdata(dev)); 119 struct pyra_device *pyra = hid_get_drvdata(dev_get_drvdata(dev));
122 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 120 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
123 int retval; 121 int retval;
@@ -191,8 +189,7 @@ static ssize_t pyra_sysfs_read_profilex_settings(struct file *fp,
191 struct kobject *kobj, struct bin_attribute *attr, char *buf, 189 struct kobject *kobj, struct bin_attribute *attr, char *buf,
192 loff_t off, size_t count) 190 loff_t off, size_t count)
193{ 191{
194 struct device *dev = 192 struct device *dev = kobj_to_dev(kobj)->parent->parent;
195 container_of(kobj, struct device, kobj)->parent->parent;
196 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 193 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
197 ssize_t retval; 194 ssize_t retval;
198 195
@@ -210,8 +207,7 @@ static ssize_t pyra_sysfs_read_profilex_buttons(struct file *fp,
210 struct kobject *kobj, struct bin_attribute *attr, char *buf, 207 struct kobject *kobj, struct bin_attribute *attr, char *buf,
211 loff_t off, size_t count) 208 loff_t off, size_t count)
212{ 209{
213 struct device *dev = 210 struct device *dev = kobj_to_dev(kobj)->parent->parent;
214 container_of(kobj, struct device, kobj)->parent->parent;
215 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 211 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
216 ssize_t retval; 212 ssize_t retval;
217 213
@@ -248,8 +244,7 @@ static ssize_t pyra_sysfs_write_settings(struct file *fp,
248 struct kobject *kobj, struct bin_attribute *attr, char *buf, 244 struct kobject *kobj, struct bin_attribute *attr, char *buf,
249 loff_t off, size_t count) 245 loff_t off, size_t count)
250{ 246{
251 struct device *dev = 247 struct device *dev = kobj_to_dev(kobj)->parent->parent;
252 container_of(kobj, struct device, kobj)->parent->parent;
253 struct pyra_device *pyra = hid_get_drvdata(dev_get_drvdata(dev)); 248 struct pyra_device *pyra = hid_get_drvdata(dev_get_drvdata(dev));
254 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 249 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
255 int retval = 0; 250 int retval = 0;
diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-sensor-hub.c
index 92870cdb52d9..58ed8f25ab21 100644
--- a/drivers/hid/hid-sensor-hub.c
+++ b/drivers/hid/hid-sensor-hub.c
@@ -794,6 +794,9 @@ static const struct hid_device_id sensor_hub_devices[] = {
794 { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_ITE, 794 { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_ITE,
795 USB_DEVICE_ID_ITE_LENOVO_YOGA2), 795 USB_DEVICE_ID_ITE_LENOVO_YOGA2),
796 .driver_data = HID_SENSOR_HUB_ENUM_QUIRK}, 796 .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
797 { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_ITE,
798 USB_DEVICE_ID_ITE_LENOVO_YOGA900),
799 .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
797 { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, HID_ANY_ID, 800 { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, HID_ANY_ID,
798 HID_ANY_ID) }, 801 HID_ANY_ID) },
799 { } 802 { }
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
index 774cd2210566..9b8db0e0ef1c 100644
--- a/drivers/hid/hid-sony.c
+++ b/drivers/hid/hid-sony.c
@@ -1028,6 +1028,7 @@ struct sony_sc {
1028 struct led_classdev *leds[MAX_LEDS]; 1028 struct led_classdev *leds[MAX_LEDS];
1029 unsigned long quirks; 1029 unsigned long quirks;
1030 struct work_struct state_worker; 1030 struct work_struct state_worker;
1031 void(*send_output_report)(struct sony_sc*);
1031 struct power_supply *battery; 1032 struct power_supply *battery;
1032 struct power_supply_desc battery_desc; 1033 struct power_supply_desc battery_desc;
1033 int device_id; 1034 int device_id;
@@ -1044,6 +1045,7 @@ struct sony_sc {
1044 __u8 battery_charging; 1045 __u8 battery_charging;
1045 __u8 battery_capacity; 1046 __u8 battery_capacity;
1046 __u8 led_state[MAX_LEDS]; 1047 __u8 led_state[MAX_LEDS];
1048 __u8 resume_led_state[MAX_LEDS];
1047 __u8 led_delay_on[MAX_LEDS]; 1049 __u8 led_delay_on[MAX_LEDS];
1048 __u8 led_delay_off[MAX_LEDS]; 1050 __u8 led_delay_off[MAX_LEDS];
1049 __u8 led_count; 1051 __u8 led_count;
@@ -1137,11 +1139,11 @@ static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
1137 * the gyroscope values to corresponding axes so we need a 1139 * the gyroscope values to corresponding axes so we need a
1138 * modified one. 1140 * modified one.
1139 */ 1141 */
1140 if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && *rsize == 467) { 1142 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
1141 hid_info(hdev, "Using modified Dualshock 4 report descriptor with gyroscope axes\n"); 1143 hid_info(hdev, "Using modified Dualshock 4 report descriptor with gyroscope axes\n");
1142 rdesc = dualshock4_usb_rdesc; 1144 rdesc = dualshock4_usb_rdesc;
1143 *rsize = sizeof(dualshock4_usb_rdesc); 1145 *rsize = sizeof(dualshock4_usb_rdesc);
1144 } else if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) && *rsize == 357) { 1146 } else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
1145 hid_info(hdev, "Using modified Dualshock 4 Bluetooth report descriptor\n"); 1147 hid_info(hdev, "Using modified Dualshock 4 Bluetooth report descriptor\n");
1146 rdesc = dualshock4_bt_rdesc; 1148 rdesc = dualshock4_bt_rdesc;
1147 *rsize = sizeof(dualshock4_bt_rdesc); 1149 *rsize = sizeof(dualshock4_bt_rdesc);
@@ -1549,7 +1551,7 @@ static void sony_led_set_brightness(struct led_classdev *led,
1549 enum led_brightness value) 1551 enum led_brightness value)
1550{ 1552{
1551 struct device *dev = led->dev->parent; 1553 struct device *dev = led->dev->parent;
1552 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 1554 struct hid_device *hdev = to_hid_device(dev);
1553 struct sony_sc *drv_data; 1555 struct sony_sc *drv_data;
1554 1556
1555 int n; 1557 int n;
@@ -1591,7 +1593,7 @@ static void sony_led_set_brightness(struct led_classdev *led,
1591static enum led_brightness sony_led_get_brightness(struct led_classdev *led) 1593static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
1592{ 1594{
1593 struct device *dev = led->dev->parent; 1595 struct device *dev = led->dev->parent;
1594 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 1596 struct hid_device *hdev = to_hid_device(dev);
1595 struct sony_sc *drv_data; 1597 struct sony_sc *drv_data;
1596 1598
1597 int n; 1599 int n;
@@ -1614,7 +1616,7 @@ static int sony_led_blink_set(struct led_classdev *led, unsigned long *delay_on,
1614 unsigned long *delay_off) 1616 unsigned long *delay_off)
1615{ 1617{
1616 struct device *dev = led->dev->parent; 1618 struct device *dev = led->dev->parent;
1617 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 1619 struct hid_device *hdev = to_hid_device(dev);
1618 struct sony_sc *drv_data = hid_get_drvdata(hdev); 1620 struct sony_sc *drv_data = hid_get_drvdata(hdev);
1619 int n; 1621 int n;
1620 __u8 new_on, new_off; 1622 __u8 new_on, new_off;
@@ -1789,7 +1791,7 @@ error_leds:
1789 return ret; 1791 return ret;
1790} 1792}
1791 1793
1792static void sixaxis_state_worker(struct work_struct *work) 1794static void sixaxis_send_output_report(struct sony_sc *sc)
1793{ 1795{
1794 static const union sixaxis_output_report_01 default_report = { 1796 static const union sixaxis_output_report_01 default_report = {
1795 .buf = { 1797 .buf = {
@@ -1803,7 +1805,6 @@ static void sixaxis_state_worker(struct work_struct *work)
1803 0x00, 0x00, 0x00, 0x00, 0x00 1805 0x00, 0x00, 0x00, 0x00, 0x00
1804 } 1806 }
1805 }; 1807 };
1806 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1807 struct sixaxis_output_report *report = 1808 struct sixaxis_output_report *report =
1808 (struct sixaxis_output_report *)sc->output_report_dmabuf; 1809 (struct sixaxis_output_report *)sc->output_report_dmabuf;
1809 int n; 1810 int n;
@@ -1846,9 +1847,8 @@ static void sixaxis_state_worker(struct work_struct *work)
1846 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT); 1847 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
1847} 1848}
1848 1849
1849static void dualshock4_state_worker(struct work_struct *work) 1850static void dualshock4_send_output_report(struct sony_sc *sc)
1850{ 1851{
1851 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1852 struct hid_device *hdev = sc->hdev; 1852 struct hid_device *hdev = sc->hdev;
1853 __u8 *buf = sc->output_report_dmabuf; 1853 __u8 *buf = sc->output_report_dmabuf;
1854 int offset; 1854 int offset;
@@ -1893,9 +1893,8 @@ static void dualshock4_state_worker(struct work_struct *work)
1893 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT); 1893 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
1894} 1894}
1895 1895
1896static void motion_state_worker(struct work_struct *work) 1896static void motion_send_output_report(struct sony_sc *sc)
1897{ 1897{
1898 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1899 struct hid_device *hdev = sc->hdev; 1898 struct hid_device *hdev = sc->hdev;
1900 struct motion_output_report_02 *report = 1899 struct motion_output_report_02 *report =
1901 (struct motion_output_report_02 *)sc->output_report_dmabuf; 1900 (struct motion_output_report_02 *)sc->output_report_dmabuf;
@@ -1914,6 +1913,18 @@ static void motion_state_worker(struct work_struct *work)
1914 hid_hw_output_report(hdev, (__u8 *)report, MOTION_REPORT_0x02_SIZE); 1913 hid_hw_output_report(hdev, (__u8 *)report, MOTION_REPORT_0x02_SIZE);
1915} 1914}
1916 1915
1916static inline void sony_send_output_report(struct sony_sc *sc)
1917{
1918 if (sc->send_output_report)
1919 sc->send_output_report(sc);
1920}
1921
1922static void sony_state_worker(struct work_struct *work)
1923{
1924 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1925 sc->send_output_report(sc);
1926}
1927
1917static int sony_allocate_output_report(struct sony_sc *sc) 1928static int sony_allocate_output_report(struct sony_sc *sc)
1918{ 1929{
1919 if ((sc->quirks & SIXAXIS_CONTROLLER) || 1930 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
@@ -2241,11 +2252,13 @@ static void sony_release_device_id(struct sony_sc *sc)
2241 } 2252 }
2242} 2253}
2243 2254
2244static inline void sony_init_work(struct sony_sc *sc, 2255static inline void sony_init_output_report(struct sony_sc *sc,
2245 void (*worker)(struct work_struct *)) 2256 void(*send_output_report)(struct sony_sc*))
2246{ 2257{
2258 sc->send_output_report = send_output_report;
2259
2247 if (!sc->worker_initialized) 2260 if (!sc->worker_initialized)
2248 INIT_WORK(&sc->state_worker, worker); 2261 INIT_WORK(&sc->state_worker, sony_state_worker);
2249 2262
2250 sc->worker_initialized = 1; 2263 sc->worker_initialized = 1;
2251} 2264}
@@ -2319,7 +2332,7 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
2319 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP; 2332 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2320 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID; 2333 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
2321 ret = sixaxis_set_operational_usb(hdev); 2334 ret = sixaxis_set_operational_usb(hdev);
2322 sony_init_work(sc, sixaxis_state_worker); 2335 sony_init_output_report(sc, sixaxis_send_output_report);
2323 } else if ((sc->quirks & SIXAXIS_CONTROLLER_BT) || 2336 } else if ((sc->quirks & SIXAXIS_CONTROLLER_BT) ||
2324 (sc->quirks & NAVIGATION_CONTROLLER_BT)) { 2337 (sc->quirks & NAVIGATION_CONTROLLER_BT)) {
2325 /* 2338 /*
@@ -2328,7 +2341,7 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
2328 */ 2341 */
2329 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP; 2342 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2330 ret = sixaxis_set_operational_bt(hdev); 2343 ret = sixaxis_set_operational_bt(hdev);
2331 sony_init_work(sc, sixaxis_state_worker); 2344 sony_init_output_report(sc, sixaxis_send_output_report);
2332 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) { 2345 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
2333 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) { 2346 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
2334 /* 2347 /*
@@ -2343,9 +2356,9 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
2343 } 2356 }
2344 } 2357 }
2345 2358
2346 sony_init_work(sc, dualshock4_state_worker); 2359 sony_init_output_report(sc, dualshock4_send_output_report);
2347 } else if (sc->quirks & MOTION_CONTROLLER) { 2360 } else if (sc->quirks & MOTION_CONTROLLER) {
2348 sony_init_work(sc, motion_state_worker); 2361 sony_init_output_report(sc, motion_send_output_report);
2349 } else { 2362 } else {
2350 ret = 0; 2363 ret = 0;
2351 } 2364 }
@@ -2421,6 +2434,56 @@ static void sony_remove(struct hid_device *hdev)
2421 hid_hw_stop(hdev); 2434 hid_hw_stop(hdev);
2422} 2435}
2423 2436
2437#ifdef CONFIG_PM
2438
2439static int sony_suspend(struct hid_device *hdev, pm_message_t message)
2440{
2441 /*
2442 * On suspend save the current LED state,
2443 * stop running force-feedback and blank the LEDS.
2444 */
2445 if (SONY_LED_SUPPORT || SONY_FF_SUPPORT) {
2446 struct sony_sc *sc = hid_get_drvdata(hdev);
2447
2448#ifdef CONFIG_SONY_FF
2449 sc->left = sc->right = 0;
2450#endif
2451
2452 memcpy(sc->resume_led_state, sc->led_state,
2453 sizeof(sc->resume_led_state));
2454 memset(sc->led_state, 0, sizeof(sc->led_state));
2455
2456 sony_send_output_report(sc);
2457 }
2458
2459 return 0;
2460}
2461
2462static int sony_resume(struct hid_device *hdev)
2463{
2464 /* Restore the state of controller LEDs on resume */
2465 if (SONY_LED_SUPPORT) {
2466 struct sony_sc *sc = hid_get_drvdata(hdev);
2467
2468 memcpy(sc->led_state, sc->resume_led_state,
2469 sizeof(sc->led_state));
2470
2471 /*
2472 * The Sixaxis and navigation controllers on USB need to be
2473 * reinitialized on resume or they won't behave properly.
2474 */
2475 if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
2476 (sc->quirks & NAVIGATION_CONTROLLER_USB))
2477 sixaxis_set_operational_usb(sc->hdev);
2478
2479 sony_set_leds(sc);
2480 }
2481
2482 return 0;
2483}
2484
2485#endif
2486
2424static const struct hid_device_id sony_devices[] = { 2487static const struct hid_device_id sony_devices[] = {
2425 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER), 2488 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
2426 .driver_data = SIXAXIS_CONTROLLER_USB }, 2489 .driver_data = SIXAXIS_CONTROLLER_USB },
@@ -2470,7 +2533,13 @@ static struct hid_driver sony_driver = {
2470 .probe = sony_probe, 2533 .probe = sony_probe,
2471 .remove = sony_remove, 2534 .remove = sony_remove,
2472 .report_fixup = sony_report_fixup, 2535 .report_fixup = sony_report_fixup,
2473 .raw_event = sony_raw_event 2536 .raw_event = sony_raw_event,
2537
2538#ifdef CONFIG_PM
2539 .suspend = sony_suspend,
2540 .resume = sony_resume,
2541 .reset_resume = sony_resume,
2542#endif
2474}; 2543};
2475 2544
2476static int __init sony_init(void) 2545static int __init sony_init(void)
diff --git a/drivers/hid/hid-steelseries.c b/drivers/hid/hid-steelseries.c
index 3edd4ac36494..ec18768b124a 100644
--- a/drivers/hid/hid-steelseries.c
+++ b/drivers/hid/hid-steelseries.c
@@ -141,7 +141,7 @@ static void steelseries_srws1_led_all_set_brightness(struct led_classdev *led_cd
141 enum led_brightness value) 141 enum led_brightness value)
142{ 142{
143 struct device *dev = led_cdev->dev->parent; 143 struct device *dev = led_cdev->dev->parent;
144 struct hid_device *hid = container_of(dev, struct hid_device, dev); 144 struct hid_device *hid = to_hid_device(dev);
145 struct steelseries_srws1_data *drv_data = hid_get_drvdata(hid); 145 struct steelseries_srws1_data *drv_data = hid_get_drvdata(hid);
146 146
147 if (!drv_data) { 147 if (!drv_data) {
@@ -160,7 +160,7 @@ static void steelseries_srws1_led_all_set_brightness(struct led_classdev *led_cd
160static enum led_brightness steelseries_srws1_led_all_get_brightness(struct led_classdev *led_cdev) 160static enum led_brightness steelseries_srws1_led_all_get_brightness(struct led_classdev *led_cdev)
161{ 161{
162 struct device *dev = led_cdev->dev->parent; 162 struct device *dev = led_cdev->dev->parent;
163 struct hid_device *hid = container_of(dev, struct hid_device, dev); 163 struct hid_device *hid = to_hid_device(dev);
164 struct steelseries_srws1_data *drv_data; 164 struct steelseries_srws1_data *drv_data;
165 165
166 drv_data = hid_get_drvdata(hid); 166 drv_data = hid_get_drvdata(hid);
@@ -177,7 +177,7 @@ static void steelseries_srws1_led_set_brightness(struct led_classdev *led_cdev,
177 enum led_brightness value) 177 enum led_brightness value)
178{ 178{
179 struct device *dev = led_cdev->dev->parent; 179 struct device *dev = led_cdev->dev->parent;
180 struct hid_device *hid = container_of(dev, struct hid_device, dev); 180 struct hid_device *hid = to_hid_device(dev);
181 struct steelseries_srws1_data *drv_data = hid_get_drvdata(hid); 181 struct steelseries_srws1_data *drv_data = hid_get_drvdata(hid);
182 int i, state = 0; 182 int i, state = 0;
183 183
@@ -205,7 +205,7 @@ static void steelseries_srws1_led_set_brightness(struct led_classdev *led_cdev,
205static enum led_brightness steelseries_srws1_led_get_brightness(struct led_classdev *led_cdev) 205static enum led_brightness steelseries_srws1_led_get_brightness(struct led_classdev *led_cdev)
206{ 206{
207 struct device *dev = led_cdev->dev->parent; 207 struct device *dev = led_cdev->dev->parent;
208 struct hid_device *hid = container_of(dev, struct hid_device, dev); 208 struct hid_device *hid = to_hid_device(dev);
209 struct steelseries_srws1_data *drv_data; 209 struct steelseries_srws1_data *drv_data;
210 int i, value = 0; 210 int i, value = 0;
211 211
diff --git a/drivers/hid/hid-wiimote-modules.c b/drivers/hid/hid-wiimote-modules.c
index 05e23c417d50..4390eee2ce84 100644
--- a/drivers/hid/hid-wiimote-modules.c
+++ b/drivers/hid/hid-wiimote-modules.c
@@ -296,14 +296,12 @@ static const struct wiimod_ops wiimod_battery = {
296 296
297static enum led_brightness wiimod_led_get(struct led_classdev *led_dev) 297static enum led_brightness wiimod_led_get(struct led_classdev *led_dev)
298{ 298{
299 struct wiimote_data *wdata;
300 struct device *dev = led_dev->dev->parent; 299 struct device *dev = led_dev->dev->parent;
300 struct wiimote_data *wdata = dev_to_wii(dev);
301 int i; 301 int i;
302 unsigned long flags; 302 unsigned long flags;
303 bool value = false; 303 bool value = false;
304 304
305 wdata = hid_get_drvdata(container_of(dev, struct hid_device, dev));
306
307 for (i = 0; i < 4; ++i) { 305 for (i = 0; i < 4; ++i) {
308 if (wdata->leds[i] == led_dev) { 306 if (wdata->leds[i] == led_dev) {
309 spin_lock_irqsave(&wdata->state.lock, flags); 307 spin_lock_irqsave(&wdata->state.lock, flags);
@@ -319,14 +317,12 @@ static enum led_brightness wiimod_led_get(struct led_classdev *led_dev)
319static void wiimod_led_set(struct led_classdev *led_dev, 317static void wiimod_led_set(struct led_classdev *led_dev,
320 enum led_brightness value) 318 enum led_brightness value)
321{ 319{
322 struct wiimote_data *wdata;
323 struct device *dev = led_dev->dev->parent; 320 struct device *dev = led_dev->dev->parent;
321 struct wiimote_data *wdata = dev_to_wii(dev);
324 int i; 322 int i;
325 unsigned long flags; 323 unsigned long flags;
326 __u8 state, flag; 324 __u8 state, flag;
327 325
328 wdata = hid_get_drvdata(container_of(dev, struct hid_device, dev));
329
330 for (i = 0; i < 4; ++i) { 326 for (i = 0; i < 4; ++i) {
331 if (wdata->leds[i] == led_dev) { 327 if (wdata->leds[i] == led_dev) {
332 flag = WIIPROTO_FLAG_LED(i + 1); 328 flag = WIIPROTO_FLAG_LED(i + 1);
diff --git a/drivers/hid/hid-wiimote.h b/drivers/hid/hid-wiimote.h
index 875694d43e4d..510ca77fe14e 100644
--- a/drivers/hid/hid-wiimote.h
+++ b/drivers/hid/hid-wiimote.h
@@ -256,8 +256,7 @@ enum wiiproto_reqs {
256 WIIPROTO_REQ_MAX 256 WIIPROTO_REQ_MAX
257}; 257};
258 258
259#define dev_to_wii(pdev) hid_get_drvdata(container_of(pdev, struct hid_device, \ 259#define dev_to_wii(pdev) hid_get_drvdata(to_hid_device(pdev))
260 dev))
261 260
262void __wiimote_schedule(struct wiimote_data *wdata); 261void __wiimote_schedule(struct wiimote_data *wdata);
263 262
diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c
index 10bd8e6e4c9c..b9216938a718 100644
--- a/drivers/hid/i2c-hid/i2c-hid.c
+++ b/drivers/hid/i2c-hid/i2c-hid.c
@@ -151,6 +151,7 @@ struct i2c_hid {
151 struct i2c_hid_platform_data pdata; 151 struct i2c_hid_platform_data pdata;
152 152
153 bool irq_wake_enabled; 153 bool irq_wake_enabled;
154 struct mutex reset_lock;
154}; 155};
155 156
156static int __i2c_hid_command(struct i2c_client *client, 157static int __i2c_hid_command(struct i2c_client *client,
@@ -356,9 +357,16 @@ static int i2c_hid_hwreset(struct i2c_client *client)
356 357
357 i2c_hid_dbg(ihid, "%s\n", __func__); 358 i2c_hid_dbg(ihid, "%s\n", __func__);
358 359
360 /*
361 * This prevents sending feature reports while the device is
362 * being reset. Otherwise we may lose the reset complete
363 * interrupt.
364 */
365 mutex_lock(&ihid->reset_lock);
366
359 ret = i2c_hid_set_power(client, I2C_HID_PWR_ON); 367 ret = i2c_hid_set_power(client, I2C_HID_PWR_ON);
360 if (ret) 368 if (ret)
361 return ret; 369 goto out_unlock;
362 370
363 i2c_hid_dbg(ihid, "resetting...\n"); 371 i2c_hid_dbg(ihid, "resetting...\n");
364 372
@@ -366,10 +374,11 @@ static int i2c_hid_hwreset(struct i2c_client *client)
366 if (ret) { 374 if (ret) {
367 dev_err(&client->dev, "failed to reset device.\n"); 375 dev_err(&client->dev, "failed to reset device.\n");
368 i2c_hid_set_power(client, I2C_HID_PWR_SLEEP); 376 i2c_hid_set_power(client, I2C_HID_PWR_SLEEP);
369 return ret;
370 } 377 }
371 378
372 return 0; 379out_unlock:
380 mutex_unlock(&ihid->reset_lock);
381 return ret;
373} 382}
374 383
375static void i2c_hid_get_input(struct i2c_hid *ihid) 384static void i2c_hid_get_input(struct i2c_hid *ihid)
@@ -587,12 +596,15 @@ static int i2c_hid_output_raw_report(struct hid_device *hid, __u8 *buf,
587 size_t count, unsigned char report_type, bool use_data) 596 size_t count, unsigned char report_type, bool use_data)
588{ 597{
589 struct i2c_client *client = hid->driver_data; 598 struct i2c_client *client = hid->driver_data;
599 struct i2c_hid *ihid = i2c_get_clientdata(client);
590 int report_id = buf[0]; 600 int report_id = buf[0];
591 int ret; 601 int ret;
592 602
593 if (report_type == HID_INPUT_REPORT) 603 if (report_type == HID_INPUT_REPORT)
594 return -EINVAL; 604 return -EINVAL;
595 605
606 mutex_lock(&ihid->reset_lock);
607
596 if (report_id) { 608 if (report_id) {
597 buf++; 609 buf++;
598 count--; 610 count--;
@@ -605,6 +617,8 @@ static int i2c_hid_output_raw_report(struct hid_device *hid, __u8 *buf,
605 if (report_id && ret >= 0) 617 if (report_id && ret >= 0)
606 ret++; /* add report_id to the number of transfered bytes */ 618 ret++; /* add report_id to the number of transfered bytes */
607 619
620 mutex_unlock(&ihid->reset_lock);
621
608 return ret; 622 return ret;
609} 623}
610 624
@@ -990,6 +1004,7 @@ static int i2c_hid_probe(struct i2c_client *client,
990 ihid->wHIDDescRegister = cpu_to_le16(hidRegister); 1004 ihid->wHIDDescRegister = cpu_to_le16(hidRegister);
991 1005
992 init_waitqueue_head(&ihid->wait); 1006 init_waitqueue_head(&ihid->wait);
1007 mutex_init(&ihid->reset_lock);
993 1008
994 /* we need to allocate the command buffer without knowing the maximum 1009 /* we need to allocate the command buffer without knowing the maximum
995 * size of the reports. Let's use HID_MIN_BUFFER_SIZE, then we do the 1010 * size of the reports. Let's use HID_MIN_BUFFER_SIZE, then we do the
@@ -1184,7 +1199,6 @@ MODULE_DEVICE_TABLE(i2c, i2c_hid_id_table);
1184static struct i2c_driver i2c_hid_driver = { 1199static struct i2c_driver i2c_hid_driver = {
1185 .driver = { 1200 .driver = {
1186 .name = "i2c_hid", 1201 .name = "i2c_hid",
1187 .owner = THIS_MODULE,
1188 .pm = &i2c_hid_pm, 1202 .pm = &i2c_hid_pm,
1189 .acpi_match_table = ACPI_PTR(i2c_hid_acpi_match), 1203 .acpi_match_table = ACPI_PTR(i2c_hid_acpi_match),
1190 .of_match_table = of_match_ptr(i2c_hid_of_match), 1204 .of_match_table = of_match_ptr(i2c_hid_of_match),
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 36712e9f56c2..ad71160b9ea4 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -274,10 +274,10 @@ static void hid_irq_in(struct urb *urb)
274 274
275 switch (urb->status) { 275 switch (urb->status) {
276 case 0: /* success */ 276 case 0: /* success */
277 usbhid_mark_busy(usbhid);
278 usbhid->retry_delay = 0; 277 usbhid->retry_delay = 0;
279 if ((hid->quirks & HID_QUIRK_ALWAYS_POLL) && !hid->open) 278 if ((hid->quirks & HID_QUIRK_ALWAYS_POLL) && !hid->open)
280 break; 279 break;
280 usbhid_mark_busy(usbhid);
281 if (!test_bit(HID_RESUME_RUNNING, &usbhid->iofl)) { 281 if (!test_bit(HID_RESUME_RUNNING, &usbhid->iofl)) {
282 hid_input_report(urb->context, HID_INPUT_REPORT, 282 hid_input_report(urb->context, HID_INPUT_REPORT,
283 urb->transfer_buffer, 283 urb->transfer_buffer,
@@ -477,8 +477,6 @@ static void hid_ctrl(struct urb *urb)
477 struct usbhid_device *usbhid = hid->driver_data; 477 struct usbhid_device *usbhid = hid->driver_data;
478 int unplug = 0, status = urb->status; 478 int unplug = 0, status = urb->status;
479 479
480 spin_lock(&usbhid->lock);
481
482 switch (status) { 480 switch (status) {
483 case 0: /* success */ 481 case 0: /* success */
484 if (usbhid->ctrl[usbhid->ctrltail].dir == USB_DIR_IN) 482 if (usbhid->ctrl[usbhid->ctrltail].dir == USB_DIR_IN)
@@ -498,6 +496,8 @@ static void hid_ctrl(struct urb *urb)
498 hid_warn(urb->dev, "ctrl urb status %d received\n", status); 496 hid_warn(urb->dev, "ctrl urb status %d received\n", status);
499 } 497 }
500 498
499 spin_lock(&usbhid->lock);
500
501 if (unplug) { 501 if (unplug) {
502 usbhid->ctrltail = usbhid->ctrlhead; 502 usbhid->ctrltail = usbhid->ctrlhead;
503 } else { 503 } else {
diff --git a/drivers/hid/usbhid/usbhid.h b/drivers/hid/usbhid/usbhid.h
index 807922b49aa4..fa47d666cfcf 100644
--- a/drivers/hid/usbhid/usbhid.h
+++ b/drivers/hid/usbhid/usbhid.h
@@ -96,7 +96,7 @@ struct usbhid_device {
96}; 96};
97 97
98#define hid_to_usb_dev(hid_dev) \ 98#define hid_to_usb_dev(hid_dev) \
99 container_of(hid_dev->dev.parent->parent, struct usb_device, dev) 99 to_usb_device(hid_dev->dev.parent->parent)
100 100
101#endif 101#endif
102 102
diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
index e06af5b9f59e..5cb21dd91094 100644
--- a/drivers/hid/wacom_sys.c
+++ b/drivers/hid/wacom_sys.c
@@ -686,7 +686,7 @@ out:
686static ssize_t wacom_led_select_store(struct device *dev, int set_id, 686static ssize_t wacom_led_select_store(struct device *dev, int set_id,
687 const char *buf, size_t count) 687 const char *buf, size_t count)
688{ 688{
689 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 689 struct hid_device *hdev = to_hid_device(dev);
690 struct wacom *wacom = hid_get_drvdata(hdev); 690 struct wacom *wacom = hid_get_drvdata(hdev);
691 unsigned int id; 691 unsigned int id;
692 int err; 692 int err;
@@ -714,7 +714,7 @@ static ssize_t wacom_led##SET_ID##_select_store(struct device *dev, \
714static ssize_t wacom_led##SET_ID##_select_show(struct device *dev, \ 714static ssize_t wacom_led##SET_ID##_select_show(struct device *dev, \
715 struct device_attribute *attr, char *buf) \ 715 struct device_attribute *attr, char *buf) \
716{ \ 716{ \
717 struct hid_device *hdev = container_of(dev, struct hid_device, dev);\ 717 struct hid_device *hdev = to_hid_device(dev);\
718 struct wacom *wacom = hid_get_drvdata(hdev); \ 718 struct wacom *wacom = hid_get_drvdata(hdev); \
719 return scnprintf(buf, PAGE_SIZE, "%d\n", \ 719 return scnprintf(buf, PAGE_SIZE, "%d\n", \
720 wacom->led.select[SET_ID]); \ 720 wacom->led.select[SET_ID]); \
@@ -750,7 +750,7 @@ static ssize_t wacom_luminance_store(struct wacom *wacom, u8 *dest,
750static ssize_t wacom_##name##_luminance_store(struct device *dev, \ 750static ssize_t wacom_##name##_luminance_store(struct device *dev, \
751 struct device_attribute *attr, const char *buf, size_t count) \ 751 struct device_attribute *attr, const char *buf, size_t count) \
752{ \ 752{ \
753 struct hid_device *hdev = container_of(dev, struct hid_device, dev);\ 753 struct hid_device *hdev = to_hid_device(dev);\
754 struct wacom *wacom = hid_get_drvdata(hdev); \ 754 struct wacom *wacom = hid_get_drvdata(hdev); \
755 \ 755 \
756 return wacom_luminance_store(wacom, &wacom->led.field, \ 756 return wacom_luminance_store(wacom, &wacom->led.field, \
@@ -773,7 +773,7 @@ DEVICE_LUMINANCE_ATTR(buttons, img_lum);
773static ssize_t wacom_button_image_store(struct device *dev, int button_id, 773static ssize_t wacom_button_image_store(struct device *dev, int button_id,
774 const char *buf, size_t count) 774 const char *buf, size_t count)
775{ 775{
776 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 776 struct hid_device *hdev = to_hid_device(dev);
777 struct wacom *wacom = hid_get_drvdata(hdev); 777 struct wacom *wacom = hid_get_drvdata(hdev);
778 int err; 778 int err;
779 unsigned len; 779 unsigned len;
@@ -1097,7 +1097,7 @@ static ssize_t wacom_show_speed(struct device *dev,
1097 struct device_attribute 1097 struct device_attribute
1098 *attr, char *buf) 1098 *attr, char *buf)
1099{ 1099{
1100 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 1100 struct hid_device *hdev = to_hid_device(dev);
1101 struct wacom *wacom = hid_get_drvdata(hdev); 1101 struct wacom *wacom = hid_get_drvdata(hdev);
1102 1102
1103 return snprintf(buf, PAGE_SIZE, "%i\n", wacom->wacom_wac.bt_high_speed); 1103 return snprintf(buf, PAGE_SIZE, "%i\n", wacom->wacom_wac.bt_high_speed);
@@ -1107,7 +1107,7 @@ static ssize_t wacom_store_speed(struct device *dev,
1107 struct device_attribute *attr, 1107 struct device_attribute *attr,
1108 const char *buf, size_t count) 1108 const char *buf, size_t count)
1109{ 1109{
1110 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 1110 struct hid_device *hdev = to_hid_device(dev);
1111 struct wacom *wacom = hid_get_drvdata(hdev); 1111 struct wacom *wacom = hid_get_drvdata(hdev);
1112 u8 new_speed; 1112 u8 new_speed;
1113 1113
@@ -1130,8 +1130,8 @@ static ssize_t wacom_show_remote_mode(struct kobject *kobj,
1130 struct kobj_attribute *kattr, 1130 struct kobj_attribute *kattr,
1131 char *buf, int index) 1131 char *buf, int index)
1132{ 1132{
1133 struct device *dev = container_of(kobj->parent, struct device, kobj); 1133 struct device *dev = kobj_to_dev(kobj->parent);
1134 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 1134 struct hid_device *hdev = to_hid_device(dev);
1135 struct wacom *wacom = hid_get_drvdata(hdev); 1135 struct wacom *wacom = hid_get_drvdata(hdev);
1136 u8 mode; 1136 u8 mode;
1137 1137
@@ -1241,8 +1241,8 @@ static ssize_t wacom_store_unpair_remote(struct kobject *kobj,
1241 const char *buf, size_t count) 1241 const char *buf, size_t count)
1242{ 1242{
1243 unsigned char selector = 0; 1243 unsigned char selector = 0;
1244 struct device *dev = container_of(kobj->parent, struct device, kobj); 1244 struct device *dev = kobj_to_dev(kobj->parent);
1245 struct hid_device *hdev = container_of(dev, struct hid_device, dev); 1245 struct hid_device *hdev = to_hid_device(dev);
1246 struct wacom *wacom = hid_get_drvdata(hdev); 1246 struct wacom *wacom = hid_get_drvdata(hdev);
1247 int err; 1247 int err;
1248 1248
@@ -1353,8 +1353,7 @@ static void wacom_clean_inputs(struct wacom *wacom)
1353 else 1353 else
1354 input_free_device(wacom->wacom_wac.pad_input); 1354 input_free_device(wacom->wacom_wac.pad_input);
1355 } 1355 }
1356 if (wacom->remote_dir) 1356 kobject_put(wacom->remote_dir);
1357 kobject_put(wacom->remote_dir);
1358 wacom->wacom_wac.pen_input = NULL; 1357 wacom->wacom_wac.pen_input = NULL;
1359 wacom->wacom_wac.touch_input = NULL; 1358 wacom->wacom_wac.touch_input = NULL;
1360 wacom->wacom_wac.pad_input = NULL; 1359 wacom->wacom_wac.pad_input = NULL;
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
index 01a4f05c1642..99ef77fcfb80 100644
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -34,6 +34,9 @@
34 */ 34 */
35#define WACOM_CONTACT_AREA_SCALE 2607 35#define WACOM_CONTACT_AREA_SCALE 2607
36 36
37static void wacom_report_numbered_buttons(struct input_dev *input_dev,
38 int button_count, int mask);
39
37/* 40/*
38 * Percent of battery capacity for Graphire. 41 * Percent of battery capacity for Graphire.
39 * 8th value means AC online and show 100% capacity. 42 * 8th value means AC online and show 100% capacity.
@@ -436,16 +439,142 @@ exit:
436static void wacom_intuos_schedule_prox_event(struct wacom_wac *wacom_wac) 439static void wacom_intuos_schedule_prox_event(struct wacom_wac *wacom_wac)
437{ 440{
438 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac); 441 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
442 struct wacom_features *features = &wacom_wac->features;
439 struct hid_report *r; 443 struct hid_report *r;
440 struct hid_report_enum *re; 444 struct hid_report_enum *re;
441 445
442 re = &(wacom->hdev->report_enum[HID_FEATURE_REPORT]); 446 re = &(wacom->hdev->report_enum[HID_FEATURE_REPORT]);
443 r = re->report_id_hash[WACOM_REPORT_INTUOSREAD]; 447 if (features->type == INTUOSHT2)
448 r = re->report_id_hash[WACOM_REPORT_INTUOSHT2_ID];
449 else
450 r = re->report_id_hash[WACOM_REPORT_INTUOS_ID1];
444 if (r) { 451 if (r) {
445 hid_hw_request(wacom->hdev, r, HID_REQ_GET_REPORT); 452 hid_hw_request(wacom->hdev, r, HID_REQ_GET_REPORT);
446 } 453 }
447} 454}
448 455
456static int wacom_intuos_pad(struct wacom_wac *wacom)
457{
458 struct wacom_features *features = &wacom->features;
459 unsigned char *data = wacom->data;
460 struct input_dev *input = wacom->pad_input;
461 int i;
462 int buttons = 0, nbuttons = features->numbered_buttons;
463 int keys = 0, nkeys = 0;
464 int ring1 = 0, ring2 = 0;
465 int strip1 = 0, strip2 = 0;
466 bool prox = false;
467
468 /* pad packets. Works as a second tool and is always in prox */
469 if (!(data[0] == WACOM_REPORT_INTUOSPAD || data[0] == WACOM_REPORT_INTUOS5PAD ||
470 data[0] == WACOM_REPORT_CINTIQPAD))
471 return 0;
472
473 if (features->type >= INTUOS4S && features->type <= INTUOS4L) {
474 buttons = (data[3] << 1) | (data[2] & 0x01);
475 ring1 = data[1];
476 } else if (features->type == DTK) {
477 buttons = data[6];
478 } else if (features->type == WACOM_13HD) {
479 buttons = (data[4] << 1) | (data[3] & 0x01);
480 } else if (features->type == WACOM_24HD) {
481 buttons = (data[8] << 8) | data[6];
482 ring1 = data[1];
483 ring2 = data[2];
484
485 /*
486 * Three "buttons" are available on the 24HD which are
487 * physically implemented as a touchstrip. Each button
488 * is approximately 3 bits wide with a 2 bit spacing.
489 * The raw touchstrip bits are stored at:
490 * ((data[3] & 0x1f) << 8) | data[4])
491 */
492 nkeys = 3;
493 keys = ((data[3] & 0x1C) ? 1<<2 : 0) |
494 ((data[4] & 0xE0) ? 1<<1 : 0) |
495 ((data[4] & 0x07) ? 1<<0 : 0);
496 } else if (features->type == WACOM_27QHD) {
497 nkeys = 3;
498 keys = data[2] & 0x07;
499
500 input_report_abs(input, ABS_X, be16_to_cpup((__be16 *)&data[4]));
501 input_report_abs(input, ABS_Y, be16_to_cpup((__be16 *)&data[6]));
502 input_report_abs(input, ABS_Z, be16_to_cpup((__be16 *)&data[8]));
503 } else if (features->type == CINTIQ_HYBRID) {
504 /*
505 * Do not send hardware buttons under Android. They
506 * are already sent to the system through GPIO (and
507 * have different meaning).
508 *
509 * d-pad right -> data[4] & 0x10
510 * d-pad up -> data[4] & 0x20
511 * d-pad left -> data[4] & 0x40
512 * d-pad down -> data[4] & 0x80
513 * d-pad center -> data[3] & 0x01
514 */
515 buttons = (data[4] << 1) | (data[3] & 0x01);
516 } else if (features->type == CINTIQ_COMPANION_2) {
517 /* d-pad right -> data[4] & 0x10
518 * d-pad up -> data[4] & 0x20
519 * d-pad left -> data[4] & 0x40
520 * d-pad down -> data[4] & 0x80
521 * d-pad center -> data[3] & 0x01
522 */
523 buttons = ((data[2] >> 4) << 7) |
524 ((data[1] & 0x04) << 6) |
525 ((data[2] & 0x0F) << 2) |
526 (data[1] & 0x03);
527 } else if (features->type >= INTUOS5S && features->type <= INTUOSPL) {
528 /*
529 * ExpressKeys on Intuos5/Intuos Pro have a capacitive sensor in
530 * addition to the mechanical switch. Switch data is
531 * stored in data[4], capacitive data in data[5].
532 *
533 * Touch ring mode switch (data[3]) has no capacitive sensor
534 */
535 buttons = (data[4] << 1) | (data[3] & 0x01);
536 ring1 = data[2];
537 } else {
538 if (features->type == WACOM_21UX2 || features->type == WACOM_22HD) {
539 buttons = (data[8] << 10) | ((data[7] & 0x01) << 9) |
540 (data[6] << 1) | (data[5] & 0x01);
541
542 if (features->type == WACOM_22HD) {
543 nkeys = 3;
544 keys = data[9] & 0x07;
545 }
546 } else {
547 buttons = ((data[6] & 0x10) << 10) |
548 ((data[5] & 0x10) << 9) |
549 ((data[6] & 0x0F) << 4) |
550 (data[5] & 0x0F);
551 }
552 strip1 = ((data[1] & 0x1f) << 8) | data[2];
553 strip2 = ((data[3] & 0x1f) << 8) | data[4];
554 }
555
556 prox = (buttons & ~(~0 << nbuttons)) | (keys & ~(~0 << nkeys)) |
557 (ring1 & 0x80) | (ring2 & 0x80) | strip1 | strip2;
558
559 wacom_report_numbered_buttons(input, nbuttons, buttons);
560
561 for (i = 0; i < nkeys; i++)
562 input_report_key(input, KEY_PROG1 + i, keys & (1 << i));
563
564 input_report_abs(input, ABS_RX, strip1);
565 input_report_abs(input, ABS_RY, strip2);
566
567 input_report_abs(input, ABS_WHEEL, (ring1 & 0x80) ? (ring1 & 0x7f) : 0);
568 input_report_abs(input, ABS_THROTTLE, (ring2 & 0x80) ? (ring2 & 0x7f) : 0);
569
570 input_report_key(input, wacom->tool[1], prox ? 1 : 0);
571 input_report_abs(input, ABS_MISC, prox ? PAD_DEVICE_ID : 0);
572
573 input_event(input, EV_MSC, MSC_SERIAL, 0xffffffff);
574
575 return 1;
576}
577
449static int wacom_intuos_inout(struct wacom_wac *wacom) 578static int wacom_intuos_inout(struct wacom_wac *wacom)
450{ 579{
451 struct wacom_features *features = &wacom->features; 580 struct wacom_features *features = &wacom->features;
@@ -755,19 +884,40 @@ static int wacom_remote_status_irq(struct wacom_wac *wacom_wac, size_t len)
755 return 0; 884 return 0;
756} 885}
757 886
758static void wacom_intuos_general(struct wacom_wac *wacom) 887static int wacom_intuos_general(struct wacom_wac *wacom)
759{ 888{
760 struct wacom_features *features = &wacom->features; 889 struct wacom_features *features = &wacom->features;
761 unsigned char *data = wacom->data; 890 unsigned char *data = wacom->data;
762 struct input_dev *input = wacom->pen_input; 891 struct input_dev *input = wacom->pen_input;
763 unsigned int t; 892 int idx = (features->type == INTUOS) ? (data[1] & 0x01) : 0;
893 unsigned char type = (data[1] >> 1) & 0x0F;
894 unsigned int x, y, distance, t;
764 895
765 /* general pen packet */ 896 if (data[0] != WACOM_REPORT_PENABLED && data[0] != WACOM_REPORT_CINTIQ &&
766 if ((data[1] & 0xb8) == 0xa0) { 897 data[0] != WACOM_REPORT_INTUOS_PEN)
767 t = (data[6] << 2) | ((data[7] >> 6) & 3); 898 return 0;
768 if (features->pressure_max == 2047) { 899
769 t = (t << 1) | (data[1] & 1); 900 x = (be16_to_cpup((__be16 *)&data[2]) << 1) | ((data[9] >> 1) & 1);
770 } 901 y = (be16_to_cpup((__be16 *)&data[4]) << 1) | (data[9] & 1);
902 distance = data[9] >> 2;
903 if (features->type < INTUOS3S) {
904 x >>= 1;
905 y >>= 1;
906 distance >>= 1;
907 }
908 input_report_abs(input, ABS_X, x);
909 input_report_abs(input, ABS_Y, y);
910 input_report_abs(input, ABS_DISTANCE, distance);
911
912 switch (type) {
913 case 0x00:
914 case 0x01:
915 case 0x02:
916 case 0x03:
917 /* general pen packet */
918 t = (data[6] << 3) | ((data[7] & 0xC0) >> 5) | (data[1] & 1);
919 if (features->pressure_max < 2047)
920 t >>= 1;
771 input_report_abs(input, ABS_PRESSURE, t); 921 input_report_abs(input, ABS_PRESSURE, t);
772 if (features->type != INTUOSHT2) { 922 if (features->type != INTUOSHT2) {
773 input_report_abs(input, ABS_TILT_X, 923 input_report_abs(input, ABS_TILT_X,
@@ -777,29 +927,112 @@ static void wacom_intuos_general(struct wacom_wac *wacom)
777 input_report_key(input, BTN_STYLUS, data[1] & 2); 927 input_report_key(input, BTN_STYLUS, data[1] & 2);
778 input_report_key(input, BTN_STYLUS2, data[1] & 4); 928 input_report_key(input, BTN_STYLUS2, data[1] & 4);
779 input_report_key(input, BTN_TOUCH, t > 10); 929 input_report_key(input, BTN_TOUCH, t > 10);
780 } 930 break;
781 931
782 /* airbrush second packet */ 932 case 0x0a:
783 if ((data[1] & 0xbc) == 0xb4) { 933 /* airbrush second packet */
784 input_report_abs(input, ABS_WHEEL, 934 input_report_abs(input, ABS_WHEEL,
785 (data[6] << 2) | ((data[7] >> 6) & 3)); 935 (data[6] << 2) | ((data[7] >> 6) & 3));
786 input_report_abs(input, ABS_TILT_X, 936 input_report_abs(input, ABS_TILT_X,
787 (((data[7] << 1) & 0x7e) | (data[8] >> 7)) - 64); 937 (((data[7] << 1) & 0x7e) | (data[8] >> 7)) - 64);
788 input_report_abs(input, ABS_TILT_Y, (data[8] & 0x7f) - 64); 938 input_report_abs(input, ABS_TILT_Y, (data[8] & 0x7f) - 64);
939 break;
940
941 case 0x05:
942 /* Rotation packet */
943 if (features->type >= INTUOS3S) {
944 /* I3 marker pen rotation */
945 t = (data[6] << 3) | ((data[7] >> 5) & 7);
946 t = (data[7] & 0x20) ? ((t > 900) ? ((t-1) / 2 - 1350) :
947 ((t-1) / 2 + 450)) : (450 - t / 2) ;
948 input_report_abs(input, ABS_Z, t);
949 } else {
950 /* 4D mouse 2nd packet */
951 t = (data[6] << 3) | ((data[7] >> 5) & 7);
952 input_report_abs(input, ABS_RZ, (data[7] & 0x20) ?
953 ((t - 1) / 2) : -t / 2);
954 }
955 break;
956
957 case 0x04:
958 /* 4D mouse 1st packet */
959 input_report_key(input, BTN_LEFT, data[8] & 0x01);
960 input_report_key(input, BTN_MIDDLE, data[8] & 0x02);
961 input_report_key(input, BTN_RIGHT, data[8] & 0x04);
962
963 input_report_key(input, BTN_SIDE, data[8] & 0x20);
964 input_report_key(input, BTN_EXTRA, data[8] & 0x10);
965 t = (data[6] << 2) | ((data[7] >> 6) & 3);
966 input_report_abs(input, ABS_THROTTLE, (data[8] & 0x08) ? -t : t);
967 break;
968
969 case 0x06:
970 /* I4 mouse */
971 input_report_key(input, BTN_LEFT, data[6] & 0x01);
972 input_report_key(input, BTN_MIDDLE, data[6] & 0x02);
973 input_report_key(input, BTN_RIGHT, data[6] & 0x04);
974 input_report_rel(input, REL_WHEEL, ((data[7] & 0x80) >> 7)
975 - ((data[7] & 0x40) >> 6));
976 input_report_key(input, BTN_SIDE, data[6] & 0x08);
977 input_report_key(input, BTN_EXTRA, data[6] & 0x10);
978
979 input_report_abs(input, ABS_TILT_X,
980 (((data[7] << 1) & 0x7e) | (data[8] >> 7)) - 64);
981 input_report_abs(input, ABS_TILT_Y, (data[8] & 0x7f) - 64);
982 break;
983
984 case 0x08:
985 if (wacom->tool[idx] == BTN_TOOL_MOUSE) {
986 /* 2D mouse packet */
987 input_report_key(input, BTN_LEFT, data[8] & 0x04);
988 input_report_key(input, BTN_MIDDLE, data[8] & 0x08);
989 input_report_key(input, BTN_RIGHT, data[8] & 0x10);
990 input_report_rel(input, REL_WHEEL, (data[8] & 0x01)
991 - ((data[8] & 0x02) >> 1));
992
993 /* I3 2D mouse side buttons */
994 if (features->type >= INTUOS3S && features->type <= INTUOS3L) {
995 input_report_key(input, BTN_SIDE, data[8] & 0x40);
996 input_report_key(input, BTN_EXTRA, data[8] & 0x20);
997 }
998 }
999 else if (wacom->tool[idx] == BTN_TOOL_LENS) {
1000 /* Lens cursor packets */
1001 input_report_key(input, BTN_LEFT, data[8] & 0x01);
1002 input_report_key(input, BTN_MIDDLE, data[8] & 0x02);
1003 input_report_key(input, BTN_RIGHT, data[8] & 0x04);
1004 input_report_key(input, BTN_SIDE, data[8] & 0x10);
1005 input_report_key(input, BTN_EXTRA, data[8] & 0x08);
1006 }
1007 break;
1008
1009 case 0x07:
1010 case 0x09:
1011 case 0x0b:
1012 case 0x0c:
1013 case 0x0d:
1014 case 0x0e:
1015 case 0x0f:
1016 /* unhandled */
1017 break;
789 } 1018 }
1019
1020 input_report_abs(input, ABS_MISC, wacom->id[idx]); /* report tool id */
1021 input_report_key(input, wacom->tool[idx], 1);
1022 input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
1023 wacom->reporting_data = true;
1024 return 2;
790} 1025}
791 1026
792static int wacom_intuos_irq(struct wacom_wac *wacom) 1027static int wacom_intuos_irq(struct wacom_wac *wacom)
793{ 1028{
794 struct wacom_features *features = &wacom->features;
795 unsigned char *data = wacom->data; 1029 unsigned char *data = wacom->data;
796 struct input_dev *input = wacom->pen_input; 1030 struct input_dev *input = wacom->pen_input;
797 unsigned int t; 1031 int result;
798 int idx = 0, result;
799 1032
800 if (data[0] != WACOM_REPORT_PENABLED && 1033 if (data[0] != WACOM_REPORT_PENABLED &&
801 data[0] != WACOM_REPORT_INTUOSREAD && 1034 data[0] != WACOM_REPORT_INTUOS_ID1 &&
802 data[0] != WACOM_REPORT_INTUOSWRITE && 1035 data[0] != WACOM_REPORT_INTUOS_ID2 &&
803 data[0] != WACOM_REPORT_INTUOSPAD && 1036 data[0] != WACOM_REPORT_INTUOSPAD &&
804 data[0] != WACOM_REPORT_INTUOS_PEN && 1037 data[0] != WACOM_REPORT_INTUOS_PEN &&
805 data[0] != WACOM_REPORT_CINTIQ && 1038 data[0] != WACOM_REPORT_CINTIQ &&
@@ -810,339 +1043,22 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
810 return 0; 1043 return 0;
811 } 1044 }
812 1045
813 /* tool number */ 1046 /* process pad events */
814 if (features->type == INTUOS) 1047 result = wacom_intuos_pad(wacom);
815 idx = data[1] & 0x01; 1048 if (result)
816 1049 return result;
817 /* pad packets. Works as a second tool and is always in prox */
818 if (data[0] == WACOM_REPORT_INTUOSPAD || data[0] == WACOM_REPORT_INTUOS5PAD ||
819 data[0] == WACOM_REPORT_CINTIQPAD) {
820 input = wacom->pad_input;
821 if (features->type >= INTUOS4S && features->type <= INTUOS4L) {
822 input_report_key(input, BTN_0, (data[2] & 0x01));
823 input_report_key(input, BTN_1, (data[3] & 0x01));
824 input_report_key(input, BTN_2, (data[3] & 0x02));
825 input_report_key(input, BTN_3, (data[3] & 0x04));
826 input_report_key(input, BTN_4, (data[3] & 0x08));
827 input_report_key(input, BTN_5, (data[3] & 0x10));
828 input_report_key(input, BTN_6, (data[3] & 0x20));
829 if (data[1] & 0x80) {
830 input_report_abs(input, ABS_WHEEL, (data[1] & 0x7f));
831 } else {
832 /* Out of proximity, clear wheel value. */
833 input_report_abs(input, ABS_WHEEL, 0);
834 }
835 if (features->type != INTUOS4S) {
836 input_report_key(input, BTN_7, (data[3] & 0x40));
837 input_report_key(input, BTN_8, (data[3] & 0x80));
838 }
839 if (data[1] | (data[2] & 0x01) | data[3]) {
840 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
841 } else {
842 input_report_abs(input, ABS_MISC, 0);
843 }
844 } else if (features->type == DTK) {
845 input_report_key(input, BTN_0, (data[6] & 0x01));
846 input_report_key(input, BTN_1, (data[6] & 0x02));
847 input_report_key(input, BTN_2, (data[6] & 0x04));
848 input_report_key(input, BTN_3, (data[6] & 0x08));
849 input_report_key(input, BTN_4, (data[6] & 0x10));
850 input_report_key(input, BTN_5, (data[6] & 0x20));
851 if (data[6] & 0x3f) {
852 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
853 } else {
854 input_report_abs(input, ABS_MISC, 0);
855 }
856 } else if (features->type == WACOM_13HD) {
857 input_report_key(input, BTN_0, (data[3] & 0x01));
858 input_report_key(input, BTN_1, (data[4] & 0x01));
859 input_report_key(input, BTN_2, (data[4] & 0x02));
860 input_report_key(input, BTN_3, (data[4] & 0x04));
861 input_report_key(input, BTN_4, (data[4] & 0x08));
862 input_report_key(input, BTN_5, (data[4] & 0x10));
863 input_report_key(input, BTN_6, (data[4] & 0x20));
864 input_report_key(input, BTN_7, (data[4] & 0x40));
865 input_report_key(input, BTN_8, (data[4] & 0x80));
866 if ((data[3] & 0x01) | data[4]) {
867 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
868 } else {
869 input_report_abs(input, ABS_MISC, 0);
870 }
871 } else if (features->type == WACOM_24HD) {
872 input_report_key(input, BTN_0, (data[6] & 0x01));
873 input_report_key(input, BTN_1, (data[6] & 0x02));
874 input_report_key(input, BTN_2, (data[6] & 0x04));
875 input_report_key(input, BTN_3, (data[6] & 0x08));
876 input_report_key(input, BTN_4, (data[6] & 0x10));
877 input_report_key(input, BTN_5, (data[6] & 0x20));
878 input_report_key(input, BTN_6, (data[6] & 0x40));
879 input_report_key(input, BTN_7, (data[6] & 0x80));
880 input_report_key(input, BTN_8, (data[8] & 0x01));
881 input_report_key(input, BTN_9, (data[8] & 0x02));
882 input_report_key(input, BTN_A, (data[8] & 0x04));
883 input_report_key(input, BTN_B, (data[8] & 0x08));
884 input_report_key(input, BTN_C, (data[8] & 0x10));
885 input_report_key(input, BTN_X, (data[8] & 0x20));
886 input_report_key(input, BTN_Y, (data[8] & 0x40));
887 input_report_key(input, BTN_Z, (data[8] & 0x80));
888
889 /*
890 * Three "buttons" are available on the 24HD which are
891 * physically implemented as a touchstrip. Each button
892 * is approximately 3 bits wide with a 2 bit spacing.
893 * The raw touchstrip bits are stored at:
894 * ((data[3] & 0x1f) << 8) | data[4])
895 */
896 input_report_key(input, KEY_PROG1, data[4] & 0x07);
897 input_report_key(input, KEY_PROG2, data[4] & 0xE0);
898 input_report_key(input, KEY_PROG3, data[3] & 0x1C);
899
900 if (data[1] & 0x80) {
901 input_report_abs(input, ABS_WHEEL, (data[1] & 0x7f));
902 } else {
903 /* Out of proximity, clear wheel value. */
904 input_report_abs(input, ABS_WHEEL, 0);
905 }
906
907 if (data[2] & 0x80) {
908 input_report_abs(input, ABS_THROTTLE, (data[2] & 0x7f));
909 } else {
910 /* Out of proximity, clear second wheel value. */
911 input_report_abs(input, ABS_THROTTLE, 0);
912 }
913
914 if (data[1] | data[2] | (data[3] & 0x1f) | data[4] | data[6] | data[8]) {
915 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
916 } else {
917 input_report_abs(input, ABS_MISC, 0);
918 }
919 } else if (features->type == WACOM_27QHD) {
920 input_report_key(input, KEY_PROG1, data[2] & 0x01);
921 input_report_key(input, KEY_PROG2, data[2] & 0x02);
922 input_report_key(input, KEY_PROG3, data[2] & 0x04);
923
924 input_report_abs(input, ABS_X, be16_to_cpup((__be16 *)&data[4]));
925 input_report_abs(input, ABS_Y, be16_to_cpup((__be16 *)&data[6]));
926 input_report_abs(input, ABS_Z, be16_to_cpup((__be16 *)&data[8]));
927 if ((data[2] & 0x07) | data[4] | data[5] | data[6] | data[7] | data[8] | data[9]) {
928 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
929 } else {
930 input_report_abs(input, ABS_MISC, 0);
931 }
932 } else if (features->type == CINTIQ_HYBRID) {
933 /*
934 * Do not send hardware buttons under Android. They
935 * are already sent to the system through GPIO (and
936 * have different meaning).
937 */
938 input_report_key(input, BTN_1, (data[4] & 0x01));
939 input_report_key(input, BTN_2, (data[4] & 0x02));
940 input_report_key(input, BTN_3, (data[4] & 0x04));
941 input_report_key(input, BTN_4, (data[4] & 0x08));
942
943 input_report_key(input, BTN_5, (data[4] & 0x10)); /* Right */
944 input_report_key(input, BTN_6, (data[4] & 0x20)); /* Up */
945 input_report_key(input, BTN_7, (data[4] & 0x40)); /* Left */
946 input_report_key(input, BTN_8, (data[4] & 0x80)); /* Down */
947 input_report_key(input, BTN_0, (data[3] & 0x01)); /* Center */
948
949 if (data[4] | (data[3] & 0x01)) {
950 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
951 } else {
952 input_report_abs(input, ABS_MISC, 0);
953 }
954
955 } else if (features->type == CINTIQ_COMPANION_2) {
956 input_report_key(input, BTN_1, (data[1] & 0x02));
957 input_report_key(input, BTN_2, (data[2] & 0x01));
958 input_report_key(input, BTN_3, (data[2] & 0x02));
959 input_report_key(input, BTN_4, (data[2] & 0x04));
960 input_report_key(input, BTN_5, (data[2] & 0x08));
961 input_report_key(input, BTN_6, (data[1] & 0x04));
962
963 input_report_key(input, BTN_7, (data[2] & 0x10)); /* Right */
964 input_report_key(input, BTN_8, (data[2] & 0x20)); /* Up */
965 input_report_key(input, BTN_9, (data[2] & 0x40)); /* Left */
966 input_report_key(input, BTN_A, (data[2] & 0x80)); /* Down */
967 input_report_key(input, BTN_0, (data[1] & 0x01)); /* Center */
968
969 if (data[2] | (data[1] & 0x07)) {
970 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
971 } else {
972 input_report_abs(input, ABS_MISC, 0);
973 }
974
975 } else if (features->type >= INTUOS5S && features->type <= INTUOSPL) {
976 int i;
977
978 /* Touch ring mode switch has no capacitive sensor */
979 input_report_key(input, BTN_0, (data[3] & 0x01));
980
981 /*
982 * ExpressKeys on Intuos5/Intuos Pro have a capacitive sensor in
983 * addition to the mechanical switch. Switch data is
984 * stored in data[4], capacitive data in data[5].
985 */
986 for (i = 0; i < 8; i++)
987 input_report_key(input, BTN_1 + i, data[4] & (1 << i));
988
989 if (data[2] & 0x80) {
990 input_report_abs(input, ABS_WHEEL, (data[2] & 0x7f));
991 } else {
992 /* Out of proximity, clear wheel value. */
993 input_report_abs(input, ABS_WHEEL, 0);
994 }
995
996 if (data[2] | (data[3] & 0x01) | data[4] | data[5]) {
997 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
998 } else {
999 input_report_abs(input, ABS_MISC, 0);
1000 }
1001 } else {
1002 if (features->type == WACOM_21UX2 || features->type == WACOM_22HD) {
1003 input_report_key(input, BTN_0, (data[5] & 0x01));
1004 input_report_key(input, BTN_1, (data[6] & 0x01));
1005 input_report_key(input, BTN_2, (data[6] & 0x02));
1006 input_report_key(input, BTN_3, (data[6] & 0x04));
1007 input_report_key(input, BTN_4, (data[6] & 0x08));
1008 input_report_key(input, BTN_5, (data[6] & 0x10));
1009 input_report_key(input, BTN_6, (data[6] & 0x20));
1010 input_report_key(input, BTN_7, (data[6] & 0x40));
1011 input_report_key(input, BTN_8, (data[6] & 0x80));
1012 input_report_key(input, BTN_9, (data[7] & 0x01));
1013 input_report_key(input, BTN_A, (data[8] & 0x01));
1014 input_report_key(input, BTN_B, (data[8] & 0x02));
1015 input_report_key(input, BTN_C, (data[8] & 0x04));
1016 input_report_key(input, BTN_X, (data[8] & 0x08));
1017 input_report_key(input, BTN_Y, (data[8] & 0x10));
1018 input_report_key(input, BTN_Z, (data[8] & 0x20));
1019 input_report_key(input, BTN_BASE, (data[8] & 0x40));
1020 input_report_key(input, BTN_BASE2, (data[8] & 0x80));
1021
1022 if (features->type == WACOM_22HD) {
1023 input_report_key(input, KEY_PROG1, data[9] & 0x01);
1024 input_report_key(input, KEY_PROG2, data[9] & 0x02);
1025 input_report_key(input, KEY_PROG3, data[9] & 0x04);
1026 }
1027 } else {
1028 input_report_key(input, BTN_0, (data[5] & 0x01));
1029 input_report_key(input, BTN_1, (data[5] & 0x02));
1030 input_report_key(input, BTN_2, (data[5] & 0x04));
1031 input_report_key(input, BTN_3, (data[5] & 0x08));
1032 input_report_key(input, BTN_4, (data[6] & 0x01));
1033 input_report_key(input, BTN_5, (data[6] & 0x02));
1034 input_report_key(input, BTN_6, (data[6] & 0x04));
1035 input_report_key(input, BTN_7, (data[6] & 0x08));
1036 input_report_key(input, BTN_8, (data[5] & 0x10));
1037 input_report_key(input, BTN_9, (data[6] & 0x10));
1038 }
1039 input_report_abs(input, ABS_RX, ((data[1] & 0x1f) << 8) | data[2]);
1040 input_report_abs(input, ABS_RY, ((data[3] & 0x1f) << 8) | data[4]);
1041
1042 if ((data[5] & 0x1f) | data[6] | (data[1] & 0x1f) |
1043 data[2] | (data[3] & 0x1f) | data[4] | data[8] |
1044 (data[7] & 0x01)) {
1045 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
1046 } else {
1047 input_report_abs(input, ABS_MISC, 0);
1048 }
1049 }
1050 return 1;
1051 }
1052 1050
1053 /* process in/out prox events */ 1051 /* process in/out prox events */
1054 result = wacom_intuos_inout(wacom); 1052 result = wacom_intuos_inout(wacom);
1055 if (result) 1053 if (result)
1056 return result - 1; 1054 return result - 1;
1057
1058 if (features->type >= INTUOS3S) {
1059 input_report_abs(input, ABS_X, (data[2] << 9) | (data[3] << 1) | ((data[9] >> 1) & 1));
1060 input_report_abs(input, ABS_Y, (data[4] << 9) | (data[5] << 1) | (data[9] & 1));
1061 input_report_abs(input, ABS_DISTANCE, ((data[9] >> 2) & 0x3f));
1062 } else {
1063 input_report_abs(input, ABS_X, be16_to_cpup((__be16 *)&data[2]));
1064 input_report_abs(input, ABS_Y, be16_to_cpup((__be16 *)&data[4]));
1065 input_report_abs(input, ABS_DISTANCE, ((data[9] >> 3) & 0x1f));
1066 }
1067 1055
1068 /* process general packets */ 1056 /* process general packets */
1069 wacom_intuos_general(wacom); 1057 result = wacom_intuos_general(wacom);
1070 1058 if (result)
1071 /* 4D mouse, 2D mouse, marker pen rotation, tilt mouse, or Lens cursor packets */ 1059 return result - 1;
1072 if ((data[1] & 0xbc) == 0xa8 || (data[1] & 0xbe) == 0xb0 || (data[1] & 0xbc) == 0xac) {
1073
1074 if (data[1] & 0x02) {
1075 /* Rotation packet */
1076 if (features->type >= INTUOS3S) {
1077 /* I3 marker pen rotation */
1078 t = (data[6] << 3) | ((data[7] >> 5) & 7);
1079 t = (data[7] & 0x20) ? ((t > 900) ? ((t-1) / 2 - 1350) :
1080 ((t-1) / 2 + 450)) : (450 - t / 2) ;
1081 input_report_abs(input, ABS_Z, t);
1082 } else {
1083 /* 4D mouse rotation packet */
1084 t = (data[6] << 3) | ((data[7] >> 5) & 7);
1085 input_report_abs(input, ABS_RZ, (data[7] & 0x20) ?
1086 ((t - 1) / 2) : -t / 2);
1087 }
1088
1089 } else if (!(data[1] & 0x10) && features->type < INTUOS3S) {
1090 /* 4D mouse packet */
1091 input_report_key(input, BTN_LEFT, data[8] & 0x01);
1092 input_report_key(input, BTN_MIDDLE, data[8] & 0x02);
1093 input_report_key(input, BTN_RIGHT, data[8] & 0x04);
1094
1095 input_report_key(input, BTN_SIDE, data[8] & 0x20);
1096 input_report_key(input, BTN_EXTRA, data[8] & 0x10);
1097 t = (data[6] << 2) | ((data[7] >> 6) & 3);
1098 input_report_abs(input, ABS_THROTTLE, (data[8] & 0x08) ? -t : t);
1099
1100 } else if (wacom->tool[idx] == BTN_TOOL_MOUSE) {
1101 /* I4 mouse */
1102 if (features->type >= INTUOS4S && features->type <= INTUOSPL) {
1103 input_report_key(input, BTN_LEFT, data[6] & 0x01);
1104 input_report_key(input, BTN_MIDDLE, data[6] & 0x02);
1105 input_report_key(input, BTN_RIGHT, data[6] & 0x04);
1106 input_report_rel(input, REL_WHEEL, ((data[7] & 0x80) >> 7)
1107 - ((data[7] & 0x40) >> 6));
1108 input_report_key(input, BTN_SIDE, data[6] & 0x08);
1109 input_report_key(input, BTN_EXTRA, data[6] & 0x10);
1110
1111 input_report_abs(input, ABS_TILT_X,
1112 (((data[7] << 1) & 0x7e) | (data[8] >> 7)) - 64);
1113 input_report_abs(input, ABS_TILT_Y, (data[8] & 0x7f) - 64);
1114 } else {
1115 /* 2D mouse packet */
1116 input_report_key(input, BTN_LEFT, data[8] & 0x04);
1117 input_report_key(input, BTN_MIDDLE, data[8] & 0x08);
1118 input_report_key(input, BTN_RIGHT, data[8] & 0x10);
1119 input_report_rel(input, REL_WHEEL, (data[8] & 0x01)
1120 - ((data[8] & 0x02) >> 1));
1121
1122 /* I3 2D mouse side buttons */
1123 if (features->type >= INTUOS3S && features->type <= INTUOS3L) {
1124 input_report_key(input, BTN_SIDE, data[8] & 0x40);
1125 input_report_key(input, BTN_EXTRA, data[8] & 0x20);
1126 }
1127 }
1128 } else if ((features->type < INTUOS3S || features->type == INTUOS3L ||
1129 features->type == INTUOS4L || features->type == INTUOS5L ||
1130 features->type == INTUOSPL) &&
1131 wacom->tool[idx] == BTN_TOOL_LENS) {
1132 /* Lens cursor packets */
1133 input_report_key(input, BTN_LEFT, data[8] & 0x01);
1134 input_report_key(input, BTN_MIDDLE, data[8] & 0x02);
1135 input_report_key(input, BTN_RIGHT, data[8] & 0x04);
1136 input_report_key(input, BTN_SIDE, data[8] & 0x10);
1137 input_report_key(input, BTN_EXTRA, data[8] & 0x08);
1138 }
1139 }
1140 1060
1141 input_report_abs(input, ABS_MISC, wacom->id[idx]); /* report tool id */ 1061 return 0;
1142 input_report_key(input, wacom->tool[idx], 1);
1143 input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
1144 wacom->reporting_data = true;
1145 return 1;
1146} 1062}
1147 1063
1148static int int_dist(int x1, int y1, int x2, int y2) 1064static int int_dist(int x1, int y1, int x2, int y2)
@@ -2509,7 +2425,7 @@ void wacom_setup_device_quirks(struct wacom *wacom)
2509 features->quirks |= WACOM_QUIRK_BATTERY; 2425 features->quirks |= WACOM_QUIRK_BATTERY;
2510 2426
2511 /* quirk for bamboo touch with 2 low res touches */ 2427 /* quirk for bamboo touch with 2 low res touches */
2512 if (features->type == BAMBOO_PT && 2428 if ((features->type == BAMBOO_PT || features->type == BAMBOO_TOUCH) &&
2513 features->pktlen == WACOM_PKGLEN_BBTOUCH) { 2429 features->pktlen == WACOM_PKGLEN_BBTOUCH) {
2514 features->x_max <<= 5; 2430 features->x_max <<= 5;
2515 features->y_max <<= 5; 2431 features->y_max <<= 5;
@@ -2806,6 +2722,19 @@ static void wacom_setup_numbered_buttons(struct input_dev *input_dev,
2806 __set_bit(BTN_BASE + (i-16), input_dev->keybit); 2722 __set_bit(BTN_BASE + (i-16), input_dev->keybit);
2807} 2723}
2808 2724
2725static void wacom_report_numbered_buttons(struct input_dev *input_dev,
2726 int button_count, int mask)
2727{
2728 int i;
2729
2730 for (i = 0; i < button_count && i < 10; i++)
2731 input_report_key(input_dev, BTN_0 + i, mask & (1 << i));
2732 for (i = 10; i < button_count && i < 16; i++)
2733 input_report_key(input_dev, BTN_A + (i-10), mask & (1 << i));
2734 for (i = 16; i < button_count && i < 18; i++)
2735 input_report_key(input_dev, BTN_BASE + (i-16), mask & (1 << i));
2736}
2737
2809int wacom_setup_pad_input_capabilities(struct input_dev *input_dev, 2738int wacom_setup_pad_input_capabilities(struct input_dev *input_dev,
2810 struct wacom_wac *wacom_wac) 2739 struct wacom_wac *wacom_wac)
2811{ 2740{
diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h
index 877c24a5df94..25baa7f29599 100644
--- a/drivers/hid/wacom_wac.h
+++ b/drivers/hid/wacom_wac.h
@@ -47,8 +47,8 @@
47/* wacom data packet report IDs */ 47/* wacom data packet report IDs */
48#define WACOM_REPORT_PENABLED 2 48#define WACOM_REPORT_PENABLED 2
49#define WACOM_REPORT_PENABLED_BT 3 49#define WACOM_REPORT_PENABLED_BT 3
50#define WACOM_REPORT_INTUOSREAD 5 50#define WACOM_REPORT_INTUOS_ID1 5
51#define WACOM_REPORT_INTUOSWRITE 6 51#define WACOM_REPORT_INTUOS_ID2 6
52#define WACOM_REPORT_INTUOSPAD 12 52#define WACOM_REPORT_INTUOSPAD 12
53#define WACOM_REPORT_INTUOS5PAD 3 53#define WACOM_REPORT_INTUOS5PAD 3
54#define WACOM_REPORT_DTUSPAD 21 54#define WACOM_REPORT_DTUSPAD 21
@@ -70,6 +70,7 @@
70#define WACOM_REPORT_DEVICE_LIST 16 70#define WACOM_REPORT_DEVICE_LIST 16
71#define WACOM_REPORT_INTUOS_PEN 16 71#define WACOM_REPORT_INTUOS_PEN 16
72#define WACOM_REPORT_REMOTE 17 72#define WACOM_REPORT_REMOTE 17
73#define WACOM_REPORT_INTUOSHT2_ID 8
73 74
74/* device quirks */ 75/* device quirks */
75#define WACOM_QUIRK_BBTOUCH_LOWRES 0x0001 76#define WACOM_QUIRK_BBTOUCH_LOWRES 0x0001
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 251a1d382e23..75b66eccc692 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -168,6 +168,8 @@ struct hid_item {
168#define HID_UP_MSVENDOR 0xff000000 168#define HID_UP_MSVENDOR 0xff000000
169#define HID_UP_CUSTOM 0x00ff0000 169#define HID_UP_CUSTOM 0x00ff0000
170#define HID_UP_LOGIVENDOR 0xffbc0000 170#define HID_UP_LOGIVENDOR 0xffbc0000
171#define HID_UP_LOGIVENDOR2 0xff090000
172#define HID_UP_LOGIVENDOR3 0xff430000
171#define HID_UP_LNVENDOR 0xffa00000 173#define HID_UP_LNVENDOR 0xffa00000
172#define HID_UP_SENSOR 0x00200000 174#define HID_UP_SENSOR 0x00200000
173 175
@@ -563,6 +565,9 @@ struct hid_device { /* device report descriptor */
563 wait_queue_head_t debug_wait; 565 wait_queue_head_t debug_wait;
564}; 566};
565 567
568#define to_hid_device(pdev) \
569 container_of(pdev, struct hid_device, dev)
570
566static inline void *hid_get_drvdata(struct hid_device *hdev) 571static inline void *hid_get_drvdata(struct hid_device *hdev)
567{ 572{
568 return dev_get_drvdata(&hdev->dev); 573 return dev_get_drvdata(&hdev->dev);
@@ -712,6 +717,9 @@ struct hid_driver {
712 struct device_driver driver; 717 struct device_driver driver;
713}; 718};
714 719
720#define to_hid_driver(pdrv) \
721 container_of(pdrv, struct hid_driver, driver)
722
715/** 723/**
716 * hid_ll_driver - low level driver callbacks 724 * hid_ll_driver - low level driver callbacks
717 * @start: called on probe to start the device 725 * @start: called on probe to start the device