Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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);
+15 −10
Original line number Diff line number Diff line
@@ -192,9 +192,15 @@ static void wacom_usage_mapping(struct hid_device *hdev,
	if (!pen && !finger)
		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)
		/* touch device at least supports one touch point */
			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 = 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) {
+7 −2
Original line number Diff line number Diff line
@@ -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);