2016-06-01 2:21 GMT+03:00 João Paulo Rechi Vita <jprvita@xxxxxxxxx>: > Check if disabling the i8042 AUX port has any effect on > VPCCMD_R_TOUCHPAD, and use that information to decide whether or not > ideapad_sync_touchpad_state() should do something. > > Signed-off-by: João Paulo Rechi Vita <jprvita@xxxxxxxxxxxx> > --- > drivers/platform/x86/ideapad-laptop.c | 17 +++++++++++++++++ > 1 file changed, 17 insertions(+) > > diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c > index 06a837a..08dd487 100644 > --- a/drivers/platform/x86/ideapad-laptop.c > +++ b/drivers/platform/x86/ideapad-laptop.c > @@ -93,6 +93,7 @@ struct ideapad_private { > struct dentry *debug; > unsigned long cfg; > bool has_hw_rfkill_switch; > + bool has_hw_tp_ctrl; > }; > > static bool no_bt_rfkill; > @@ -773,6 +774,9 @@ static void ideapad_sync_touchpad_state(struct ideapad_private *priv) > { > unsigned long value; > > + if (!priv->has_hw_tp_ctrl) > + return; > + > /* Without reading from EC touchpad LED doesn't switch state */ > if (!read_ec_data(priv->adev->handle, VPCCMD_R_TOUCHPAD, &value)) { > /* Some IdeaPads don't really turn off touchpad - they only > @@ -930,6 +934,18 @@ static const struct dmi_system_id no_hw_rfkill_list[] = { > {} > }; > > +static bool ideapad_has_touchpad_ctrl(struct ideapad_private *priv) > +{ > + unsigned char param; > + unsigned long value_disabled, value_enabled; > + > + i8042_command(¶m, I8042_CMD_AUX_DISABLE); > + read_ec_data(priv->adev->handle, VPCCMD_R_TOUCHPAD, &value_disabled); > + i8042_command(¶m, I8042_CMD_AUX_ENABLE); > + read_ec_data(priv->adev->handle, VPCCMD_R_TOUCHPAD, &value_enabled); This should be tested on a device that has touchpad control, but personally I don't think it will work in that way. As VPCCMD_R_TOUCHPAD returns different values independently of the actual touchpad state, but synchronously with the LED state changes, I think disabling the touchpad by I8042_CMD_AUX_DISABLE will not affect the value read with VPCCMD_R_TOUCHPAD. So if this code will for some reason work, we should test it in advance, merging it without prior testing has a very big chances to break touchpad switching. > + return (value_disabled != value_enabled); > +} > + > static int ideapad_acpi_add(struct platform_device *pdev) > { > int ret, i; > @@ -978,6 +994,7 @@ static int ideapad_acpi_add(struct platform_device *pdev) > ideapad_register_rfkill(priv, i); > > ideapad_sync_rfk_state(priv); > + priv->has_hw_tp_ctrl = ideapad_has_touchpad_ctrl(priv); > ideapad_sync_touchpad_state(priv); > > if (acpi_video_get_backlight_type() == acpi_backlight_vendor) { > -- > 2.5.0 > -- To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html