Commit 01125b2d authored by Jiri Kosina's avatar Jiri Kosina

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

- High resolution mode for DEll canvas support, from Benjamin Tissoires
- A lot of improvements to pen handling in the Wacom driver, from Jason Gerecke
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parents 4b545304 5b01b3b8
...@@ -196,6 +196,13 @@ static void wacom_feature_mapping(struct hid_device *hdev, ...@@ -196,6 +196,13 @@ static void wacom_feature_mapping(struct hid_device *hdev,
kfree(data); kfree(data);
break; break;
} }
if (hdev->vendor == USB_VENDOR_ID_WACOM &&
hdev->product == 0x4200 /* Dell Canvas 27 */ &&
field->application == HID_UP_MSVENDOR) {
wacom->wacom_wac.mode_report = field->report->id;
wacom->wacom_wac.mode_value = 2;
}
} }
/* /*
......
...@@ -2140,6 +2140,12 @@ static void wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field ...@@ -2140,6 +2140,12 @@ static void wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field
case HID_DG_TIPSWITCH: case HID_DG_TIPSWITCH:
wacom_wac->hid_data.tipswitch |= value; wacom_wac->hid_data.tipswitch |= value;
return; return;
case HID_DG_BARRELSWITCH:
wacom_wac->hid_data.barrelswitch = value;
return;
case HID_DG_BARRELSWITCH2:
wacom_wac->hid_data.barrelswitch2 = value;
return;
case HID_DG_TOOLSERIALNUMBER: case HID_DG_TOOLSERIALNUMBER:
if (value) { if (value) {
wacom_wac->serial[0] = (wacom_wac->serial[0] & ~0xFFFFFFFFULL); wacom_wac->serial[0] = (wacom_wac->serial[0] & ~0xFFFFFFFFULL);
...@@ -2217,11 +2223,11 @@ static void wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field ...@@ -2217,11 +2223,11 @@ static void wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field
if (!usage->type || delay_pen_events(wacom_wac)) if (!usage->type || delay_pen_events(wacom_wac))
return; return;
/* send pen events only when the pen is in/entering/leaving proximity */ /* send pen events only when the pen is in range */
if (!wacom_wac->hid_data.inrange_state && !wacom_wac->tool[0]) if (wacom_wac->hid_data.inrange_state)
return; input_event(input, usage->type, usage->code, value);
else if (wacom_wac->shared->stylus_in_proximity && !wacom_wac->hid_data.sense_state)
input_event(input, usage->type, usage->code, value); input_event(input, usage->type, usage->code, 0);
} }
static void wacom_wac_pen_pre_report(struct hid_device *hdev, static void wacom_wac_pen_pre_report(struct hid_device *hdev,
...@@ -2236,11 +2242,11 @@ static void wacom_wac_pen_report(struct hid_device *hdev, ...@@ -2236,11 +2242,11 @@ static void wacom_wac_pen_report(struct hid_device *hdev,
struct wacom *wacom = hid_get_drvdata(hdev); struct wacom *wacom = hid_get_drvdata(hdev);
struct wacom_wac *wacom_wac = &wacom->wacom_wac; struct wacom_wac *wacom_wac = &wacom->wacom_wac;
struct input_dev *input = wacom_wac->pen_input; struct input_dev *input = wacom_wac->pen_input;
bool prox = wacom_wac->hid_data.inrange_state; bool range = wacom_wac->hid_data.inrange_state;
bool range = wacom_wac->hid_data.sense_state; bool sense = wacom_wac->hid_data.sense_state;
if (!wacom_wac->tool[0] && prox) { /* first in prox */ if (!wacom_wac->tool[0] && range) { /* first in range */
/* Going into proximity select tool */ /* Going into range select tool */
if (wacom_wac->hid_data.invert_state) if (wacom_wac->hid_data.invert_state)
wacom_wac->tool[0] = BTN_TOOL_RUBBER; wacom_wac->tool[0] = BTN_TOOL_RUBBER;
else if (wacom_wac->id[0]) else if (wacom_wac->id[0])
...@@ -2250,10 +2256,16 @@ static void wacom_wac_pen_report(struct hid_device *hdev, ...@@ -2250,10 +2256,16 @@ static void wacom_wac_pen_report(struct hid_device *hdev,
} }
/* keep pen state for touch events */ /* keep pen state for touch events */
wacom_wac->shared->stylus_in_proximity = range; wacom_wac->shared->stylus_in_proximity = sense;
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 |
(wacom_wac->hid_data.barrelswitch2 << 1);
input_report_key(input, BTN_STYLUS, sw_state == 1);
input_report_key(input, BTN_STYLUS2, sw_state == 2);
input_report_key(input, BTN_STYLUS3, sw_state == 3);
/* /*
* Non-USI EMR tools should have their IDs mangled to * Non-USI EMR tools should have their IDs mangled to
...@@ -2269,10 +2281,10 @@ static void wacom_wac_pen_report(struct hid_device *hdev, ...@@ -2269,10 +2281,10 @@ static void wacom_wac_pen_report(struct hid_device *hdev,
*/ */
input_report_key(input, BTN_TOUCH, input_report_key(input, BTN_TOUCH,
wacom_wac->hid_data.tipswitch); wacom_wac->hid_data.tipswitch);
input_report_key(input, wacom_wac->tool[0], prox); input_report_key(input, wacom_wac->tool[0], sense);
if (wacom_wac->serial[0]) { if (wacom_wac->serial[0]) {
input_event(input, EV_MSC, MSC_SERIAL, wacom_wac->serial[0]); input_event(input, EV_MSC, MSC_SERIAL, wacom_wac->serial[0]);
input_report_abs(input, ABS_MISC, prox ? id : 0); input_report_abs(input, ABS_MISC, sense ? id : 0);
} }
wacom_wac->hid_data.tipswitch = false; wacom_wac->hid_data.tipswitch = false;
...@@ -2280,7 +2292,7 @@ static void wacom_wac_pen_report(struct hid_device *hdev, ...@@ -2280,7 +2292,7 @@ static void wacom_wac_pen_report(struct hid_device *hdev,
input_sync(input); input_sync(input);
} }
if (!prox) { if (!sense) {
wacom_wac->tool[0] = 0; wacom_wac->tool[0] = 0;
wacom_wac->id[0] = 0; wacom_wac->id[0] = 0;
wacom_wac->serial[0] = 0; wacom_wac->serial[0] = 0;
...@@ -3300,9 +3312,11 @@ int wacom_setup_pen_input_capabilities(struct input_dev *input_dev, ...@@ -3300,9 +3312,11 @@ int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
else else
__set_bit(INPUT_PROP_POINTER, input_dev->propbit); __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
if (features->type == HID_GENERIC) if (features->type == HID_GENERIC) {
/* setup has already been done */ /* setup has already been done; apply otherwise-undetectible quirks */
input_set_capability(input_dev, EV_KEY, BTN_STYLUS3);
return 0; return 0;
}
__set_bit(BTN_TOUCH, input_dev->keybit); __set_bit(BTN_TOUCH, input_dev->keybit);
__set_bit(ABS_MISC, input_dev->absbit); __set_bit(ABS_MISC, input_dev->absbit);
......
...@@ -292,6 +292,8 @@ struct hid_data { ...@@ -292,6 +292,8 @@ struct hid_data {
bool inrange_state; bool inrange_state;
bool invert_state; bool invert_state;
bool tipswitch; bool tipswitch;
bool barrelswitch;
bool barrelswitch2;
int x; int x;
int y; int y;
int pressure; int pressure;
......
...@@ -406,6 +406,7 @@ ...@@ -406,6 +406,7 @@
#define BTN_TOOL_MOUSE 0x146 #define BTN_TOOL_MOUSE 0x146
#define BTN_TOOL_LENS 0x147 #define BTN_TOOL_LENS 0x147
#define BTN_TOOL_QUINTTAP 0x148 /* Five fingers on trackpad */ #define BTN_TOOL_QUINTTAP 0x148 /* Five fingers on trackpad */
#define BTN_STYLUS3 0x149
#define BTN_TOUCH 0x14a #define BTN_TOUCH 0x14a
#define BTN_STYLUS 0x14b #define BTN_STYLUS 0x14b
#define BTN_STYLUS2 0x14c #define BTN_STYLUS2 0x14c
......
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