^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * drivers/input/tablet/wacom_wac.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * USB Wacom tablet support - Wacom specific code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include "wacom_wac.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include "wacom.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/input/mt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) /* resolution for penabled devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define WACOM_PL_RES 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define WACOM_PENPRTN_RES 40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define WACOM_VOLITO_RES 50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define WACOM_GRAPHIRE_RES 80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define WACOM_INTUOS_RES 100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define WACOM_INTUOS3_RES 200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) /* Newer Cintiq and DTU have an offset between tablet and screen areas */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define WACOM_DTU_OFFSET 200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define WACOM_CINTIQ_OFFSET 400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * Scale factor relating reported contact size to logical contact area.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * 2^14/pi is a good approximation on Intuos5 and 3rd-gen Bamboo
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define WACOM_CONTACT_AREA_SCALE 2607
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) static bool touch_arbitration = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) module_param(touch_arbitration, bool, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) MODULE_PARM_DESC(touch_arbitration, " on (Y) off (N)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) static void wacom_report_numbered_buttons(struct input_dev *input_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) int button_count, int mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) static int wacom_numbered_button_to_key(int n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) static void wacom_update_led(struct wacom *wacom, int button_count, int mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) int group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * Percent of battery capacity for Graphire.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * 8th value means AC online and show 100% capacity.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) static unsigned short batcap_gr[8] = { 1, 15, 25, 35, 50, 70, 100, 100 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * Percent of battery capacity for Intuos4 WL, AC has a separate bit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) static unsigned short batcap_i4[8] = { 1, 15, 30, 45, 60, 70, 85, 100 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) static void __wacom_notify_battery(struct wacom_battery *battery,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) int bat_status, int bat_capacity,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) bool bat_charging, bool bat_connected,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) bool ps_connected)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) bool changed = battery->bat_status != bat_status ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) battery->battery_capacity != bat_capacity ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) battery->bat_charging != bat_charging ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) battery->bat_connected != bat_connected ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) battery->ps_connected != ps_connected;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) if (changed) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) battery->bat_status = bat_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) battery->battery_capacity = bat_capacity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) battery->bat_charging = bat_charging;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) battery->bat_connected = bat_connected;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) battery->ps_connected = ps_connected;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) if (battery->battery)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) power_supply_changed(battery->battery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) static void wacom_notify_battery(struct wacom_wac *wacom_wac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) int bat_status, int bat_capacity, bool bat_charging,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) bool bat_connected, bool ps_connected)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) __wacom_notify_battery(&wacom->battery, bat_status, bat_capacity,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) bat_charging, bat_connected, ps_connected);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) static int wacom_penpartner_irq(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) struct input_dev *input = wacom->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) switch (data[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) if (data[5] & 0x80) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) wacom->tool[0] = (data[5] & 0x20) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) wacom->id[0] = (data[5] & 0x20) ? ERASER_DEVICE_ID : STYLUS_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) input_report_key(input, wacom->tool[0], 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) input_report_abs(input, ABS_X, get_unaligned_le16(&data[1]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) input_report_abs(input, ABS_Y, get_unaligned_le16(&data[3]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) input_report_abs(input, ABS_PRESSURE, (signed char)data[6] + 127);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) input_report_key(input, BTN_TOUCH, ((signed char)data[6] > -127));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) input_report_key(input, BTN_STYLUS, (data[5] & 0x40));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) input_report_key(input, wacom->tool[0], 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) input_report_abs(input, ABS_MISC, 0); /* report tool id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) input_report_abs(input, ABS_PRESSURE, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) input_report_key(input, BTN_TOUCH, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) input_report_key(input, BTN_TOOL_PEN, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) input_report_abs(input, ABS_MISC, STYLUS_DEVICE_ID); /* report tool id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) input_report_abs(input, ABS_X, get_unaligned_le16(&data[1]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) input_report_abs(input, ABS_Y, get_unaligned_le16(&data[3]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) input_report_abs(input, ABS_PRESSURE, (signed char)data[6] + 127);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) input_report_key(input, BTN_TOUCH, ((signed char)data[6] > -80) && !(data[5] & 0x20));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) input_report_key(input, BTN_STYLUS, (data[5] & 0x40));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) dev_dbg(input->dev.parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) "%s: received unknown report #%d\n", __func__, data[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) static int wacom_pl_irq(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) struct wacom_features *features = &wacom->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) struct input_dev *input = wacom->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) int prox, pressure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) if (data[0] != WACOM_REPORT_PENABLED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) dev_dbg(input->dev.parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) "%s: received unknown report #%d\n", __func__, data[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) prox = data[1] & 0x40;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) if (!wacom->id[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) if ((data[0] & 0x10) || (data[4] & 0x20)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) wacom->tool[0] = BTN_TOOL_RUBBER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) wacom->id[0] = ERASER_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) wacom->tool[0] = BTN_TOOL_PEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) wacom->id[0] = STYLUS_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) /* If the eraser is in prox, STYLUS2 is always set. If we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) * mis-detected the type and notice that STYLUS2 isn't set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) * then force the eraser out of prox and let the pen in.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) if (wacom->tool[0] == BTN_TOOL_RUBBER && !(data[4] & 0x20)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) input_report_key(input, BTN_TOOL_RUBBER, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) input_report_abs(input, ABS_MISC, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) input_sync(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) wacom->tool[0] = BTN_TOOL_PEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) wacom->id[0] = STYLUS_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) if (prox) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) if (features->pressure_max > 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) pressure = (pressure << 1) | ((data[4] >> 6) & 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) pressure += (features->pressure_max + 1) / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) input_report_abs(input, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) input_report_abs(input, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) input_report_abs(input, ABS_PRESSURE, pressure);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) input_report_key(input, BTN_TOUCH, data[4] & 0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) input_report_key(input, BTN_STYLUS, data[4] & 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) /* Only allow the stylus2 button to be reported for the pen tool. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) input_report_key(input, BTN_STYLUS2, (wacom->tool[0] == BTN_TOOL_PEN) && (data[4] & 0x20));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) if (!prox)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) wacom->id[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) input_report_key(input, wacom->tool[0], prox);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) input_report_abs(input, ABS_MISC, wacom->id[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) static int wacom_ptu_irq(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) struct input_dev *input = wacom->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) if (data[0] != WACOM_REPORT_PENABLED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) dev_dbg(input->dev.parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) "%s: received unknown report #%d\n", __func__, data[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) if (data[1] & 0x04) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) input_report_key(input, BTN_TOOL_RUBBER, data[1] & 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) input_report_key(input, BTN_TOUCH, data[1] & 0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) wacom->id[0] = ERASER_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) input_report_key(input, BTN_TOOL_PEN, data[1] & 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) input_report_key(input, BTN_TOUCH, data[1] & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) wacom->id[0] = STYLUS_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) input_report_abs(input, ABS_PRESSURE, le16_to_cpup((__le16 *)&data[6]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) input_report_key(input, BTN_STYLUS, data[1] & 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) input_report_key(input, BTN_STYLUS2, data[1] & 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) static int wacom_dtu_irq(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) struct input_dev *input = wacom->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) int prox = data[1] & 0x20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) dev_dbg(input->dev.parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) "%s: received report #%d", __func__, data[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) if (prox) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) /* Going into proximity select tool */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) if (wacom->tool[0] == BTN_TOOL_PEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) wacom->id[0] = STYLUS_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) wacom->id[0] = ERASER_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) input_report_key(input, BTN_STYLUS, data[1] & 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) input_report_key(input, BTN_STYLUS2, data[1] & 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) input_report_abs(input, ABS_PRESSURE, ((data[7] & 0x01) << 8) | data[6]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) input_report_key(input, BTN_TOUCH, data[1] & 0x05);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) if (!prox) /* out-prox */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) wacom->id[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) input_report_key(input, wacom->tool[0], prox);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) input_report_abs(input, ABS_MISC, wacom->id[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) static int wacom_dtus_irq(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) struct input_dev *input = wacom->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) unsigned short prox, pressure = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) if (data[0] != WACOM_REPORT_DTUS && data[0] != WACOM_REPORT_DTUSPAD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) dev_dbg(input->dev.parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) "%s: received unknown report #%d", __func__, data[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) } else if (data[0] == WACOM_REPORT_DTUSPAD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) input = wacom->pad_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) input_report_key(input, BTN_0, (data[1] & 0x01));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) input_report_key(input, BTN_1, (data[1] & 0x02));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) input_report_key(input, BTN_2, (data[1] & 0x04));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) input_report_key(input, BTN_3, (data[1] & 0x08));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) input_report_abs(input, ABS_MISC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) data[1] & 0x0f ? PAD_DEVICE_ID : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) prox = data[1] & 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) if (prox) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) switch ((data[1] >> 3) & 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) case 1: /* Rubber */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) wacom->tool[0] = BTN_TOOL_RUBBER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) wacom->id[0] = ERASER_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) case 2: /* Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) wacom->tool[0] = BTN_TOOL_PEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) wacom->id[0] = STYLUS_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) input_report_key(input, BTN_STYLUS, data[1] & 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) input_report_key(input, BTN_STYLUS2, data[1] & 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) input_report_abs(input, ABS_X, get_unaligned_be16(&data[3]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) input_report_abs(input, ABS_Y, get_unaligned_be16(&data[5]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) pressure = ((data[1] & 0x03) << 8) | (data[2] & 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) input_report_abs(input, ABS_PRESSURE, pressure);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) input_report_key(input, BTN_TOUCH, pressure > 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) if (!prox) /* out-prox */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) wacom->id[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) input_report_key(input, wacom->tool[0], prox);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) input_report_abs(input, ABS_MISC, wacom->id[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) static int wacom_graphire_irq(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) struct wacom_features *features = &wacom->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) struct input_dev *input = wacom->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) struct input_dev *pad_input = wacom->pad_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) int battery_capacity, ps_connected;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) int prox;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) int rw = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) int retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) if (features->type == GRAPHIRE_BT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) if (data[0] != WACOM_REPORT_PENABLED_BT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) dev_dbg(input->dev.parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) "%s: received unknown report #%d\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) data[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) } else if (data[0] != WACOM_REPORT_PENABLED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) dev_dbg(input->dev.parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) "%s: received unknown report #%d\n", __func__, data[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) prox = data[1] & 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) if (prox || wacom->id[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) if (prox) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) switch ((data[1] >> 5) & 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) case 0: /* Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) wacom->tool[0] = BTN_TOOL_PEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) wacom->id[0] = STYLUS_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) case 1: /* Rubber */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) wacom->tool[0] = BTN_TOOL_RUBBER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) wacom->id[0] = ERASER_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) case 2: /* Mouse with wheel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) input_report_key(input, BTN_MIDDLE, data[1] & 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) case 3: /* Mouse without wheel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) wacom->tool[0] = BTN_TOOL_MOUSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) wacom->id[0] = CURSOR_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) if (wacom->tool[0] != BTN_TOOL_MOUSE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) if (features->type == GRAPHIRE_BT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) input_report_abs(input, ABS_PRESSURE, data[6] |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) (((__u16) (data[1] & 0x08)) << 5));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) input_report_abs(input, ABS_PRESSURE, data[6] |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) ((data[7] & 0x03) << 8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) input_report_key(input, BTN_TOUCH, data[1] & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) input_report_key(input, BTN_STYLUS, data[1] & 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) input_report_key(input, BTN_STYLUS2, data[1] & 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) input_report_key(input, BTN_LEFT, data[1] & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) input_report_key(input, BTN_RIGHT, data[1] & 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) if (features->type == WACOM_G4 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) features->type == WACOM_MO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) input_report_abs(input, ABS_DISTANCE, data[6] & 0x3f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) rw = (data[7] & 0x04) - (data[7] & 0x03);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) } else if (features->type == GRAPHIRE_BT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) /* Compute distance between mouse and tablet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) rw = 44 - (data[6] >> 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) rw = clamp_val(rw, 0, 31);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) input_report_abs(input, ABS_DISTANCE, rw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) if (((data[1] >> 5) & 3) == 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) /* Mouse with wheel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) input_report_key(input, BTN_MIDDLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) data[1] & 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) rw = (data[6] & 0x01) ? -1 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) (data[6] & 0x02) ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) rw = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) input_report_abs(input, ABS_DISTANCE, data[7] & 0x3f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) rw = -(signed char)data[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) input_report_rel(input, REL_WHEEL, rw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) if (!prox)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) wacom->id[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) input_report_key(input, wacom->tool[0], prox);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) input_sync(input); /* sync last event */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) /* send pad data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) switch (features->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) case WACOM_G4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) prox = data[7] & 0xf8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) if (prox || wacom->id[1]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) wacom->id[1] = PAD_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) input_report_key(pad_input, BTN_BACK, (data[7] & 0x40));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) input_report_key(pad_input, BTN_FORWARD, (data[7] & 0x80));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) rw = ((data[7] & 0x18) >> 3) - ((data[7] & 0x20) >> 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) input_report_rel(pad_input, REL_WHEEL, rw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) if (!prox)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) wacom->id[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) input_report_abs(pad_input, ABS_MISC, wacom->id[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) retval = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) case WACOM_MO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) prox = (data[7] & 0xf8) || data[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) if (prox || wacom->id[1]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) wacom->id[1] = PAD_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) input_report_key(pad_input, BTN_BACK, (data[7] & 0x08));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) input_report_key(pad_input, BTN_LEFT, (data[7] & 0x20));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) input_report_key(pad_input, BTN_FORWARD, (data[7] & 0x10));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) input_report_key(pad_input, BTN_RIGHT, (data[7] & 0x40));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) input_report_abs(pad_input, ABS_WHEEL, (data[8] & 0x7f));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) if (!prox)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) wacom->id[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) input_report_abs(pad_input, ABS_MISC, wacom->id[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) retval = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) case GRAPHIRE_BT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) prox = data[7] & 0x03;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) if (prox || wacom->id[1]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) wacom->id[1] = PAD_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) input_report_key(pad_input, BTN_0, (data[7] & 0x02));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) input_report_key(pad_input, BTN_1, (data[7] & 0x01));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) if (!prox)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) wacom->id[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) input_report_abs(pad_input, ABS_MISC, wacom->id[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) retval = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) /* Store current battery capacity and power supply state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) if (features->type == GRAPHIRE_BT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) rw = (data[7] >> 2 & 0x07);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) battery_capacity = batcap_gr[rw];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) ps_connected = rw == 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) battery_capacity, ps_connected, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) ps_connected);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) static void wacom_intuos_schedule_prox_event(struct wacom_wac *wacom_wac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) struct wacom_features *features = &wacom_wac->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) struct hid_report *r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) struct hid_report_enum *re;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) re = &(wacom->hdev->report_enum[HID_FEATURE_REPORT]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) if (features->type == INTUOSHT2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) r = re->report_id_hash[WACOM_REPORT_INTUOSHT2_ID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) r = re->report_id_hash[WACOM_REPORT_INTUOS_ID1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) if (r) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) hid_hw_request(wacom->hdev, r, HID_REQ_GET_REPORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) static int wacom_intuos_pad(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) struct wacom_features *features = &wacom->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) struct input_dev *input = wacom->pad_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) int buttons = 0, nbuttons = features->numbered_buttons;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) int keys = 0, nkeys = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) int ring1 = 0, ring2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) int strip1 = 0, strip2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) bool prox = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) bool wrench = false, keyboard = false, mute_touch = false, menu = false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) info = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) /* pad packets. Works as a second tool and is always in prox */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) if (!(data[0] == WACOM_REPORT_INTUOSPAD || data[0] == WACOM_REPORT_INTUOS5PAD ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) data[0] == WACOM_REPORT_CINTIQPAD))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) if (features->type >= INTUOS4S && features->type <= INTUOS4L) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) buttons = (data[3] << 1) | (data[2] & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) ring1 = data[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) } else if (features->type == DTK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) buttons = data[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) } else if (features->type == WACOM_13HD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) buttons = (data[4] << 1) | (data[3] & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) } else if (features->type == WACOM_24HD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) buttons = (data[8] << 8) | data[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) ring1 = data[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) ring2 = data[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) * Three "buttons" are available on the 24HD which are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) * physically implemented as a touchstrip. Each button
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) * is approximately 3 bits wide with a 2 bit spacing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) * The raw touchstrip bits are stored at:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) * ((data[3] & 0x1f) << 8) | data[4])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) nkeys = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) keys = ((data[3] & 0x1C) ? 1<<2 : 0) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) ((data[4] & 0xE0) ? 1<<1 : 0) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) ((data[4] & 0x07) ? 1<<0 : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) keyboard = !!(data[4] & 0xE0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) info = !!(data[3] & 0x1C);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) if (features->oPid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) mute_touch = !!(data[4] & 0x07);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) if (mute_touch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) wacom->shared->is_touch_on =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) !wacom->shared->is_touch_on;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) wrench = !!(data[4] & 0x07);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) } else if (features->type == WACOM_27QHD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) nkeys = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) keys = data[2] & 0x07;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) wrench = !!(data[2] & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) keyboard = !!(data[2] & 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) if (features->oPid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) mute_touch = !!(data[2] & 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) if (mute_touch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) wacom->shared->is_touch_on =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) !wacom->shared->is_touch_on;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) menu = !!(data[2] & 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) input_report_abs(input, ABS_X, be16_to_cpup((__be16 *)&data[4]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) input_report_abs(input, ABS_Y, be16_to_cpup((__be16 *)&data[6]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) input_report_abs(input, ABS_Z, be16_to_cpup((__be16 *)&data[8]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) } else if (features->type == CINTIQ_HYBRID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) * Do not send hardware buttons under Android. They
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) * are already sent to the system through GPIO (and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) * have different meaning).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) * d-pad right -> data[4] & 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) * d-pad up -> data[4] & 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) * d-pad left -> data[4] & 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) * d-pad down -> data[4] & 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) * d-pad center -> data[3] & 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) buttons = (data[4] << 1) | (data[3] & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) } else if (features->type == CINTIQ_COMPANION_2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) /* d-pad right -> data[2] & 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) * d-pad up -> data[2] & 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) * d-pad left -> data[2] & 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) * d-pad down -> data[2] & 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) * d-pad center -> data[1] & 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) buttons = ((data[2] >> 4) << 7) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) ((data[1] & 0x04) << 4) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) ((data[2] & 0x0F) << 2) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) (data[1] & 0x03);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) } else if (features->type >= INTUOS5S && features->type <= INTUOSPL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) * ExpressKeys on Intuos5/Intuos Pro have a capacitive sensor in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) * addition to the mechanical switch. Switch data is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) * stored in data[4], capacitive data in data[5].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) * Touch ring mode switch (data[3]) has no capacitive sensor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) buttons = (data[4] << 1) | (data[3] & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) ring1 = data[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) if (features->type == WACOM_21UX2 || features->type == WACOM_22HD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) buttons = (data[8] << 10) | ((data[7] & 0x01) << 9) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) (data[6] << 1) | (data[5] & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) if (features->type == WACOM_22HD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) nkeys = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) keys = data[9] & 0x07;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) info = !!(data[9] & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) wrench = !!(data[9] & 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) buttons = ((data[6] & 0x10) << 5) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) ((data[5] & 0x10) << 4) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) ((data[6] & 0x0F) << 4) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) (data[5] & 0x0F);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) strip1 = ((data[1] & 0x1f) << 8) | data[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) strip2 = ((data[3] & 0x1f) << 8) | data[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) prox = (buttons & ~(~0U << nbuttons)) | (keys & ~(~0U << nkeys)) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) (ring1 & 0x80) | (ring2 & 0x80) | strip1 | strip2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) wacom_report_numbered_buttons(input, nbuttons, buttons);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) for (i = 0; i < nkeys; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) input_report_key(input, KEY_PROG1 + i, keys & (1 << i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) input_report_key(input, KEY_BUTTONCONFIG, wrench);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) input_report_key(input, KEY_ONSCREEN_KEYBOARD, keyboard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) input_report_key(input, KEY_CONTROLPANEL, menu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) input_report_key(input, KEY_INFO, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) if (wacom->shared && wacom->shared->touch_input) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) input_report_switch(wacom->shared->touch_input,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) SW_MUTE_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) !wacom->shared->is_touch_on);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) input_sync(wacom->shared->touch_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) input_report_abs(input, ABS_RX, strip1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) input_report_abs(input, ABS_RY, strip2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) input_report_abs(input, ABS_WHEEL, (ring1 & 0x80) ? (ring1 & 0x7f) : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) input_report_abs(input, ABS_THROTTLE, (ring2 & 0x80) ? (ring2 & 0x7f) : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) input_report_key(input, wacom->tool[1], prox ? 1 : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) input_report_abs(input, ABS_MISC, prox ? PAD_DEVICE_ID : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) input_event(input, EV_MSC, MSC_SERIAL, 0xffffffff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) static int wacom_intuos_id_mangle(int tool_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) return (tool_id & ~0xFFF) << 4 | (tool_id & 0xFFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) static int wacom_intuos_get_tool_type(int tool_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) int tool_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) switch (tool_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) case 0x812: /* Inking pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) case 0x801: /* Intuos3 Inking pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) case 0x12802: /* Intuos4/5 Inking Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) case 0x012:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) tool_type = BTN_TOOL_PENCIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) case 0x822: /* Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) case 0x842:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) case 0x852:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) case 0x823: /* Intuos3 Grip Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) case 0x813: /* Intuos3 Classic Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) case 0x885: /* Intuos3 Marker Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) case 0x802: /* Intuos4/5 13HD/24HD General Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) case 0x804: /* Intuos4/5 13HD/24HD Marker Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) case 0x8e2: /* IntuosHT2 pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) case 0x022:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) case 0x10804: /* Intuos4/5 13HD/24HD Art Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) case 0x10842: /* MobileStudio Pro Pro Pen slim */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) case 0x14802: /* Intuos4/5 13HD/24HD Classic Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) case 0x16802: /* Cintiq 13HD Pro Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) case 0x18802: /* DTH2242 Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) case 0x10802: /* Intuos4/5 13HD/24HD General Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) tool_type = BTN_TOOL_PEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) case 0x832: /* Stroke pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) case 0x032:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) tool_type = BTN_TOOL_BRUSH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) case 0x007: /* Mouse 4D and 2D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) case 0x09c:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) case 0x094:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) case 0x017: /* Intuos3 2D Mouse */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) case 0x806: /* Intuos4 Mouse */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) tool_type = BTN_TOOL_MOUSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) case 0x096: /* Lens cursor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) case 0x097: /* Intuos3 Lens cursor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) case 0x006: /* Intuos4 Lens cursor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) tool_type = BTN_TOOL_LENS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) case 0x82a: /* Eraser */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) case 0x84a:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) case 0x85a:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) case 0x91a:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) case 0xd1a:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) case 0x0fa:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) case 0x82b: /* Intuos3 Grip Pen Eraser */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) case 0x81b: /* Intuos3 Classic Pen Eraser */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) case 0x91b: /* Intuos3 Airbrush Eraser */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) case 0x80c: /* Intuos4/5 13HD/24HD Marker Pen Eraser */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) case 0x80a: /* Intuos4/5 13HD/24HD General Pen Eraser */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) case 0x90a: /* Intuos4/5 13HD/24HD Airbrush Eraser */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) case 0x1480a: /* Intuos4/5 13HD/24HD Classic Pen Eraser */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) case 0x1090a: /* Intuos4/5 13HD/24HD Airbrush Eraser */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) case 0x1080c: /* Intuos4/5 13HD/24HD Art Pen Eraser */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) case 0x1084a: /* MobileStudio Pro Pro Pen slim Eraser */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) case 0x1680a: /* Cintiq 13HD Pro Pen Eraser */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) case 0x1880a: /* DTH2242 Eraser */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) case 0x1080a: /* Intuos4/5 13HD/24HD General Pen Eraser */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) tool_type = BTN_TOOL_RUBBER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) case 0xd12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) case 0x912:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) case 0x112:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) case 0x913: /* Intuos3 Airbrush */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) case 0x902: /* Intuos4/5 13HD/24HD Airbrush */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) case 0x10902: /* Intuos4/5 13HD/24HD Airbrush */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) tool_type = BTN_TOOL_AIRBRUSH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) default: /* Unknown tool */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) tool_type = BTN_TOOL_PEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) return tool_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) static void wacom_exit_report(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) struct input_dev *input = wacom->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) struct wacom_features *features = &wacom->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) int idx = (features->type == INTUOS) ? (data[1] & 0x01) : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) * Reset all states otherwise we lose the initial states
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) * when in-prox next time
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) input_report_abs(input, ABS_X, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) input_report_abs(input, ABS_Y, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) input_report_abs(input, ABS_DISTANCE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) input_report_abs(input, ABS_TILT_X, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) input_report_abs(input, ABS_TILT_Y, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) if (wacom->tool[idx] >= BTN_TOOL_MOUSE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) input_report_key(input, BTN_LEFT, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) input_report_key(input, BTN_MIDDLE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) input_report_key(input, BTN_RIGHT, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) input_report_key(input, BTN_SIDE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) input_report_key(input, BTN_EXTRA, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) input_report_abs(input, ABS_THROTTLE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) input_report_abs(input, ABS_RZ, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) input_report_abs(input, ABS_PRESSURE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) input_report_key(input, BTN_STYLUS, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) input_report_key(input, BTN_STYLUS2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) input_report_key(input, BTN_TOUCH, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) input_report_abs(input, ABS_WHEEL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) if (features->type >= INTUOS3S)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) input_report_abs(input, ABS_Z, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) input_report_key(input, wacom->tool[idx], 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) input_report_abs(input, ABS_MISC, 0); /* reset tool id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) wacom->id[idx] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) static int wacom_intuos_inout(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) struct wacom_features *features = &wacom->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) struct input_dev *input = wacom->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) int idx = (features->type == INTUOS) ? (data[1] & 0x01) : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) if (!(((data[1] & 0xfc) == 0xc0) || /* in prox */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) ((data[1] & 0xfe) == 0x20) || /* in range */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) ((data[1] & 0xfe) == 0x80))) /* out prox */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) /* Enter report */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) if ((data[1] & 0xfc) == 0xc0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) /* serial number of the tool */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) wacom->serial[idx] = ((data[3] & 0x0f) << 28) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) (data[4] << 20) + (data[5] << 12) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) (data[6] << 4) + (data[7] >> 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) wacom->id[idx] = (data[2] << 4) | (data[3] >> 4) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) ((data[7] & 0x0f) << 16) | ((data[8] & 0xf0) << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) wacom->tool[idx] = wacom_intuos_get_tool_type(wacom->id[idx]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) wacom->shared->stylus_in_proximity = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) /* in Range */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) if ((data[1] & 0xfe) == 0x20) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) if (features->type != INTUOSHT2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) wacom->shared->stylus_in_proximity = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) /* in Range while exiting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) if (wacom->reporting_data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) input_report_key(input, BTN_TOUCH, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) input_report_abs(input, ABS_PRESSURE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) input_report_abs(input, ABS_DISTANCE, wacom->features.distance_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) /* Exit report */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) if ((data[1] & 0xfe) == 0x80) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) wacom->shared->stylus_in_proximity = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) wacom->reporting_data = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) /* don't report exit if we don't know the ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) if (!wacom->id[idx])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) wacom_exit_report(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) static inline bool report_touch_events(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) return (touch_arbitration ? !wacom->shared->stylus_in_proximity : 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) static inline bool delay_pen_events(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) return (wacom->shared->touch_down && touch_arbitration);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) static int wacom_intuos_general(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) struct wacom_features *features = &wacom->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) struct input_dev *input = wacom->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) int idx = (features->type == INTUOS) ? (data[1] & 0x01) : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) unsigned char type = (data[1] >> 1) & 0x0F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) unsigned int x, y, distance, t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) if (data[0] != WACOM_REPORT_PENABLED && data[0] != WACOM_REPORT_CINTIQ &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) data[0] != WACOM_REPORT_INTUOS_PEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) if (delay_pen_events(wacom))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) /* don't report events if we don't know the tool ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) if (!wacom->id[idx]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) /* but reschedule a read of the current tool */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) wacom_intuos_schedule_prox_event(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) * don't report events for invalid data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) /* older I4 styli don't work with new Cintiqs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) if ((!((wacom->id[idx] >> 16) & 0x01) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) (features->type == WACOM_21UX2)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) /* Only large Intuos support Lense Cursor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) (wacom->tool[idx] == BTN_TOOL_LENS &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) (features->type == INTUOS3 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) features->type == INTUOS3S ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) features->type == INTUOS4 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) features->type == INTUOS4S ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) features->type == INTUOS5 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) features->type == INTUOS5S ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) features->type == INTUOSPM ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) features->type == INTUOSPS)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) /* Cintiq doesn't send data when RDY bit isn't set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) (features->type == CINTIQ && !(data[1] & 0x40)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) x = (be16_to_cpup((__be16 *)&data[2]) << 1) | ((data[9] >> 1) & 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) y = (be16_to_cpup((__be16 *)&data[4]) << 1) | (data[9] & 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) distance = data[9] >> 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) if (features->type < INTUOS3S) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) x >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) y >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) distance >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) if (features->type == INTUOSHT2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) distance = features->distance_max - distance;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) input_report_abs(input, ABS_X, x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) input_report_abs(input, ABS_Y, y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) input_report_abs(input, ABS_DISTANCE, distance);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) case 0x00:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) case 0x01:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) case 0x02:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) case 0x03:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) /* general pen packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) t = (data[6] << 3) | ((data[7] & 0xC0) >> 5) | (data[1] & 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) if (features->pressure_max < 2047)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) t >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) input_report_abs(input, ABS_PRESSURE, t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) if (features->type != INTUOSHT2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) input_report_abs(input, ABS_TILT_X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) (((data[7] << 1) & 0x7e) | (data[8] >> 7)) - 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) input_report_abs(input, ABS_TILT_Y, (data[8] & 0x7f) - 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) input_report_key(input, BTN_STYLUS, data[1] & 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) input_report_key(input, BTN_STYLUS2, data[1] & 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) input_report_key(input, BTN_TOUCH, t > 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) case 0x0a:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) /* airbrush second packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) input_report_abs(input, ABS_WHEEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) (data[6] << 2) | ((data[7] >> 6) & 3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) input_report_abs(input, ABS_TILT_X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) (((data[7] << 1) & 0x7e) | (data[8] >> 7)) - 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) input_report_abs(input, ABS_TILT_Y, (data[8] & 0x7f) - 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) case 0x05:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) /* Rotation packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) if (features->type >= INTUOS3S) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) /* I3 marker pen rotation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) t = (data[6] << 3) | ((data[7] >> 5) & 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) t = (data[7] & 0x20) ? ((t > 900) ? ((t-1) / 2 - 1350) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) ((t-1) / 2 + 450)) : (450 - t / 2) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) input_report_abs(input, ABS_Z, t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) /* 4D mouse 2nd packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) t = (data[6] << 3) | ((data[7] >> 5) & 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) input_report_abs(input, ABS_RZ, (data[7] & 0x20) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) ((t - 1) / 2) : -t / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) case 0x04:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) /* 4D mouse 1st packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) input_report_key(input, BTN_LEFT, data[8] & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) input_report_key(input, BTN_MIDDLE, data[8] & 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) input_report_key(input, BTN_RIGHT, data[8] & 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) input_report_key(input, BTN_SIDE, data[8] & 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) input_report_key(input, BTN_EXTRA, data[8] & 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) t = (data[6] << 2) | ((data[7] >> 6) & 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) input_report_abs(input, ABS_THROTTLE, (data[8] & 0x08) ? -t : t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) case 0x06:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) /* I4 mouse */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) input_report_key(input, BTN_LEFT, data[6] & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) input_report_key(input, BTN_MIDDLE, data[6] & 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) input_report_key(input, BTN_RIGHT, data[6] & 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) input_report_rel(input, REL_WHEEL, ((data[7] & 0x80) >> 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) - ((data[7] & 0x40) >> 6));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) input_report_key(input, BTN_SIDE, data[6] & 0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) input_report_key(input, BTN_EXTRA, data[6] & 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) input_report_abs(input, ABS_TILT_X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) (((data[7] << 1) & 0x7e) | (data[8] >> 7)) - 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) input_report_abs(input, ABS_TILT_Y, (data[8] & 0x7f) - 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) case 0x08:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) if (wacom->tool[idx] == BTN_TOOL_MOUSE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) /* 2D mouse packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) input_report_key(input, BTN_LEFT, data[8] & 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) input_report_key(input, BTN_MIDDLE, data[8] & 0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) input_report_key(input, BTN_RIGHT, data[8] & 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) input_report_rel(input, REL_WHEEL, (data[8] & 0x01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) - ((data[8] & 0x02) >> 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) /* I3 2D mouse side buttons */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) if (features->type >= INTUOS3S && features->type <= INTUOS3L) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) input_report_key(input, BTN_SIDE, data[8] & 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) input_report_key(input, BTN_EXTRA, data[8] & 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) else if (wacom->tool[idx] == BTN_TOOL_LENS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) /* Lens cursor packets */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) input_report_key(input, BTN_LEFT, data[8] & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) input_report_key(input, BTN_MIDDLE, data[8] & 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) input_report_key(input, BTN_RIGHT, data[8] & 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) input_report_key(input, BTN_SIDE, data[8] & 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) input_report_key(input, BTN_EXTRA, data[8] & 0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) case 0x07:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) case 0x09:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) case 0x0b:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) case 0x0c:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) case 0x0d:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) case 0x0e:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) case 0x0f:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) /* unhandled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) input_report_abs(input, ABS_MISC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) wacom_intuos_id_mangle(wacom->id[idx])); /* report tool id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) input_report_key(input, wacom->tool[idx], 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) wacom->reporting_data = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) static int wacom_intuos_irq(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) struct input_dev *input = wacom->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) if (data[0] != WACOM_REPORT_PENABLED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) data[0] != WACOM_REPORT_INTUOS_ID1 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) data[0] != WACOM_REPORT_INTUOS_ID2 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) data[0] != WACOM_REPORT_INTUOSPAD &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) data[0] != WACOM_REPORT_INTUOS_PEN &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) data[0] != WACOM_REPORT_CINTIQ &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) data[0] != WACOM_REPORT_CINTIQPAD &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) data[0] != WACOM_REPORT_INTUOS5PAD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) dev_dbg(input->dev.parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) "%s: received unknown report #%d\n", __func__, data[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) /* process pad events */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) result = wacom_intuos_pad(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) if (result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) /* process in/out prox events */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) result = wacom_intuos_inout(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) if (result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) return result - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) /* process general packets */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) result = wacom_intuos_general(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) if (result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) return result - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) static int wacom_remote_irq(struct wacom_wac *wacom_wac, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) unsigned char *data = wacom_wac->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) struct input_dev *input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) struct wacom_remote *remote = wacom->remote;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) int bat_charging, bat_percent, touch_ring_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) __u32 serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) int i, index = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) if (data[0] != WACOM_REPORT_REMOTE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) hid_dbg(wacom->hdev, "%s: received unknown report #%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) __func__, data[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) serial = data[3] + (data[4] << 8) + (data[5] << 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) wacom_wac->id[0] = PAD_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) spin_lock_irqsave(&remote->remote_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) for (i = 0; i < WACOM_MAX_REMOTES; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) if (remote->remotes[i].serial == serial) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) index = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) if (index < 0 || !remote->remotes[index].registered)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) input = remote->remotes[index].input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) input_report_key(input, BTN_0, (data[9] & 0x01));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) input_report_key(input, BTN_1, (data[9] & 0x02));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) input_report_key(input, BTN_2, (data[9] & 0x04));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) input_report_key(input, BTN_3, (data[9] & 0x08));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) input_report_key(input, BTN_4, (data[9] & 0x10));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) input_report_key(input, BTN_5, (data[9] & 0x20));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) input_report_key(input, BTN_6, (data[9] & 0x40));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) input_report_key(input, BTN_7, (data[9] & 0x80));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) input_report_key(input, BTN_8, (data[10] & 0x01));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) input_report_key(input, BTN_9, (data[10] & 0x02));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) input_report_key(input, BTN_A, (data[10] & 0x04));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) input_report_key(input, BTN_B, (data[10] & 0x08));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) input_report_key(input, BTN_C, (data[10] & 0x10));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) input_report_key(input, BTN_X, (data[10] & 0x20));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) input_report_key(input, BTN_Y, (data[10] & 0x40));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) input_report_key(input, BTN_Z, (data[10] & 0x80));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) input_report_key(input, BTN_BASE, (data[11] & 0x01));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) input_report_key(input, BTN_BASE2, (data[11] & 0x02));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) if (data[12] & 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) input_report_abs(input, ABS_WHEEL, (data[12] & 0x7f) - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) input_report_abs(input, ABS_WHEEL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) bat_percent = data[7] & 0x7f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) bat_charging = !!(data[7] & 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) if (data[9] | data[10] | (data[11] & 0x03) | data[12])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) input_report_abs(input, ABS_MISC, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) input_event(input, EV_MSC, MSC_SERIAL, serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) input_sync(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) /*Which mode select (LED light) is currently on?*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) touch_ring_mode = (data[11] & 0xC0) >> 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) for (i = 0; i < WACOM_MAX_REMOTES; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) if (remote->remotes[i].serial == serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) wacom->led.groups[i].select = touch_ring_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) __wacom_notify_battery(&remote->remotes[index].battery,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) WACOM_POWER_SUPPLY_STATUS_AUTO, bat_percent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) bat_charging, 1, bat_charging);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) spin_unlock_irqrestore(&remote->remote_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) static void wacom_remote_status_irq(struct wacom_wac *wacom_wac, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) unsigned char *data = wacom_wac->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) struct wacom_remote *remote = wacom->remote;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) struct wacom_remote_data remote_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) int i, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) if (data[0] != WACOM_REPORT_DEVICE_LIST)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) memset(&remote_data, 0, sizeof(struct wacom_remote_data));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) for (i = 0; i < WACOM_MAX_REMOTES; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) int j = i * 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) int serial = (data[j+6] << 16) + (data[j+5] << 8) + data[j+4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) bool connected = data[j+2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) remote_data.remote[i].serial = serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) remote_data.remote[i].connected = connected;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) spin_lock_irqsave(&remote->remote_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) ret = kfifo_in(&remote->remote_fifo, &remote_data, sizeof(remote_data));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) if (ret != sizeof(remote_data)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) spin_unlock_irqrestore(&remote->remote_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) hid_err(wacom->hdev, "Can't queue Remote status event.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) spin_unlock_irqrestore(&remote->remote_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) wacom_schedule_work(wacom_wac, WACOM_WORKER_REMOTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) static int int_dist(int x1, int y1, int x2, int y2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) int x = x2 - x1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) int y = y2 - y1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) return int_sqrt(x*x + y*y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) static void wacom_intuos_bt_process_data(struct wacom_wac *wacom,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) unsigned char *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) memcpy(wacom->data, data, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) wacom_intuos_irq(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) input_sync(wacom->pen_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) if (wacom->pad_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) input_sync(wacom->pad_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) static int wacom_intuos_bt_irq(struct wacom_wac *wacom, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) unsigned char data[WACOM_PKGLEN_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) int i = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) unsigned power_raw, battery_capacity, bat_charging, ps_connected;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) memcpy(data, wacom->data, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) switch (data[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) case 0x04:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) wacom_intuos_bt_process_data(wacom, data + i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) i += 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) case 0x03:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) wacom_intuos_bt_process_data(wacom, data + i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) i += 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) wacom_intuos_bt_process_data(wacom, data + i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) i += 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) power_raw = data[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) bat_charging = (power_raw & 0x08) ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) ps_connected = (power_raw & 0x10) ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) battery_capacity = batcap_i4[power_raw & 0x07];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) battery_capacity, bat_charging,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) battery_capacity || bat_charging,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) ps_connected);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) dev_dbg(wacom->pen_input->dev.parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) "Unknown report: %d,%d size:%zu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) data[0], data[1], len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) static int wacom_wac_finger_count_touches(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) struct input_dev *input = wacom->touch_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) unsigned touch_max = wacom->features.touch_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) int count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) if (!touch_max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) if (touch_max == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) return test_bit(BTN_TOUCH, input->key) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) report_touch_events(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) for (i = 0; i < input->mt->num_slots; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) struct input_mt_slot *ps = &input->mt->slots[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) int id = input_mt_get_value(ps, ABS_MT_TRACKING_ID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) if (id >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) int pen_frame_len, pen_frames;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) struct input_dev *pen_input = wacom->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) if (wacom->features.type == INTUOSP2_BT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) wacom->features.type == INTUOSP2S_BT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) wacom->serial[0] = get_unaligned_le64(&data[99]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) wacom->id[0] = get_unaligned_le16(&data[107]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) pen_frame_len = 14;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) pen_frames = 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) wacom->serial[0] = get_unaligned_le64(&data[33]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) wacom->id[0] = get_unaligned_le16(&data[41]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) pen_frame_len = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) pen_frames = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) if (wacom->serial[0] >> 52 == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) /* Add back in missing bits of ID for non-USI pens */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) wacom->id[0] |= (wacom->serial[0] >> 32) & 0xFFFFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) for (i = 0; i < pen_frames; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) unsigned char *frame = &data[i*pen_frame_len + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) bool valid = frame[0] & 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) bool prox = frame[0] & 0x40;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) bool range = frame[0] & 0x20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) bool invert = frame[0] & 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) if (!valid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) if (!prox) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) wacom->shared->stylus_in_proximity = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) wacom_exit_report(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) input_sync(pen_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) wacom->tool[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) wacom->id[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) wacom->serial[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) if (range) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) if (!wacom->tool[0]) { /* first in range */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) /* Going into range select tool */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) if (invert)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) wacom->tool[0] = BTN_TOOL_RUBBER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) else if (wacom->id[0])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) wacom->tool[0] = wacom_intuos_get_tool_type(wacom->id[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) wacom->tool[0] = BTN_TOOL_PEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) input_report_abs(pen_input, ABS_X, get_unaligned_le16(&frame[1]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) input_report_abs(pen_input, ABS_Y, get_unaligned_le16(&frame[3]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) if (wacom->features.type == INTUOSP2_BT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) wacom->features.type == INTUOSP2S_BT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) /* Fix rotation alignment: userspace expects zero at left */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) int16_t rotation =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) (int16_t)get_unaligned_le16(&frame[9]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) rotation += 1800/4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) if (rotation > 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) rotation -= 1800;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) input_report_abs(pen_input, ABS_TILT_X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) (char)frame[7]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) input_report_abs(pen_input, ABS_TILT_Y,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) (char)frame[8]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) input_report_abs(pen_input, ABS_Z, rotation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) input_report_abs(pen_input, ABS_WHEEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) get_unaligned_le16(&frame[11]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) if (wacom->tool[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) input_report_abs(pen_input, ABS_PRESSURE, get_unaligned_le16(&frame[5]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) if (wacom->features.type == INTUOSP2_BT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) wacom->features.type == INTUOSP2S_BT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) input_report_abs(pen_input, ABS_DISTANCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) range ? frame[13] : wacom->features.distance_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) input_report_abs(pen_input, ABS_DISTANCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) range ? frame[7] : wacom->features.distance_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) input_report_key(pen_input, BTN_TOUCH, frame[0] & 0x09);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) input_report_key(pen_input, BTN_STYLUS, frame[0] & 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) input_report_key(pen_input, BTN_STYLUS2, frame[0] & 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) input_report_key(pen_input, wacom->tool[0], prox);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) input_event(pen_input, EV_MSC, MSC_SERIAL, wacom->serial[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) input_report_abs(pen_input, ABS_MISC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) wacom_intuos_id_mangle(wacom->id[0])); /* report tool id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) wacom->shared->stylus_in_proximity = prox;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) input_sync(pen_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) static void wacom_intuos_pro2_bt_touch(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) const int finger_touch_len = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) const int finger_frames = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) const int finger_frame_len = 43;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) struct input_dev *touch_input = wacom->touch_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) int num_contacts_left = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) int i, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) for (i = 0; i < finger_frames; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) unsigned char *frame = &data[i*finger_frame_len + 109];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) int current_num_contacts = frame[0] & 0x7F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) int contacts_to_send;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) if (!(frame[0] & 0x80))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) * First packet resets the counter since only the first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) * packet in series will have non-zero current_num_contacts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) if (current_num_contacts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) wacom->num_contacts_left = current_num_contacts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) contacts_to_send = min(num_contacts_left, wacom->num_contacts_left);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) for (j = 0; j < contacts_to_send; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) unsigned char *touch = &frame[j*finger_touch_len + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) int slot = input_mt_get_slot_by_key(touch_input, touch[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) int x = get_unaligned_le16(&touch[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) int y = get_unaligned_le16(&touch[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) int w = touch[6] * input_abs_get_res(touch_input, ABS_MT_POSITION_X);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) int h = touch[7] * input_abs_get_res(touch_input, ABS_MT_POSITION_Y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) if (slot < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) input_mt_slot(touch_input, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) input_mt_report_slot_state(touch_input, MT_TOOL_FINGER, touch[1] & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) input_report_abs(touch_input, ABS_MT_POSITION_X, x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) input_report_abs(touch_input, ABS_MT_POSITION_Y, y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) input_report_abs(touch_input, ABS_MT_TOUCH_MAJOR, max(w, h));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) input_report_abs(touch_input, ABS_MT_TOUCH_MINOR, min(w, h));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) input_report_abs(touch_input, ABS_MT_ORIENTATION, w > h);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) input_mt_sync_frame(touch_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) wacom->num_contacts_left -= contacts_to_send;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) if (wacom->num_contacts_left <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) wacom->num_contacts_left = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) input_sync(touch_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) if (wacom->num_contacts_left == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) // Be careful that we don't accidentally call input_sync with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) // only a partial set of fingers of processed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) input_report_switch(touch_input, SW_MUTE_DEVICE, !(data[281] >> 7));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) input_sync(touch_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) static void wacom_intuos_pro2_bt_pad(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) struct input_dev *pad_input = wacom->pad_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) int nbuttons = wacom->features.numbered_buttons;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) int expresskeys = data[282];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) int center = (data[281] & 0x40) >> 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) int ring = data[285] & 0x7F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) bool ringstatus = data[285] & 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) bool prox = expresskeys || center || ringstatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) /* Fix touchring data: userspace expects 0 at left and increasing clockwise */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) ring = 71 - ring;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) ring += 3*72/16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) if (ring > 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) ring -= 72;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) wacom_report_numbered_buttons(pad_input, nbuttons,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) expresskeys | (center << (nbuttons - 1)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) input_report_abs(pad_input, ABS_WHEEL, ringstatus ? ring : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) input_report_key(pad_input, wacom->tool[1], prox ? 1 : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) input_report_abs(pad_input, ABS_MISC, prox ? PAD_DEVICE_ID : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) input_event(pad_input, EV_MSC, MSC_SERIAL, 0xffffffff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) input_sync(pad_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) static void wacom_intuos_pro2_bt_battery(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) bool chg = data[284] & 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) int battery_status = data[284] & 0x7F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) battery_status, chg, 1, chg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) static void wacom_intuos_gen3_bt_pad(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) struct input_dev *pad_input = wacom->pad_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) int buttons = data[44];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) wacom_report_numbered_buttons(pad_input, 4, buttons);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) input_report_key(pad_input, wacom->tool[1], buttons ? 1 : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) input_report_abs(pad_input, ABS_MISC, buttons ? PAD_DEVICE_ID : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) input_event(pad_input, EV_MSC, MSC_SERIAL, 0xffffffff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) input_sync(pad_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) static void wacom_intuos_gen3_bt_battery(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) bool chg = data[45] & 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) int battery_status = data[45] & 0x7F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) battery_status, chg, 1, chg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) static int wacom_intuos_pro2_bt_irq(struct wacom_wac *wacom, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) if (data[0] != 0x80 && data[0] != 0x81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) dev_dbg(wacom->pen_input->dev.parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) "%s: received unknown report #%d\n", __func__, data[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) wacom_intuos_pro2_bt_pen(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) if (wacom->features.type == INTUOSP2_BT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) wacom->features.type == INTUOSP2S_BT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) wacom_intuos_pro2_bt_touch(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) wacom_intuos_pro2_bt_pad(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) wacom_intuos_pro2_bt_battery(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) wacom_intuos_gen3_bt_pad(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) wacom_intuos_gen3_bt_battery(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) static int wacom_24hdt_irq(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) struct input_dev *input = wacom->touch_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) int current_num_contacts = data[61];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) int contacts_to_send = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) int num_contacts_left = 4; /* maximum contacts per packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) int byte_per_packet = WACOM_BYTES_PER_24HDT_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) int y_offset = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) if (wacom->shared->has_mute_touch_switch &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) !wacom->shared->is_touch_on) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) if (!wacom->shared->touch_down)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) if (wacom->features.type == WACOM_27QHDT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) current_num_contacts = data[63];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) num_contacts_left = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) byte_per_packet = WACOM_BYTES_PER_QHDTHID_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) y_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) * First packet resets the counter since only the first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) * packet in series will have non-zero current_num_contacts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) if (current_num_contacts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) wacom->num_contacts_left = current_num_contacts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) contacts_to_send = min(num_contacts_left, wacom->num_contacts_left);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) for (i = 0; i < contacts_to_send; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) int offset = (byte_per_packet * i) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) bool touch = (data[offset] & 0x1) && report_touch_events(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) int slot = input_mt_get_slot_by_key(input, data[offset + 1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) if (slot < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) input_mt_slot(input, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) if (touch) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) int t_x = get_unaligned_le16(&data[offset + 2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) int t_y = get_unaligned_le16(&data[offset + 4 + y_offset]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) input_report_abs(input, ABS_MT_POSITION_X, t_x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) input_report_abs(input, ABS_MT_POSITION_Y, t_y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) if (wacom->features.type != WACOM_27QHDT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) int c_x = get_unaligned_le16(&data[offset + 4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) int c_y = get_unaligned_le16(&data[offset + 8]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) int w = get_unaligned_le16(&data[offset + 10]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) int h = get_unaligned_le16(&data[offset + 12]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) input_report_abs(input, ABS_MT_TOUCH_MAJOR, min(w,h));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) input_report_abs(input, ABS_MT_WIDTH_MAJOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) min(w, h) + int_dist(t_x, t_y, c_x, c_y));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) input_report_abs(input, ABS_MT_WIDTH_MINOR, min(w, h));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) input_report_abs(input, ABS_MT_ORIENTATION, w > h);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) input_mt_sync_frame(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) wacom->num_contacts_left -= contacts_to_send;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) if (wacom->num_contacts_left <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) wacom->num_contacts_left = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) static int wacom_mt_touch(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) struct input_dev *input = wacom->touch_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) int current_num_contacts = data[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) int contacts_to_send = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) int x_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) /* MTTPC does not support Height and Width */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) if (wacom->features.type == MTTPC || wacom->features.type == MTTPC_B)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) x_offset = -4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) * First packet resets the counter since only the first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) * packet in series will have non-zero current_num_contacts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) if (current_num_contacts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) wacom->num_contacts_left = current_num_contacts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) /* There are at most 5 contacts per packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) contacts_to_send = min(5, wacom->num_contacts_left);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) for (i = 0; i < contacts_to_send; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) int offset = (WACOM_BYTES_PER_MT_PACKET + x_offset) * i + 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) bool touch = (data[offset] & 0x1) && report_touch_events(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) int id = get_unaligned_le16(&data[offset + 1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) int slot = input_mt_get_slot_by_key(input, id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) if (slot < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) input_mt_slot(input, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) if (touch) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) int x = get_unaligned_le16(&data[offset + x_offset + 7]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) int y = get_unaligned_le16(&data[offset + x_offset + 9]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) input_report_abs(input, ABS_MT_POSITION_X, x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) input_report_abs(input, ABS_MT_POSITION_Y, y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) input_mt_sync_frame(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) wacom->num_contacts_left -= contacts_to_send;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) if (wacom->num_contacts_left <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) wacom->num_contacts_left = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) static int wacom_tpc_mt_touch(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) struct input_dev *input = wacom->touch_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) for (i = 0; i < 2; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) int p = data[1] & (1 << i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) bool touch = p && report_touch_events(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) input_mt_slot(input, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) if (touch) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) int x = le16_to_cpup((__le16 *)&data[i * 2 + 2]) & 0x7fff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) int y = le16_to_cpup((__le16 *)&data[i * 2 + 6]) & 0x7fff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) input_report_abs(input, ABS_MT_POSITION_X, x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) input_report_abs(input, ABS_MT_POSITION_Y, y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) input_mt_sync_frame(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) /* keep touch state for pen event */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) static int wacom_tpc_single_touch(struct wacom_wac *wacom, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) struct input_dev *input = wacom->touch_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) bool prox = report_touch_events(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) int x = 0, y = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) if (wacom->features.touch_max > 1 || len > WACOM_PKGLEN_TPC2FG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) if (len == WACOM_PKGLEN_TPC1FG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) prox = prox && (data[0] & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) x = get_unaligned_le16(&data[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) y = get_unaligned_le16(&data[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) } else if (len == WACOM_PKGLEN_TPC1FG_B) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) prox = prox && (data[2] & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) x = get_unaligned_le16(&data[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) y = get_unaligned_le16(&data[5]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) prox = prox && (data[1] & 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) x = le16_to_cpup((__le16 *)&data[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) y = le16_to_cpup((__le16 *)&data[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) if (prox) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) input_report_abs(input, ABS_X, x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) input_report_abs(input, ABS_Y, y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) input_report_key(input, BTN_TOUCH, prox);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) /* keep touch state for pen events */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) wacom->shared->touch_down = prox;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) static int wacom_tpc_pen(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) struct input_dev *input = wacom->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) bool prox = data[1] & 0x20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) if (!wacom->shared->stylus_in_proximity) /* first in prox */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) /* Going into proximity select tool */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) /* keep pen state for touch events */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) wacom->shared->stylus_in_proximity = prox;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) /* send pen events only when touch is up or forced out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) * or touch arbitration is off
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) if (!delay_pen_events(wacom)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) input_report_key(input, BTN_STYLUS, data[1] & 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) input_report_key(input, BTN_STYLUS2, data[1] & 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) input_report_abs(input, ABS_PRESSURE, ((data[7] & 0x07) << 8) | data[6]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) input_report_key(input, BTN_TOUCH, data[1] & 0x05);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) input_report_key(input, wacom->tool[0], prox);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) if (wacom->pen_input) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) dev_dbg(wacom->pen_input->dev.parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) "%s: received report #%d\n", __func__, data[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) if (len == WACOM_PKGLEN_PENABLED ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) data[0] == WACOM_REPORT_PENABLED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) return wacom_tpc_pen(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) else if (wacom->touch_input) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) dev_dbg(wacom->touch_input->dev.parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) "%s: received report #%d\n", __func__, data[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) switch (len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) case WACOM_PKGLEN_TPC1FG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) return wacom_tpc_single_touch(wacom, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) case WACOM_PKGLEN_TPC2FG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) return wacom_tpc_mt_touch(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) switch (data[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) case WACOM_REPORT_TPC1FG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) case WACOM_REPORT_TPCHID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) case WACOM_REPORT_TPCST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) case WACOM_REPORT_TPC1FGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) return wacom_tpc_single_touch(wacom, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) case WACOM_REPORT_TPCMT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) case WACOM_REPORT_TPCMT2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) return wacom_mt_touch(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) static int wacom_offset_rotation(struct input_dev *input, struct hid_usage *usage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) int value, int num, int denom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) struct input_absinfo *abs = &input->absinfo[usage->code];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) int range = (abs->maximum - abs->minimum + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) value += num*range/denom;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) if (value > abs->maximum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) value -= range;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) else if (value < abs->minimum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) value += range;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) return value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) int wacom_equivalent_usage(int usage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) if ((usage & HID_USAGE_PAGE) == WACOM_HID_UP_WACOMDIGITIZER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) int subpage = (usage & 0xFF00) << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) int subusage = (usage & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) if (subpage == WACOM_HID_SP_PAD ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) subpage == WACOM_HID_SP_BUTTON ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) subpage == WACOM_HID_SP_DIGITIZER ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) subpage == WACOM_HID_SP_DIGITIZERINFO ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) usage == WACOM_HID_WD_SENSE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) usage == WACOM_HID_WD_SERIALHI ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) usage == WACOM_HID_WD_TOOLTYPE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) usage == WACOM_HID_WD_DISTANCE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) usage == WACOM_HID_WD_TOUCHSTRIP ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) usage == WACOM_HID_WD_TOUCHSTRIP2 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) usage == WACOM_HID_WD_TOUCHRING ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) usage == WACOM_HID_WD_TOUCHRINGSTATUS ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) usage == WACOM_HID_WD_REPORT_VALID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) return usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) if (subpage == HID_UP_UNDEFINED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) subpage = HID_UP_DIGITIZER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) return subpage | subusage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) if ((usage & HID_USAGE_PAGE) == WACOM_HID_UP_WACOMTOUCH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) int subpage = (usage & 0xFF00) << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) int subusage = (usage & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) if (usage == WACOM_HID_WT_REPORT_VALID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) return usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) if (subpage == HID_UP_UNDEFINED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) subpage = WACOM_HID_SP_DIGITIZER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) return subpage | subusage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) return usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) struct hid_field *field, __u8 type, __u16 code, int fuzz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) struct wacom *wacom = input_get_drvdata(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) struct wacom_features *features = &wacom_wac->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) int fmin = field->logical_minimum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) int fmax = field->logical_maximum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) unsigned int equivalent_usage = wacom_equivalent_usage(usage->hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) int resolution_code = code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) if (equivalent_usage == HID_DG_TWIST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) resolution_code = ABS_RZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) if (equivalent_usage == HID_GD_X) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) fmin += features->offset_left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) fmax -= features->offset_right;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) if (equivalent_usage == HID_GD_Y) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) fmin += features->offset_top;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) fmax -= features->offset_bottom;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) usage->type = type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) usage->code = code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) set_bit(type, input->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) case EV_ABS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) input_set_abs_params(input, code, fmin, fmax, fuzz, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) input_abs_set_res(input, code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) hidinput_calc_abs_res(field, resolution_code));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) case EV_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) input_set_capability(input, EV_KEY, code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) case EV_MSC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) input_set_capability(input, EV_MSC, code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) case EV_SW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) input_set_capability(input, EV_SW, code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) static void wacom_wac_battery_usage_mapping(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) struct hid_field *field, struct hid_usage *usage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) struct wacom_features *features = &wacom_wac->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) switch (equivalent_usage) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) case HID_DG_BATTERYSTRENGTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) case WACOM_HID_WD_BATTERY_LEVEL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) case WACOM_HID_WD_BATTERY_CHARGING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) features->quirks |= WACOM_QUIRK_BATTERY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) static void wacom_wac_battery_event(struct hid_device *hdev, struct hid_field *field,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) struct hid_usage *usage, __s32 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) switch (equivalent_usage) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) case HID_DG_BATTERYSTRENGTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) if (value == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) wacom_wac->hid_data.bat_status = POWER_SUPPLY_STATUS_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) value = value * 100 / (field->logical_maximum - field->logical_minimum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) wacom_wac->hid_data.battery_capacity = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) wacom_wac->hid_data.bat_connected = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) case WACOM_HID_WD_BATTERY_LEVEL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) value = value * 100 / (field->logical_maximum - field->logical_minimum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) wacom_wac->hid_data.battery_capacity = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) wacom_wac->hid_data.bat_connected = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) case WACOM_HID_WD_BATTERY_CHARGING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) wacom_wac->hid_data.bat_charging = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) wacom_wac->hid_data.ps_connected = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) wacom_wac->hid_data.bat_connected = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) static void wacom_wac_battery_pre_report(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) struct hid_report *report)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) static void wacom_wac_battery_report(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) struct hid_report *report)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) struct wacom_features *features = &wacom_wac->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) if (features->quirks & WACOM_QUIRK_BATTERY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) int status = wacom_wac->hid_data.bat_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) int capacity = wacom_wac->hid_data.battery_capacity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) bool charging = wacom_wac->hid_data.bat_charging;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) bool connected = wacom_wac->hid_data.bat_connected;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) bool powered = wacom_wac->hid_data.ps_connected;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) wacom_notify_battery(wacom_wac, status, capacity, charging,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) connected, powered);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) static void wacom_wac_pad_usage_mapping(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) struct hid_field *field, struct hid_usage *usage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) struct wacom_features *features = &wacom_wac->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) struct input_dev *input = wacom_wac->pad_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) switch (equivalent_usage) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) case WACOM_HID_WD_ACCELEROMETER_X:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) __set_bit(INPUT_PROP_ACCELEROMETER, input->propbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) wacom_map_usage(input, usage, field, EV_ABS, ABS_X, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) case WACOM_HID_WD_ACCELEROMETER_Y:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) __set_bit(INPUT_PROP_ACCELEROMETER, input->propbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) wacom_map_usage(input, usage, field, EV_ABS, ABS_Y, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) case WACOM_HID_WD_ACCELEROMETER_Z:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) __set_bit(INPUT_PROP_ACCELEROMETER, input->propbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) wacom_map_usage(input, usage, field, EV_ABS, ABS_Z, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) case WACOM_HID_WD_BUTTONCENTER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) case WACOM_HID_WD_BUTTONHOME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) case WACOM_HID_WD_BUTTONUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) case WACOM_HID_WD_BUTTONDOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) case WACOM_HID_WD_BUTTONLEFT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) case WACOM_HID_WD_BUTTONRIGHT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) wacom_map_usage(input, usage, field, EV_KEY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) wacom_numbered_button_to_key(features->numbered_buttons),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) features->numbered_buttons++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) case WACOM_HID_WD_TOUCHONOFF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) case WACOM_HID_WD_MUTE_DEVICE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) * This usage, which is used to mute touch events, comes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) * from the pad packet, but is reported on the touch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) * interface. Because the touch interface may not have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) * been created yet, we cannot call wacom_map_usage(). In
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) * order to process this usage when we receive it, we set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) * the usage type and code directly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) wacom_wac->has_mute_touch_switch = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) usage->type = EV_SW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) usage->code = SW_MUTE_DEVICE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) case WACOM_HID_WD_TOUCHSTRIP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) wacom_map_usage(input, usage, field, EV_ABS, ABS_RX, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) case WACOM_HID_WD_TOUCHSTRIP2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) wacom_map_usage(input, usage, field, EV_ABS, ABS_RY, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) case WACOM_HID_WD_TOUCHRING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) wacom_map_usage(input, usage, field, EV_ABS, ABS_WHEEL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) case WACOM_HID_WD_TOUCHRINGSTATUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) * Only set up type/code association. Completely mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) * this usage may overwrite the axis resolution and range.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) usage->type = EV_ABS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) usage->code = ABS_WHEEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) set_bit(EV_ABS, input->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) case WACOM_HID_WD_BUTTONCONFIG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) wacom_map_usage(input, usage, field, EV_KEY, KEY_BUTTONCONFIG, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) case WACOM_HID_WD_ONSCREEN_KEYBOARD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) wacom_map_usage(input, usage, field, EV_KEY, KEY_ONSCREEN_KEYBOARD, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) case WACOM_HID_WD_CONTROLPANEL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) wacom_map_usage(input, usage, field, EV_KEY, KEY_CONTROLPANEL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) case WACOM_HID_WD_MODE_CHANGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) /* do not overwrite previous data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) if (!wacom_wac->has_mode_change) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) wacom_wac->has_mode_change = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) wacom_wac->is_direct_mode = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) switch (equivalent_usage & 0xfffffff0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) case WACOM_HID_WD_EXPRESSKEY00:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) wacom_map_usage(input, usage, field, EV_KEY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) wacom_numbered_button_to_key(features->numbered_buttons),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) features->numbered_buttons++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) struct hid_usage *usage, __s32 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) struct input_dev *input = wacom_wac->pad_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) struct wacom_features *features = &wacom_wac->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) bool do_report = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) * Avoid reporting this event and setting inrange_state if this usage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) * hasn't been mapped.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) if (!usage->type && equivalent_usage != WACOM_HID_WD_MODE_CHANGE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) if (wacom_equivalent_usage(field->physical) == HID_DG_TABLETFUNCTIONKEY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) if (usage->hid != WACOM_HID_WD_TOUCHRING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) wacom_wac->hid_data.inrange_state |= value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) switch (equivalent_usage) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) case WACOM_HID_WD_TOUCHRING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) * Userspace expects touchrings to increase in value with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) * clockwise gestures and have their zero point at the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) * tablet's left. HID events "should" be clockwise-
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) * increasing and zero at top, though the MobileStudio
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) * Pro and 2nd-gen Intuos Pro don't do this...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) if (hdev->vendor == 0x56a &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) (hdev->product == 0x34d || hdev->product == 0x34e || /* MobileStudio Pro */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) hdev->product == 0x357 || hdev->product == 0x358 || /* Intuos Pro 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) hdev->product == 0x392 || /* Intuos Pro 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) hdev->product == 0x398 || hdev->product == 0x399 || /* MobileStudio Pro */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) hdev->product == 0x3AA)) { /* MobileStudio Pro */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) value = (field->logical_maximum - value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) if (hdev->product == 0x357 || hdev->product == 0x358 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) hdev->product == 0x392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) value = wacom_offset_rotation(input, usage, value, 3, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) else if (hdev->product == 0x34d || hdev->product == 0x34e ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) hdev->product == 0x398 || hdev->product == 0x399 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) hdev->product == 0x3AA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) value = wacom_offset_rotation(input, usage, value, 1, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) value = wacom_offset_rotation(input, usage, value, 1, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) do_report = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) case WACOM_HID_WD_TOUCHRINGSTATUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) if (!value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) input_event(input, usage->type, usage->code, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) case WACOM_HID_WD_MUTE_DEVICE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) case WACOM_HID_WD_TOUCHONOFF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) if (wacom_wac->shared->touch_input) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) bool *is_touch_on = &wacom_wac->shared->is_touch_on;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) if (equivalent_usage == WACOM_HID_WD_MUTE_DEVICE && value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) *is_touch_on = !(*is_touch_on);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) else if (equivalent_usage == WACOM_HID_WD_TOUCHONOFF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) *is_touch_on = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) input_report_switch(wacom_wac->shared->touch_input,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) SW_MUTE_DEVICE, !(*is_touch_on));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) input_sync(wacom_wac->shared->touch_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) case WACOM_HID_WD_MODE_CHANGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) if (wacom_wac->is_direct_mode != value) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) wacom_wac->is_direct_mode = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) wacom_schedule_work(&wacom->wacom_wac, WACOM_WORKER_MODE_CHANGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) case WACOM_HID_WD_BUTTONCENTER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) for (i = 0; i < wacom->led.count; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) wacom_update_led(wacom, features->numbered_buttons,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) value, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) do_report = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) if (do_report) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) input_event(input, usage->type, usage->code, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) if (value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) wacom_wac->hid_data.pad_input_event_flag = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) static void wacom_wac_pad_pre_report(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) struct hid_report *report)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) wacom_wac->hid_data.inrange_state = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) static void wacom_wac_pad_report(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) struct hid_report *report, struct hid_field *field)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) struct input_dev *input = wacom_wac->pad_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) bool active = wacom_wac->hid_data.inrange_state != 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) /* report prox for expresskey events */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) if (wacom_wac->hid_data.pad_input_event_flag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) input_event(input, EV_ABS, ABS_MISC, active ? PAD_DEVICE_ID : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) input_sync(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) if (!active)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) wacom_wac->hid_data.pad_input_event_flag = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) struct hid_field *field, struct hid_usage *usage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) struct wacom_features *features = &wacom_wac->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) struct input_dev *input = wacom_wac->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) switch (equivalent_usage) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) case HID_GD_X:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) wacom_map_usage(input, usage, field, EV_ABS, ABS_X, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) case HID_GD_Y:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) wacom_map_usage(input, usage, field, EV_ABS, ABS_Y, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) case WACOM_HID_WD_DISTANCE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) case HID_GD_Z:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) wacom_map_usage(input, usage, field, EV_ABS, ABS_DISTANCE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) case HID_DG_TIPPRESSURE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) wacom_map_usage(input, usage, field, EV_ABS, ABS_PRESSURE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) case HID_DG_INRANGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) wacom_map_usage(input, usage, field, EV_KEY, BTN_TOOL_PEN, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) case HID_DG_INVERT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) wacom_map_usage(input, usage, field, EV_KEY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) BTN_TOOL_RUBBER, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) case HID_DG_TILT_X:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) wacom_map_usage(input, usage, field, EV_ABS, ABS_TILT_X, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) case HID_DG_TILT_Y:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) wacom_map_usage(input, usage, field, EV_ABS, ABS_TILT_Y, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) case HID_DG_TWIST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) wacom_map_usage(input, usage, field, EV_ABS, ABS_Z, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) case HID_DG_ERASER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) case HID_DG_TIPSWITCH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) wacom_map_usage(input, usage, field, EV_KEY, BTN_TOUCH, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) case HID_DG_BARRELSWITCH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) wacom_map_usage(input, usage, field, EV_KEY, BTN_STYLUS, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) case HID_DG_BARRELSWITCH2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) wacom_map_usage(input, usage, field, EV_KEY, BTN_STYLUS2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) case HID_DG_TOOLSERIALNUMBER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) features->quirks |= WACOM_QUIRK_TOOLSERIAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) wacom_map_usage(input, usage, field, EV_MSC, MSC_SERIAL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) case WACOM_HID_WD_SENSE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) features->quirks |= WACOM_QUIRK_SENSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) wacom_map_usage(input, usage, field, EV_KEY, BTN_TOOL_PEN, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) case WACOM_HID_WD_SERIALHI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) wacom_map_usage(input, usage, field, EV_ABS, ABS_MISC, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) if (!(features->quirks & WACOM_QUIRK_AESPEN)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) set_bit(EV_KEY, input->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) input_set_capability(input, EV_KEY, BTN_TOOL_PEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) input_set_capability(input, EV_KEY, BTN_TOOL_RUBBER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) input_set_capability(input, EV_KEY, BTN_TOOL_BRUSH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) input_set_capability(input, EV_KEY, BTN_TOOL_PENCIL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) input_set_capability(input, EV_KEY, BTN_TOOL_AIRBRUSH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) if (!(features->device_type & WACOM_DEVICETYPE_DIRECT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) input_set_capability(input, EV_KEY, BTN_TOOL_MOUSE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) input_set_capability(input, EV_KEY, BTN_TOOL_LENS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) case WACOM_HID_WD_FINGERWHEEL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) wacom_map_usage(input, usage, field, EV_ABS, ABS_WHEEL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) static void wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) struct hid_usage *usage, __s32 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) struct wacom_features *features = &wacom_wac->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) struct input_dev *input = wacom_wac->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) if (wacom_wac->is_invalid_bt_frame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) switch (equivalent_usage) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) case HID_GD_Z:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) * HID_GD_Z "should increase as the control's position is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) * moved from high to low", while ABS_DISTANCE instead
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) * increases in value as the tool moves from low to high.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) value = field->logical_maximum - value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) case HID_DG_INRANGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) wacom_wac->hid_data.inrange_state = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) if (!(features->quirks & WACOM_QUIRK_SENSE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) wacom_wac->hid_data.sense_state = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) case HID_DG_INVERT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) wacom_wac->hid_data.invert_state = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) case HID_DG_ERASER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) case HID_DG_TIPSWITCH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) wacom_wac->hid_data.tipswitch |= value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) case HID_DG_BARRELSWITCH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) wacom_wac->hid_data.barrelswitch = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) case HID_DG_BARRELSWITCH2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) wacom_wac->hid_data.barrelswitch2 = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) case HID_DG_TOOLSERIALNUMBER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) if (value) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) wacom_wac->serial[0] = (wacom_wac->serial[0] & ~0xFFFFFFFFULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) wacom_wac->serial[0] |= wacom_s32tou(value, field->report_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) case HID_DG_TWIST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) * Userspace expects pen twist to have its zero point when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) * the buttons/finger is on the tablet's left. HID values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) * are zero when buttons are toward the top.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) value = wacom_offset_rotation(input, usage, value, 1, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) case WACOM_HID_WD_SENSE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) wacom_wac->hid_data.sense_state = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) case WACOM_HID_WD_SERIALHI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) if (value) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) __u32 raw_value = wacom_s32tou(value, field->report_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) wacom_wac->serial[0] = (wacom_wac->serial[0] & 0xFFFFFFFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) wacom_wac->serial[0] |= ((__u64)raw_value) << 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) * Non-USI EMR devices may contain additional tool type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) * information here. See WACOM_HID_WD_TOOLTYPE case for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) * more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) if (value >> 20 == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) wacom_wac->id[0] |= raw_value & 0xFFFFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) case WACOM_HID_WD_TOOLTYPE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) * Some devices (MobileStudio Pro, and possibly later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) * devices as well) do not return the complete tool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) * type in their WACOM_HID_WD_TOOLTYPE usage. Use a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) * bitwise OR so the complete value can be built
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) * up over time :(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) wacom_wac->id[0] |= wacom_s32tou(value, field->report_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) case WACOM_HID_WD_OFFSETLEFT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) if (features->offset_left && value != features->offset_left)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) hid_warn(hdev, "%s: overriding existing left offset "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) "%d -> %d\n", __func__, value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) features->offset_left);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) features->offset_left = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) case WACOM_HID_WD_OFFSETRIGHT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) if (features->offset_right && value != features->offset_right)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) hid_warn(hdev, "%s: overriding existing right offset "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) "%d -> %d\n", __func__, value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) features->offset_right);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) features->offset_right = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) case WACOM_HID_WD_OFFSETTOP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) if (features->offset_top && value != features->offset_top)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) hid_warn(hdev, "%s: overriding existing top offset "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) "%d -> %d\n", __func__, value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) features->offset_top);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) features->offset_top = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) case WACOM_HID_WD_OFFSETBOTTOM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) if (features->offset_bottom && value != features->offset_bottom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) hid_warn(hdev, "%s: overriding existing bottom offset "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) "%d -> %d\n", __func__, value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) features->offset_bottom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) features->offset_bottom = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) case WACOM_HID_WD_REPORT_VALID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) wacom_wac->is_invalid_bt_frame = !value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) /* send pen events only when touch is up or forced out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) * or touch arbitration is off
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) if (!usage->type || delay_pen_events(wacom_wac))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) /* send pen events only when the pen is in range */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) if (wacom_wac->hid_data.inrange_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) input_event(input, usage->type, usage->code, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) else if (wacom_wac->shared->stylus_in_proximity && !wacom_wac->hid_data.sense_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) input_event(input, usage->type, usage->code, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) static void wacom_wac_pen_pre_report(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) struct hid_report *report)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) wacom_wac->is_invalid_bt_frame = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) static void wacom_wac_pen_report(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) struct hid_report *report)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) struct input_dev *input = wacom_wac->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) bool range = wacom_wac->hid_data.inrange_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) bool sense = wacom_wac->hid_data.sense_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) if (wacom_wac->is_invalid_bt_frame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) if (!wacom_wac->tool[0] && range) { /* first in range */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) /* Going into range select tool */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) if (wacom_wac->hid_data.invert_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) wacom_wac->tool[0] = BTN_TOOL_RUBBER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) else if (wacom_wac->id[0])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) wacom_wac->tool[0] = wacom_intuos_get_tool_type(wacom_wac->id[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) wacom_wac->tool[0] = BTN_TOOL_PEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) /* keep pen state for touch events */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) wacom_wac->shared->stylus_in_proximity = sense;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) if (!delay_pen_events(wacom_wac) && wacom_wac->tool[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) int id = wacom_wac->id[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) int sw_state = wacom_wac->hid_data.barrelswitch |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) (wacom_wac->hid_data.barrelswitch2 << 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) input_report_key(input, BTN_STYLUS, sw_state == 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) input_report_key(input, BTN_STYLUS2, sw_state == 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) input_report_key(input, BTN_STYLUS3, sw_state == 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) * Non-USI EMR tools should have their IDs mangled to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) * match the legacy behavior of wacom_intuos_general
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) if (wacom_wac->serial[0] >> 52 == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) id = wacom_intuos_id_mangle(id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) * To ensure compatibility with xf86-input-wacom, we should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) * report the BTN_TOOL_* event prior to the ABS_MISC or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) * MSC_SERIAL events.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) input_report_key(input, BTN_TOUCH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) wacom_wac->hid_data.tipswitch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) input_report_key(input, wacom_wac->tool[0], sense);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) if (wacom_wac->serial[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) input_event(input, EV_MSC, MSC_SERIAL, wacom_wac->serial[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) input_report_abs(input, ABS_MISC, sense ? id : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) wacom_wac->hid_data.tipswitch = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) input_sync(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) if (!sense) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) wacom_wac->tool[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) wacom_wac->id[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) wacom_wac->serial[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) static void wacom_wac_finger_usage_mapping(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) struct hid_field *field, struct hid_usage *usage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) struct input_dev *input = wacom_wac->touch_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) unsigned touch_max = wacom_wac->features.touch_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) switch (equivalent_usage) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) case HID_GD_X:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) if (touch_max == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) wacom_map_usage(input, usage, field, EV_ABS, ABS_X, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) wacom_map_usage(input, usage, field, EV_ABS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) ABS_MT_POSITION_X, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) case HID_GD_Y:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) if (touch_max == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) wacom_map_usage(input, usage, field, EV_ABS, ABS_Y, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) wacom_map_usage(input, usage, field, EV_ABS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) ABS_MT_POSITION_Y, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) case HID_DG_WIDTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) case HID_DG_HEIGHT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) wacom_map_usage(input, usage, field, EV_ABS, ABS_MT_TOUCH_MAJOR, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) wacom_map_usage(input, usage, field, EV_ABS, ABS_MT_TOUCH_MINOR, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) input_set_abs_params(input, ABS_MT_ORIENTATION, 0, 1, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) case HID_DG_TIPSWITCH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) wacom_map_usage(input, usage, field, EV_KEY, BTN_TOUCH, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) case HID_DG_CONTACTCOUNT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) wacom_wac->hid_data.cc_report = field->report->id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) wacom_wac->hid_data.cc_index = field->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) wacom_wac->hid_data.cc_value_index = usage->usage_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) case HID_DG_CONTACTID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) if ((field->logical_maximum - field->logical_minimum) < touch_max) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) * The HID descriptor for G11 sensors leaves logical
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) * maximum set to '1' despite it being a multitouch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) * device. Override to a sensible number.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) field->logical_maximum = 255;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) static void wacom_wac_finger_slot(struct wacom_wac *wacom_wac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) struct input_dev *input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) struct hid_data *hid_data = &wacom_wac->hid_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) bool mt = wacom_wac->features.touch_max > 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) bool prox = hid_data->tipswitch &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) report_touch_events(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) if (wacom_wac->shared->has_mute_touch_switch &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) !wacom_wac->shared->is_touch_on) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) if (!wacom_wac->shared->touch_down)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) prox = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) wacom_wac->hid_data.num_received++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) if (wacom_wac->hid_data.num_received > wacom_wac->hid_data.num_expected)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) if (mt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) int slot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) slot = input_mt_get_slot_by_key(input, hid_data->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) input_mt_slot(input, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) input_mt_report_slot_state(input, MT_TOOL_FINGER, prox);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) input_report_key(input, BTN_TOUCH, prox);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) if (prox) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) input_report_abs(input, mt ? ABS_MT_POSITION_X : ABS_X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) hid_data->x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) input_report_abs(input, mt ? ABS_MT_POSITION_Y : ABS_Y,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) hid_data->y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) if (test_bit(ABS_MT_TOUCH_MAJOR, input->absbit)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) input_report_abs(input, ABS_MT_TOUCH_MAJOR, max(hid_data->width, hid_data->height));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) input_report_abs(input, ABS_MT_TOUCH_MINOR, min(hid_data->width, hid_data->height));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) if (hid_data->width != hid_data->height)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) input_report_abs(input, ABS_MT_ORIENTATION, hid_data->width <= hid_data->height ? 0 : 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) static bool wacom_wac_slot_is_active(struct input_dev *dev, int key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) struct input_mt *mt = dev->mt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) struct input_mt_slot *s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) if (!mt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) for (s = mt->slots; s != mt->slots + mt->num_slots; s++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) if (s->key == key &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) input_mt_get_value(s, ABS_MT_TRACKING_ID) >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) static void wacom_wac_finger_event(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) struct hid_field *field, struct hid_usage *usage, __s32 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) struct wacom_features *features = &wacom->wacom_wac.features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) if (wacom_wac->is_invalid_bt_frame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) switch (equivalent_usage) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) case HID_DG_CONFIDENCE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) wacom_wac->hid_data.confidence = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) case HID_GD_X:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) wacom_wac->hid_data.x = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) case HID_GD_Y:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) wacom_wac->hid_data.y = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) case HID_DG_WIDTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) wacom_wac->hid_data.width = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) case HID_DG_HEIGHT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) wacom_wac->hid_data.height = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) case HID_DG_CONTACTID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) wacom_wac->hid_data.id = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) case HID_DG_TIPSWITCH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) wacom_wac->hid_data.tipswitch = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) case WACOM_HID_WT_REPORT_VALID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) wacom_wac->is_invalid_bt_frame = !value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) case HID_DG_CONTACTMAX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) if (!features->touch_max) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) features->touch_max = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) hid_warn(hdev, "%s: ignoring attempt to overwrite non-zero touch_max "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) "%d -> %d\n", __func__, features->touch_max, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) if (usage->usage_index + 1 == field->report_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) if (equivalent_usage == wacom_wac->hid_data.last_slot_field) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) bool touch_removed = wacom_wac_slot_is_active(wacom_wac->touch_input,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) wacom_wac->hid_data.id) && !wacom_wac->hid_data.tipswitch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) if (wacom_wac->hid_data.confidence || touch_removed) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) wacom_wac_finger_slot(wacom_wac, wacom_wac->touch_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) static void wacom_wac_finger_pre_report(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) struct hid_report *report)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) struct hid_data* hid_data = &wacom_wac->hid_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) wacom_wac->is_invalid_bt_frame = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) hid_data->confidence = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) hid_data->cc_report = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) hid_data->cc_index = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) hid_data->cc_value_index = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) for (i = 0; i < report->maxfield; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) struct hid_field *field = report->field[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) int j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) for (j = 0; j < field->maxusage; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) struct hid_usage *usage = &field->usage[j];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) unsigned int equivalent_usage =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) wacom_equivalent_usage(usage->hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) switch (equivalent_usage) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) case HID_GD_X:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) case HID_GD_Y:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) case HID_DG_WIDTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) case HID_DG_HEIGHT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) case HID_DG_CONTACTID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) case HID_DG_INRANGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) case HID_DG_INVERT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) case HID_DG_TIPSWITCH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) hid_data->last_slot_field = equivalent_usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) case HID_DG_CONTACTCOUNT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) hid_data->cc_report = report->id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) hid_data->cc_index = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) hid_data->cc_value_index = j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) if (hid_data->cc_report != 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) hid_data->cc_index >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) struct hid_field *field = report->field[hid_data->cc_index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) int value = field->value[hid_data->cc_value_index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) if (value) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) hid_data->num_expected = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) hid_data->num_received = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) hid_data->num_expected = wacom_wac->features.touch_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) hid_data->num_received = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) static void wacom_wac_finger_report(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) struct hid_report *report)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) struct input_dev *input = wacom_wac->touch_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) unsigned touch_max = wacom_wac->features.touch_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) /* If more packets of data are expected, give us a chance to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) * process them rather than immediately syncing a partial
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) * update.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) if (wacom_wac->hid_data.num_received < wacom_wac->hid_data.num_expected)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) if (touch_max > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) input_mt_sync_frame(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) input_sync(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) wacom_wac->hid_data.num_received = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) wacom_wac->hid_data.num_expected = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) /* keep touch state for pen event */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) wacom_wac->shared->touch_down = wacom_wac_finger_count_touches(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) void wacom_wac_usage_mapping(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) struct hid_field *field, struct hid_usage *usage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) struct wacom_features *features = &wacom_wac->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) if (WACOM_DIRECT_DEVICE(field))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) features->device_type |= WACOM_DEVICETYPE_DIRECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) /* usage tests must precede field tests */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) if (WACOM_BATTERY_USAGE(usage))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) wacom_wac_battery_usage_mapping(hdev, field, usage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) else if (WACOM_PAD_FIELD(field))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) wacom_wac_pad_usage_mapping(hdev, field, usage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) else if (WACOM_PEN_FIELD(field))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) wacom_wac_pen_usage_mapping(hdev, field, usage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) else if (WACOM_FINGER_FIELD(field))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) wacom_wac_finger_usage_mapping(hdev, field, usage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) void wacom_wac_event(struct hid_device *hdev, struct hid_field *field,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) struct hid_usage *usage, __s32 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) if (wacom->wacom_wac.features.type != HID_GENERIC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) if (value > field->logical_maximum || value < field->logical_minimum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) /* usage tests must precede field tests */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) if (WACOM_BATTERY_USAGE(usage))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) wacom_wac_battery_event(hdev, field, usage, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) else if (WACOM_PAD_FIELD(field) && wacom->wacom_wac.pad_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) wacom_wac_pad_event(hdev, field, usage, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) wacom_wac_pen_event(hdev, field, usage, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) else if (WACOM_FINGER_FIELD(field) && wacom->wacom_wac.touch_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) wacom_wac_finger_event(hdev, field, usage, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) static void wacom_report_events(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) struct hid_report *report, int collection_index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) int field_index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) for (r = field_index; r < report->maxfield; r++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) struct hid_field *field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) unsigned count, n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) field = report->field[r];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) count = field->report_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) if (!(HID_MAIN_ITEM_VARIABLE & field->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) for (n = 0 ; n < count; n++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) if (field->usage[n].collection_index == collection_index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) wacom_wac_event(hdev, field, &field->usage[n],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) field->value[n]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) static int wacom_wac_collection(struct hid_device *hdev, struct hid_report *report,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) int collection_index, struct hid_field *field,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) int field_index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) wacom_report_events(hdev, report, collection_index, field_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) * Non-input reports may be sent prior to the device being
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) * completely initialized. Since only their events need
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) * to be processed, exit after 'wacom_report_events' has
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) * been called to prevent potential crashes in the report-
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) * processing functions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) if (report->type != HID_INPUT_REPORT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) if (WACOM_PAD_FIELD(field))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) wacom_wac_pen_report(hdev, report);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) else if (WACOM_FINGER_FIELD(field) && wacom->wacom_wac.touch_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) wacom_wac_finger_report(hdev, report);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) void wacom_wac_report(struct hid_device *hdev, struct hid_report *report)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) struct wacom *wacom = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) struct hid_field *field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) bool pad_in_hid_field = false, pen_in_hid_field = false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) finger_in_hid_field = false, true_pad = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) int prev_collection = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) if (wacom_wac->features.type != HID_GENERIC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) for (r = 0; r < report->maxfield; r++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842) field = report->field[r];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) if (WACOM_PAD_FIELD(field))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) pad_in_hid_field = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) if (WACOM_PEN_FIELD(field))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) pen_in_hid_field = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) if (WACOM_FINGER_FIELD(field))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) finger_in_hid_field = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) if (wacom_equivalent_usage(field->physical) == HID_DG_TABLETFUNCTIONKEY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) true_pad = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) wacom_wac_battery_pre_report(hdev, report);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) if (pad_in_hid_field && wacom->wacom_wac.pad_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) wacom_wac_pad_pre_report(hdev, report);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) if (pen_in_hid_field && wacom->wacom_wac.pen_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) wacom_wac_pen_pre_report(hdev, report);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) if (finger_in_hid_field && wacom->wacom_wac.touch_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) wacom_wac_finger_pre_report(hdev, report);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) for (r = 0; r < report->maxfield; r++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) field = report->field[r];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) if (field->usage[0].collection_index != prev_collection) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) if (wacom_wac_collection(hdev, report,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) field->usage[0].collection_index, field, r) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) prev_collection = field->usage[0].collection_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) wacom_wac_battery_report(hdev, report);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) if (true_pad && wacom->wacom_wac.pad_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) wacom_wac_pad_report(hdev, report, field);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) static int wacom_bpt_touch(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) struct wacom_features *features = &wacom->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) struct input_dev *input = wacom->touch_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) struct input_dev *pad_input = wacom->pad_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) if (data[0] != 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) for (i = 0; i < 2; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) int offset = (data[1] & 0x80) ? (8 * i) : (9 * i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) bool touch = report_touch_events(wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) && (data[offset + 3] & 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) input_mt_slot(input, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) if (touch) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) int x = get_unaligned_be16(&data[offset + 3]) & 0x7ff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) int y = get_unaligned_be16(&data[offset + 5]) & 0x7ff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) if (features->quirks & WACOM_QUIRK_BBTOUCH_LOWRES) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) x <<= 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) y <<= 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) input_report_abs(input, ABS_MT_POSITION_X, x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) input_report_abs(input, ABS_MT_POSITION_Y, y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) input_mt_sync_frame(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) input_report_key(pad_input, BTN_LEFT, (data[1] & 0x08) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913) input_report_key(pad_input, BTN_FORWARD, (data[1] & 0x04) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) input_report_key(pad_input, BTN_BACK, (data[1] & 0x02) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) input_report_key(pad_input, BTN_RIGHT, (data[1] & 0x01) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) struct wacom_features *features = &wacom->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) struct input_dev *input = wacom->touch_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) bool touch = data[1] & 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926) int slot = input_mt_get_slot_by_key(input, data[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) if (slot < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) touch = touch && report_touch_events(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933) input_mt_slot(input, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) if (touch) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) int x = (data[2] << 4) | (data[4] >> 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) int y = (data[3] << 4) | (data[4] & 0x0f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939) int width, height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) if (features->type >= INTUOSPS && features->type <= INTUOSHT2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) width = data[5] * 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) height = data[6] * 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) * "a" is a scaled-down area which we assume is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) * roughly circular and which can be described as:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948) * a=(pi*r^2)/C.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) int a = data[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951) int x_res = input_abs_get_res(input, ABS_MT_POSITION_X);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952) int y_res = input_abs_get_res(input, ABS_MT_POSITION_Y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) width = 2 * int_sqrt(a * WACOM_CONTACT_AREA_SCALE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) height = width * y_res / x_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) input_report_abs(input, ABS_MT_POSITION_X, x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958) input_report_abs(input, ABS_MT_POSITION_Y, y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) input_report_abs(input, ABS_MT_TOUCH_MAJOR, width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960) input_report_abs(input, ABS_MT_TOUCH_MINOR, height);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964) static void wacom_bpt3_button_msg(struct wacom_wac *wacom, unsigned char *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966) struct input_dev *input = wacom->pad_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967) struct wacom_features *features = &wacom->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969) if (features->type == INTUOSHT || features->type == INTUOSHT2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970) input_report_key(input, BTN_LEFT, (data[1] & 0x02) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971) input_report_key(input, BTN_BACK, (data[1] & 0x08) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973) input_report_key(input, BTN_BACK, (data[1] & 0x02) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976) input_report_key(input, BTN_FORWARD, (data[1] & 0x04) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) input_report_key(input, BTN_RIGHT, (data[1] & 0x01) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980) static int wacom_bpt3_touch(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983) int count = data[1] & 0x07;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) int touch_changed = 0, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) if (data[0] != 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) /* data has up to 7 fixed sized 8-byte messages starting at data[2] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990) for (i = 0; i < count; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991) int offset = (8 * i) + 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) int msg_id = data[offset];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994) if (msg_id >= 2 && msg_id <= 17) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995) wacom_bpt3_touch_msg(wacom, data + offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996) touch_changed++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997) } else if (msg_id == 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) wacom_bpt3_button_msg(wacom, data + offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002) /* only update touch if we actually have a touchpad and touch data changed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003) if (wacom->touch_input && touch_changed) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004) input_mt_sync_frame(wacom->touch_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011) static int wacom_bpt_pen(struct wacom_wac *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) struct wacom_features *features = &wacom->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014) struct input_dev *input = wacom->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) int x = 0, y = 0, p = 0, d = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) bool pen = false, btn1 = false, btn2 = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018) bool range, prox, rdy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020) if (data[0] != WACOM_REPORT_PENABLED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023) range = (data[1] & 0x80) == 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) prox = (data[1] & 0x40) == 0x40;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025) rdy = (data[1] & 0x20) == 0x20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) wacom->shared->stylus_in_proximity = range;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028) if (delay_pen_events(wacom))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) if (rdy) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032) p = le16_to_cpup((__le16 *)&data[6]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) pen = data[1] & 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034) btn1 = data[1] & 0x02;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035) btn2 = data[1] & 0x04;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037) if (prox) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038) x = le16_to_cpup((__le16 *)&data[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) y = le16_to_cpup((__le16 *)&data[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) if (data[1] & 0x08) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) wacom->tool[0] = BTN_TOOL_RUBBER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) wacom->id[0] = ERASER_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) wacom->tool[0] = BTN_TOOL_PEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046) wacom->id[0] = STYLUS_DEVICE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048) wacom->reporting_data = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050) if (range) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052) * Convert distance from out prox to distance from tablet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) * distance will be greater than distance_max once
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054) * touching and applying pressure; do not report negative
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055) * distance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057) if (data[8] <= features->distance_max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058) d = features->distance_max - data[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060) wacom->id[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063) if (wacom->reporting_data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064) input_report_key(input, BTN_TOUCH, pen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065) input_report_key(input, BTN_STYLUS, btn1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066) input_report_key(input, BTN_STYLUS2, btn2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068) if (prox || !range) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069) input_report_abs(input, ABS_X, x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) input_report_abs(input, ABS_Y, y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) input_report_abs(input, ABS_PRESSURE, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073) input_report_abs(input, ABS_DISTANCE, d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075) input_report_key(input, wacom->tool[0], range); /* PEN or RUBBER */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) input_report_abs(input, ABS_MISC, wacom->id[0]); /* TOOL ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079) if (!range) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080) wacom->reporting_data = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086) static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) struct wacom_features *features = &wacom->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) if ((features->type == INTUOSHT2) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091) (features->device_type & WACOM_DEVICETYPE_PEN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092) return wacom_intuos_irq(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) else if (len == WACOM_PKGLEN_BBTOUCH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094) return wacom_bpt_touch(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) else if (len == WACOM_PKGLEN_BBTOUCH3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096) return wacom_bpt3_touch(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097) else if (len == WACOM_PKGLEN_BBFUN || len == WACOM_PKGLEN_BBPEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098) return wacom_bpt_pen(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103) static void wacom_bamboo_pad_pen_event(struct wacom_wac *wacom,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104) unsigned char *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106) unsigned char prefix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109) * We need to reroute the event from the debug interface to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110) * pen interface.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111) * We need to add the report ID to the actual pen report, so we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) * temporary overwrite the first byte to prevent having to kzalloc/kfree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) * and memcpy the report.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115) prefix = data[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116) data[0] = WACOM_REPORT_BPAD_PEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) * actually reroute the event.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) * No need to check if wacom->shared->pen is valid, hid_input_report()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) * will check for us.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) hid_input_report(wacom->shared->pen, HID_INPUT_REPORT, data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) WACOM_PKGLEN_PENABLED, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126) data[0] = prefix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) static int wacom_bamboo_pad_touch_event(struct wacom_wac *wacom,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130) unsigned char *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132) struct input_dev *input = wacom->touch_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133) unsigned char *finger_data, prefix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) unsigned id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135) int x, y;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136) bool valid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138) prefix = data[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140) for (id = 0; id < wacom->features.touch_max; id++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141) valid = !!(prefix & BIT(id)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) report_touch_events(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144) input_mt_slot(input, id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) input_mt_report_slot_state(input, MT_TOOL_FINGER, valid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147) if (!valid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) finger_data = data + 1 + id * 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151) x = finger_data[0] | ((finger_data[1] & 0x0f) << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152) y = (finger_data[2] << 4) | (finger_data[1] >> 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154) input_report_abs(input, ABS_MT_POSITION_X, x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) input_report_abs(input, ABS_MT_POSITION_Y, y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158) input_mt_sync_frame(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) input_report_key(input, BTN_LEFT, prefix & 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161) input_report_key(input, BTN_RIGHT, prefix & 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) /* keep touch state for pen event */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164) wacom->shared->touch_down = !!prefix && report_touch_events(wacom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169) static int wacom_bamboo_pad_irq(struct wacom_wac *wacom, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173) if (!((len == WACOM_PKGLEN_BPAD_TOUCH) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) (len == WACOM_PKGLEN_BPAD_TOUCH_USB)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) (data[0] != WACOM_REPORT_BPAD_TOUCH))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178) if (data[1] & 0x01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179) wacom_bamboo_pad_pen_event(wacom, &data[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) if (data[1] & 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) return wacom_bamboo_pad_touch_event(wacom, &data[9]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187) static int wacom_wireless_irq(struct wacom_wac *wacom, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) unsigned char *data = wacom->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190) int connected;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192) if (len != WACOM_PKGLEN_WIRELESS || data[0] != WACOM_REPORT_WL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195) connected = data[1] & 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196) if (connected) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197) int pid, battery, charging;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199) if ((wacom->shared->type == INTUOSHT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200) wacom->shared->type == INTUOSHT2) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) wacom->shared->touch_input &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202) wacom->shared->touch_max) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203) input_report_switch(wacom->shared->touch_input,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204) SW_MUTE_DEVICE, data[5] & 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205) input_sync(wacom->shared->touch_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208) pid = get_unaligned_be16(&data[6]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209) battery = (data[5] & 0x3f) * 100 / 31;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) charging = !!(data[5] & 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) if (wacom->pid != pid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212) wacom->pid = pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) wacom_schedule_work(wacom, WACOM_WORKER_WIRELESS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216) wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217) battery, charging, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219) } else if (wacom->pid != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220) /* disconnected while previously connected */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221) wacom->pid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222) wacom_schedule_work(wacom, WACOM_WORKER_WIRELESS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223) wacom_notify_battery(wacom, POWER_SUPPLY_STATUS_UNKNOWN, 0, 0, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229) static int wacom_status_irq(struct wacom_wac *wacom_wac, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231) struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232) struct wacom_features *features = &wacom_wac->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233) unsigned char *data = wacom_wac->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235) if (data[0] != WACOM_REPORT_USB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) if ((features->type == INTUOSHT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239) features->type == INTUOSHT2) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240) wacom_wac->shared->touch_input &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241) features->touch_max) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) input_report_switch(wacom_wac->shared->touch_input,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243) SW_MUTE_DEVICE, data[8] & 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) input_sync(wacom_wac->shared->touch_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) if (data[9] & 0x02) { /* wireless module is attached */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248) int battery = (data[8] & 0x3f) * 100 / 31;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249) bool charging = !!(data[8] & 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251) wacom_notify_battery(wacom_wac, WACOM_POWER_SUPPLY_STATUS_AUTO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252) battery, charging, battery || charging, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) if (!wacom->battery.battery &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255) !(features->quirks & WACOM_QUIRK_BATTERY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256) features->quirks |= WACOM_QUIRK_BATTERY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) wacom_schedule_work(wacom_wac, WACOM_WORKER_BATTERY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260) else if ((features->quirks & WACOM_QUIRK_BATTERY) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261) wacom->battery.battery) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262) features->quirks &= ~WACOM_QUIRK_BATTERY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263) wacom_schedule_work(wacom_wac, WACOM_WORKER_BATTERY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264) wacom_notify_battery(wacom_wac, POWER_SUPPLY_STATUS_UNKNOWN, 0, 0, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269) void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271) bool sync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) switch (wacom_wac->features.type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274) case PENPARTNER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275) sync = wacom_penpartner_irq(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278) case PL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279) sync = wacom_pl_irq(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282) case WACOM_G4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283) case GRAPHIRE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284) case GRAPHIRE_BT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285) case WACOM_MO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286) sync = wacom_graphire_irq(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289) case PTU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290) sync = wacom_ptu_irq(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293) case DTU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294) sync = wacom_dtu_irq(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297) case DTUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298) case DTUSX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299) sync = wacom_dtus_irq(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) case INTUOS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303) case INTUOS3S:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304) case INTUOS3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305) case INTUOS3L:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306) case INTUOS4S:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) case INTUOS4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308) case INTUOS4L:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) case CINTIQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310) case WACOM_BEE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311) case WACOM_13HD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312) case WACOM_21UX2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313) case WACOM_22HD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314) case WACOM_24HD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315) case WACOM_27QHD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316) case DTK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317) case CINTIQ_HYBRID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318) case CINTIQ_COMPANION_2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) sync = wacom_intuos_irq(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322) case INTUOS4WL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323) sync = wacom_intuos_bt_irq(wacom_wac, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326) case WACOM_24HDT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) case WACOM_27QHDT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328) sync = wacom_24hdt_irq(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331) case INTUOS5S:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332) case INTUOS5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333) case INTUOS5L:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334) case INTUOSPS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335) case INTUOSPM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336) case INTUOSPL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337) if (len == WACOM_PKGLEN_BBTOUCH3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338) sync = wacom_bpt3_touch(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339) else if (wacom_wac->data[0] == WACOM_REPORT_USB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340) sync = wacom_status_irq(wacom_wac, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342) sync = wacom_intuos_irq(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345) case INTUOSP2_BT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346) case INTUOSP2S_BT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347) case INTUOSHT3_BT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348) sync = wacom_intuos_pro2_bt_irq(wacom_wac, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) case TABLETPC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352) case TABLETPCE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353) case TABLETPC2FG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354) case MTSCREEN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355) case MTTPC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356) case MTTPC_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357) sync = wacom_tpc_irq(wacom_wac, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360) case BAMBOO_PT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361) case BAMBOO_PEN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362) case BAMBOO_TOUCH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363) case INTUOSHT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364) case INTUOSHT2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365) if (wacom_wac->data[0] == WACOM_REPORT_USB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366) sync = wacom_status_irq(wacom_wac, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368) sync = wacom_bpt_irq(wacom_wac, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371) case BAMBOO_PAD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372) sync = wacom_bamboo_pad_irq(wacom_wac, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375) case WIRELESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376) sync = wacom_wireless_irq(wacom_wac, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379) case REMOTE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380) sync = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381) if (wacom_wac->data[0] == WACOM_REPORT_DEVICE_LIST)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382) wacom_remote_status_irq(wacom_wac, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384) sync = wacom_remote_irq(wacom_wac, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388) sync = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392) if (sync) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393) if (wacom_wac->pen_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) input_sync(wacom_wac->pen_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395) if (wacom_wac->touch_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396) input_sync(wacom_wac->touch_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397) if (wacom_wac->pad_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398) input_sync(wacom_wac->pad_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402) static void wacom_setup_basic_pro_pen(struct wacom_wac *wacom_wac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404) struct input_dev *input_dev = wacom_wac->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406) input_set_capability(input_dev, EV_MSC, MSC_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408) __set_bit(BTN_TOOL_PEN, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3409) __set_bit(BTN_STYLUS, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3410) __set_bit(BTN_STYLUS2, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3412) input_set_abs_params(input_dev, ABS_DISTANCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3413) 0, wacom_wac->features.distance_max, wacom_wac->features.distance_fuzz, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3414) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3416) static void wacom_setup_cintiq(struct wacom_wac *wacom_wac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3417) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3418) struct input_dev *input_dev = wacom_wac->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3419) struct wacom_features *features = &wacom_wac->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3421) wacom_setup_basic_pro_pen(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3423) __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3424) __set_bit(BTN_TOOL_BRUSH, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3425) __set_bit(BTN_TOOL_PENCIL, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3426) __set_bit(BTN_TOOL_AIRBRUSH, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3428) input_set_abs_params(input_dev, ABS_WHEEL, 0, 1023, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3429) input_set_abs_params(input_dev, ABS_TILT_X, -64, 63, features->tilt_fuzz, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3430) input_abs_set_res(input_dev, ABS_TILT_X, 57);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3431) input_set_abs_params(input_dev, ABS_TILT_Y, -64, 63, features->tilt_fuzz, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3432) input_abs_set_res(input_dev, ABS_TILT_Y, 57);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3435) static void wacom_setup_intuos(struct wacom_wac *wacom_wac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3436) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3437) struct input_dev *input_dev = wacom_wac->pen_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3439) input_set_capability(input_dev, EV_REL, REL_WHEEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3441) wacom_setup_cintiq(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3443) __set_bit(BTN_LEFT, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3444) __set_bit(BTN_RIGHT, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3445) __set_bit(BTN_MIDDLE, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3446) __set_bit(BTN_SIDE, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3447) __set_bit(BTN_EXTRA, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3448) __set_bit(BTN_TOOL_MOUSE, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3449) __set_bit(BTN_TOOL_LENS, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3451) input_set_abs_params(input_dev, ABS_RZ, -900, 899, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3452) input_abs_set_res(input_dev, ABS_RZ, 287);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3453) input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3454) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3456) void wacom_setup_device_quirks(struct wacom *wacom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3457) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3458) struct wacom_wac *wacom_wac = &wacom->wacom_wac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3459) struct wacom_features *features = &wacom->wacom_wac.features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3461) /* The pen and pad share the same interface on most devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3462) if (features->type == GRAPHIRE_BT || features->type == WACOM_G4 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3463) features->type == DTUS ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3464) (features->type >= INTUOS3S && features->type <= WACOM_MO)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3465) if (features->device_type & WACOM_DEVICETYPE_PEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3466) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3467) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3469) /* touch device found but size is not defined. use default */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3470) if (features->device_type & WACOM_DEVICETYPE_TOUCH && !features->x_max) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3471) features->x_max = 1023;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3472) features->y_max = 1023;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3475) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3476) * Intuos5/Pro and Bamboo 3rd gen have no useful data about its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3477) * touch interface in its HID descriptor. If this is the touch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3478) * interface (PacketSize of WACOM_PKGLEN_BBTOUCH3), override the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3479) * tablet values.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3480) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3481) if ((features->type >= INTUOS5S && features->type <= INTUOSPL) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3482) (features->type >= INTUOSHT && features->type <= BAMBOO_PT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3483) if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3484) if (features->touch_max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3485) features->device_type |= WACOM_DEVICETYPE_TOUCH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3486) if (features->type >= INTUOSHT && features->type <= BAMBOO_PT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3487) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3489) if (features->type == INTUOSHT2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3490) features->x_max = features->x_max / 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3491) features->y_max = features->y_max / 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3493) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3494) features->x_max = 4096;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3495) features->y_max = 4096;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3496) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3497) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3498) else if (features->pktlen == WACOM_PKGLEN_BBTOUCH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3499) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3500) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3501) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3503) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3504) * Hack for the Bamboo One:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3505) * the device presents a PAD/Touch interface as most Bamboos and even
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3506) * sends ghosts PAD data on it. However, later, we must disable this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3507) * ghost interface, and we can not detect it unless we set it here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3508) * to WACOM_DEVICETYPE_PAD or WACOM_DEVICETYPE_TOUCH.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3509) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3510) if (features->type == BAMBOO_PEN &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3511) features->pktlen == WACOM_PKGLEN_BBTOUCH3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3512) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3514) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3515) * Raw Wacom-mode pen and touch events both come from interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3516) * 0, whose HID descriptor has an application usage of 0xFF0D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3517) * (i.e., WACOM_HID_WD_DIGITIZER). We route pen packets back
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3518) * out through the HID_GENERIC device created for interface 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3519) * so rewrite this one to be of type WACOM_DEVICETYPE_TOUCH.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3520) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3521) if (features->type == BAMBOO_PAD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3522) features->device_type = WACOM_DEVICETYPE_TOUCH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3524) if (features->type == REMOTE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3525) features->device_type = WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3527) if (features->type == INTUOSP2_BT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3528) features->type == INTUOSP2S_BT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3529) features->device_type |= WACOM_DEVICETYPE_PEN |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3530) WACOM_DEVICETYPE_PAD |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3531) WACOM_DEVICETYPE_TOUCH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3532) features->quirks |= WACOM_QUIRK_BATTERY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3533) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3535) if (features->type == INTUOSHT3_BT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3536) features->device_type |= WACOM_DEVICETYPE_PEN |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3537) WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3538) features->quirks |= WACOM_QUIRK_BATTERY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3539) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3541) switch (features->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3542) case PL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3543) case DTU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3544) case DTUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3545) case DTUSX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3546) case WACOM_21UX2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3547) case WACOM_22HD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3548) case DTK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3549) case WACOM_24HD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3550) case WACOM_27QHD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3551) case CINTIQ_HYBRID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3552) case CINTIQ_COMPANION_2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3553) case CINTIQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3554) case WACOM_BEE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3555) case WACOM_13HD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3556) case WACOM_24HDT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3557) case WACOM_27QHDT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3558) case TABLETPC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3559) case TABLETPCE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3560) case TABLETPC2FG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3561) case MTSCREEN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3562) case MTTPC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3563) case MTTPC_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3564) features->device_type |= WACOM_DEVICETYPE_DIRECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3565) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3568) if (wacom->hdev->bus == BUS_BLUETOOTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3569) features->quirks |= WACOM_QUIRK_BATTERY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3571) /* quirk for bamboo touch with 2 low res touches */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3572) if ((features->type == BAMBOO_PT || features->type == BAMBOO_TOUCH) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3573) features->pktlen == WACOM_PKGLEN_BBTOUCH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3574) features->x_max <<= 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3575) features->y_max <<= 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3576) features->x_fuzz <<= 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3577) features->y_fuzz <<= 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3578) features->quirks |= WACOM_QUIRK_BBTOUCH_LOWRES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3579) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3581) if (features->type == WIRELESS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3582) if (features->device_type == WACOM_DEVICETYPE_WL_MONITOR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3583) features->quirks |= WACOM_QUIRK_BATTERY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3585) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3587) if (features->type == REMOTE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3588) features->device_type |= WACOM_DEVICETYPE_WL_MONITOR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3590) /* HID descriptor for DTK-2451 / DTH-2452 claims to report lots
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3591) * of things it shouldn't. Lets fix up the damage...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3592) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3593) if (wacom->hdev->product == 0x382 || wacom->hdev->product == 0x37d) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3594) features->quirks &= ~WACOM_QUIRK_TOOLSERIAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3595) __clear_bit(BTN_TOOL_BRUSH, wacom_wac->pen_input->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3596) __clear_bit(BTN_TOOL_PENCIL, wacom_wac->pen_input->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3597) __clear_bit(BTN_TOOL_AIRBRUSH, wacom_wac->pen_input->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3598) __clear_bit(ABS_Z, wacom_wac->pen_input->absbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3599) __clear_bit(ABS_DISTANCE, wacom_wac->pen_input->absbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3600) __clear_bit(ABS_TILT_X, wacom_wac->pen_input->absbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3601) __clear_bit(ABS_TILT_Y, wacom_wac->pen_input->absbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3602) __clear_bit(ABS_WHEEL, wacom_wac->pen_input->absbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3603) __clear_bit(ABS_MISC, wacom_wac->pen_input->absbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3604) __clear_bit(MSC_SERIAL, wacom_wac->pen_input->mscbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3605) __clear_bit(EV_MSC, wacom_wac->pen_input->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3606) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3607) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3609) int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3610) struct wacom_wac *wacom_wac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3611) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3612) struct wacom_features *features = &wacom_wac->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3614) if (!(features->device_type & WACOM_DEVICETYPE_PEN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3615) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3617) if (features->device_type & WACOM_DEVICETYPE_DIRECT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3618) __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3619) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3620) __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3622) if (features->type == HID_GENERIC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3623) /* setup has already been done; apply otherwise-undetectible quirks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3624) input_set_capability(input_dev, EV_KEY, BTN_STYLUS3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3625) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3626) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3628) input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3629) __set_bit(BTN_TOUCH, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3630) __set_bit(ABS_MISC, input_dev->absbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3632) input_set_abs_params(input_dev, ABS_X, 0 + features->offset_left,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3633) features->x_max - features->offset_right,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3634) features->x_fuzz, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3635) input_set_abs_params(input_dev, ABS_Y, 0 + features->offset_top,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3636) features->y_max - features->offset_bottom,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3637) features->y_fuzz, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3638) input_set_abs_params(input_dev, ABS_PRESSURE, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3639) features->pressure_max, features->pressure_fuzz, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3641) /* penabled devices have fixed resolution for each model */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3642) input_abs_set_res(input_dev, ABS_X, features->x_resolution);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3643) input_abs_set_res(input_dev, ABS_Y, features->y_resolution);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3645) switch (features->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3646) case GRAPHIRE_BT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3647) __clear_bit(ABS_MISC, input_dev->absbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3648) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3650) case WACOM_MO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3651) case WACOM_G4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3652) input_set_abs_params(input_dev, ABS_DISTANCE, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3653) features->distance_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3654) features->distance_fuzz, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3655) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3657) case GRAPHIRE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3658) input_set_capability(input_dev, EV_REL, REL_WHEEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3660) __set_bit(BTN_LEFT, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3661) __set_bit(BTN_RIGHT, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3662) __set_bit(BTN_MIDDLE, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3664) __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3665) __set_bit(BTN_TOOL_PEN, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3666) __set_bit(BTN_TOOL_MOUSE, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3667) __set_bit(BTN_STYLUS, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3668) __set_bit(BTN_STYLUS2, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3669) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3671) case WACOM_27QHD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3672) case WACOM_24HD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3673) case DTK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3674) case WACOM_22HD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3675) case WACOM_21UX2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3676) case WACOM_BEE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3677) case CINTIQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3678) case WACOM_13HD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3679) case CINTIQ_HYBRID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3680) case CINTIQ_COMPANION_2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3681) input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3682) input_abs_set_res(input_dev, ABS_Z, 287);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3683) wacom_setup_cintiq(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3684) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3686) case INTUOS3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3687) case INTUOS3L:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3688) case INTUOS3S:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3689) case INTUOS4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3690) case INTUOS4WL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3691) case INTUOS4L:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3692) case INTUOS4S:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3693) input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3694) input_abs_set_res(input_dev, ABS_Z, 287);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3695) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3697) case INTUOS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3698) wacom_setup_intuos(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3699) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3701) case INTUOS5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3702) case INTUOS5L:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3703) case INTUOSPM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3704) case INTUOSPL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3705) case INTUOS5S:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3706) case INTUOSPS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3707) case INTUOSP2_BT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3708) case INTUOSP2S_BT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3709) input_set_abs_params(input_dev, ABS_DISTANCE, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3710) features->distance_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3711) features->distance_fuzz, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3713) input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3714) input_abs_set_res(input_dev, ABS_Z, 287);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3716) wacom_setup_intuos(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3717) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3719) case WACOM_24HDT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3720) case WACOM_27QHDT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3721) case MTSCREEN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3722) case MTTPC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3723) case MTTPC_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3724) case TABLETPC2FG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3725) case TABLETPC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3726) case TABLETPCE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3727) __clear_bit(ABS_MISC, input_dev->absbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3728) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3730) case DTUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3731) case DTUSX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3732) case PL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3733) case DTU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3734) __set_bit(BTN_TOOL_PEN, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3735) __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3736) __set_bit(BTN_STYLUS, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3737) __set_bit(BTN_STYLUS2, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3738) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3740) case PTU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3741) __set_bit(BTN_STYLUS2, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3742) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3744) case PENPARTNER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3745) __set_bit(BTN_TOOL_PEN, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3746) __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3747) __set_bit(BTN_STYLUS, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3748) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3750) case INTUOSHT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3751) case BAMBOO_PT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3752) case BAMBOO_PEN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3753) case INTUOSHT2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3754) case INTUOSHT3_BT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3755) if (features->type == INTUOSHT2 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3756) features->type == INTUOSHT3_BT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3757) wacom_setup_basic_pro_pen(wacom_wac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3758) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3759) __clear_bit(ABS_MISC, input_dev->absbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3760) __set_bit(BTN_TOOL_PEN, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3761) __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3762) __set_bit(BTN_STYLUS, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3763) __set_bit(BTN_STYLUS2, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3764) input_set_abs_params(input_dev, ABS_DISTANCE, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3765) features->distance_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3766) features->distance_fuzz, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3767) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3768) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3769) case BAMBOO_PAD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3770) __clear_bit(ABS_MISC, input_dev->absbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3771) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3772) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3773) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3774) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3776) int wacom_setup_touch_input_capabilities(struct input_dev *input_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3777) struct wacom_wac *wacom_wac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3778) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3779) struct wacom_features *features = &wacom_wac->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3781) if (!(features->device_type & WACOM_DEVICETYPE_TOUCH))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3782) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3784) if (features->device_type & WACOM_DEVICETYPE_DIRECT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3785) __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3786) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3787) __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3788)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3789) if (features->type == HID_GENERIC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3790) /* setup has already been done */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3791) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3793) input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3794) __set_bit(BTN_TOUCH, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3796) if (features->touch_max == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3797) input_set_abs_params(input_dev, ABS_X, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3798) features->x_max, features->x_fuzz, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3799) input_set_abs_params(input_dev, ABS_Y, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3800) features->y_max, features->y_fuzz, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3801) input_abs_set_res(input_dev, ABS_X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3802) features->x_resolution);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3803) input_abs_set_res(input_dev, ABS_Y,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3804) features->y_resolution);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3805) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3806) else if (features->touch_max > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3807) input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3808) features->x_max, features->x_fuzz, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3809) input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3810) features->y_max, features->y_fuzz, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3811) input_abs_set_res(input_dev, ABS_MT_POSITION_X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3812) features->x_resolution);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3813) input_abs_set_res(input_dev, ABS_MT_POSITION_Y,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3814) features->y_resolution);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3815) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3817) switch (features->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3818) case INTUOSP2_BT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3819) case INTUOSP2S_BT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3820) input_dev->evbit[0] |= BIT_MASK(EV_SW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3821) __set_bit(SW_MUTE_DEVICE, input_dev->swbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3823) if (wacom_wac->shared->touch->product == 0x361) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3824) input_set_abs_params(input_dev, ABS_MT_POSITION_X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3825) 0, 12440, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3826) input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3827) 0, 8640, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3828) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3829) else if (wacom_wac->shared->touch->product == 0x360) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3830) input_set_abs_params(input_dev, ABS_MT_POSITION_X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3831) 0, 8960, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3832) input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3833) 0, 5920, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3834) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3835) else if (wacom_wac->shared->touch->product == 0x393) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3836) input_set_abs_params(input_dev, ABS_MT_POSITION_X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3837) 0, 6400, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3838) input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3839) 0, 4000, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3840) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3841) input_abs_set_res(input_dev, ABS_MT_POSITION_X, 40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3842) input_abs_set_res(input_dev, ABS_MT_POSITION_Y, 40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3844) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3846) case INTUOS5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3847) case INTUOS5L:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3848) case INTUOSPM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3849) case INTUOSPL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3850) case INTUOS5S:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3851) case INTUOSPS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3852) input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, features->x_max, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3853) input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR, 0, features->y_max, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3854) input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3855) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3856)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3857) case WACOM_24HDT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3858) input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, features->x_max, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3859) input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, features->x_max, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3860) input_set_abs_params(input_dev, ABS_MT_WIDTH_MINOR, 0, features->y_max, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3861) input_set_abs_params(input_dev, ABS_MT_ORIENTATION, 0, 1, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3862) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3864) case WACOM_27QHDT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3865) if (wacom_wac->shared->touch->product == 0x32C ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3866) wacom_wac->shared->touch->product == 0xF6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3867) input_dev->evbit[0] |= BIT_MASK(EV_SW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3868) __set_bit(SW_MUTE_DEVICE, input_dev->swbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3869) wacom_wac->has_mute_touch_switch = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3870) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3871) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3873) case MTSCREEN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3874) case MTTPC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3875) case MTTPC_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3876) case TABLETPC2FG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3877) input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_DIRECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3878) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3880) case TABLETPC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3881) case TABLETPCE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3882) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3883)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3884) case INTUOSHT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3885) case INTUOSHT2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3886) input_dev->evbit[0] |= BIT_MASK(EV_SW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3887) __set_bit(SW_MUTE_DEVICE, input_dev->swbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3888) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3890) case BAMBOO_PT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3891) case BAMBOO_TOUCH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3892) if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3893) input_set_abs_params(input_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3894) ABS_MT_TOUCH_MAJOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3895) 0, features->x_max, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3896) input_set_abs_params(input_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3897) ABS_MT_TOUCH_MINOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3898) 0, features->y_max, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3899) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3900) input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3901) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3903) case BAMBOO_PAD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3904) input_mt_init_slots(input_dev, features->touch_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3905) INPUT_MT_POINTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3906) __set_bit(BTN_LEFT, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3907) __set_bit(BTN_RIGHT, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3908) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3909) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3910) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3911) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3912)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3913) static int wacom_numbered_button_to_key(int n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3914) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3915) if (n < 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3916) return BTN_0 + n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3917) else if (n < 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3918) return BTN_A + (n-10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3919) else if (n < 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3920) return BTN_BASE + (n-16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3921) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3922) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3923) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3925) static void wacom_setup_numbered_buttons(struct input_dev *input_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3926) int button_count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3927) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3928) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3929)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3930) for (i = 0; i < button_count; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3931) int key = wacom_numbered_button_to_key(i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3933) if (key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3934) __set_bit(key, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3935) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3936) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3937)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3938) static void wacom_24hd_update_leds(struct wacom *wacom, int mask, int group)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3939) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3940) struct wacom_led *led;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3941) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3942) bool updated = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3944) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3945) * 24HD has LED group 1 to the left and LED group 0 to the right.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3946) * So group 0 matches the second half of the buttons and thus the mask
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3947) * needs to be shifted.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3948) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3949) if (group == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3950) mask >>= 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3952) for (i = 0; i < 3; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3953) led = wacom_led_find(wacom, group, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3954) if (!led) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3955) hid_err(wacom->hdev, "can't find LED %d in group %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3956) i, group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3957) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3958) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3959) if (!updated && mask & BIT(i)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3960) led->held = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3961) led_trigger_event(&led->trigger, LED_FULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3962) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3963) led->held = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3964) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3968) static bool wacom_is_led_toggled(struct wacom *wacom, int button_count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3969) int mask, int group)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3970) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3971) int group_button;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3973) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3974) * 21UX2 has LED group 1 to the left and LED group 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3975) * to the right. We need to reverse the group to match this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3976) * historical behavior.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3977) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3978) if (wacom->wacom_wac.features.type == WACOM_21UX2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3979) group = 1 - group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3981) group_button = group * (button_count/wacom->led.count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3983) if (wacom->wacom_wac.features.type == INTUOSP2_BT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3984) group_button = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3986) return mask & (1 << group_button);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3987) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3989) static void wacom_update_led(struct wacom *wacom, int button_count, int mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3990) int group)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3991) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3992) struct wacom_led *led, *next_led;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3993) int cur;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3994) bool pressed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3996) if (wacom->wacom_wac.features.type == WACOM_24HD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3997) return wacom_24hd_update_leds(wacom, mask, group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3999) pressed = wacom_is_led_toggled(wacom, button_count, mask, group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4000) cur = wacom->led.groups[group].select;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4002) led = wacom_led_find(wacom, group, cur);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4003) if (!led) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4004) hid_err(wacom->hdev, "can't find current LED %d in group %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4005) cur, group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4006) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4007) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4009) if (!pressed) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4010) led->held = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4011) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4012) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4014) if (led->held && pressed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4015) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4017) next_led = wacom_led_next(wacom, led);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4018) if (!next_led) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4019) hid_err(wacom->hdev, "can't find next LED in group %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4020) group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4021) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4022) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4023) if (next_led == led)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4024) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4026) next_led->held = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4027) led_trigger_event(&next_led->trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4028) wacom_leds_brightness_get(next_led));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4029) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4031) static void wacom_report_numbered_buttons(struct input_dev *input_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4032) int button_count, int mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4033) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4034) struct wacom *wacom = input_get_drvdata(input_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4035) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4037) for (i = 0; i < wacom->led.count; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4038) wacom_update_led(wacom, button_count, mask, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4039)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4040) for (i = 0; i < button_count; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4041) int key = wacom_numbered_button_to_key(i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4043) if (key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4044) input_report_key(input_dev, key, mask & (1 << i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4045) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4046) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4047)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4048) int wacom_setup_pad_input_capabilities(struct input_dev *input_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4049) struct wacom_wac *wacom_wac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4050) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4051) struct wacom_features *features = &wacom_wac->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4053) if ((features->type == HID_GENERIC) && features->numbered_buttons > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4054) features->device_type |= WACOM_DEVICETYPE_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4056) if (!(features->device_type & WACOM_DEVICETYPE_PAD))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4057) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4058)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4059) if (features->type == REMOTE && input_dev == wacom_wac->pad_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4060) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4062) input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4064) /* kept for making legacy xf86-input-wacom working with the wheels */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4065) __set_bit(ABS_MISC, input_dev->absbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4067) /* kept for making legacy xf86-input-wacom accepting the pad */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4068) if (!(input_dev->absinfo && (input_dev->absinfo[ABS_X].minimum ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4069) input_dev->absinfo[ABS_X].maximum)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4070) input_set_abs_params(input_dev, ABS_X, 0, 1, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4071) if (!(input_dev->absinfo && (input_dev->absinfo[ABS_Y].minimum ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4072) input_dev->absinfo[ABS_Y].maximum)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4073) input_set_abs_params(input_dev, ABS_Y, 0, 1, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4075) /* kept for making udev and libwacom accepting the pad */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4076) __set_bit(BTN_STYLUS, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4078) wacom_setup_numbered_buttons(input_dev, features->numbered_buttons);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4080) switch (features->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4082) case CINTIQ_HYBRID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4083) case CINTIQ_COMPANION_2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4084) case DTK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4085) case DTUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4086) case GRAPHIRE_BT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4087) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4088)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4089) case WACOM_MO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4090) __set_bit(BTN_BACK, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4091) __set_bit(BTN_LEFT, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4092) __set_bit(BTN_FORWARD, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4093) __set_bit(BTN_RIGHT, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4094) input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4095) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4097) case WACOM_G4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4098) __set_bit(BTN_BACK, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4099) __set_bit(BTN_FORWARD, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4100) input_set_capability(input_dev, EV_REL, REL_WHEEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4101) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4103) case WACOM_24HD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4104) __set_bit(KEY_PROG1, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4105) __set_bit(KEY_PROG2, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4106) __set_bit(KEY_PROG3, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4108) __set_bit(KEY_ONSCREEN_KEYBOARD, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4109) __set_bit(KEY_INFO, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4111) if (!features->oPid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4112) __set_bit(KEY_BUTTONCONFIG, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4114) input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4115) input_set_abs_params(input_dev, ABS_THROTTLE, 0, 71, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4116) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4118) case WACOM_27QHD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4119) __set_bit(KEY_PROG1, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4120) __set_bit(KEY_PROG2, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4121) __set_bit(KEY_PROG3, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4123) __set_bit(KEY_ONSCREEN_KEYBOARD, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4124) __set_bit(KEY_BUTTONCONFIG, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4126) if (!features->oPid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4127) __set_bit(KEY_CONTROLPANEL, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4128) input_set_abs_params(input_dev, ABS_X, -2048, 2048, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4129) input_abs_set_res(input_dev, ABS_X, 1024); /* points/g */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4130) input_set_abs_params(input_dev, ABS_Y, -2048, 2048, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4131) input_abs_set_res(input_dev, ABS_Y, 1024);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4132) input_set_abs_params(input_dev, ABS_Z, -2048, 2048, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4133) input_abs_set_res(input_dev, ABS_Z, 1024);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4134) __set_bit(INPUT_PROP_ACCELEROMETER, input_dev->propbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4135) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4137) case WACOM_22HD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4138) __set_bit(KEY_PROG1, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4139) __set_bit(KEY_PROG2, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4140) __set_bit(KEY_PROG3, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4142) __set_bit(KEY_BUTTONCONFIG, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4143) __set_bit(KEY_INFO, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4144) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4146) case WACOM_21UX2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4147) case WACOM_BEE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4148) case CINTIQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4149) input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4150) input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4151) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4153) case WACOM_13HD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4154) input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4155) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4157) case INTUOS3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4158) case INTUOS3L:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4159) input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4160) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4162) case INTUOS3S:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4163) input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4164) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4166) case INTUOS5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4167) case INTUOS5L:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4168) case INTUOSPM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4169) case INTUOSPL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4170) case INTUOS5S:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4171) case INTUOSPS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4172) case INTUOSP2_BT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4173) case INTUOSP2S_BT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4174) input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4175) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4177) case INTUOS4WL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4178) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4179) * For Bluetooth devices, the udev rule does not work correctly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4180) * for pads unless we add a stylus capability, which forces
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4181) * ID_INPUT_TABLET to be set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4182) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4183) __set_bit(BTN_STYLUS, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4184) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4186) case INTUOS4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4187) case INTUOS4L:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4188) case INTUOS4S:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4189) input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4190) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4192) case INTUOSHT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4193) case BAMBOO_PT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4194) case BAMBOO_TOUCH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4195) case INTUOSHT2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4196) __clear_bit(ABS_MISC, input_dev->absbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4198) __set_bit(BTN_LEFT, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4199) __set_bit(BTN_FORWARD, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4200) __set_bit(BTN_BACK, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4201) __set_bit(BTN_RIGHT, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4203) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4205) case REMOTE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4206) input_set_capability(input_dev, EV_MSC, MSC_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4207) input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4208) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4210) case INTUOSHT3_BT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4211) case HID_GENERIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4212) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4214) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4215) /* no pad supported */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4216) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4218) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4221) static const struct wacom_features wacom_features_0x00 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4222) { "Wacom Penpartner", 5040, 3780, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4223) PENPARTNER, WACOM_PENPRTN_RES, WACOM_PENPRTN_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4224) static const struct wacom_features wacom_features_0x10 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4225) { "Wacom Graphire", 10206, 7422, 511, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4226) GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4227) static const struct wacom_features wacom_features_0x81 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4228) { "Wacom Graphire BT", 16704, 12064, 511, 32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4229) GRAPHIRE_BT, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES, 2 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4230) static const struct wacom_features wacom_features_0x11 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4231) { "Wacom Graphire2 4x5", 10206, 7422, 511, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4232) GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4233) static const struct wacom_features wacom_features_0x12 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4234) { "Wacom Graphire2 5x7", 13918, 10206, 511, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4235) GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4236) static const struct wacom_features wacom_features_0x13 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4237) { "Wacom Graphire3", 10208, 7424, 511, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4238) GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4239) static const struct wacom_features wacom_features_0x14 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4240) { "Wacom Graphire3 6x8", 16704, 12064, 511, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4241) GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4242) static const struct wacom_features wacom_features_0x15 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4243) { "Wacom Graphire4 4x5", 10208, 7424, 511, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4244) WACOM_G4, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4245) static const struct wacom_features wacom_features_0x16 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4246) { "Wacom Graphire4 6x8", 16704, 12064, 511, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4247) WACOM_G4, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4248) static const struct wacom_features wacom_features_0x17 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4249) { "Wacom BambooFun 4x5", 14760, 9225, 511, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4250) WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4251) static const struct wacom_features wacom_features_0x18 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4252) { "Wacom BambooFun 6x8", 21648, 13530, 511, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4253) WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4254) static const struct wacom_features wacom_features_0x19 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4255) { "Wacom Bamboo1 Medium", 16704, 12064, 511, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4256) GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4257) static const struct wacom_features wacom_features_0x60 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4258) { "Wacom Volito", 5104, 3712, 511, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4259) GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4260) static const struct wacom_features wacom_features_0x61 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4261) { "Wacom PenStation2", 3250, 2320, 255, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4262) GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4263) static const struct wacom_features wacom_features_0x62 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4264) { "Wacom Volito2 4x5", 5104, 3712, 511, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4265) GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4266) static const struct wacom_features wacom_features_0x63 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4267) { "Wacom Volito2 2x3", 3248, 2320, 511, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4268) GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4269) static const struct wacom_features wacom_features_0x64 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4270) { "Wacom PenPartner2", 3250, 2320, 511, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4271) GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4272) static const struct wacom_features wacom_features_0x65 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4273) { "Wacom Bamboo", 14760, 9225, 511, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4274) WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4275) static const struct wacom_features wacom_features_0x69 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4276) { "Wacom Bamboo1", 5104, 3712, 511, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4277) GRAPHIRE, WACOM_PENPRTN_RES, WACOM_PENPRTN_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4278) static const struct wacom_features wacom_features_0x6A =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4279) { "Wacom Bamboo1 4x6", 14760, 9225, 1023, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4280) GRAPHIRE, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4281) static const struct wacom_features wacom_features_0x6B =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4282) { "Wacom Bamboo1 5x8", 21648, 13530, 1023, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4283) GRAPHIRE, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4284) static const struct wacom_features wacom_features_0x20 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4285) { "Wacom Intuos 4x5", 12700, 10600, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4286) INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4287) static const struct wacom_features wacom_features_0x21 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4288) { "Wacom Intuos 6x8", 20320, 16240, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4289) INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4290) static const struct wacom_features wacom_features_0x22 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4291) { "Wacom Intuos 9x12", 30480, 24060, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4292) INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4293) static const struct wacom_features wacom_features_0x23 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4294) { "Wacom Intuos 12x12", 30480, 31680, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4295) INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4296) static const struct wacom_features wacom_features_0x24 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4297) { "Wacom Intuos 12x18", 45720, 31680, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4298) INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4299) static const struct wacom_features wacom_features_0x30 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4300) { "Wacom PL400", 5408, 4056, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4301) PL, WACOM_PL_RES, WACOM_PL_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4302) static const struct wacom_features wacom_features_0x31 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4303) { "Wacom PL500", 6144, 4608, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4304) PL, WACOM_PL_RES, WACOM_PL_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4305) static const struct wacom_features wacom_features_0x32 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4306) { "Wacom PL600", 6126, 4604, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4307) PL, WACOM_PL_RES, WACOM_PL_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4308) static const struct wacom_features wacom_features_0x33 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4309) { "Wacom PL600SX", 6260, 5016, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4310) PL, WACOM_PL_RES, WACOM_PL_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4311) static const struct wacom_features wacom_features_0x34 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4312) { "Wacom PL550", 6144, 4608, 511, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4313) PL, WACOM_PL_RES, WACOM_PL_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4314) static const struct wacom_features wacom_features_0x35 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4315) { "Wacom PL800", 7220, 5780, 511, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4316) PL, WACOM_PL_RES, WACOM_PL_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4317) static const struct wacom_features wacom_features_0x37 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4318) { "Wacom PL700", 6758, 5406, 511, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4319) PL, WACOM_PL_RES, WACOM_PL_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4320) static const struct wacom_features wacom_features_0x38 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4321) { "Wacom PL510", 6282, 4762, 511, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4322) PL, WACOM_PL_RES, WACOM_PL_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4323) static const struct wacom_features wacom_features_0x39 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4324) { "Wacom DTU710", 34080, 27660, 511, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4325) PL, WACOM_PL_RES, WACOM_PL_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4326) static const struct wacom_features wacom_features_0xC4 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4327) { "Wacom DTF521", 6282, 4762, 511, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4328) PL, WACOM_PL_RES, WACOM_PL_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4329) static const struct wacom_features wacom_features_0xC0 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4330) { "Wacom DTF720", 6858, 5506, 511, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4331) PL, WACOM_PL_RES, WACOM_PL_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4332) static const struct wacom_features wacom_features_0xC2 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4333) { "Wacom DTF720a", 6858, 5506, 511, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4334) PL, WACOM_PL_RES, WACOM_PL_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4335) static const struct wacom_features wacom_features_0x03 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4336) { "Wacom Cintiq Partner", 20480, 15360, 511, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4337) PTU, WACOM_PL_RES, WACOM_PL_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4338) static const struct wacom_features wacom_features_0x41 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4339) { "Wacom Intuos2 4x5", 12700, 10600, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4340) INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4341) static const struct wacom_features wacom_features_0x42 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4342) { "Wacom Intuos2 6x8", 20320, 16240, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4343) INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4344) static const struct wacom_features wacom_features_0x43 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4345) { "Wacom Intuos2 9x12", 30480, 24060, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4346) INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4347) static const struct wacom_features wacom_features_0x44 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4348) { "Wacom Intuos2 12x12", 30480, 31680, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4349) INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4350) static const struct wacom_features wacom_features_0x45 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4351) { "Wacom Intuos2 12x18", 45720, 31680, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4352) INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4353) static const struct wacom_features wacom_features_0xB0 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4354) { "Wacom Intuos3 4x5", 25400, 20320, 1023, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4355) INTUOS3S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 4 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4356) static const struct wacom_features wacom_features_0xB1 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4357) { "Wacom Intuos3 6x8", 40640, 30480, 1023, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4358) INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 8 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4359) static const struct wacom_features wacom_features_0xB2 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4360) { "Wacom Intuos3 9x12", 60960, 45720, 1023, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4361) INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 8 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4362) static const struct wacom_features wacom_features_0xB3 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4363) { "Wacom Intuos3 12x12", 60960, 60960, 1023, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4364) INTUOS3L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 8 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4365) static const struct wacom_features wacom_features_0xB4 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4366) { "Wacom Intuos3 12x19", 97536, 60960, 1023, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4367) INTUOS3L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 8 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4368) static const struct wacom_features wacom_features_0xB5 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4369) { "Wacom Intuos3 6x11", 54204, 31750, 1023, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4370) INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 8 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4371) static const struct wacom_features wacom_features_0xB7 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4372) { "Wacom Intuos3 4x6", 31496, 19685, 1023, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4373) INTUOS3S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 4 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4374) static const struct wacom_features wacom_features_0xB8 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4375) { "Wacom Intuos4 4x6", 31496, 19685, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4376) INTUOS4S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 7 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4377) static const struct wacom_features wacom_features_0xB9 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4378) { "Wacom Intuos4 6x9", 44704, 27940, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4379) INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4380) static const struct wacom_features wacom_features_0xBA =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4381) { "Wacom Intuos4 8x13", 65024, 40640, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4382) INTUOS4L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4383) static const struct wacom_features wacom_features_0xBB =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4384) { "Wacom Intuos4 12x19", 97536, 60960, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4385) INTUOS4L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4386) static const struct wacom_features wacom_features_0xBC =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4387) { "Wacom Intuos4 WL", 40640, 25400, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4388) INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4389) static const struct wacom_features wacom_features_0xBD =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4390) { "Wacom Intuos4 WL", 40640, 25400, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4391) INTUOS4WL, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4392) static const struct wacom_features wacom_features_0x26 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4393) { "Wacom Intuos5 touch S", 31496, 19685, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4394) INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 7, .touch_max = 16 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4395) static const struct wacom_features wacom_features_0x27 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4396) { "Wacom Intuos5 touch M", 44704, 27940, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4397) INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, .touch_max = 16 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4398) static const struct wacom_features wacom_features_0x28 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4399) { "Wacom Intuos5 touch L", 65024, 40640, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4400) INTUOS5L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, .touch_max = 16 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4401) static const struct wacom_features wacom_features_0x29 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4402) { "Wacom Intuos5 S", 31496, 19685, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4403) INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 7 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4404) static const struct wacom_features wacom_features_0x2A =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4405) { "Wacom Intuos5 M", 44704, 27940, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4406) INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4407) static const struct wacom_features wacom_features_0x314 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4408) { "Wacom Intuos Pro S", 31496, 19685, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4409) INTUOSPS, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 7, .touch_max = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4410) .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4411) static const struct wacom_features wacom_features_0x315 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4412) { "Wacom Intuos Pro M", 44704, 27940, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4413) INTUOSPM, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, .touch_max = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4414) .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4415) static const struct wacom_features wacom_features_0x317 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4416) { "Wacom Intuos Pro L", 65024, 40640, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4417) INTUOSPL, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, .touch_max = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4418) .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4419) static const struct wacom_features wacom_features_0xF4 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4420) { "Wacom Cintiq 24HD", 104480, 65600, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4421) WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4422) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4423) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4424) static const struct wacom_features wacom_features_0xF8 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4425) { "Wacom Cintiq 24HD touch", 104480, 65600, 2047, 63, /* Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4426) WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4427) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4428) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4429) .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf6 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4430) static const struct wacom_features wacom_features_0xF6 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4431) { "Wacom Cintiq 24HD touch", .type = WACOM_24HDT, /* Touch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4432) .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf8, .touch_max = 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4433) .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4434) static const struct wacom_features wacom_features_0x32A =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4435) { "Wacom Cintiq 27QHD", 120140, 67920, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4436) WACOM_27QHD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4437) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4438) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4439) static const struct wacom_features wacom_features_0x32B =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4440) { "Wacom Cintiq 27QHD touch", 120140, 67920, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4441) WACOM_27QHD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4442) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4443) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4444) .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x32C };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4445) static const struct wacom_features wacom_features_0x32C =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4446) { "Wacom Cintiq 27QHD touch", .type = WACOM_27QHDT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4447) .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x32B, .touch_max = 10 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4448) static const struct wacom_features wacom_features_0x3F =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4449) { "Wacom Cintiq 21UX", 87200, 65600, 1023, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4450) CINTIQ, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 8 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4451) static const struct wacom_features wacom_features_0xC5 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4452) { "Wacom Cintiq 20WSX", 86680, 54180, 1023, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4453) WACOM_BEE, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 10 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4454) static const struct wacom_features wacom_features_0xC6 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4455) { "Wacom Cintiq 12WX", 53020, 33440, 1023, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4456) WACOM_BEE, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 10 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4457) static const struct wacom_features wacom_features_0x304 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4458) { "Wacom Cintiq 13HD", 59552, 33848, 1023, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4459) WACOM_13HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4460) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4461) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4462) static const struct wacom_features wacom_features_0x333 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4463) { "Wacom Cintiq 13HD touch", 59552, 33848, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4464) WACOM_13HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4465) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4466) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4467) .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x335 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4468) static const struct wacom_features wacom_features_0x335 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4469) { "Wacom Cintiq 13HD touch", .type = WACOM_24HDT, /* Touch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4470) .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x333, .touch_max = 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4471) .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4472) static const struct wacom_features wacom_features_0xC7 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4473) { "Wacom DTU1931", 37832, 30305, 511, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4474) PL, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4475) static const struct wacom_features wacom_features_0xCE =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4476) { "Wacom DTU2231", 47864, 27011, 511, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4477) DTU, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4478) .check_for_hid_type = true, .hid_type = HID_TYPE_USBMOUSE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4479) static const struct wacom_features wacom_features_0xF0 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4480) { "Wacom DTU1631", 34623, 19553, 511, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4481) DTU, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4482) static const struct wacom_features wacom_features_0xFB =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4483) { "Wacom DTU1031", 22096, 13960, 511, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4484) DTUS, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4485) WACOM_DTU_OFFSET, WACOM_DTU_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4486) WACOM_DTU_OFFSET, WACOM_DTU_OFFSET };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4487) static const struct wacom_features wacom_features_0x32F =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4488) { "Wacom DTU1031X", 22672, 12928, 511, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4489) DTUSX, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4490) WACOM_DTU_OFFSET, WACOM_DTU_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4491) WACOM_DTU_OFFSET, WACOM_DTU_OFFSET };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4492) static const struct wacom_features wacom_features_0x336 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4493) { "Wacom DTU1141", 23672, 13403, 1023, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4494) DTUS, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4495) WACOM_DTU_OFFSET, WACOM_DTU_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4496) WACOM_DTU_OFFSET, WACOM_DTU_OFFSET };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4497) static const struct wacom_features wacom_features_0x57 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4498) { "Wacom DTK2241", 95840, 54260, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4499) DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4500) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4501) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4502) static const struct wacom_features wacom_features_0x59 = /* Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4503) { "Wacom DTH2242", 95840, 54260, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4504) DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4505) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4506) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4507) .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5D };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4508) static const struct wacom_features wacom_features_0x5D = /* Touch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4509) { "Wacom DTH2242", .type = WACOM_24HDT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4510) .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x59, .touch_max = 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4511) .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4512) static const struct wacom_features wacom_features_0xCC =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4513) { "Wacom Cintiq 21UX2", 87200, 65600, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4514) WACOM_21UX2, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4515) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4516) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4517) static const struct wacom_features wacom_features_0xFA =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4518) { "Wacom Cintiq 22HD", 95840, 54260, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4519) WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4520) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4521) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4522) static const struct wacom_features wacom_features_0x5B =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4523) { "Wacom Cintiq 22HDT", 95840, 54260, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4524) WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4525) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4526) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4527) .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5e };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4528) static const struct wacom_features wacom_features_0x5E =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4529) { "Wacom Cintiq 22HDT", .type = WACOM_24HDT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4530) .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5b, .touch_max = 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4531) .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4532) static const struct wacom_features wacom_features_0x90 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4533) { "Wacom ISDv4 90", 26202, 16325, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4534) TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; /* Pen-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4535) static const struct wacom_features wacom_features_0x93 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4536) { "Wacom ISDv4 93", 26202, 16325, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4537) TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 1 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4538) static const struct wacom_features wacom_features_0x97 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4539) { "Wacom ISDv4 97", 26202, 16325, 511, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4540) TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; /* Pen-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4541) static const struct wacom_features wacom_features_0x9A =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4542) { "Wacom ISDv4 9A", 26202, 16325, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4543) TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 1 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4544) static const struct wacom_features wacom_features_0x9F =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4545) { "Wacom ISDv4 9F", 26202, 16325, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4546) TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 1 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4547) static const struct wacom_features wacom_features_0xE2 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4548) { "Wacom ISDv4 E2", 26202, 16325, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4549) TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4550) static const struct wacom_features wacom_features_0xE3 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4551) { "Wacom ISDv4 E3", 26202, 16325, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4552) TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4553) static const struct wacom_features wacom_features_0xE5 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4554) { "Wacom ISDv4 E5", 26202, 16325, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4555) MTSCREEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4556) static const struct wacom_features wacom_features_0xE6 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4557) { "Wacom ISDv4 E6", 27760, 15694, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4558) TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4559) static const struct wacom_features wacom_features_0xEC =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4560) { "Wacom ISDv4 EC", 25710, 14500, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4561) TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; /* Pen-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4562) static const struct wacom_features wacom_features_0xED =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4563) { "Wacom ISDv4 ED", 26202, 16325, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4564) TABLETPCE, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 1 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4565) static const struct wacom_features wacom_features_0xEF =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4566) { "Wacom ISDv4 EF", 26202, 16325, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4567) TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; /* Pen-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4568) static const struct wacom_features wacom_features_0x100 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4569) { "Wacom ISDv4 100", 26202, 16325, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4570) MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4571) static const struct wacom_features wacom_features_0x101 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4572) { "Wacom ISDv4 101", 26202, 16325, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4573) MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4574) static const struct wacom_features wacom_features_0x10D =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4575) { "Wacom ISDv4 10D", 26202, 16325, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4576) MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4577) static const struct wacom_features wacom_features_0x10E =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4578) { "Wacom ISDv4 10E", 27760, 15694, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4579) MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4580) static const struct wacom_features wacom_features_0x10F =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4581) { "Wacom ISDv4 10F", 27760, 15694, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4582) MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4583) static const struct wacom_features wacom_features_0x116 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4584) { "Wacom ISDv4 116", 26202, 16325, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4585) TABLETPCE, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 1 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4586) static const struct wacom_features wacom_features_0x12C =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4587) { "Wacom ISDv4 12C", 27848, 15752, 2047, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4588) TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; /* Pen-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4589) static const struct wacom_features wacom_features_0x4001 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4590) { "Wacom ISDv4 4001", 26202, 16325, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4591) MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4592) static const struct wacom_features wacom_features_0x4004 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4593) { "Wacom ISDv4 4004", 11060, 6220, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4594) MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4595) static const struct wacom_features wacom_features_0x5000 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4596) { "Wacom ISDv4 5000", 27848, 15752, 1023, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4597) MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4598) static const struct wacom_features wacom_features_0x5002 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4599) { "Wacom ISDv4 5002", 29576, 16724, 1023, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4600) MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4601) static const struct wacom_features wacom_features_0x47 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4602) { "Wacom Intuos2 6x8", 20320, 16240, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4603) INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4604) static const struct wacom_features wacom_features_0x84 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4605) { "Wacom Wireless Receiver", .type = WIRELESS, .touch_max = 16 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4606) static const struct wacom_features wacom_features_0xD0 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4607) { "Wacom Bamboo 2FG", 14720, 9200, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4608) BAMBOO_TOUCH, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4609) static const struct wacom_features wacom_features_0xD1 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4610) { "Wacom Bamboo 2FG 4x5", 14720, 9200, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4611) BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4612) static const struct wacom_features wacom_features_0xD2 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4613) { "Wacom Bamboo Craft", 14720, 9200, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4614) BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4615) static const struct wacom_features wacom_features_0xD3 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4616) { "Wacom Bamboo 2FG 6x8", 21648, 13700, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4617) BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4618) static const struct wacom_features wacom_features_0xD4 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4619) { "Wacom Bamboo Pen", 14720, 9200, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4620) BAMBOO_PEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4621) static const struct wacom_features wacom_features_0xD5 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4622) { "Wacom Bamboo Pen 6x8", 21648, 13700, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4623) BAMBOO_PEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4624) static const struct wacom_features wacom_features_0xD6 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4625) { "Wacom BambooPT 2FG 4x5", 14720, 9200, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4626) BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4627) static const struct wacom_features wacom_features_0xD7 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4628) { "Wacom BambooPT 2FG Small", 14720, 9200, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4629) BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4630) static const struct wacom_features wacom_features_0xD8 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4631) { "Wacom Bamboo Comic 2FG", 21648, 13700, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4632) BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4633) static const struct wacom_features wacom_features_0xDA =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4634) { "Wacom Bamboo 2FG 4x5 SE", 14720, 9200, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4635) BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4636) static const struct wacom_features wacom_features_0xDB =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4637) { "Wacom Bamboo 2FG 6x8 SE", 21648, 13700, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4638) BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4639) static const struct wacom_features wacom_features_0xDD =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4640) { "Wacom Bamboo Connect", 14720, 9200, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4641) BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4642) static const struct wacom_features wacom_features_0xDE =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4643) { "Wacom Bamboo 16FG 4x5", 14720, 9200, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4644) BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4645) static const struct wacom_features wacom_features_0xDF =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4646) { "Wacom Bamboo 16FG 6x8", 21648, 13700, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4647) BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4648) static const struct wacom_features wacom_features_0x300 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4649) { "Wacom Bamboo One S", 14720, 9225, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4650) BAMBOO_PEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4651) static const struct wacom_features wacom_features_0x301 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4652) { "Wacom Bamboo One M", 21648, 13530, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4653) BAMBOO_PEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4654) static const struct wacom_features wacom_features_0x302 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4655) { "Wacom Intuos PT S", 15200, 9500, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4656) INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4657) .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4658) static const struct wacom_features wacom_features_0x303 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4659) { "Wacom Intuos PT M", 21600, 13500, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4660) INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4661) .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4662) static const struct wacom_features wacom_features_0x30E =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4663) { "Wacom Intuos S", 15200, 9500, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4664) INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4665) .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4666) static const struct wacom_features wacom_features_0x6004 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4667) { "ISD-V4", 12800, 8000, 255, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4668) TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4669) static const struct wacom_features wacom_features_0x307 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4670) { "Wacom ISDv5 307", 59552, 33848, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4671) CINTIQ_HYBRID, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4672) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4673) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4674) .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x309 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4675) static const struct wacom_features wacom_features_0x309 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4676) { "Wacom ISDv5 309", .type = WACOM_24HDT, /* Touch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4677) .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x0307, .touch_max = 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4678) .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4679) static const struct wacom_features wacom_features_0x30A =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4680) { "Wacom ISDv5 30A", 59552, 33848, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4681) CINTIQ_HYBRID, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4682) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4683) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4684) .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x30C };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4685) static const struct wacom_features wacom_features_0x30C =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4686) { "Wacom ISDv5 30C", .type = WACOM_24HDT, /* Touch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4687) .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x30A, .touch_max = 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4688) .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4689) static const struct wacom_features wacom_features_0x318 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4690) { "Wacom USB Bamboo PAD", 4095, 4095, /* Touch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4691) .type = BAMBOO_PAD, 35, 48, .touch_max = 4 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4692) static const struct wacom_features wacom_features_0x319 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4693) { "Wacom Wireless Bamboo PAD", 4095, 4095, /* Touch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4694) .type = BAMBOO_PAD, 35, 48, .touch_max = 4 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4695) static const struct wacom_features wacom_features_0x325 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4696) { "Wacom ISDv5 325", 59552, 33848, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4697) CINTIQ_COMPANION_2, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4698) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4699) WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4700) .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x326 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4701) static const struct wacom_features wacom_features_0x326 = /* Touch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4702) { "Wacom ISDv5 326", .type = HID_GENERIC, .oVid = USB_VENDOR_ID_WACOM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4703) .oPid = 0x325 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4704) static const struct wacom_features wacom_features_0x323 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4705) { "Wacom Intuos P M", 21600, 13500, 1023, 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4706) INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4707) .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4708) static const struct wacom_features wacom_features_0x331 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4709) { "Wacom Express Key Remote", .type = REMOTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4710) .numbered_buttons = 18, .check_for_hid_type = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4711) .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4712) static const struct wacom_features wacom_features_0x33B =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4713) { "Wacom Intuos S 2", 15200, 9500, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4714) INTUOSHT2, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4715) .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4716) static const struct wacom_features wacom_features_0x33C =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4717) { "Wacom Intuos PT S 2", 15200, 9500, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4718) INTUOSHT2, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4719) .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4720) static const struct wacom_features wacom_features_0x33D =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4721) { "Wacom Intuos P M 2", 21600, 13500, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4722) INTUOSHT2, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4723) .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4724) static const struct wacom_features wacom_features_0x33E =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4725) { "Wacom Intuos PT M 2", 21600, 13500, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4726) INTUOSHT2, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4727) .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4728) static const struct wacom_features wacom_features_0x343 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4729) { "Wacom DTK1651", 34816, 19759, 1023, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4730) DTUS, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4731) WACOM_DTU_OFFSET, WACOM_DTU_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4732) WACOM_DTU_OFFSET, WACOM_DTU_OFFSET };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4733) static const struct wacom_features wacom_features_0x360 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4734) { "Wacom Intuos Pro M", 44800, 29600, 8191, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4735) INTUOSP2_BT, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, .touch_max = 10 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4736) static const struct wacom_features wacom_features_0x361 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4737) { "Wacom Intuos Pro L", 62200, 43200, 8191, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4738) INTUOSP2_BT, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, .touch_max = 10 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4739) static const struct wacom_features wacom_features_0x377 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4740) { "Wacom Intuos BT S", 15200, 9500, 4095, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4741) INTUOSHT3_BT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 4 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4742) static const struct wacom_features wacom_features_0x379 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4743) { "Wacom Intuos BT M", 21600, 13500, 4095, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4744) INTUOSHT3_BT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 4 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4745) static const struct wacom_features wacom_features_0x37A =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4746) { "Wacom One by Wacom S", 15200, 9500, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4747) BAMBOO_PEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4748) static const struct wacom_features wacom_features_0x37B =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4749) { "Wacom One by Wacom M", 21600, 13500, 2047, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4750) BAMBOO_PEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4751) static const struct wacom_features wacom_features_0x393 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4752) { "Wacom Intuos Pro S", 31920, 19950, 8191, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4753) INTUOSP2S_BT, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4754) .touch_max = 10 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4755) static const struct wacom_features wacom_features_0x3c6 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4756) { "Wacom Intuos BT S", 15200, 9500, 4095, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4757) INTUOSHT3_BT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 4 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4758) static const struct wacom_features wacom_features_0x3c8 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4759) { "Wacom Intuos BT M", 21600, 13500, 4095, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4760) INTUOSHT3_BT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 4 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4762) static const struct wacom_features wacom_features_HID_ANY_ID =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4763) { "Wacom HID", .type = HID_GENERIC, .oVid = HID_ANY_ID, .oPid = HID_ANY_ID };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4765) #define USB_DEVICE_WACOM(prod) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4766) HID_DEVICE(BUS_USB, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4767) .driver_data = (kernel_ulong_t)&wacom_features_##prod
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4769) #define BT_DEVICE_WACOM(prod) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4770) HID_DEVICE(BUS_BLUETOOTH, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4771) .driver_data = (kernel_ulong_t)&wacom_features_##prod
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4773) #define I2C_DEVICE_WACOM(prod) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4774) HID_DEVICE(BUS_I2C, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4775) .driver_data = (kernel_ulong_t)&wacom_features_##prod
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4777) #define USB_DEVICE_LENOVO(prod) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4778) HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, prod), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4779) .driver_data = (kernel_ulong_t)&wacom_features_##prod
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4781) const struct hid_device_id wacom_ids[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4782) { USB_DEVICE_WACOM(0x00) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4783) { USB_DEVICE_WACOM(0x03) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4784) { USB_DEVICE_WACOM(0x10) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4785) { USB_DEVICE_WACOM(0x11) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4786) { USB_DEVICE_WACOM(0x12) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4787) { USB_DEVICE_WACOM(0x13) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4788) { USB_DEVICE_WACOM(0x14) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4789) { USB_DEVICE_WACOM(0x15) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4790) { USB_DEVICE_WACOM(0x16) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4791) { USB_DEVICE_WACOM(0x17) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4792) { USB_DEVICE_WACOM(0x18) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4793) { USB_DEVICE_WACOM(0x19) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4794) { USB_DEVICE_WACOM(0x20) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4795) { USB_DEVICE_WACOM(0x21) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4796) { USB_DEVICE_WACOM(0x22) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4797) { USB_DEVICE_WACOM(0x23) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4798) { USB_DEVICE_WACOM(0x24) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4799) { USB_DEVICE_WACOM(0x26) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4800) { USB_DEVICE_WACOM(0x27) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4801) { USB_DEVICE_WACOM(0x28) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4802) { USB_DEVICE_WACOM(0x29) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4803) { USB_DEVICE_WACOM(0x2A) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4804) { USB_DEVICE_WACOM(0x30) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4805) { USB_DEVICE_WACOM(0x31) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4806) { USB_DEVICE_WACOM(0x32) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4807) { USB_DEVICE_WACOM(0x33) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4808) { USB_DEVICE_WACOM(0x34) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4809) { USB_DEVICE_WACOM(0x35) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4810) { USB_DEVICE_WACOM(0x37) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4811) { USB_DEVICE_WACOM(0x38) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4812) { USB_DEVICE_WACOM(0x39) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4813) { USB_DEVICE_WACOM(0x3F) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4814) { USB_DEVICE_WACOM(0x41) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4815) { USB_DEVICE_WACOM(0x42) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4816) { USB_DEVICE_WACOM(0x43) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4817) { USB_DEVICE_WACOM(0x44) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4818) { USB_DEVICE_WACOM(0x45) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4819) { USB_DEVICE_WACOM(0x47) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4820) { USB_DEVICE_WACOM(0x57) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4821) { USB_DEVICE_WACOM(0x59) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4822) { USB_DEVICE_WACOM(0x5B) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4823) { USB_DEVICE_WACOM(0x5D) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4824) { USB_DEVICE_WACOM(0x5E) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4825) { USB_DEVICE_WACOM(0x60) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4826) { USB_DEVICE_WACOM(0x61) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4827) { USB_DEVICE_WACOM(0x62) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4828) { USB_DEVICE_WACOM(0x63) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4829) { USB_DEVICE_WACOM(0x64) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4830) { USB_DEVICE_WACOM(0x65) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4831) { USB_DEVICE_WACOM(0x69) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4832) { USB_DEVICE_WACOM(0x6A) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4833) { USB_DEVICE_WACOM(0x6B) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4834) { BT_DEVICE_WACOM(0x81) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4835) { USB_DEVICE_WACOM(0x84) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4836) { USB_DEVICE_WACOM(0x90) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4837) { USB_DEVICE_WACOM(0x93) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4838) { USB_DEVICE_WACOM(0x97) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4839) { USB_DEVICE_WACOM(0x9A) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4840) { USB_DEVICE_WACOM(0x9F) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4841) { USB_DEVICE_WACOM(0xB0) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4842) { USB_DEVICE_WACOM(0xB1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4843) { USB_DEVICE_WACOM(0xB2) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4844) { USB_DEVICE_WACOM(0xB3) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4845) { USB_DEVICE_WACOM(0xB4) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4846) { USB_DEVICE_WACOM(0xB5) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4847) { USB_DEVICE_WACOM(0xB7) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4848) { USB_DEVICE_WACOM(0xB8) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4849) { USB_DEVICE_WACOM(0xB9) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4850) { USB_DEVICE_WACOM(0xBA) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4851) { USB_DEVICE_WACOM(0xBB) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4852) { USB_DEVICE_WACOM(0xBC) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4853) { BT_DEVICE_WACOM(0xBD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4854) { USB_DEVICE_WACOM(0xC0) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4855) { USB_DEVICE_WACOM(0xC2) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4856) { USB_DEVICE_WACOM(0xC4) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4857) { USB_DEVICE_WACOM(0xC5) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4858) { USB_DEVICE_WACOM(0xC6) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4859) { USB_DEVICE_WACOM(0xC7) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4860) { USB_DEVICE_WACOM(0xCC) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4861) { USB_DEVICE_WACOM(0xCE) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4862) { USB_DEVICE_WACOM(0xD0) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4863) { USB_DEVICE_WACOM(0xD1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4864) { USB_DEVICE_WACOM(0xD2) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4865) { USB_DEVICE_WACOM(0xD3) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4866) { USB_DEVICE_WACOM(0xD4) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4867) { USB_DEVICE_WACOM(0xD5) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4868) { USB_DEVICE_WACOM(0xD6) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4869) { USB_DEVICE_WACOM(0xD7) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4870) { USB_DEVICE_WACOM(0xD8) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4871) { USB_DEVICE_WACOM(0xDA) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4872) { USB_DEVICE_WACOM(0xDB) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4873) { USB_DEVICE_WACOM(0xDD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4874) { USB_DEVICE_WACOM(0xDE) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4875) { USB_DEVICE_WACOM(0xDF) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4876) { USB_DEVICE_WACOM(0xE2) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4877) { USB_DEVICE_WACOM(0xE3) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4878) { USB_DEVICE_WACOM(0xE5) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4879) { USB_DEVICE_WACOM(0xE6) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4880) { USB_DEVICE_WACOM(0xEC) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4881) { USB_DEVICE_WACOM(0xED) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4882) { USB_DEVICE_WACOM(0xEF) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4883) { USB_DEVICE_WACOM(0xF0) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4884) { USB_DEVICE_WACOM(0xF4) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4885) { USB_DEVICE_WACOM(0xF6) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4886) { USB_DEVICE_WACOM(0xF8) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4887) { USB_DEVICE_WACOM(0xFA) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4888) { USB_DEVICE_WACOM(0xFB) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4889) { USB_DEVICE_WACOM(0x100) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4890) { USB_DEVICE_WACOM(0x101) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4891) { USB_DEVICE_WACOM(0x10D) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4892) { USB_DEVICE_WACOM(0x10E) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4893) { USB_DEVICE_WACOM(0x10F) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4894) { USB_DEVICE_WACOM(0x116) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4895) { USB_DEVICE_WACOM(0x12C) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4896) { USB_DEVICE_WACOM(0x300) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4897) { USB_DEVICE_WACOM(0x301) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4898) { USB_DEVICE_WACOM(0x302) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4899) { USB_DEVICE_WACOM(0x303) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4900) { USB_DEVICE_WACOM(0x304) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4901) { USB_DEVICE_WACOM(0x307) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4902) { USB_DEVICE_WACOM(0x309) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4903) { USB_DEVICE_WACOM(0x30A) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4904) { USB_DEVICE_WACOM(0x30C) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4905) { USB_DEVICE_WACOM(0x30E) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4906) { USB_DEVICE_WACOM(0x314) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4907) { USB_DEVICE_WACOM(0x315) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4908) { USB_DEVICE_WACOM(0x317) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4909) { USB_DEVICE_WACOM(0x318) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4910) { USB_DEVICE_WACOM(0x319) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4911) { USB_DEVICE_WACOM(0x323) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4912) { USB_DEVICE_WACOM(0x325) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4913) { USB_DEVICE_WACOM(0x326) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4914) { USB_DEVICE_WACOM(0x32A) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4915) { USB_DEVICE_WACOM(0x32B) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4916) { USB_DEVICE_WACOM(0x32C) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4917) { USB_DEVICE_WACOM(0x32F) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4918) { USB_DEVICE_WACOM(0x331) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4919) { USB_DEVICE_WACOM(0x333) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4920) { USB_DEVICE_WACOM(0x335) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4921) { USB_DEVICE_WACOM(0x336) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4922) { USB_DEVICE_WACOM(0x33B) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4923) { USB_DEVICE_WACOM(0x33C) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4924) { USB_DEVICE_WACOM(0x33D) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4925) { USB_DEVICE_WACOM(0x33E) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4926) { USB_DEVICE_WACOM(0x343) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4927) { BT_DEVICE_WACOM(0x360) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4928) { BT_DEVICE_WACOM(0x361) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4929) { BT_DEVICE_WACOM(0x377) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4930) { BT_DEVICE_WACOM(0x379) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4931) { USB_DEVICE_WACOM(0x37A) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4932) { USB_DEVICE_WACOM(0x37B) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4933) { BT_DEVICE_WACOM(0x393) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4934) { BT_DEVICE_WACOM(0x3c6) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4935) { BT_DEVICE_WACOM(0x3c8) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4936) { USB_DEVICE_WACOM(0x4001) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4937) { USB_DEVICE_WACOM(0x4004) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4938) { USB_DEVICE_WACOM(0x5000) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4939) { USB_DEVICE_WACOM(0x5002) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4940) { USB_DEVICE_LENOVO(0x6004) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4942) { USB_DEVICE_WACOM(HID_ANY_ID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4943) { I2C_DEVICE_WACOM(HID_ANY_ID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4944) { BT_DEVICE_WACOM(HID_ANY_ID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4945) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4946) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4947) MODULE_DEVICE_TABLE(hid, wacom_ids);