Commit 912c6aa6 authored by Aaron Armstrong Skomra's avatar Aaron Armstrong Skomra Committed by Jiri Kosina

HID: wacom: Add 2nd gen Intuos Pro Small support

The existing INTUOSP2_BT device class supports LEDs and this device
does not. A new device class enum entry, "INTUOSP2S_BT", is created
to avoid the INTUOSP2_BT LED code.
Signed-off-by: default avatarAaron Armstrong Skomra <aaron.skomra@wacom.com>
Reviewed-by: default avatarJason Gerecke <jason.gerecke@wacom.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 68c20cc2
...@@ -1220,7 +1220,8 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom) ...@@ -1220,7 +1220,8 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
unsigned char *data = wacom->data; unsigned char *data = wacom->data;
int i; int i;
if (wacom->features.type == INTUOSP2_BT) { if (wacom->features.type == INTUOSP2_BT ||
wacom->features.type == INTUOSP2S_BT) {
wacom->serial[0] = get_unaligned_le64(&data[99]); wacom->serial[0] = get_unaligned_le64(&data[99]);
wacom->id[0] = get_unaligned_le16(&data[107]); wacom->id[0] = get_unaligned_le16(&data[107]);
pen_frame_len = 14; pen_frame_len = 14;
...@@ -1257,7 +1258,8 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom) ...@@ -1257,7 +1258,8 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
input_report_abs(pen_input, ABS_X, get_unaligned_le16(&frame[1])); input_report_abs(pen_input, ABS_X, get_unaligned_le16(&frame[1]));
input_report_abs(pen_input, ABS_Y, get_unaligned_le16(&frame[3])); input_report_abs(pen_input, ABS_Y, get_unaligned_le16(&frame[3]));
if (wacom->features.type == INTUOSP2_BT) { if (wacom->features.type == INTUOSP2_BT ||
wacom->features.type == INTUOSP2S_BT) {
/* Fix rotation alignment: userspace expects zero at left */ /* Fix rotation alignment: userspace expects zero at left */
int16_t rotation = int16_t rotation =
(int16_t)get_unaligned_le16(&frame[9]); (int16_t)get_unaligned_le16(&frame[9]);
...@@ -1276,7 +1278,8 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom) ...@@ -1276,7 +1278,8 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
} }
} }
input_report_abs(pen_input, ABS_PRESSURE, get_unaligned_le16(&frame[5])); input_report_abs(pen_input, ABS_PRESSURE, get_unaligned_le16(&frame[5]));
if (wacom->features.type == INTUOSP2_BT) { if (wacom->features.type == INTUOSP2_BT ||
wacom->features.type == INTUOSP2S_BT) {
input_report_abs(pen_input, ABS_DISTANCE, input_report_abs(pen_input, ABS_DISTANCE,
range ? frame[13] : wacom->features.distance_max); range ? frame[13] : wacom->features.distance_max);
} else { } else {
...@@ -1436,7 +1439,8 @@ static int wacom_intuos_pro2_bt_irq(struct wacom_wac *wacom, size_t len) ...@@ -1436,7 +1439,8 @@ static int wacom_intuos_pro2_bt_irq(struct wacom_wac *wacom, size_t len)
} }
wacom_intuos_pro2_bt_pen(wacom); wacom_intuos_pro2_bt_pen(wacom);
if (wacom->features.type == INTUOSP2_BT) { if (wacom->features.type == INTUOSP2_BT ||
wacom->features.type == INTUOSP2S_BT) {
wacom_intuos_pro2_bt_touch(wacom); wacom_intuos_pro2_bt_touch(wacom);
wacom_intuos_pro2_bt_pad(wacom); wacom_intuos_pro2_bt_pad(wacom);
wacom_intuos_pro2_bt_battery(wacom); wacom_intuos_pro2_bt_battery(wacom);
...@@ -3204,6 +3208,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) ...@@ -3204,6 +3208,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
break; break;
case INTUOSP2_BT: case INTUOSP2_BT:
case INTUOSP2S_BT:
case INTUOSHT3_BT: case INTUOSHT3_BT:
sync = wacom_intuos_pro2_bt_irq(wacom_wac, len); sync = wacom_intuos_pro2_bt_irq(wacom_wac, len);
break; break;
...@@ -3384,7 +3389,8 @@ void wacom_setup_device_quirks(struct wacom *wacom) ...@@ -3384,7 +3389,8 @@ void wacom_setup_device_quirks(struct wacom *wacom)
if (features->type == REMOTE) if (features->type == REMOTE)
features->device_type = WACOM_DEVICETYPE_PAD; features->device_type = WACOM_DEVICETYPE_PAD;
if (features->type == INTUOSP2_BT) { if (features->type == INTUOSP2_BT ||
features->type == INTUOSP2S_BT) {
features->device_type |= WACOM_DEVICETYPE_PEN | features->device_type |= WACOM_DEVICETYPE_PEN |
WACOM_DEVICETYPE_PAD | WACOM_DEVICETYPE_PAD |
WACOM_DEVICETYPE_TOUCH; WACOM_DEVICETYPE_TOUCH;
...@@ -3565,6 +3571,7 @@ int wacom_setup_pen_input_capabilities(struct input_dev *input_dev, ...@@ -3565,6 +3571,7 @@ int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
case INTUOS5S: case INTUOS5S:
case INTUOSPS: case INTUOSPS:
case INTUOSP2_BT: case INTUOSP2_BT:
case INTUOSP2S_BT:
input_set_abs_params(input_dev, ABS_DISTANCE, 0, input_set_abs_params(input_dev, ABS_DISTANCE, 0,
features->distance_max, features->distance_max,
features->distance_fuzz, 0); features->distance_fuzz, 0);
...@@ -3676,6 +3683,7 @@ int wacom_setup_touch_input_capabilities(struct input_dev *input_dev, ...@@ -3676,6 +3683,7 @@ int wacom_setup_touch_input_capabilities(struct input_dev *input_dev,
switch (features->type) { switch (features->type) {
case INTUOSP2_BT: case INTUOSP2_BT:
case INTUOSP2S_BT:
input_dev->evbit[0] |= BIT_MASK(EV_SW); input_dev->evbit[0] |= BIT_MASK(EV_SW);
__set_bit(SW_MUTE_DEVICE, input_dev->swbit); __set_bit(SW_MUTE_DEVICE, input_dev->swbit);
...@@ -3691,6 +3699,12 @@ int wacom_setup_touch_input_capabilities(struct input_dev *input_dev, ...@@ -3691,6 +3699,12 @@ int wacom_setup_touch_input_capabilities(struct input_dev *input_dev,
input_set_abs_params(input_dev, ABS_MT_POSITION_Y, input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
0, 5920, 4, 0); 0, 5920, 4, 0);
} }
else if (wacom_wac->shared->touch->product == 0x393) {
input_set_abs_params(input_dev, ABS_MT_POSITION_X,
0, 6400, 4, 0);
input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
0, 4000, 4, 0);
}
input_abs_set_res(input_dev, ABS_MT_POSITION_X, 40); input_abs_set_res(input_dev, ABS_MT_POSITION_X, 40);
input_abs_set_res(input_dev, ABS_MT_POSITION_Y, 40); input_abs_set_res(input_dev, ABS_MT_POSITION_Y, 40);
...@@ -3997,6 +4011,7 @@ int wacom_setup_pad_input_capabilities(struct input_dev *input_dev, ...@@ -3997,6 +4011,7 @@ int wacom_setup_pad_input_capabilities(struct input_dev *input_dev,
case INTUOS5S: case INTUOS5S:
case INTUOSPS: case INTUOSPS:
case INTUOSP2_BT: case INTUOSP2_BT:
case INTUOSP2S_BT:
input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0); input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
break; break;
...@@ -4574,6 +4589,10 @@ static const struct wacom_features wacom_features_0x37A = ...@@ -4574,6 +4589,10 @@ static const struct wacom_features wacom_features_0x37A =
static const struct wacom_features wacom_features_0x37B = static const struct wacom_features wacom_features_0x37B =
{ "Wacom One by Wacom M", 21600, 13500, 2047, 63, { "Wacom One by Wacom M", 21600, 13500, 2047, 63,
BAMBOO_PEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; BAMBOO_PEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
static const struct wacom_features wacom_features_0x393 =
{ "Wacom Intuos Pro S", 31920, 19950, 8191, 63,
INTUOSP2S_BT, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 7,
.touch_max = 10 };
static const struct wacom_features wacom_features_HID_ANY_ID = static const struct wacom_features wacom_features_HID_ANY_ID =
{ "Wacom HID", .type = HID_GENERIC, .oVid = HID_ANY_ID, .oPid = HID_ANY_ID }; { "Wacom HID", .type = HID_GENERIC, .oVid = HID_ANY_ID, .oPid = HID_ANY_ID };
...@@ -4746,6 +4765,7 @@ const struct hid_device_id wacom_ids[] = { ...@@ -4746,6 +4765,7 @@ const struct hid_device_id wacom_ids[] = {
{ BT_DEVICE_WACOM(0x379) }, { BT_DEVICE_WACOM(0x379) },
{ USB_DEVICE_WACOM(0x37A) }, { USB_DEVICE_WACOM(0x37A) },
{ USB_DEVICE_WACOM(0x37B) }, { USB_DEVICE_WACOM(0x37B) },
{ BT_DEVICE_WACOM(0x393) },
{ USB_DEVICE_WACOM(0x4001) }, { USB_DEVICE_WACOM(0x4001) },
{ USB_DEVICE_WACOM(0x4004) }, { USB_DEVICE_WACOM(0x4004) },
{ USB_DEVICE_WACOM(0x5000) }, { USB_DEVICE_WACOM(0x5000) },
......
...@@ -215,6 +215,7 @@ enum { ...@@ -215,6 +215,7 @@ enum {
INTUOSPM, INTUOSPM,
INTUOSPL, INTUOSPL,
INTUOSP2_BT, INTUOSP2_BT,
INTUOSP2S_BT,
INTUOSHT3_BT, INTUOSHT3_BT,
WACOM_21UX2, WACOM_21UX2,
WACOM_22HD, WACOM_22HD,
......
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