Commit 5f63595e authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull input fixes from Dmitry Torokhov:

 - a fix for unbalanced open count for inhibited input devices

 - fixups in Elantech PS/2 and Cyppress TTSP v5 drivers

 - a quirk to soc_button_array driver to make it work with Lenovo
   Yoga Book X90F / X90L

 - a removal of erroneous entry from xpad driver

* tag 'input-for-v6.4-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
  Input: xpad - delete a Razer DeathAdder mouse VID/PID entry
  Input: psmouse - fix OOB access in Elantech protocol
  Input: soc_button_array - add invalid acpi_index DMI quirk handling
  Input: fix open count when closing inhibited device
  Input: cyttsp5 - fix array length
parents 25bda386 feee70f4
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -703,7 +703,7 @@ void input_close_device(struct input_handle *handle)

	__input_release_device(handle);

	if (!dev->inhibited && !--dev->users) {
	if (!--dev->users && !dev->inhibited) {
		if (dev->poller)
			input_dev_poller_stop(dev->poller);
		if (dev->close)
+0 −1
Original line number Diff line number Diff line
@@ -281,7 +281,6 @@ static const struct xpad_device {
	{ 0x1430, 0xf801, "RedOctane Controller", 0, XTYPE_XBOX360 },
	{ 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", 0, XTYPE_XBOX360 },
	{ 0x146b, 0x0604, "Bigben Interactive DAIJA Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
	{ 0x1532, 0x0037, "Razer Sabertooth", 0, XTYPE_XBOX360 },
	{ 0x1532, 0x0a00, "Razer Atrox Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
	{ 0x1532, 0x0a03, "Razer Wildcat", 0, XTYPE_XBOXONE },
	{ 0x15e4, 0x3f00, "Power A Mini Pro Elite", 0, XTYPE_XBOX360 },
+30 −0
Original line number Diff line number Diff line
@@ -108,6 +108,27 @@ static const struct dmi_system_id dmi_use_low_level_irq[] = {
	{} /* Terminating entry */
};

/*
 * Some devices have a wrong entry which points to a GPIO which is
 * required in another driver, so this driver must not claim it.
 */
static const struct dmi_system_id dmi_invalid_acpi_index[] = {
	{
		/*
		 * Lenovo Yoga Book X90F / X90L, the PNP0C40 home button entry
		 * points to a GPIO which is not a home button and which is
		 * required by the lenovo-yogabook driver.
		 */
		.matches = {
			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Intel Corporation"),
			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "CHERRYVIEW D1 PLATFORM"),
			DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "YETI-11"),
		},
		.driver_data = (void *)1l,
	},
	{} /* Terminating entry */
};

/*
 * Get the Nth GPIO number from the ACPI object.
 */
@@ -137,6 +158,8 @@ soc_button_device_create(struct platform_device *pdev,
	struct platform_device *pd;
	struct gpio_keys_button *gpio_keys;
	struct gpio_keys_platform_data *gpio_keys_pdata;
	const struct dmi_system_id *dmi_id;
	int invalid_acpi_index = -1;
	int error, gpio, irq;
	int n_buttons = 0;

@@ -154,10 +177,17 @@ soc_button_device_create(struct platform_device *pdev,
	gpio_keys = (void *)(gpio_keys_pdata + 1);
	n_buttons = 0;

	dmi_id = dmi_first_match(dmi_invalid_acpi_index);
	if (dmi_id)
		invalid_acpi_index = (long)dmi_id->driver_data;

	for (info = button_info; info->name; info++) {
		if (info->autorepeat != autorepeat)
			continue;

		if (info->acpi_index == invalid_acpi_index)
			continue;

		error = soc_button_lookup_gpio(&pdev->dev, info->acpi_index, &gpio, &irq);
		if (error || irq < 0) {
			/*
+5 −4
Original line number Diff line number Diff line
@@ -674,10 +674,11 @@ static void process_packet_head_v4(struct psmouse *psmouse)
	struct input_dev *dev = psmouse->dev;
	struct elantech_data *etd = psmouse->private;
	unsigned char *packet = psmouse->packet;
	int id = ((packet[3] & 0xe0) >> 5) - 1;
	int id;
	int pres, traces;

	if (id < 0)
	id = ((packet[3] & 0xe0) >> 5) - 1;
	if (id < 0 || id >= ETP_MAX_FINGERS)
		return;

	etd->mt[id].x = ((packet[1] & 0x0f) << 8) | packet[2];
@@ -707,7 +708,7 @@ static void process_packet_motion_v4(struct psmouse *psmouse)
	int id, sid;

	id = ((packet[0] & 0xe0) >> 5) - 1;
	if (id < 0)
	if (id < 0 || id >= ETP_MAX_FINGERS)
		return;

	sid = ((packet[3] & 0xe0) >> 5) - 1;
@@ -728,7 +729,7 @@ static void process_packet_motion_v4(struct psmouse *psmouse)
	input_report_abs(dev, ABS_MT_POSITION_X, etd->mt[id].x);
	input_report_abs(dev, ABS_MT_POSITION_Y, etd->mt[id].y);

	if (sid >= 0) {
	if (sid >= 0 && sid < ETP_MAX_FINGERS) {
		etd->mt[sid].x += delta_x2 * weight;
		etd->mt[sid].y -= delta_y2 * weight;
		input_mt_slot(dev, sid);
+1 −1
Original line number Diff line number Diff line
@@ -560,7 +560,7 @@ static int cyttsp5_hid_output_get_sysinfo(struct cyttsp5 *ts)
static int cyttsp5_hid_output_bl_launch_app(struct cyttsp5 *ts)
{
	int rc;
	u8 cmd[HID_OUTPUT_BL_LAUNCH_APP];
	u8 cmd[HID_OUTPUT_BL_LAUNCH_APP_SIZE];
	u16 crc;

	put_unaligned_le16(HID_OUTPUT_BL_LAUNCH_APP_SIZE, cmd);