Skip to content

Commit

Permalink
HID: wacom - Bamboo pen-only tablet does not support PAD
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Ping Cheng authored and Jiri Kosina committed Nov 20, 2014
1 parent 97edcad commit 30ebc1a
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 13 deletions.
2 changes: 1 addition & 1 deletion drivers/hid/wacom.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
25 changes: 15 additions & 10 deletions drivers/hid/wacom_sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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) {
Expand Down
9 changes: 7 additions & 2 deletions drivers/hid/wacom_wac.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 30ebc1a

Please sign in to comment.