Commit e00811b4 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 9f03b2c7 0fd5f221
...@@ -213,7 +213,7 @@ static int tm2_touchkey_probe(struct i2c_client *client, ...@@ -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, ...@@ -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) ...@@ -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[] = { ...@@ -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, ...@@ -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[] = { ...@@ -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 { ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
} }
......
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