Commit 30ebc1ae authored by Ping Cheng's avatar Ping Cheng Committed by Jiri Kosina

HID: wacom - Bamboo pen-only tablet does not support PAD

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: default avatarPing Cheng <pingc@wacom.com>
Reviewed-by: default avatarBenjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 97edcad8
...@@ -140,7 +140,7 @@ extern const struct hid_device_id wacom_ids[]; ...@@ -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_wac_irq(struct wacom_wac *wacom_wac, size_t len);
void wacom_setup_device_quirks(struct wacom_features *features); 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); struct wacom_wac *wacom_wac);
int wacom_setup_pad_input_capabilities(struct input_dev *input_dev, int wacom_setup_pad_input_capabilities(struct input_dev *input_dev,
struct wacom_wac *wacom_wac); struct wacom_wac *wacom_wac);
......
...@@ -192,9 +192,15 @@ static void wacom_usage_mapping(struct hid_device *hdev, ...@@ -192,9 +192,15 @@ static void wacom_usage_mapping(struct hid_device *hdev,
if (!pen && !finger) if (!pen && !finger)
return; return;
/*
* 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) if (finger && !features->touch_max)
/* touch device at least supports one touch point */
features->touch_max = 1; features->touch_max = 1;
}
switch (usage->hid) { switch (usage->hid) {
case HID_GD_X: case HID_GD_X:
...@@ -1151,13 +1157,12 @@ static int wacom_register_inputs(struct wacom *wacom) ...@@ -1151,13 +1157,12 @@ static int wacom_register_inputs(struct wacom *wacom)
if (!input_dev || !pad_input_dev) if (!input_dev || !pad_input_dev)
return -EINVAL; return -EINVAL;
error = wacom_setup_input_capabilities(input_dev, wacom_wac); error = wacom_setup_pentouch_input_capabilities(input_dev, wacom_wac);
if (error) if (!error) {
return error;
error = input_register_device(input_dev); error = input_register_device(input_dev);
if (error) if (error)
return error; return error;
}
error = wacom_setup_pad_input_capabilities(pad_input_dev, wacom_wac); error = wacom_setup_pad_input_capabilities(pad_input_dev, wacom_wac);
if (error) { if (error) {
......
...@@ -2032,7 +2032,7 @@ static void wacom_abs_set_axis(struct input_dev *input_dev, ...@@ -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_wac *wacom_wac)
{ {
struct wacom_features *features = &wacom_wac->features; struct wacom_features *features = &wacom_wac->features;
...@@ -2246,6 +2246,9 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev, ...@@ -2246,6 +2246,9 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
__clear_bit(ABS_X, input_dev->absbit); __clear_bit(ABS_X, input_dev->absbit);
__clear_bit(ABS_Y, input_dev->absbit); __clear_bit(ABS_Y, input_dev->absbit);
__clear_bit(BTN_TOUCH, input_dev->keybit); __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) { } else if (features->device_type == BTN_TOOL_PEN) {
__set_bit(INPUT_PROP_POINTER, input_dev->propbit); __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
...@@ -2444,7 +2447,9 @@ int wacom_setup_pad_input_capabilities(struct input_dev *input_dev, ...@@ -2444,7 +2447,9 @@ int wacom_setup_pad_input_capabilities(struct input_dev *input_dev,
case INTUOSHT: case INTUOSHT:
case BAMBOO_PT: case BAMBOO_PT:
/* pad device is on the touch interface */ /* 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; return -ENODEV;
__clear_bit(ABS_MISC, input_dev->absbit); __clear_bit(ABS_MISC, input_dev->absbit);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment