Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
Pull input subsystem fixes from Dmitry Torokhov: - a couple of regression fixes in synaptics and axp20x-pek drivers - try to ease transition from PS/2 to RMI for Synaptics touchpad users by ensuring we do not try to activate RMI mode when RMI SMBus support is not enabled, and nag users a bit to enable it - plus a couple of other changes that seemed worthwhile for this release * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: Input: axp20x-pek - switch to acpi_dev_present and check for ACPI0011 too Input: axp20x-pek - only check for "INTCFD9" ACPI device on Cherry Trail Input: tm2-touchkey - use LEN_ON as boolean value instead of LED_FULL Input: synaptics - tell users to report when they should be using rmi-smbus Input: synaptics - warn the users when there is a better mode Input: synaptics - keep PS/2 around when RMI4_SMB is not enabled Input: synaptics - clear device info before filling in Input: silead - disable interrupt during suspend
This commit is contained in:
commit
e00811b4ca
4 changed files with 69 additions and 17 deletions
|
@ -213,7 +213,7 @@ static int tm2_touchkey_probe(struct i2c_client *client,
|
|||
/* led device */
|
||||
touchkey->led_dev.name = TM2_TOUCHKEY_DEV_NAME;
|
||||
touchkey->led_dev.brightness = LED_FULL;
|
||||
touchkey->led_dev.max_brightness = LED_FULL;
|
||||
touchkey->led_dev.max_brightness = LED_ON;
|
||||
touchkey->led_dev.brightness_set = tm2_touchkey_led_brightness_set;
|
||||
|
||||
error = devm_led_classdev_register(&client->dev, &touchkey->led_dev);
|
||||
|
|
|
@ -256,6 +256,42 @@ static int axp20x_pek_probe_input_device(struct axp20x_pek *axp20x_pek,
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
static bool axp20x_pek_should_register_input(struct axp20x_pek *axp20x_pek,
|
||||
struct platform_device *pdev)
|
||||
{
|
||||
unsigned long long hrv = 0;
|
||||
acpi_status status;
|
||||
|
||||
if (IS_ENABLED(CONFIG_INPUT_SOC_BUTTON_ARRAY) &&
|
||||
axp20x_pek->axp20x->variant == AXP288_ID) {
|
||||
status = acpi_evaluate_integer(ACPI_HANDLE(pdev->dev.parent),
|
||||
"_HRV", NULL, &hrv);
|
||||
if (ACPI_FAILURE(status))
|
||||
dev_err(&pdev->dev, "Failed to get PMIC hardware revision\n");
|
||||
|
||||
/*
|
||||
* On Cherry Trail platforms (hrv == 3), do not register the
|
||||
* input device if there is an "INTCFD9" or "ACPI0011" gpio
|
||||
* button ACPI device, as that handles the power button too,
|
||||
* and otherwise we end up reporting all presses twice.
|
||||
*/
|
||||
if (hrv == 3 && (acpi_dev_present("INTCFD9", NULL, -1) ||
|
||||
acpi_dev_present("ACPI0011", NULL, -1)))
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
static bool axp20x_pek_should_register_input(struct axp20x_pek *axp20x_pek,
|
||||
struct platform_device *pdev)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int axp20x_pek_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct axp20x_pek *axp20x_pek;
|
||||
|
@ -268,13 +304,7 @@ static int axp20x_pek_probe(struct platform_device *pdev)
|
|||
|
||||
axp20x_pek->axp20x = dev_get_drvdata(pdev->dev.parent);
|
||||
|
||||
/*
|
||||
* Do not register the input device if there is an "INTCFD9"
|
||||
* gpio button ACPI device, that handles the power button too,
|
||||
* and otherwise we end up reporting all presses twice.
|
||||
*/
|
||||
if (!acpi_dev_found("INTCFD9") ||
|
||||
!IS_ENABLED(CONFIG_INPUT_SOC_BUTTON_ARRAY)) {
|
||||
if (axp20x_pek_should_register_input(axp20x_pek, pdev)) {
|
||||
error = axp20x_pek_probe_input_device(axp20x_pek, pdev);
|
||||
if (error)
|
||||
return error;
|
||||
|
|
|
@ -176,6 +176,12 @@ static const char * const smbus_pnp_ids[] = {
|
|||
NULL
|
||||
};
|
||||
|
||||
static const char * const forcepad_pnp_ids[] = {
|
||||
"SYN300D",
|
||||
"SYN3014",
|
||||
NULL
|
||||
};
|
||||
|
||||
/*
|
||||
* Send a command to the synpatics touchpad by special commands
|
||||
*/
|
||||
|
@ -397,6 +403,8 @@ static int synaptics_query_hardware(struct psmouse *psmouse,
|
|||
{
|
||||
int error;
|
||||
|
||||
memset(info, 0, sizeof(*info));
|
||||
|
||||
error = synaptics_identify(psmouse, info);
|
||||
if (error)
|
||||
return error;
|
||||
|
@ -480,13 +488,6 @@ static const struct min_max_quirk min_max_pnpid_table[] = {
|
|||
{ }
|
||||
};
|
||||
|
||||
/* This list has been kindly provided by Synaptics. */
|
||||
static const char * const forcepad_pnp_ids[] = {
|
||||
"SYN300D",
|
||||
"SYN3014",
|
||||
NULL
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
* Synaptics communications functions
|
||||
****************************************************************************/
|
||||
|
@ -1687,7 +1688,8 @@ enum {
|
|||
SYNAPTICS_INTERTOUCH_ON,
|
||||
};
|
||||
|
||||
static int synaptics_intertouch = SYNAPTICS_INTERTOUCH_NOT_SET;
|
||||
static int synaptics_intertouch = IS_ENABLED(CONFIG_RMI4_SMB) ?
|
||||
SYNAPTICS_INTERTOUCH_NOT_SET : SYNAPTICS_INTERTOUCH_OFF;
|
||||
module_param_named(synaptics_intertouch, synaptics_intertouch, int, 0644);
|
||||
MODULE_PARM_DESC(synaptics_intertouch, "Use a secondary bus for the Synaptics device.");
|
||||
|
||||
|
@ -1737,8 +1739,16 @@ static int synaptics_setup_intertouch(struct psmouse *psmouse,
|
|||
|
||||
if (synaptics_intertouch == SYNAPTICS_INTERTOUCH_NOT_SET) {
|
||||
if (!psmouse_matches_pnp_id(psmouse, topbuttonpad_pnp_ids) &&
|
||||
!psmouse_matches_pnp_id(psmouse, smbus_pnp_ids))
|
||||
!psmouse_matches_pnp_id(psmouse, smbus_pnp_ids)) {
|
||||
|
||||
if (!psmouse_matches_pnp_id(psmouse, forcepad_pnp_ids))
|
||||
psmouse_info(psmouse,
|
||||
"Your touchpad (%s) says it can support a different bus. "
|
||||
"If i2c-hid and hid-rmi are not used, you might want to try setting psmouse.synaptics_intertouch to 1 and report this to linux-input@vger.kernel.org.\n",
|
||||
psmouse->ps2dev.serio->firmware_id);
|
||||
|
||||
return -ENXIO;
|
||||
}
|
||||
}
|
||||
|
||||
psmouse_info(psmouse, "Trying to set up SMBus access\n");
|
||||
|
@ -1810,6 +1820,15 @@ int synaptics_init(struct psmouse *psmouse)
|
|||
}
|
||||
|
||||
if (SYN_CAP_INTERTOUCH(info.ext_cap_0c)) {
|
||||
if ((!IS_ENABLED(CONFIG_RMI4_SMB) ||
|
||||
!IS_ENABLED(CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS)) &&
|
||||
/* Forcepads need F21, which is not ready */
|
||||
!psmouse_matches_pnp_id(psmouse, forcepad_pnp_ids)) {
|
||||
psmouse_warn(psmouse,
|
||||
"The touchpad can support a better bus than the too old PS/2 protocol. "
|
||||
"Make sure MOUSE_PS2_SYNAPTICS_SMBUS and RMI4_SMB are enabled to get a better touchpad experience.\n");
|
||||
}
|
||||
|
||||
error = synaptics_setup_intertouch(psmouse, &info, true);
|
||||
if (!error)
|
||||
return PSMOUSE_SYNAPTICS_SMBUS;
|
||||
|
|
|
@ -526,6 +526,7 @@ static int __maybe_unused silead_ts_suspend(struct device *dev)
|
|||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
|
||||
disable_irq(client->irq);
|
||||
silead_ts_set_power(client, SILEAD_POWER_OFF);
|
||||
return 0;
|
||||
}
|
||||
|
@ -551,6 +552,8 @@ static int __maybe_unused silead_ts_resume(struct device *dev)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
enable_irq(client->irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue