HID: wacom - Bamboo pen-only tablet does not support PAD
authorPing Cheng <pinglinux@gmail.com>
Tue, 18 Nov 2014 21:29:16 +0000 (13:29 -0800)
committerJiri Kosina <jkosina@suse.cz>
Thu, 20 Nov 2014 16:28:43 +0000 (17:28 +0100)
Bamboo models do not support HID_DG_CONTACTMAX. Plus, Bamboo pen-only
has touch descriptor. This leads to some complications in the code.

This patch also fixes duplicated PAD interfeaces for Intuos Pen
models.

Signed-off-by: Ping Cheng <pingc@wacom.com>
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/wacom.h
drivers/hid/wacom_sys.c
drivers/hid/wacom_wac.c

index 0cc5344..7db4328 100644 (file)
@@ -140,7 +140,7 @@ extern const struct hid_device_id wacom_ids[];
 
 void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len);
 void wacom_setup_device_quirks(struct wacom_features *features);
-int wacom_setup_input_capabilities(struct input_dev *input_dev,
+int wacom_setup_pentouch_input_capabilities(struct input_dev *input_dev,
                                   struct wacom_wac *wacom_wac);
 int wacom_setup_pad_input_capabilities(struct input_dev *input_dev,
                                       struct wacom_wac *wacom_wac);
index 8593047..68b6cd6 100644 (file)
@@ -192,9 +192,15 @@ static void wacom_usage_mapping(struct hid_device *hdev,
        if (!pen && !finger)
                return;
 
-       if (finger && !features->touch_max)
-               /* touch device at least supports one touch point */
-               features->touch_max = 1;
+       /*
+        * Bamboo models do not support HID_DG_CONTACTMAX.
+        * And, Bamboo Pen only descriptor contains touch.
+        */
+       if (features->type != BAMBOO_PT) {
+               /* ISDv4 touch devices at least supports one touch point */
+               if (finger && !features->touch_max)
+                       features->touch_max = 1;
+       }
 
        switch (usage->hid) {
        case HID_GD_X:
@@ -1151,13 +1157,12 @@ static int wacom_register_inputs(struct wacom *wacom)
        if (!input_dev || !pad_input_dev)
                return -EINVAL;
 
-       error = wacom_setup_input_capabilities(input_dev, wacom_wac);
-       if (error)
-               return error;
-
-       error = input_register_device(input_dev);
-       if (error)
-               return error;
+       error = wacom_setup_pentouch_input_capabilities(input_dev, wacom_wac);
+       if (!error) {
+               error = input_register_device(input_dev);
+               if (error)
+                       return error;
+       }
 
        error = wacom_setup_pad_input_capabilities(pad_input_dev, wacom_wac);
        if (error) {
index 51c7353..caf035f 100644 (file)
@@ -2032,7 +2032,7 @@ static void wacom_abs_set_axis(struct input_dev *input_dev,
        }
 }
 
-int wacom_setup_input_capabilities(struct input_dev *input_dev,
+int wacom_setup_pentouch_input_capabilities(struct input_dev *input_dev,
                                   struct wacom_wac *wacom_wac)
 {
        struct wacom_features *features = &wacom_wac->features;
@@ -2246,6 +2246,9 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
                                __clear_bit(ABS_X, input_dev->absbit);
                                __clear_bit(ABS_Y, input_dev->absbit);
                                __clear_bit(BTN_TOUCH, input_dev->keybit);
+
+                               /* PAD is setup by wacom_setup_pad_input_capabilities later */
+                               return 1;
                        }
                } else if (features->device_type == BTN_TOOL_PEN) {
                        __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
@@ -2444,7 +2447,9 @@ int wacom_setup_pad_input_capabilities(struct input_dev *input_dev,
        case INTUOSHT:
        case BAMBOO_PT:
                /* pad device is on the touch interface */
-               if (features->device_type != BTN_TOOL_FINGER)
+               if ((features->device_type != BTN_TOOL_FINGER) ||
+                   /* Bamboo Pen only tablet does not have pad */
+                   ((features->type == BAMBOO_PT) && !features->touch_max))
                        return -ENODEV;
 
                __clear_bit(ABS_MISC, input_dev->absbit);