platform/x86: asus-wmi: Adjust tablet/lidflip handling to use enum
authorLuke D. Jones <luke@ljones.dev>
Sat, 13 Aug 2022 09:27:52 +0000 (21:27 +1200)
committerHans de Goede <hdegoede@redhat.com>
Thu, 25 Aug 2022 14:23:53 +0000 (16:23 +0200)
Due to multiple types of tablet/lidflip, the existing code for
handling these events is refactored to use an enum for each type.

Signed-off-by: Luke D. Jones <luke@ljones.dev>
Link: https://lore.kernel.org/r/20220813092753.6635-1-luke@ljones.dev
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
drivers/platform/x86/asus-nb-wmi.c
drivers/platform/x86/asus-wmi.c
drivers/platform/x86/asus-wmi.h

index 478dd30..4672a2b 100644 (file)
@@ -115,12 +115,12 @@ static struct quirk_entry quirk_asus_forceals = {
 };
 
 static struct quirk_entry quirk_asus_use_kbd_dock_devid = {
-       .use_kbd_dock_devid = true,
+       .tablet_switch_mode = asus_wmi_kbd_dock_devid,
 };
 
 static struct quirk_entry quirk_asus_use_lid_flip_devid = {
        .wmi_backlight_set_devstate = true,
-       .use_lid_flip_devid = true,
+       .tablet_switch_mode = asus_wmi_lid_flip_devid,
 };
 
 static int dmi_matched(const struct dmi_system_id *dmi)
@@ -492,16 +492,13 @@ static void asus_nb_wmi_quirks(struct asus_wmi_driver *driver)
 
        switch (tablet_mode_sw) {
        case 0:
-               quirks->use_kbd_dock_devid = false;
-               quirks->use_lid_flip_devid = false;
+               quirks->tablet_switch_mode = asus_wmi_no_tablet_switch;
                break;
        case 1:
-               quirks->use_kbd_dock_devid = true;
-               quirks->use_lid_flip_devid = false;
+               quirks->tablet_switch_mode = asus_wmi_kbd_dock_devid;
                break;
        case 2:
-               quirks->use_kbd_dock_devid = false;
-               quirks->use_lid_flip_devid = true;
+               quirks->tablet_switch_mode = asus_wmi_lid_flip_devid;
                break;
        }
 
index 46d0dd9..fe2d072 100644 (file)
@@ -486,8 +486,11 @@ static bool asus_wmi_dev_is_present(struct asus_wmi *asus, u32 dev_id)
 
 static int asus_wmi_input_init(struct asus_wmi *asus)
 {
+       struct device *dev;
        int err, result;
 
+       dev = &asus->platform_device->dev;
+
        asus->inputdev = input_allocate_device();
        if (!asus->inputdev)
                return -ENOMEM;
@@ -495,35 +498,38 @@ static int asus_wmi_input_init(struct asus_wmi *asus)
        asus->inputdev->name = asus->driver->input_name;
        asus->inputdev->phys = asus->driver->input_phys;
        asus->inputdev->id.bustype = BUS_HOST;
-       asus->inputdev->dev.parent = &asus->platform_device->dev;
+       asus->inputdev->dev.parent = dev;
        set_bit(EV_REP, asus->inputdev->evbit);
 
        err = sparse_keymap_setup(asus->inputdev, asus->driver->keymap, NULL);
        if (err)
                goto err_free_dev;
 
-       if (asus->driver->quirks->use_kbd_dock_devid) {
+       switch (asus->driver->quirks->tablet_switch_mode) {
+       case asus_wmi_no_tablet_switch:
+               break;
+       case asus_wmi_kbd_dock_devid:
                result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_KBD_DOCK);
                if (result >= 0) {
                        input_set_capability(asus->inputdev, EV_SW, SW_TABLET_MODE);
                        input_report_switch(asus->inputdev, SW_TABLET_MODE, !result);
                } else if (result != -ENODEV) {
-                       pr_err("Error checking for keyboard-dock: %d\n", result);
+                       dev_err(dev, "Error checking for keyboard-dock: %d\n", result);
                }
-       }
-
-       if (asus->driver->quirks->use_lid_flip_devid) {
+               break;
+       case asus_wmi_lid_flip_devid:
                result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_LID_FLIP);
                if (result < 0)
-                       asus->driver->quirks->use_lid_flip_devid = 0;
+                       asus->driver->quirks->tablet_switch_mode = asus_wmi_no_tablet_switch;
                if (result >= 0) {
                        input_set_capability(asus->inputdev, EV_SW, SW_TABLET_MODE);
                        input_report_switch(asus->inputdev, SW_TABLET_MODE, result);
                } else if (result == -ENODEV) {
-                       pr_err("This device has lid_flip quirk but got ENODEV checking it. This is a bug.");
+                       dev_err(dev, "This device has lid_flip quirk but got ENODEV checking it. This is a bug.");
                } else {
-                       pr_err("Error checking for lid-flip: %d\n", result);
+                       dev_err(dev, "Error checking for lid-flip: %d\n", result);
                }
+               break;
        }
 
        err = input_register_device(asus->inputdev);
@@ -549,8 +555,9 @@ static void asus_wmi_input_exit(struct asus_wmi *asus)
 
 static void lid_flip_tablet_mode_get_state(struct asus_wmi *asus)
 {
-       int result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_LID_FLIP);
+       int result;
 
+       result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_LID_FLIP);
        if (result >= 0) {
                input_report_switch(asus->inputdev, SW_TABLET_MODE, result);
                input_sync(asus->inputdev);
@@ -3044,7 +3051,8 @@ static void asus_wmi_handle_event_code(int code, struct asus_wmi *asus)
                return;
        }
 
-       if (asus->driver->quirks->use_kbd_dock_devid && code == NOTIFY_KBD_DOCK_CHANGE) {
+       if (asus->driver->quirks->tablet_switch_mode == asus_wmi_kbd_dock_devid &&
+           code == NOTIFY_KBD_DOCK_CHANGE) {
                result = asus_wmi_get_devstate_simple(asus,
                                                      ASUS_WMI_DEVID_KBD_DOCK);
                if (result >= 0) {
@@ -3055,7 +3063,8 @@ static void asus_wmi_handle_event_code(int code, struct asus_wmi *asus)
                return;
        }
 
-       if (asus->driver->quirks->use_lid_flip_devid && code == NOTIFY_LID_FLIP) {
+       if (asus->driver->quirks->tablet_switch_mode == asus_wmi_lid_flip_devid &&
+           code == NOTIFY_LID_FLIP) {
                lid_flip_tablet_mode_get_state(asus);
                return;
        }
@@ -3685,8 +3694,14 @@ static int asus_hotk_resume(struct device *device)
        if (asus_wmi_has_fnlock_key(asus))
                asus_wmi_fnlock_update(asus);
 
-       if (asus->driver->quirks->use_lid_flip_devid)
+       switch (asus->driver->quirks->tablet_switch_mode) {
+       case asus_wmi_no_tablet_switch:
+       case asus_wmi_kbd_dock_devid:
+               break;
+       case asus_wmi_lid_flip_devid:
                lid_flip_tablet_mode_get_state(asus);
+               break;
+       }
 
        return 0;
 }
@@ -3727,8 +3742,14 @@ static int asus_hotk_restore(struct device *device)
        if (asus_wmi_has_fnlock_key(asus))
                asus_wmi_fnlock_update(asus);
 
-       if (asus->driver->quirks->use_lid_flip_devid)
+       switch (asus->driver->quirks->tablet_switch_mode) {
+       case asus_wmi_no_tablet_switch:
+       case asus_wmi_kbd_dock_devid:
+               break;
+       case asus_wmi_lid_flip_devid:
                lid_flip_tablet_mode_get_state(asus);
+               break;
+       }
 
        return 0;
 }
index b302415..413920b 100644 (file)
@@ -25,6 +25,12 @@ struct module;
 struct key_entry;
 struct asus_wmi;
 
+enum asus_wmi_tablet_switch_mode {
+       asus_wmi_no_tablet_switch,
+       asus_wmi_kbd_dock_devid,
+       asus_wmi_lid_flip_devid,
+};
+
 struct quirk_entry {
        bool hotplug_wireless;
        bool scalar_panel_brightness;
@@ -33,8 +39,7 @@ struct quirk_entry {
        bool wmi_backlight_native;
        bool wmi_backlight_set_devstate;
        bool wmi_force_als_set;
-       bool use_kbd_dock_devid;
-       bool use_lid_flip_devid;
+       enum asus_wmi_tablet_switch_mode tablet_switch_mode;
        int wapf;
        /*
         * For machines with AMD graphic chips, it will send out WMI event