Commit 07d17217 authored by Jiri Kosina's avatar Jiri Kosina

Merge branch 'for-5.19/wacom' into for-linus

- support for pens with 3 buttons (Joshua Dickens)
- support for HID_DG_SCANTIME to report the timestamp for pen and touch events
  (Joshua Dickens)
parents 2e688e65 d88591a5
...@@ -8639,6 +8639,14 @@ F: drivers/hid/hid-sensor-* ...@@ -8639,6 +8639,14 @@ F: drivers/hid/hid-sensor-*
F: drivers/iio/*/hid-* F: drivers/iio/*/hid-*
F: include/linux/hid-sensor-* F: include/linux/hid-sensor-*
HID WACOM DRIVER
M: Ping Cheng <ping.cheng@wacom.com>
M: Jason Gerecke <jason.gerecke@wacom.com>
L: linux-input@vger.kernel.org
S: Maintained
F: drivers/hid/wacom.h
F: drivers/hid/wacom_*
HIGH-RESOLUTION TIMERS, CLOCKEVENTS HIGH-RESOLUTION TIMERS, CLOCKEVENTS
M: Thomas Gleixner <tglx@linutronix.de> M: Thomas Gleixner <tglx@linutronix.de>
L: linux-kernel@vger.kernel.org L: linux-kernel@vger.kernel.org
......
...@@ -1777,7 +1777,7 @@ static int __wacom_initialize_battery(struct wacom *wacom, ...@@ -1777,7 +1777,7 @@ static int __wacom_initialize_battery(struct wacom *wacom,
bat_desc->get_property = wacom_battery_get_property; bat_desc->get_property = wacom_battery_get_property;
sprintf(battery->bat_name, "wacom_battery_%ld", n); sprintf(battery->bat_name, "wacom_battery_%ld", n);
bat_desc->name = battery->bat_name; bat_desc->name = battery->bat_name;
bat_desc->type = POWER_SUPPLY_TYPE_USB; bat_desc->type = POWER_SUPPLY_TYPE_BATTERY;
bat_desc->use_for_apm = 0; bat_desc->use_for_apm = 0;
ps_bat = devm_power_supply_register(dev, bat_desc, &psy_cfg); ps_bat = devm_power_supply_register(dev, bat_desc, &psy_cfg);
......
...@@ -1811,7 +1811,9 @@ int wacom_equivalent_usage(int usage) ...@@ -1811,7 +1811,9 @@ int wacom_equivalent_usage(int usage)
usage == WACOM_HID_WD_TOUCHSTRIP2 || usage == WACOM_HID_WD_TOUCHSTRIP2 ||
usage == WACOM_HID_WD_TOUCHRING || usage == WACOM_HID_WD_TOUCHRING ||
usage == WACOM_HID_WD_TOUCHRINGSTATUS || usage == WACOM_HID_WD_TOUCHRINGSTATUS ||
usage == WACOM_HID_WD_REPORT_VALID) { usage == WACOM_HID_WD_REPORT_VALID ||
usage == WACOM_HID_WD_BARRELSWITCH3 ||
usage == WACOM_HID_WD_SEQUENCENUMBER) {
return usage; return usage;
} }
...@@ -2196,8 +2198,11 @@ static void wacom_set_barrel_switch3_usage(struct wacom_wac *wacom_wac) ...@@ -2196,8 +2198,11 @@ static void wacom_set_barrel_switch3_usage(struct wacom_wac *wacom_wac)
if (!(features->quirks & WACOM_QUIRK_AESPEN) && if (!(features->quirks & WACOM_QUIRK_AESPEN) &&
wacom_wac->hid_data.barrelswitch && wacom_wac->hid_data.barrelswitch &&
wacom_wac->hid_data.barrelswitch2 && wacom_wac->hid_data.barrelswitch2 &&
wacom_wac->hid_data.serialhi) wacom_wac->hid_data.serialhi &&
!wacom_wac->hid_data.barrelswitch3) {
input_set_capability(input, EV_KEY, BTN_STYLUS3); input_set_capability(input, EV_KEY, BTN_STYLUS3);
features->quirks |= WACOM_QUIRK_PEN_BUTTON3;
}
} }
static void wacom_wac_pen_usage_mapping(struct hid_device *hdev, static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
...@@ -2261,6 +2266,9 @@ static void wacom_wac_pen_usage_mapping(struct hid_device *hdev, ...@@ -2261,6 +2266,9 @@ static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
features->quirks |= WACOM_QUIRK_TOOLSERIAL; features->quirks |= WACOM_QUIRK_TOOLSERIAL;
wacom_map_usage(input, usage, field, EV_MSC, MSC_SERIAL, 0); wacom_map_usage(input, usage, field, EV_MSC, MSC_SERIAL, 0);
break; break;
case HID_DG_SCANTIME:
wacom_map_usage(input, usage, field, EV_MSC, MSC_TIMESTAMP, 0);
break;
case WACOM_HID_WD_SENSE: case WACOM_HID_WD_SENSE:
features->quirks |= WACOM_QUIRK_SENSE; features->quirks |= WACOM_QUIRK_SENSE;
wacom_map_usage(input, usage, field, EV_KEY, BTN_TOOL_PEN, 0); wacom_map_usage(input, usage, field, EV_KEY, BTN_TOOL_PEN, 0);
...@@ -2274,6 +2282,11 @@ static void wacom_wac_pen_usage_mapping(struct hid_device *hdev, ...@@ -2274,6 +2282,11 @@ static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
input_set_capability(input, EV_KEY, BTN_TOOL_AIRBRUSH); input_set_capability(input, EV_KEY, BTN_TOOL_AIRBRUSH);
wacom_map_usage(input, usage, field, EV_ABS, ABS_WHEEL, 0); wacom_map_usage(input, usage, field, EV_ABS, ABS_WHEEL, 0);
break; break;
case WACOM_HID_WD_BARRELSWITCH3:
wacom_wac->hid_data.barrelswitch3 = true;
wacom_map_usage(input, usage, field, EV_KEY, BTN_STYLUS3, 0);
features->quirks &= ~WACOM_QUIRK_PEN_BUTTON3;
break;
} }
} }
...@@ -2390,6 +2403,14 @@ static void wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field ...@@ -2390,6 +2403,14 @@ static void wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field
case WACOM_HID_WD_REPORT_VALID: case WACOM_HID_WD_REPORT_VALID:
wacom_wac->is_invalid_bt_frame = !value; wacom_wac->is_invalid_bt_frame = !value;
return; return;
case WACOM_HID_WD_BARRELSWITCH3:
wacom_wac->hid_data.barrelswitch3 = value;
return;
case WACOM_HID_WD_SEQUENCENUMBER:
if (wacom_wac->hid_data.sequence_number != value)
hid_warn(hdev, "Dropped %hu packets", (unsigned short)(value - wacom_wac->hid_data.sequence_number));
wacom_wac->hid_data.sequence_number = value + 1;
return;
} }
/* send pen events only when touch is up or forced out /* send pen events only when touch is up or forced out
...@@ -2442,12 +2463,15 @@ static void wacom_wac_pen_report(struct hid_device *hdev, ...@@ -2442,12 +2463,15 @@ static void wacom_wac_pen_report(struct hid_device *hdev,
if (!delay_pen_events(wacom_wac) && wacom_wac->tool[0]) { if (!delay_pen_events(wacom_wac) && wacom_wac->tool[0]) {
int id = wacom_wac->id[0]; int id = wacom_wac->id[0];
int sw_state = wacom_wac->hid_data.barrelswitch | if (wacom_wac->features.quirks & WACOM_QUIRK_PEN_BUTTON3 &&
(wacom_wac->hid_data.barrelswitch2 << 1); wacom_wac->hid_data.barrelswitch & wacom_wac->hid_data.barrelswitch2) {
wacom_wac->hid_data.barrelswitch = 0;
input_report_key(input, BTN_STYLUS, sw_state == 1); wacom_wac->hid_data.barrelswitch2 = 0;
input_report_key(input, BTN_STYLUS2, sw_state == 2); wacom_wac->hid_data.barrelswitch3 = 1;
input_report_key(input, BTN_STYLUS3, sw_state == 3); }
input_report_key(input, BTN_STYLUS, wacom_wac->hid_data.barrelswitch);
input_report_key(input, BTN_STYLUS2, wacom_wac->hid_data.barrelswitch2);
input_report_key(input, BTN_STYLUS3, wacom_wac->hid_data.barrelswitch3);
/* /*
* Non-USI EMR tools should have their IDs mangled to * Non-USI EMR tools should have their IDs mangled to
...@@ -2529,6 +2553,9 @@ static void wacom_wac_finger_usage_mapping(struct hid_device *hdev, ...@@ -2529,6 +2553,9 @@ static void wacom_wac_finger_usage_mapping(struct hid_device *hdev,
field->logical_maximum = 255; field->logical_maximum = 255;
} }
break; break;
case HID_DG_SCANTIME:
wacom_map_usage(input, usage, field, EV_MSC, MSC_TIMESTAMP, 0);
break;
} }
} }
......
...@@ -86,6 +86,7 @@ ...@@ -86,6 +86,7 @@
#define WACOM_QUIRK_AESPEN 0x0004 #define WACOM_QUIRK_AESPEN 0x0004
#define WACOM_QUIRK_BATTERY 0x0008 #define WACOM_QUIRK_BATTERY 0x0008
#define WACOM_QUIRK_TOOLSERIAL 0x0010 #define WACOM_QUIRK_TOOLSERIAL 0x0010
#define WACOM_QUIRK_PEN_BUTTON3 0x0020
/* device types */ /* device types */
#define WACOM_DEVICETYPE_NONE 0x0000 #define WACOM_DEVICETYPE_NONE 0x0000
...@@ -108,6 +109,7 @@ ...@@ -108,6 +109,7 @@
#define WACOM_HID_WD_DIGITIZERFNKEYS (WACOM_HID_UP_WACOMDIGITIZER | 0x39) #define WACOM_HID_WD_DIGITIZERFNKEYS (WACOM_HID_UP_WACOMDIGITIZER | 0x39)
#define WACOM_HID_WD_SERIALNUMBER (WACOM_HID_UP_WACOMDIGITIZER | 0x5b) #define WACOM_HID_WD_SERIALNUMBER (WACOM_HID_UP_WACOMDIGITIZER | 0x5b)
#define WACOM_HID_WD_SERIALHI (WACOM_HID_UP_WACOMDIGITIZER | 0x5c) #define WACOM_HID_WD_SERIALHI (WACOM_HID_UP_WACOMDIGITIZER | 0x5c)
#define WACOM_HID_WD_BARRELSWITCH3 (WACOM_HID_UP_WACOMDIGITIZER | 0x5d)
#define WACOM_HID_WD_TOOLTYPE (WACOM_HID_UP_WACOMDIGITIZER | 0x77) #define WACOM_HID_WD_TOOLTYPE (WACOM_HID_UP_WACOMDIGITIZER | 0x77)
#define WACOM_HID_WD_DISTANCE (WACOM_HID_UP_WACOMDIGITIZER | 0x0132) #define WACOM_HID_WD_DISTANCE (WACOM_HID_UP_WACOMDIGITIZER | 0x0132)
#define WACOM_HID_WD_TOUCHSTRIP (WACOM_HID_UP_WACOMDIGITIZER | 0x0136) #define WACOM_HID_WD_TOUCHSTRIP (WACOM_HID_UP_WACOMDIGITIZER | 0x0136)
...@@ -115,6 +117,7 @@ ...@@ -115,6 +117,7 @@
#define WACOM_HID_WD_TOUCHRING (WACOM_HID_UP_WACOMDIGITIZER | 0x0138) #define WACOM_HID_WD_TOUCHRING (WACOM_HID_UP_WACOMDIGITIZER | 0x0138)
#define WACOM_HID_WD_TOUCHRINGSTATUS (WACOM_HID_UP_WACOMDIGITIZER | 0x0139) #define WACOM_HID_WD_TOUCHRINGSTATUS (WACOM_HID_UP_WACOMDIGITIZER | 0x0139)
#define WACOM_HID_WD_REPORT_VALID (WACOM_HID_UP_WACOMDIGITIZER | 0x01d0) #define WACOM_HID_WD_REPORT_VALID (WACOM_HID_UP_WACOMDIGITIZER | 0x01d0)
#define WACOM_HID_WD_SEQUENCENUMBER (WACOM_HID_UP_WACOMDIGITIZER | 0x0220)
#define WACOM_HID_WD_ACCELEROMETER_X (WACOM_HID_UP_WACOMDIGITIZER | 0x0401) #define WACOM_HID_WD_ACCELEROMETER_X (WACOM_HID_UP_WACOMDIGITIZER | 0x0401)
#define WACOM_HID_WD_ACCELEROMETER_Y (WACOM_HID_UP_WACOMDIGITIZER | 0x0402) #define WACOM_HID_WD_ACCELEROMETER_Y (WACOM_HID_UP_WACOMDIGITIZER | 0x0402)
#define WACOM_HID_WD_ACCELEROMETER_Z (WACOM_HID_UP_WACOMDIGITIZER | 0x0403) #define WACOM_HID_WD_ACCELEROMETER_Z (WACOM_HID_UP_WACOMDIGITIZER | 0x0403)
...@@ -300,6 +303,7 @@ struct hid_data { ...@@ -300,6 +303,7 @@ struct hid_data {
bool tipswitch; bool tipswitch;
bool barrelswitch; bool barrelswitch;
bool barrelswitch2; bool barrelswitch2;
bool barrelswitch3;
bool serialhi; bool serialhi;
bool confidence; bool confidence;
int x; int x;
...@@ -320,6 +324,7 @@ struct hid_data { ...@@ -320,6 +324,7 @@ struct hid_data {
int bat_connected; int bat_connected;
int ps_connected; int ps_connected;
bool pad_input_event_flag; bool pad_input_event_flag;
unsigned short sequence_number;
}; };
struct wacom_remote_data { struct wacom_remote_data {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment