Skip to content

Commit 298747b

Browse files
Carlo Caionedvhart
authored andcommitted
platform/x86: hp-wmi: Fix detection for dock and tablet mode
The current driver code is not checking for the error values returned by 'hp_wmi_dock_state()' and 'hp_wmi_tablet_state()' before passing the returned values down to 'input_report_switch()'. This error code is being translated to '1' in the input subsystem, reporting the wrong status. The biggest problem caused by this issue is that several laptops are wrongly reported by the driver as docked, preventing them to be put to sleep using the LID (and in most cases they are not even dockable). With this patch we create the report switches only if we are able to read the dock and tablet mode status correctly from ACPI. Signed-off-by: Carlo Caione <[email protected]> Signed-off-by: Darren Hart (VMware) <[email protected]>
1 parent c7dfc2f commit 298747b

File tree

1 file changed

+27
-13
lines changed

1 file changed

+27
-13
lines changed

drivers/platform/x86/hp-wmi.c

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -572,10 +572,12 @@ static void hp_wmi_notify(u32 value, void *context)
572572

573573
switch (event_id) {
574574
case HPWMI_DOCK_EVENT:
575-
input_report_switch(hp_wmi_input_dev, SW_DOCK,
576-
hp_wmi_dock_state());
577-
input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE,
578-
hp_wmi_tablet_state());
575+
if (test_bit(SW_DOCK, hp_wmi_input_dev->swbit))
576+
input_report_switch(hp_wmi_input_dev, SW_DOCK,
577+
hp_wmi_dock_state());
578+
if (test_bit(SW_TABLET_MODE, hp_wmi_input_dev->swbit))
579+
input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE,
580+
hp_wmi_tablet_state());
579581
input_sync(hp_wmi_input_dev);
580582
break;
581583
case HPWMI_PARK_HDD:
@@ -644,6 +646,7 @@ static int __init hp_wmi_input_setup(void)
644646
{
645647
acpi_status status;
646648
int err;
649+
int val;
647650

648651
hp_wmi_input_dev = input_allocate_device();
649652
if (!hp_wmi_input_dev)
@@ -654,17 +657,26 @@ static int __init hp_wmi_input_setup(void)
654657
hp_wmi_input_dev->id.bustype = BUS_HOST;
655658

656659
__set_bit(EV_SW, hp_wmi_input_dev->evbit);
657-
__set_bit(SW_DOCK, hp_wmi_input_dev->swbit);
658-
__set_bit(SW_TABLET_MODE, hp_wmi_input_dev->swbit);
660+
661+
/* Dock */
662+
val = hp_wmi_dock_state();
663+
if (!(val < 0)) {
664+
__set_bit(SW_DOCK, hp_wmi_input_dev->swbit);
665+
input_report_switch(hp_wmi_input_dev, SW_DOCK, val);
666+
}
667+
668+
/* Tablet mode */
669+
val = hp_wmi_tablet_state();
670+
if (!(val < 0)) {
671+
__set_bit(SW_TABLET_MODE, hp_wmi_input_dev->swbit);
672+
input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE, val);
673+
}
659674

660675
err = sparse_keymap_setup(hp_wmi_input_dev, hp_wmi_keymap, NULL);
661676
if (err)
662677
goto err_free_dev;
663678

664679
/* Set initial hardware state */
665-
input_report_switch(hp_wmi_input_dev, SW_DOCK, hp_wmi_dock_state());
666-
input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE,
667-
hp_wmi_tablet_state());
668680
input_sync(hp_wmi_input_dev);
669681

670682
if (!hp_wmi_bios_2009_later() && hp_wmi_bios_2008_later())
@@ -947,10 +959,12 @@ static int hp_wmi_resume_handler(struct device *device)
947959
* changed.
948960
*/
949961
if (hp_wmi_input_dev) {
950-
input_report_switch(hp_wmi_input_dev, SW_DOCK,
951-
hp_wmi_dock_state());
952-
input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE,
953-
hp_wmi_tablet_state());
962+
if (test_bit(SW_DOCK, hp_wmi_input_dev->swbit))
963+
input_report_switch(hp_wmi_input_dev, SW_DOCK,
964+
hp_wmi_dock_state());
965+
if (test_bit(SW_TABLET_MODE, hp_wmi_input_dev->swbit))
966+
input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE,
967+
hp_wmi_tablet_state());
954968
input_sync(hp_wmi_input_dev);
955969
}
956970

0 commit comments

Comments
 (0)