HID: wacom: Add WACOM_DEVICETYPE_DIRECT for Cintiqs and similar
authorJason Gerecke <killertofu@gmail.com>
Mon, 8 Aug 2016 19:06:29 +0000 (12:06 -0700)
committerJiri Kosina <jkosina@suse.cz>
Wed, 10 Aug 2016 09:44:28 +0000 (11:44 +0200)
"Direct" input devices like Cintiqs and Tablet PCs set the INPUT_PROP_DIRECT
property to notify userspace that the sensor and screen are overlaid. This
information can also be useful elsewhere within the kernel driver, however,
so we introduce a new WACOM_DEVICETYPE_DIRECT that signals this to other
kernel code.

Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/wacom_wac.c
drivers/hid/wacom_wac.h

index 0914667585ceaed5a837dfb88003842db24aca75..a545c2451156dd7f54a81b072c6a2e95f757fa1e 100644 (file)
@@ -1750,10 +1750,10 @@ void wacom_wac_usage_mapping(struct hid_device *hdev,
 {
        struct wacom *wacom = hid_get_drvdata(hdev);
        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
+       struct wacom_features *features = &wacom_wac->features;
 
        /* currently, only direct devices have proper hid report descriptors */
-       __set_bit(INPUT_PROP_DIRECT, wacom_wac->pen_input->propbit);
-       __set_bit(INPUT_PROP_DIRECT, wacom_wac->touch_input->propbit);
+       features->device_type |= WACOM_DEVICETYPE_DIRECT;
 
        if (WACOM_PEN_FIELD(field))
                return wacom_wac_pen_usage_mapping(hdev, field, usage);
@@ -2459,6 +2459,33 @@ void wacom_setup_device_quirks(struct wacom *wacom)
        if (features->type == REMOTE)
                features->device_type = WACOM_DEVICETYPE_PAD;
 
+       switch (features->type) {
+       case PL:
+       case DTU:
+       case DTUS:
+       case DTUSX:
+       case WACOM_21UX2:
+       case WACOM_22HD:
+       case DTK:
+       case WACOM_24HD:
+       case WACOM_27QHD:
+       case CINTIQ_HYBRID:
+       case CINTIQ_COMPANION_2:
+       case CINTIQ:
+       case WACOM_BEE:
+       case WACOM_13HD:
+       case WACOM_24HDT:
+       case WACOM_27QHDT:
+       case TABLETPC:
+       case TABLETPCE:
+       case TABLETPC2FG:
+       case MTSCREEN:
+       case MTTPC:
+       case MTTPC_B:
+               features->device_type |= WACOM_DEVICETYPE_DIRECT;
+               break;
+       }
+
        if (wacom->hdev->bus == BUS_BLUETOOTH)
                features->quirks |= WACOM_QUIRK_BATTERY;
 
@@ -2492,6 +2519,11 @@ int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
        if (!(features->device_type & WACOM_DEVICETYPE_PEN))
                return -ENODEV;
 
+       if (features->device_type & WACOM_DEVICETYPE_DIRECT)
+               __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
+       else
+               __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
+
        if (features->type == HID_GENERIC)
                /* setup has already been done */
                return 0;
@@ -2510,7 +2542,6 @@ int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
        input_abs_set_res(input_dev, ABS_X, features->x_resolution);
        input_abs_set_res(input_dev, ABS_Y, features->y_resolution);
 
-
        switch (features->type) {
        case GRAPHIRE_BT:
                __clear_bit(ABS_MISC, input_dev->absbit);
@@ -2534,8 +2565,6 @@ int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
                __set_bit(BTN_TOOL_MOUSE, input_dev->keybit);
                __set_bit(BTN_STYLUS, input_dev->keybit);
                __set_bit(BTN_STYLUS2, input_dev->keybit);
-
-               __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
                break;
 
        case WACOM_27QHD:
@@ -2550,7 +2579,6 @@ int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
        case CINTIQ_COMPANION_2:
                input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
                input_abs_set_res(input_dev, ABS_Z, 287);
-               __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
                wacom_setup_cintiq(wacom_wac);
                break;
 
@@ -2566,8 +2594,6 @@ int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
                /* fall through */
 
        case INTUOS:
-               __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
-
                wacom_setup_intuos(wacom_wac);
                break;
 
@@ -2577,8 +2603,6 @@ int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
        case INTUOSPL:
        case INTUOS5S:
        case INTUOSPS:
-               __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
-
                input_set_abs_params(input_dev, ABS_DISTANCE, 0,
                                      features->distance_max,
                                      features->distance_fuzz, 0);
@@ -2608,8 +2632,6 @@ int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
                __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
                __set_bit(BTN_STYLUS, input_dev->keybit);
                __set_bit(BTN_STYLUS2, input_dev->keybit);
-
-               __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
                break;
 
        case PTU:
@@ -2620,16 +2642,12 @@ int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
                __set_bit(BTN_TOOL_PEN, input_dev->keybit);
                __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
                __set_bit(BTN_STYLUS, input_dev->keybit);
-
-               __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
                break;
 
        case INTUOSHT:
        case BAMBOO_PT:
        case BAMBOO_PEN:
        case INTUOSHT2:
-               __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
-
                if (features->type == INTUOSHT2) {
                        wacom_setup_basic_pro_pen(wacom_wac);
                } else {
@@ -2660,6 +2678,11 @@ int wacom_setup_touch_input_capabilities(struct input_dev *input_dev,
        if (!(features->device_type & WACOM_DEVICETYPE_TOUCH))
                return -ENODEV;
 
+       if (features->device_type & WACOM_DEVICETYPE_DIRECT)
+               __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
+       else
+               __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
+
        if (features->type == HID_GENERIC)
                /* setup has already been done */
                return 0;
@@ -2694,8 +2717,6 @@ int wacom_setup_touch_input_capabilities(struct input_dev *input_dev,
        case INTUOSPL:
        case INTUOS5S:
        case INTUOSPS:
-               __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
-
                input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, features->x_max, 0, 0);
                input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR, 0, features->y_max, 0, 0);
                input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
@@ -2718,7 +2739,6 @@ int wacom_setup_touch_input_capabilities(struct input_dev *input_dev,
 
        case TABLETPC:
        case TABLETPCE:
-               __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
                break;
 
        case INTUOSHT:
index 745e2c91cb5519f4930b9bbf2be7f3ea1fdfe1e2..de5d1adafc6be7ed169cfc86dcf696088f8a205b 100644 (file)
@@ -82,6 +82,7 @@
 #define WACOM_DEVICETYPE_TOUCH          0x0002
 #define WACOM_DEVICETYPE_PAD            0x0004
 #define WACOM_DEVICETYPE_WL_MONITOR     0x0008
+#define WACOM_DEVICETYPE_DIRECT         0x0010
 
 #define WACOM_VENDORDEFINED_PEN                0xff0d0001
 #define WACOM_G9_PAGE                  0xff090000