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
|
@ -213,7 +213,7 @@ static int tm2_touchkey_probe(struct i2c_client *client,
|
||||||
/* led device */
|
/* led device */
|
||||||
touchkey->led_dev.name = TM2_TOUCHKEY_DEV_NAME;
|
touchkey->led_dev.name = TM2_TOUCHKEY_DEV_NAME;
|
||||||
touchkey->led_dev.brightness = LED_FULL;
|
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;
|
touchkey->led_dev.brightness_set = tm2_touchkey_led_brightness_set;
|
||||||
|
|
||||||
error = devm_led_classdev_register(&client->dev, &touchkey->led_dev);
|
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;
|
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)
|
static int axp20x_pek_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct axp20x_pek *axp20x_pek;
|
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);
|
axp20x_pek->axp20x = dev_get_drvdata(pdev->dev.parent);
|
||||||
|
|
||||||
/*
|
if (axp20x_pek_should_register_input(axp20x_pek, pdev)) {
|
||||||
* 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)) {
|
|
||||||
error = axp20x_pek_probe_input_device(axp20x_pek, pdev);
|
error = axp20x_pek_probe_input_device(axp20x_pek, pdev);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
|
@ -176,6 +176,12 @@ static const char * const smbus_pnp_ids[] = {
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const char * const forcepad_pnp_ids[] = {
|
||||||
|
"SYN300D",
|
||||||
|
"SYN3014",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Send a command to the synpatics touchpad by special commands
|
* Send a command to the synpatics touchpad by special commands
|
||||||
*/
|
*/
|
||||||
|
@ -397,6 +403,8 @@ static int synaptics_query_hardware(struct psmouse *psmouse,
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
|
memset(info, 0, sizeof(*info));
|
||||||
|
|
||||||
error = synaptics_identify(psmouse, info);
|
error = synaptics_identify(psmouse, info);
|
||||||
if (error)
|
if (error)
|
||||||
return 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
|
* Synaptics communications functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
@ -1687,7 +1688,8 @@ enum {
|
||||||
SYNAPTICS_INTERTOUCH_ON,
|
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_param_named(synaptics_intertouch, synaptics_intertouch, int, 0644);
|
||||||
MODULE_PARM_DESC(synaptics_intertouch, "Use a secondary bus for the Synaptics device.");
|
MODULE_PARM_DESC(synaptics_intertouch, "Use a secondary bus for the Synaptics device.");
|
||||||
|
|
||||||
|
@ -1737,9 +1739,17 @@ static int synaptics_setup_intertouch(struct psmouse *psmouse,
|
||||||
|
|
||||||
if (synaptics_intertouch == SYNAPTICS_INTERTOUCH_NOT_SET) {
|
if (synaptics_intertouch == SYNAPTICS_INTERTOUCH_NOT_SET) {
|
||||||
if (!psmouse_matches_pnp_id(psmouse, topbuttonpad_pnp_ids) &&
|
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;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
psmouse_info(psmouse, "Trying to set up SMBus access\n");
|
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 (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);
|
error = synaptics_setup_intertouch(psmouse, &info, true);
|
||||||
if (!error)
|
if (!error)
|
||||||
return PSMOUSE_SYNAPTICS_SMBUS;
|
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);
|
struct i2c_client *client = to_i2c_client(dev);
|
||||||
|
|
||||||
|
disable_irq(client->irq);
|
||||||
silead_ts_set_power(client, SILEAD_POWER_OFF);
|
silead_ts_set_power(client, SILEAD_POWER_OFF);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -551,6 +552,8 @@ static int __maybe_unused silead_ts_resume(struct device *dev)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enable_irq(client->irq);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue