提交 fe24a97c 编写于 作者: L Linus Torvalds

Merge tag 'input-for-v6.1-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input

Pull input fixes from Dmitry Torokhov:

 - a fix for 8042 to stop leaking platform device on unload

 - a fix for Goodix touchscreens on devices like Nanote UMPC-01 where we
   need to reset controller to load config from firmware

 - a workaround for Acer Switch to avoid interrupt storm from home and
   power buttons

 - a workaround for more ASUS ZenBook models to detect keyboard
   controller

 - a fix for iforce driver to properly handle communication errors

 - touchpad on HP Laptop 15-da3001TU switched to RMI mode

* tag 'input-for-v6.1-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
  Input: i8042 - fix leaking of platform device on module removal
  Input: i8042 - apply probe defer to more ASUS ZenBook models
  Input: soc_button_array - add Acer Switch V 10 to dmi_use_low_level_irq[]
  Input: soc_button_array - add use_low_level_irq module parameter
  Input: iforce - invert valid length check when fetching device IDs
  Input: goodix - try resetting the controller when no config is set
  dt-bindings: input: touchscreen: Add compatible for Goodix GT7986U chip
  Input: synaptics - switch touchpad on HP Laptop 15-da3001TU to RMI mode
...@@ -16,8 +16,11 @@ description: ...@@ -16,8 +16,11 @@ description:
properties: properties:
compatible: compatible:
items: oneOf:
- const: goodix,gt7375p - const: goodix,gt7375p
- items:
- const: goodix,gt7986u
- const: goodix,gt7375p
reg: reg:
enum: enum:
......
...@@ -273,22 +273,22 @@ int iforce_init_device(struct device *parent, u16 bustype, ...@@ -273,22 +273,22 @@ int iforce_init_device(struct device *parent, u16 bustype,
* Get device info. * Get device info.
*/ */
if (!iforce_get_id_packet(iforce, 'M', buf, &len) || len < 3) if (!iforce_get_id_packet(iforce, 'M', buf, &len) && len >= 3)
input_dev->id.vendor = get_unaligned_le16(buf + 1); input_dev->id.vendor = get_unaligned_le16(buf + 1);
else else
dev_warn(&iforce->dev->dev, "Device does not respond to id packet M\n"); dev_warn(&iforce->dev->dev, "Device does not respond to id packet M\n");
if (!iforce_get_id_packet(iforce, 'P', buf, &len) || len < 3) if (!iforce_get_id_packet(iforce, 'P', buf, &len) && len >= 3)
input_dev->id.product = get_unaligned_le16(buf + 1); input_dev->id.product = get_unaligned_le16(buf + 1);
else else
dev_warn(&iforce->dev->dev, "Device does not respond to id packet P\n"); dev_warn(&iforce->dev->dev, "Device does not respond to id packet P\n");
if (!iforce_get_id_packet(iforce, 'B', buf, &len) || len < 3) if (!iforce_get_id_packet(iforce, 'B', buf, &len) && len >= 3)
iforce->device_memory.end = get_unaligned_le16(buf + 1); iforce->device_memory.end = get_unaligned_le16(buf + 1);
else else
dev_warn(&iforce->dev->dev, "Device does not respond to id packet B\n"); dev_warn(&iforce->dev->dev, "Device does not respond to id packet B\n");
if (!iforce_get_id_packet(iforce, 'N', buf, &len) || len < 2) if (!iforce_get_id_packet(iforce, 'N', buf, &len) && len >= 2)
ff_effects = buf[1]; ff_effects = buf[1];
else else
dev_warn(&iforce->dev->dev, "Device does not respond to id packet N\n"); dev_warn(&iforce->dev->dev, "Device does not respond to id packet N\n");
......
...@@ -18,6 +18,10 @@ ...@@ -18,6 +18,10 @@
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
static bool use_low_level_irq;
module_param(use_low_level_irq, bool, 0444);
MODULE_PARM_DESC(use_low_level_irq, "Use low-level triggered IRQ instead of edge triggered");
struct soc_button_info { struct soc_button_info {
const char *name; const char *name;
int acpi_index; int acpi_index;
...@@ -73,6 +77,13 @@ static const struct dmi_system_id dmi_use_low_level_irq[] = { ...@@ -73,6 +77,13 @@ static const struct dmi_system_id dmi_use_low_level_irq[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW5-012"), DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW5-012"),
}, },
}, },
{
/* Acer Switch V 10 SW5-017, same issue as Acer Switch 10 SW5-012. */
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
DMI_MATCH(DMI_PRODUCT_NAME, "SW5-017"),
},
},
{ {
/* /*
* Acer One S1003. _LID method messes with power-button GPIO * Acer One S1003. _LID method messes with power-button GPIO
...@@ -164,7 +175,8 @@ soc_button_device_create(struct platform_device *pdev, ...@@ -164,7 +175,8 @@ soc_button_device_create(struct platform_device *pdev,
} }
/* See dmi_use_low_level_irq[] comment */ /* See dmi_use_low_level_irq[] comment */
if (!autorepeat && dmi_check_system(dmi_use_low_level_irq)) { if (!autorepeat && (use_low_level_irq ||
dmi_check_system(dmi_use_low_level_irq))) {
irq_set_irq_type(irq, IRQ_TYPE_LEVEL_LOW); irq_set_irq_type(irq, IRQ_TYPE_LEVEL_LOW);
gpio_keys[n_buttons].irq = irq; gpio_keys[n_buttons].irq = irq;
gpio_keys[n_buttons].gpio = -ENOENT; gpio_keys[n_buttons].gpio = -ENOENT;
......
...@@ -192,6 +192,7 @@ static const char * const smbus_pnp_ids[] = { ...@@ -192,6 +192,7 @@ static const char * const smbus_pnp_ids[] = {
"SYN3221", /* HP 15-ay000 */ "SYN3221", /* HP 15-ay000 */
"SYN323d", /* HP Spectre X360 13-w013dx */ "SYN323d", /* HP Spectre X360 13-w013dx */
"SYN3257", /* HP Envy 13-ad105ng */ "SYN3257", /* HP Envy 13-ad105ng */
"SYN3286", /* HP Laptop 15-da3001TU */
NULL NULL
}; };
......
...@@ -115,18 +115,18 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = { ...@@ -115,18 +115,18 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_NEVER) .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_NEVER)
}, },
{ {
/* ASUS ZenBook UX425UA */ /* ASUS ZenBook UX425UA/QA */
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX425UA"), DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX425"),
}, },
.driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER | SERIO_QUIRK_RESET_NEVER) .driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER | SERIO_QUIRK_RESET_NEVER)
}, },
{ {
/* ASUS ZenBook UM325UA */ /* ASUS ZenBook UM325UA/QA */
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325UA_UM325UA"), DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325"),
}, },
.driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER | SERIO_QUIRK_RESET_NEVER) .driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER | SERIO_QUIRK_RESET_NEVER)
}, },
......
...@@ -1543,8 +1543,6 @@ static int i8042_probe(struct platform_device *dev) ...@@ -1543,8 +1543,6 @@ static int i8042_probe(struct platform_device *dev)
{ {
int error; int error;
i8042_platform_device = dev;
if (i8042_reset == I8042_RESET_ALWAYS) { if (i8042_reset == I8042_RESET_ALWAYS) {
error = i8042_controller_selftest(); error = i8042_controller_selftest();
if (error) if (error)
...@@ -1582,7 +1580,6 @@ static int i8042_probe(struct platform_device *dev) ...@@ -1582,7 +1580,6 @@ static int i8042_probe(struct platform_device *dev)
i8042_free_aux_ports(); /* in case KBD failed but AUX not */ i8042_free_aux_ports(); /* in case KBD failed but AUX not */
i8042_free_irqs(); i8042_free_irqs();
i8042_controller_reset(false); i8042_controller_reset(false);
i8042_platform_device = NULL;
return error; return error;
} }
...@@ -1592,7 +1589,6 @@ static int i8042_remove(struct platform_device *dev) ...@@ -1592,7 +1589,6 @@ static int i8042_remove(struct platform_device *dev)
i8042_unregister_ports(); i8042_unregister_ports();
i8042_free_irqs(); i8042_free_irqs();
i8042_controller_reset(false); i8042_controller_reset(false);
i8042_platform_device = NULL;
return 0; return 0;
} }
......
...@@ -1158,6 +1158,7 @@ static int goodix_configure_dev(struct goodix_ts_data *ts) ...@@ -1158,6 +1158,7 @@ static int goodix_configure_dev(struct goodix_ts_data *ts)
input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0);
input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
retry_read_config:
/* Read configuration and apply touchscreen parameters */ /* Read configuration and apply touchscreen parameters */
goodix_read_config(ts); goodix_read_config(ts);
...@@ -1165,6 +1166,16 @@ static int goodix_configure_dev(struct goodix_ts_data *ts) ...@@ -1165,6 +1166,16 @@ static int goodix_configure_dev(struct goodix_ts_data *ts)
touchscreen_parse_properties(ts->input_dev, true, &ts->prop); touchscreen_parse_properties(ts->input_dev, true, &ts->prop);
if (!ts->prop.max_x || !ts->prop.max_y || !ts->max_touch_num) { if (!ts->prop.max_x || !ts->prop.max_y || !ts->max_touch_num) {
if (!ts->reset_controller_at_probe &&
ts->irq_pin_access_method != IRQ_PIN_ACCESS_NONE) {
dev_info(&ts->client->dev, "Config not set, resetting controller\n");
/* Retry after a controller reset */
ts->reset_controller_at_probe = true;
error = goodix_reset(ts);
if (error)
return error;
goto retry_read_config;
}
dev_err(&ts->client->dev, dev_err(&ts->client->dev,
"Invalid config (%d, %d, %d), using defaults\n", "Invalid config (%d, %d, %d), using defaults\n",
ts->prop.max_x, ts->prop.max_y, ts->max_touch_num); ts->prop.max_x, ts->prop.max_y, ts->max_touch_num);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册