Commit 7eb61cc6 authored by Linus Torvalds's avatar Linus Torvalds

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

Pull input fixes from Dmitry Torokhov:

 - a tweak to uinput interface to reject requests with abnormally large
   number of slots. 100 slots/contacts should be enough for real devices

 - support for FocalTech FT8201 added to the edt-ft5x06 driver

 - tweaks to i8042 to handle more devices that have issue with its
   emulation

 - Synaptics touchpad switched to native SMbus/RMI mode on HP Elitebook
   840 G2

 - other minor fixes

* tag 'input-for-v6.11-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
  Input: himax_hx83112b - fix incorrect size when reading product ID
  Input: i8042 - use new forcenorestore quirk to replace old buggy quirk combination
  Input: i8042 - add forcenorestore quirk to leave controller untouched even on s3
  Input: i8042 - add Fujitsu Lifebook E756 to i8042 quirk table
  Input: uinput - reject requests with unreasonable number of slots
  Input: edt-ft5x06 - add support for FocalTech FT8201
  dt-bindings: input: touchscreen: edt-ft5x06: Document FT8201 support
  Input: adc-joystick - fix optional value handling
  Input: synaptics - enable SMBus for HP Elitebook 840 G2
  Input: ads7846 - ratelimit the spi_sync error message
parents 79a899e3 4e870e6b
...@@ -42,6 +42,7 @@ properties: ...@@ -42,6 +42,7 @@ properties:
- focaltech,ft5426 - focaltech,ft5426
- focaltech,ft5452 - focaltech,ft5452
- focaltech,ft6236 - focaltech,ft6236
- focaltech,ft8201
- focaltech,ft8719 - focaltech,ft8719
reg: reg:
......
...@@ -182,8 +182,11 @@ static int adc_joystick_set_axes(struct device *dev, struct adc_joystick *joy) ...@@ -182,8 +182,11 @@ static int adc_joystick_set_axes(struct device *dev, struct adc_joystick *joy)
swap(range[0], range[1]); swap(range[0], range[1]);
} }
fwnode_property_read_u32(child, "abs-fuzz", &fuzz); if (fwnode_property_read_u32(child, "abs-fuzz", &fuzz))
fwnode_property_read_u32(child, "abs-flat", &flat); fuzz = 0;
if (fwnode_property_read_u32(child, "abs-flat", &flat))
flat = 0;
input_set_abs_params(joy->input, axes[i].code, input_set_abs_params(joy->input, axes[i].code,
range[0], range[1], fuzz, flat); range[0], range[1], fuzz, flat);
......
...@@ -417,6 +417,20 @@ static int uinput_validate_absinfo(struct input_dev *dev, unsigned int code, ...@@ -417,6 +417,20 @@ static int uinput_validate_absinfo(struct input_dev *dev, unsigned int code,
return -EINVAL; return -EINVAL;
} }
/*
* Limit number of contacts to a reasonable value (100). This
* ensures that we need less than 2 pages for struct input_mt
* (we are not using in-kernel slot assignment so not going to
* allocate memory for the "red" table), and we should have no
* trouble getting this much memory.
*/
if (code == ABS_MT_SLOT && max > 99) {
printk(KERN_DEBUG
"%s: unreasonably large number of slots requested: %d\n",
UINPUT_NAME, max);
return -EINVAL;
}
return 0; return 0;
} }
......
...@@ -189,6 +189,7 @@ static const char * const smbus_pnp_ids[] = { ...@@ -189,6 +189,7 @@ static const char * const smbus_pnp_ids[] = {
"LEN2054", /* E480 */ "LEN2054", /* E480 */
"LEN2055", /* E580 */ "LEN2055", /* E580 */
"LEN2068", /* T14 Gen 1 */ "LEN2068", /* T14 Gen 1 */
"SYN3015", /* HP EliteBook 840 G2 */
"SYN3052", /* HP EliteBook 840 G4 */ "SYN3052", /* HP EliteBook 840 G4 */
"SYN3221", /* HP 15-ay000 */ "SYN3221", /* HP 15-ay000 */
"SYN323d", /* HP Spectre X360 13-w013dx */ "SYN323d", /* HP Spectre X360 13-w013dx */
......
...@@ -83,6 +83,7 @@ static inline void i8042_write_command(int val) ...@@ -83,6 +83,7 @@ static inline void i8042_write_command(int val)
#define SERIO_QUIRK_KBDRESET BIT(12) #define SERIO_QUIRK_KBDRESET BIT(12)
#define SERIO_QUIRK_DRITEK BIT(13) #define SERIO_QUIRK_DRITEK BIT(13)
#define SERIO_QUIRK_NOPNP BIT(14) #define SERIO_QUIRK_NOPNP BIT(14)
#define SERIO_QUIRK_FORCENORESTORE BIT(15)
/* Quirk table for different mainboards. Options similar or identical to i8042 /* Quirk table for different mainboards. Options similar or identical to i8042
* module parameters. * module parameters.
...@@ -626,6 +627,15 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = { ...@@ -626,6 +627,15 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
}, },
.driver_data = (void *)(SERIO_QUIRK_NOMUX) .driver_data = (void *)(SERIO_QUIRK_NOMUX)
}, },
{
/* Fujitsu Lifebook E756 */
/* https://bugzilla.suse.com/show_bug.cgi?id=1229056 */
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E756"),
},
.driver_data = (void *)(SERIO_QUIRK_NOMUX)
},
{ {
/* Fujitsu Lifebook E5411 */ /* Fujitsu Lifebook E5411 */
.matches = { .matches = {
...@@ -1149,18 +1159,10 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = { ...@@ -1149,18 +1159,10 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
}, },
{ {
/*
* Setting SERIO_QUIRK_NOMUX or SERIO_QUIRK_RESET_ALWAYS makes
* the keyboard very laggy for ~5 seconds after boot and
* sometimes also after resume.
* However both are required for the keyboard to not fail
* completely sometimes after boot or resume.
*/
.matches = { .matches = {
DMI_MATCH(DMI_BOARD_NAME, "N150CU"), DMI_MATCH(DMI_BOARD_NAME, "N150CU"),
}, },
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | .driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
}, },
{ {
.matches = { .matches = {
...@@ -1685,6 +1687,8 @@ static void __init i8042_check_quirks(void) ...@@ -1685,6 +1687,8 @@ static void __init i8042_check_quirks(void)
if (quirks & SERIO_QUIRK_NOPNP) if (quirks & SERIO_QUIRK_NOPNP)
i8042_nopnp = true; i8042_nopnp = true;
#endif #endif
if (quirks & SERIO_QUIRK_FORCENORESTORE)
i8042_forcenorestore = true;
} }
#else #else
static inline void i8042_check_quirks(void) {} static inline void i8042_check_quirks(void) {}
...@@ -1718,7 +1722,7 @@ static int __init i8042_platform_init(void) ...@@ -1718,7 +1722,7 @@ static int __init i8042_platform_init(void)
i8042_check_quirks(); i8042_check_quirks();
pr_debug("Active quirks (empty means none):%s%s%s%s%s%s%s%s%s%s%s%s%s\n", pr_debug("Active quirks (empty means none):%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
i8042_nokbd ? " nokbd" : "", i8042_nokbd ? " nokbd" : "",
i8042_noaux ? " noaux" : "", i8042_noaux ? " noaux" : "",
i8042_nomux ? " nomux" : "", i8042_nomux ? " nomux" : "",
...@@ -1738,10 +1742,11 @@ static int __init i8042_platform_init(void) ...@@ -1738,10 +1742,11 @@ static int __init i8042_platform_init(void)
"", "",
#endif #endif
#ifdef CONFIG_PNP #ifdef CONFIG_PNP
i8042_nopnp ? " nopnp" : ""); i8042_nopnp ? " nopnp" : "",
#else #else
""); "",
#endif #endif
i8042_forcenorestore ? " forcenorestore" : "");
retval = i8042_pnp_init(); retval = i8042_pnp_init();
if (retval) if (retval)
......
...@@ -115,6 +115,10 @@ module_param_named(nopnp, i8042_nopnp, bool, 0); ...@@ -115,6 +115,10 @@ module_param_named(nopnp, i8042_nopnp, bool, 0);
MODULE_PARM_DESC(nopnp, "Do not use PNP to detect controller settings"); MODULE_PARM_DESC(nopnp, "Do not use PNP to detect controller settings");
#endif #endif
static bool i8042_forcenorestore;
module_param_named(forcenorestore, i8042_forcenorestore, bool, 0);
MODULE_PARM_DESC(forcenorestore, "Force no restore on s3 resume, copying s2idle behaviour");
#define DEBUG #define DEBUG
#ifdef DEBUG #ifdef DEBUG
static bool i8042_debug; static bool i8042_debug;
...@@ -1232,7 +1236,7 @@ static int i8042_pm_suspend(struct device *dev) ...@@ -1232,7 +1236,7 @@ static int i8042_pm_suspend(struct device *dev)
{ {
int i; int i;
if (pm_suspend_via_firmware()) if (!i8042_forcenorestore && pm_suspend_via_firmware())
i8042_controller_reset(true); i8042_controller_reset(true);
/* Set up serio interrupts for system wakeup. */ /* Set up serio interrupts for system wakeup. */
...@@ -1248,7 +1252,7 @@ static int i8042_pm_suspend(struct device *dev) ...@@ -1248,7 +1252,7 @@ static int i8042_pm_suspend(struct device *dev)
static int i8042_pm_resume_noirq(struct device *dev) static int i8042_pm_resume_noirq(struct device *dev)
{ {
if (!pm_resume_via_firmware()) if (i8042_forcenorestore || !pm_resume_via_firmware())
i8042_interrupt(0, NULL); i8042_interrupt(0, NULL);
return 0; return 0;
...@@ -1271,7 +1275,7 @@ static int i8042_pm_resume(struct device *dev) ...@@ -1271,7 +1275,7 @@ static int i8042_pm_resume(struct device *dev)
* not restore the controller state to whatever it had been at boot * not restore the controller state to whatever it had been at boot
* time, so we do not need to do anything. * time, so we do not need to do anything.
*/ */
if (!pm_suspend_via_firmware()) if (i8042_forcenorestore || !pm_suspend_via_firmware())
return 0; return 0;
/* /*
......
...@@ -824,7 +824,7 @@ static void ads7846_read_state(struct ads7846 *ts) ...@@ -824,7 +824,7 @@ static void ads7846_read_state(struct ads7846 *ts)
m = &ts->msg[msg_idx]; m = &ts->msg[msg_idx];
error = spi_sync(ts->spi, m); error = spi_sync(ts->spi, m);
if (error) { if (error) {
dev_err(&ts->spi->dev, "spi_sync --> %d\n", error); dev_err_ratelimited(&ts->spi->dev, "spi_sync --> %d\n", error);
packet->ignore = true; packet->ignore = true;
return; return;
} }
......
...@@ -1474,6 +1474,10 @@ static const struct edt_i2c_chip_data edt_ft6236_data = { ...@@ -1474,6 +1474,10 @@ static const struct edt_i2c_chip_data edt_ft6236_data = {
.max_support_points = 2, .max_support_points = 2,
}; };
static const struct edt_i2c_chip_data edt_ft8201_data = {
.max_support_points = 10,
};
static const struct edt_i2c_chip_data edt_ft8719_data = { static const struct edt_i2c_chip_data edt_ft8719_data = {
.max_support_points = 10, .max_support_points = 10,
}; };
...@@ -1485,6 +1489,7 @@ static const struct i2c_device_id edt_ft5x06_ts_id[] = { ...@@ -1485,6 +1489,7 @@ static const struct i2c_device_id edt_ft5x06_ts_id[] = {
{ .name = "ft5452", .driver_data = (long)&edt_ft5452_data }, { .name = "ft5452", .driver_data = (long)&edt_ft5452_data },
/* Note no edt- prefix for compatibility with the ft6236.c driver */ /* Note no edt- prefix for compatibility with the ft6236.c driver */
{ .name = "ft6236", .driver_data = (long)&edt_ft6236_data }, { .name = "ft6236", .driver_data = (long)&edt_ft6236_data },
{ .name = "ft8201", .driver_data = (long)&edt_ft8201_data },
{ .name = "ft8719", .driver_data = (long)&edt_ft8719_data }, { .name = "ft8719", .driver_data = (long)&edt_ft8719_data },
{ /* sentinel */ } { /* sentinel */ }
}; };
...@@ -1500,6 +1505,7 @@ static const struct of_device_id edt_ft5x06_of_match[] = { ...@@ -1500,6 +1505,7 @@ static const struct of_device_id edt_ft5x06_of_match[] = {
{ .compatible = "focaltech,ft5452", .data = &edt_ft5452_data }, { .compatible = "focaltech,ft5452", .data = &edt_ft5452_data },
/* Note focaltech vendor prefix for compatibility with ft6236.c */ /* Note focaltech vendor prefix for compatibility with ft6236.c */
{ .compatible = "focaltech,ft6236", .data = &edt_ft6236_data }, { .compatible = "focaltech,ft6236", .data = &edt_ft6236_data },
{ .compatible = "focaltech,ft8201", .data = &edt_ft8201_data },
{ .compatible = "focaltech,ft8719", .data = &edt_ft8719_data }, { .compatible = "focaltech,ft8719", .data = &edt_ft8719_data },
{ /* sentinel */ } { /* sentinel */ }
}; };
......
...@@ -130,17 +130,6 @@ static int himax_bus_read(struct himax_ts_data *ts, u32 address, void *dst, ...@@ -130,17 +130,6 @@ static int himax_bus_read(struct himax_ts_data *ts, u32 address, void *dst,
return 0; return 0;
} }
static int himax_read_mcu(struct himax_ts_data *ts, u32 address, u32 *dst)
{
int error;
error = himax_bus_read(ts, address, dst, sizeof(dst));
if (error)
return error;
return 0;
}
static void himax_reset(struct himax_ts_data *ts) static void himax_reset(struct himax_ts_data *ts)
{ {
gpiod_set_value_cansleep(ts->gpiod_rst, 1); gpiod_set_value_cansleep(ts->gpiod_rst, 1);
...@@ -160,7 +149,8 @@ static int himax_read_product_id(struct himax_ts_data *ts, u32 *product_id) ...@@ -160,7 +149,8 @@ static int himax_read_product_id(struct himax_ts_data *ts, u32 *product_id)
{ {
int error; int error;
error = himax_read_mcu(ts, HIMAX_REG_ADDR_ICID, product_id); error = himax_bus_read(ts, HIMAX_REG_ADDR_ICID, product_id,
sizeof(*product_id));
if (error) if (error)
return error; return error;
......
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