Commit 6c905ab1 authored by Jiri Kosina's avatar Jiri Kosina
Browse files

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

- Wacom pen handling fix from Ping Cheng
parents 5a4a13cb 46fc466e
Loading
Loading
Loading
Loading
+26 −24
Original line number Diff line number Diff line
@@ -1860,8 +1860,6 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
	usage->type = type;
	usage->code = code;

	set_bit(type, input->evbit);

	switch (type) {
	case EV_ABS:
		input_set_abs_params(input, code, fmin, fmax, fuzz, 0);
@@ -1869,13 +1867,9 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
				  hidinput_calc_abs_res(field, resolution_code));
		break;
	case EV_KEY:
		input_set_capability(input, EV_KEY, code);
		break;
	case EV_MSC:
		input_set_capability(input, EV_MSC, code);
		break;
	case EV_SW:
		input_set_capability(input, EV_SW, code);
		input_set_capability(input, type, code);
		break;
	}
}
@@ -2187,6 +2181,18 @@ static void wacom_wac_pad_report(struct hid_device *hdev,
	}
}

static void wacom_set_barrel_switch3_usage(struct wacom_wac *wacom_wac)
{
	struct input_dev *input = wacom_wac->pen_input;
	struct wacom_features *features = &wacom_wac->features;

	if (!(features->quirks & WACOM_QUIRK_AESPEN) &&
	    wacom_wac->hid_data.barrelswitch &&
	    wacom_wac->hid_data.barrelswitch2 &&
	    wacom_wac->hid_data.serialhi)
		input_set_capability(input, EV_KEY, BTN_STYLUS3);
}

static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
		struct hid_field *field, struct hid_usage *usage)
{
@@ -2227,13 +2233,21 @@ static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
		wacom_map_usage(input, usage, field, EV_ABS, ABS_Z, 0);
		break;
	case HID_DG_ERASER:
		input_set_capability(input, EV_KEY, BTN_TOOL_RUBBER);
		wacom_map_usage(input, usage, field, EV_KEY, BTN_TOUCH, 0);
		break;
	case HID_DG_TIPSWITCH:
		input_set_capability(input, EV_KEY, BTN_TOOL_PEN);
		wacom_map_usage(input, usage, field, EV_KEY, BTN_TOUCH, 0);
		break;
	case HID_DG_BARRELSWITCH:
		wacom_wac->hid_data.barrelswitch = true;
		wacom_set_barrel_switch3_usage(wacom_wac);
		wacom_map_usage(input, usage, field, EV_KEY, BTN_STYLUS, 0);
		break;
	case HID_DG_BARRELSWITCH2:
		wacom_wac->hid_data.barrelswitch2 = true;
		wacom_set_barrel_switch3_usage(wacom_wac);
		wacom_map_usage(input, usage, field, EV_KEY, BTN_STYLUS2, 0);
		break;
	case HID_DG_TOOLSERIALNUMBER:
@@ -2245,22 +2259,12 @@ static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
		wacom_map_usage(input, usage, field, EV_KEY, BTN_TOOL_PEN, 0);
		break;
	case WACOM_HID_WD_SERIALHI:
		wacom_wac->hid_data.serialhi = true;
		wacom_set_barrel_switch3_usage(wacom_wac);
		wacom_map_usage(input, usage, field, EV_ABS, ABS_MISC, 0);

		if (!(features->quirks & WACOM_QUIRK_AESPEN)) {
			set_bit(EV_KEY, input->evbit);
			input_set_capability(input, EV_KEY, BTN_TOOL_PEN);
			input_set_capability(input, EV_KEY, BTN_TOOL_RUBBER);
			input_set_capability(input, EV_KEY, BTN_TOOL_BRUSH);
			input_set_capability(input, EV_KEY, BTN_TOOL_PENCIL);
			input_set_capability(input, EV_KEY, BTN_TOOL_AIRBRUSH);
			if (!(features->device_type & WACOM_DEVICETYPE_DIRECT)) {
				input_set_capability(input, EV_KEY, BTN_TOOL_MOUSE);
				input_set_capability(input, EV_KEY, BTN_TOOL_LENS);
			}
		}
		break;
	case WACOM_HID_WD_FINGERWHEEL:
		input_set_capability(input, EV_KEY, BTN_TOOL_AIRBRUSH);
		wacom_map_usage(input, usage, field, EV_ABS, ABS_WHEEL, 0);
		break;
	}
@@ -3582,11 +3586,9 @@ int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
	else
		__set_bit(INPUT_PROP_POINTER, input_dev->propbit);

	if (features->type == HID_GENERIC) {
		/* setup has already been done; apply otherwise-undetectible quirks */
		input_set_capability(input_dev, EV_KEY, BTN_STYLUS3);
	if (features->type == HID_GENERIC)
		/* setup has already been done */
		return 0;
	}

	input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
	__set_bit(BTN_TOUCH, input_dev->keybit);
+1 −0
Original line number Diff line number Diff line
@@ -300,6 +300,7 @@ struct hid_data {
	bool tipswitch;
	bool barrelswitch;
	bool barrelswitch2;
	bool serialhi;
	int x;
	int y;
	int pressure;