thermal/core: Rename 'trips' to 'num_trips'
[platform/kernel/linux-rpi.git] / drivers / hid / hid-multitouch.c
index 3ea7cb1..6b86d36 100644 (file)
@@ -193,6 +193,8 @@ static void mt_post_parse(struct mt_device *td, struct mt_application *app);
 /* reserved                                    0x0014 */
 #define MT_CLS_WIN_8_FORCE_MULTI_INPUT         0x0015
 #define MT_CLS_WIN_8_DISABLE_WAKEUP            0x0016
+#define MT_CLS_WIN_8_NO_STICKY_FINGERS         0x0017
+#define MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU    0x0018
 
 /* vendor specific classes */
 #define MT_CLS_3M                              0x0101
@@ -285,6 +287,15 @@ static const struct mt_class mt_classes[] = {
                        MT_QUIRK_WIN8_PTP_BUTTONS |
                        MT_QUIRK_FORCE_MULTI_INPUT,
                .export_all_inputs = true },
+       { .name = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
+               .quirks = MT_QUIRK_IGNORE_DUPLICATES |
+                       MT_QUIRK_HOVERING |
+                       MT_QUIRK_CONTACT_CNT_ACCURATE |
+                       MT_QUIRK_STICKY_FINGERS |
+                       MT_QUIRK_WIN8_PTP_BUTTONS |
+                       MT_QUIRK_FORCE_MULTI_INPUT |
+                       MT_QUIRK_NOT_SEEN_MEANS_UP,
+               .export_all_inputs = true },
        { .name = MT_CLS_WIN_8_DISABLE_WAKEUP,
                .quirks = MT_QUIRK_ALWAYS_VALID |
                        MT_QUIRK_IGNORE_DUPLICATES |
@@ -294,6 +305,13 @@ static const struct mt_class mt_classes[] = {
                        MT_QUIRK_WIN8_PTP_BUTTONS |
                        MT_QUIRK_DISABLE_WAKEUP,
                .export_all_inputs = true },
+       { .name = MT_CLS_WIN_8_NO_STICKY_FINGERS,
+               .quirks = MT_QUIRK_ALWAYS_VALID |
+                       MT_QUIRK_IGNORE_DUPLICATES |
+                       MT_QUIRK_HOVERING |
+                       MT_QUIRK_CONTACT_CNT_ACCURATE |
+                       MT_QUIRK_WIN8_PTP_BUTTONS,
+               .export_all_inputs = true },
 
        /*
         * vendor specific classes
@@ -775,6 +793,7 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
                case HID_DG_CONFIDENCE:
                        if ((cls->name == MT_CLS_WIN_8 ||
                             cls->name == MT_CLS_WIN_8_FORCE_MULTI_INPUT ||
+                            cls->name == MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU ||
                             cls->name == MT_CLS_WIN_8_DISABLE_WAKEUP) &&
                                (field->application == HID_DG_TOUCHPAD ||
                                 field->application == HID_DG_TOUCHSCREEN))
@@ -1167,7 +1186,7 @@ static void mt_touch_report(struct hid_device *hid,
        int contact_count = -1;
 
        /* sticky fingers release in progress, abort */
-       if (test_and_set_bit(MT_IO_FLAGS_RUNNING, &td->mt_io_flags))
+       if (test_and_set_bit_lock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags))
                return;
 
        scantime = *app->scantime;
@@ -1248,7 +1267,7 @@ static void mt_touch_report(struct hid_device *hid,
                        del_timer(&td->release_timer);
        }
 
-       clear_bit(MT_IO_FLAGS_RUNNING, &td->mt_io_flags);
+       clear_bit_unlock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags);
 }
 
 static int mt_touch_input_configured(struct hid_device *hdev,
@@ -1683,11 +1702,11 @@ static void mt_expired_timeout(struct timer_list *t)
         * An input report came in just before we release the sticky fingers,
         * it will take care of the sticky fingers.
         */
-       if (test_and_set_bit(MT_IO_FLAGS_RUNNING, &td->mt_io_flags))
+       if (test_and_set_bit_lock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags))
                return;
        if (test_bit(MT_IO_FLAGS_PENDING_SLOTS, &td->mt_io_flags))
                mt_release_contacts(hdev);
-       clear_bit(MT_IO_FLAGS_RUNNING, &td->mt_io_flags);
+       clear_bit_unlock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags);
 }
 
 static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
@@ -1946,6 +1965,10 @@ static const struct hid_device_id mt_devices[] = {
                HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
                        USB_VENDOR_ID_ELAN, 0x313a) },
 
+       { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT,
+               HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
+                       USB_VENDOR_ID_ELAN, 0x3148) },
+
        /* Elitegroup panel */
        { .driver_data = MT_CLS_SERIAL,
                MT_USB_DEVICE(USB_VENDOR_ID_ELITEGROUP,
@@ -2024,6 +2047,12 @@ static const struct hid_device_id mt_devices[] = {
                           USB_VENDOR_ID_LENOVO,
                           USB_DEVICE_ID_LENOVO_X1_TAB3) },
 
+       /* Lenovo X12 TAB Gen 1 */
+       { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
+               HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8,
+                          USB_VENDOR_ID_LENOVO,
+                          USB_DEVICE_ID_LENOVO_X12_TAB) },
+
        /* MosArt panels */
        { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
                MT_USB_DEVICE(USB_VENDOR_ID_ASUS,
@@ -2120,6 +2149,11 @@ static const struct hid_device_id mt_devices[] = {
                MT_USB_DEVICE(USB_VENDOR_ID_VTL,
                        USB_DEVICE_ID_VTL_MULTITOUCH_FF3F) },
 
+       /* Winbond Electronics Corp. */
+       { .driver_data = MT_CLS_WIN_8_NO_STICKY_FINGERS,
+               HID_DEVICE(HID_BUS_ANY, HID_GROUP_MULTITOUCH_WIN_8,
+                          USB_VENDOR_ID_WINBOND, USB_DEVICE_ID_TSTP_MTOUCH) },
+
        /* Wistron panels */
        { .driver_data = MT_CLS_NSMU,
                MT_USB_DEVICE(USB_VENDOR_ID_WISTRON,
@@ -2163,6 +2197,9 @@ static const struct hid_device_id mt_devices[] = {
        { .driver_data = MT_CLS_GOOGLE,
                HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, USB_VENDOR_ID_GOOGLE,
                        USB_DEVICE_ID_GOOGLE_TOUCH_ROSE) },
+       { .driver_data = MT_CLS_GOOGLE,
+               HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8, USB_VENDOR_ID_GOOGLE,
+                       USB_DEVICE_ID_GOOGLE_WHISKERS) },
 
        /* Generic MT device */
        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_MULTITOUCH, HID_ANY_ID, HID_ANY_ID) },