Input updates for v6.11-rc4
- 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. -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQST2eWILY88ieB2DOtAj56VGEWXnAUCZsjxKQAKCRBAj56VGEWX nKE9APwPOZl4TldhPLG37LCvlVmgN0cSSWY+PEEqIaxmFtezjQEAr2/qs1XknZVr LkuhmHxng2ZI9X4HUL+h52Lha7y4UAc= =3Pcb -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
7eb61cc674
@ -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)
|
|||||||
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,
|
|||||||
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[] = {
|
|||||||
"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)
|
|||||||
#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 = {
|
|||||||
},
|
},
|
||||||
.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 = {
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
"",
|
"",
|
||||||
#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);
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
* 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)
|
|||||||
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 = {
|
|||||||
.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[] = {
|
|||||||
{ .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[] = {
|
|||||||
{ .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,
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user