OSDN Git Service

platform/x86: hp-wmi: Fix detection for dock and tablet mode
[sagit-ice-cold/kernel_xiaomi_msm8998.git] / drivers / platform / x86 / hp-wmi.c
index fb4dd7b..056a671 100644 (file)
@@ -573,10 +573,12 @@ static void hp_wmi_notify(u32 value, void *context)
 
        switch (event_id) {
        case HPWMI_DOCK_EVENT:
-               input_report_switch(hp_wmi_input_dev, SW_DOCK,
-                                   hp_wmi_dock_state());
-               input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE,
-                                   hp_wmi_tablet_state());
+               if (test_bit(SW_DOCK, hp_wmi_input_dev->swbit))
+                       input_report_switch(hp_wmi_input_dev, SW_DOCK,
+                                           hp_wmi_dock_state());
+               if (test_bit(SW_TABLET_MODE, hp_wmi_input_dev->swbit))
+                       input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE,
+                                           hp_wmi_tablet_state());
                input_sync(hp_wmi_input_dev);
                break;
        case HPWMI_PARK_HDD:
@@ -649,6 +651,7 @@ static int __init hp_wmi_input_setup(void)
 {
        acpi_status status;
        int err;
+       int val;
 
        hp_wmi_input_dev = input_allocate_device();
        if (!hp_wmi_input_dev)
@@ -659,17 +662,26 @@ static int __init hp_wmi_input_setup(void)
        hp_wmi_input_dev->id.bustype = BUS_HOST;
 
        __set_bit(EV_SW, hp_wmi_input_dev->evbit);
-       __set_bit(SW_DOCK, hp_wmi_input_dev->swbit);
-       __set_bit(SW_TABLET_MODE, hp_wmi_input_dev->swbit);
+
+       /* Dock */
+       val = hp_wmi_dock_state();
+       if (!(val < 0)) {
+               __set_bit(SW_DOCK, hp_wmi_input_dev->swbit);
+               input_report_switch(hp_wmi_input_dev, SW_DOCK, val);
+       }
+
+       /* Tablet mode */
+       val = hp_wmi_tablet_state();
+       if (!(val < 0)) {
+               __set_bit(SW_TABLET_MODE, hp_wmi_input_dev->swbit);
+               input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE, val);
+       }
 
        err = sparse_keymap_setup(hp_wmi_input_dev, hp_wmi_keymap, NULL);
        if (err)
                goto err_free_dev;
 
        /* Set initial hardware state */
-       input_report_switch(hp_wmi_input_dev, SW_DOCK, hp_wmi_dock_state());
-       input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE,
-                           hp_wmi_tablet_state());
        input_sync(hp_wmi_input_dev);
 
        if (!hp_wmi_bios_2009_later() && hp_wmi_bios_2008_later())
@@ -723,6 +735,11 @@ static int __init hp_wmi_rfkill_setup(struct platform_device *device)
        if (err)
                return err;
 
+       err = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 1, &wireless,
+                                  sizeof(wireless), 0);
+       if (err)
+               return err;
+
        if (wireless & 0x1) {
                wifi_rfkill = rfkill_alloc("hp-wifi", &device->dev,
                                           RFKILL_TYPE_WLAN,
@@ -910,7 +927,7 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)
        gps_rfkill = NULL;
        rfkill2_count = 0;
 
-       if (hp_wmi_bios_2009_later() || hp_wmi_rfkill_setup(device))
+       if (hp_wmi_rfkill_setup(device))
                hp_wmi_rfkill2_setup(device);
 
        err = device_create_file(&device->dev, &dev_attr_display);
@@ -977,10 +994,12 @@ static int hp_wmi_resume_handler(struct device *device)
         * changed.
         */
        if (hp_wmi_input_dev) {
-               input_report_switch(hp_wmi_input_dev, SW_DOCK,
-                                   hp_wmi_dock_state());
-               input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE,
-                                   hp_wmi_tablet_state());
+               if (test_bit(SW_DOCK, hp_wmi_input_dev->swbit))
+                       input_report_switch(hp_wmi_input_dev, SW_DOCK,
+                                           hp_wmi_dock_state());
+               if (test_bit(SW_TABLET_MODE, hp_wmi_input_dev->swbit))
+                       input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE,
+                                           hp_wmi_tablet_state());
                input_sync(hp_wmi_input_dev);
        }