Merge branch 'for-5.5/core' into for-linus
authorJiri Kosina <jkosina@suse.cz>
Fri, 29 Nov 2019 19:34:28 +0000 (20:34 +0100)
committerJiri Kosina <jkosina@suse.cz>
Fri, 29 Nov 2019 19:34:28 +0000 (20:34 +0100)
- hid_have_special_driver[] cleanup for LED devices (Heiner Kallweit)
- HID parser improvements (Blaž Hrastnik, Candle Sun)

drivers/hid/hid-ids.h
drivers/hid/hid-quirks.c
drivers/hid/hid-rmi.c
drivers/hid/i2c-hid/i2c-hid-core.c

index 447e8db..6273e71 100644 (file)
 #define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_094A    0x094a
 #define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_0941    0x0941
 #define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_0641    0x0641
+#define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_1f4a    0x1f4a
 
 #define USB_VENDOR_ID_HUION            0x256c
 #define USB_DEVICE_ID_HUION_TABLET     0x006e
 
 #define I2C_VENDOR_ID_RAYDIUM          0x2386
 #define I2C_PRODUCT_ID_RAYDIUM_4B33    0x4b33
+#define I2C_PRODUCT_ID_RAYDIUM_3118    0x3118
 
 #define USB_VENDOR_ID_RAZER            0x1532
 #define USB_DEVICE_ID_RAZER_BLADE_14   0x011D
index bdaab79..d1b39c2 100644 (file)
@@ -94,6 +94,7 @@ static const struct hid_device_id hid_quirks[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_094A), HID_QUIRK_ALWAYS_POLL },
        { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_0941), HID_QUIRK_ALWAYS_POLL },
        { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_0641), HID_QUIRK_ALWAYS_POLL },
+       { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_1f4a), HID_QUIRK_ALWAYS_POLL },
        { HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM, USB_DEVICE_ID_IDEACOM_IDC6680), HID_QUIRK_MULTI_INPUT },
        { HID_USB_DEVICE(USB_VENDOR_ID_INNOMEDIA, USB_DEVICE_ID_INNEX_GENESIS_ATARI), HID_QUIRK_MULTI_INPUT },
        { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X), HID_QUIRK_MULTI_INPUT },
index 7c6abd7..9ce22ac 100644 (file)
@@ -744,7 +744,8 @@ static void rmi_remove(struct hid_device *hdev)
 {
        struct rmi_data *hdata = hid_get_drvdata(hdev);
 
-       if (hdata->device_flags & RMI_DEVICE) {
+       if ((hdata->device_flags & RMI_DEVICE)
+           && test_bit(RMI_STARTED, &hdata->flags)) {
                clear_bit(RMI_STARTED, &hdata->flags);
                cancel_work_sync(&hdata->reset_work);
                rmi_unregister_transport_device(&hdata->xport);
index 04c0881..ac44bf7 100644 (file)
@@ -48,6 +48,7 @@
 #define I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV       BIT(0)
 #define I2C_HID_QUIRK_NO_IRQ_AFTER_RESET       BIT(1)
 #define I2C_HID_QUIRK_BOGUS_IRQ                        BIT(4)
+#define I2C_HID_QUIRK_RESET_ON_RESUME          BIT(5)
 
 /* flags */
 #define I2C_HID_STARTED                0
@@ -170,8 +171,12 @@ static const struct i2c_hid_quirks {
                I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV },
        { I2C_VENDOR_ID_HANTICK, I2C_PRODUCT_ID_HANTICK_5288,
                I2C_HID_QUIRK_NO_IRQ_AFTER_RESET },
+       { I2C_VENDOR_ID_RAYDIUM, I2C_PRODUCT_ID_RAYDIUM_3118,
+               I2C_HID_QUIRK_NO_IRQ_AFTER_RESET },
        { USB_VENDOR_ID_ELAN, HID_ANY_ID,
                 I2C_HID_QUIRK_BOGUS_IRQ },
+       { USB_VENDOR_ID_ALPS_JP, HID_ANY_ID,
+                I2C_HID_QUIRK_RESET_ON_RESUME },
        { 0, 0 }
 };
 
@@ -1212,8 +1217,15 @@ static int i2c_hid_resume(struct device *dev)
         * solves "incomplete reports" on Raydium devices 2386:3118 and
         * 2386:4B33 and fixes various SIS touchscreens no longer sending
         * data after a suspend/resume.
+        *
+        * However some ALPS touchpads generate IRQ storm without reset, so
+        * let's still reset them here.
         */
-       ret = i2c_hid_set_power(client, I2C_HID_PWR_ON);
+       if (ihid->quirks & I2C_HID_QUIRK_RESET_ON_RESUME)
+               ret = i2c_hid_hwreset(client);
+       else
+               ret = i2c_hid_set_power(client, I2C_HID_PWR_ON);
+
        if (ret)
                return ret;