Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

 - fix gtco tablet driver, tightening parsing of HID descriptors

 - add ACPI ID added to Elan driver to be able to handle touchpads found
   in Lenovo Ideapad 320/520

 - fix the Symaptics RMI4 driver to adjust handling of buttons

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
  Input: synaptics-rmi4 - limit the range of what GPIOs are buttons
  Input: gtco - fix potential out-of-bound access
  Input: elan_i2c - add ELAN0611 to the ACPI table
parents 22450e03 3e64fcbd
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1258,6 +1258,7 @@ static const struct acpi_device_id elan_acpi_id[] = {
	{ "ELAN0605", 0 },
	{ "ELAN0609", 0 },
	{ "ELAN060B", 0 },
	{ "ELAN0611", 0 },
	{ "ELAN1000", 0 },
	{ }
};
+3 −2
Original line number Diff line number Diff line
@@ -232,9 +232,10 @@ static int rmi_f30_map_gpios(struct rmi_function *fn,
	unsigned int trackstick_button = BTN_LEFT;
	bool button_mapped = false;
	int i;
	int button_count = min_t(u8, f30->gpioled_count, TRACKSTICK_RANGE_END);

	f30->gpioled_key_map = devm_kcalloc(&fn->dev,
					    f30->gpioled_count,
					    button_count,
					    sizeof(f30->gpioled_key_map[0]),
					    GFP_KERNEL);
	if (!f30->gpioled_key_map) {
@@ -242,7 +243,7 @@ static int rmi_f30_map_gpios(struct rmi_function *fn,
		return -ENOMEM;
	}

	for (i = 0; i < f30->gpioled_count; i++) {
	for (i = 0; i < button_count; i++) {
		if (!rmi_f30_is_valid_button(i, f30->ctrl))
			continue;

+10 −7
Original line number Diff line number Diff line
@@ -230,13 +230,17 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report,

	/* Walk  this report and pull out the info we need */
	while (i < length) {
		prefix = report[i];

		/* Skip over prefix */
		i++;
		prefix = report[i++];

		/* Determine data size and save the data in the proper variable */
		size = PREF_SIZE(prefix);
		size = (1U << PREF_SIZE(prefix)) >> 1;
		if (i + size > length) {
			dev_err(ddev,
				"Not enough data (need %d, have %d)\n",
				i + size, length);
			break;
		}

		switch (size) {
		case 1:
			data = report[i];
@@ -244,8 +248,7 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report,
		case 2:
			data16 = get_unaligned_le16(&report[i]);
			break;
		case 3:
			size = 4;
		case 4:
			data32 = get_unaligned_le32(&report[i]);
			break;
		}