platform/x86: asus-wmi: Simplify tablet-mode-switch handling

Simplify tablet-mode-switch handling:
1. The code is the same for all variants, the only difference is the
   dev_id and notify event code. Store the dev_id + code in struct asus_wmi
   and unify the handling
2. Make the new unified asus_wmi_tablet_mode_get_state() check dev_id has
   been set and make it a no-op when not set. This allows calling it
   unconditionally at resume/restore time
3. Simplify the tablet_mode_sw module-param handling, this also allows
   selecting the new lid-flip-rog type through the module-param.

Cc: Luke D. Jones <luke@ljones.dev>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20220824151145.1448010-2-hdegoede@redhat.com
This commit is contained in:
Hans de Goede 2022-08-24 17:11:45 +02:00
Родитель c98dc61ee0
Коммит 1ea0d3b467
2 изменённых файлов: 16 добавлений и 73 удалений

Просмотреть файл

@ -504,17 +504,8 @@ static void asus_nb_wmi_quirks(struct asus_wmi_driver *driver)
else else
wapf = quirks->wapf; wapf = quirks->wapf;
switch (tablet_mode_sw) { if (tablet_mode_sw != -1)
case 0: quirks->tablet_switch_mode = tablet_mode_sw;
quirks->tablet_switch_mode = asus_wmi_no_tablet_switch;
break;
case 1:
quirks->tablet_switch_mode = asus_wmi_kbd_dock_devid;
break;
case 2:
quirks->tablet_switch_mode = asus_wmi_lid_flip_devid;
break;
}
if (quirks->i8042_filter) { if (quirks->i8042_filter) {
ret = i8042_install_filter(quirks->i8042_filter); ret = i8042_install_filter(quirks->i8042_filter);

Просмотреть файл

@ -222,6 +222,9 @@ struct asus_wmi {
struct asus_rfkill gps; struct asus_rfkill gps;
struct asus_rfkill uwb; struct asus_rfkill uwb;
int tablet_switch_event_code;
u32 tablet_switch_dev_id;
enum fan_type fan_type; enum fan_type fan_type;
int fan_pwm_mode; int fan_pwm_mode;
int agfn_pwm; int agfn_pwm;
@ -490,11 +493,11 @@ static void asus_wmi_tablet_sw_init(struct asus_wmi *asus, u32 dev_id, int event
int result; int result;
result = asus_wmi_get_devstate_simple(asus, dev_id); result = asus_wmi_get_devstate_simple(asus, dev_id);
if (result < 0)
asus->driver->quirks->tablet_switch_mode = asus_wmi_no_tablet_switch;
if (result >= 0) { if (result >= 0) {
input_set_capability(asus->inputdev, EV_SW, SW_TABLET_MODE); input_set_capability(asus->inputdev, EV_SW, SW_TABLET_MODE);
input_report_switch(asus->inputdev, SW_TABLET_MODE, result); input_report_switch(asus->inputdev, SW_TABLET_MODE, result);
asus->tablet_switch_dev_id = dev_id;
asus->tablet_switch_event_code = event_code;
} else if (result == -ENODEV) { } else if (result == -ENODEV) {
dev_err(dev, "This device has tablet-mode-switch quirk but got ENODEV checking it. This is a bug."); dev_err(dev, "This device has tablet-mode-switch quirk but got ENODEV checking it. This is a bug.");
} else { } else {
@ -556,22 +559,14 @@ static void asus_wmi_input_exit(struct asus_wmi *asus)
/* Tablet mode ****************************************************************/ /* Tablet mode ****************************************************************/
static void lid_flip_tablet_mode_get_state(struct asus_wmi *asus) static void asus_wmi_tablet_mode_get_state(struct asus_wmi *asus)
{ {
int result; int result;
result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_LID_FLIP); if (!asus->tablet_switch_dev_id)
if (result >= 0) { return;
input_report_switch(asus->inputdev, SW_TABLET_MODE, result);
input_sync(asus->inputdev);
}
}
static void lid_flip_rog_tablet_mode_get_state(struct asus_wmi *asus) result = asus_wmi_get_devstate_simple(asus, asus->tablet_switch_dev_id);
{
int result;
result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_LID_FLIP_ROG);
if (result >= 0) { if (result >= 0) {
input_report_switch(asus->inputdev, SW_TABLET_MODE, result); input_report_switch(asus->inputdev, SW_TABLET_MODE, result);
input_sync(asus->inputdev); input_sync(asus->inputdev);
@ -3020,9 +3015,7 @@ static void asus_wmi_handle_event_code(int code, struct asus_wmi *asus)
{ {
unsigned int key_value = 1; unsigned int key_value = 1;
bool autorelease = 1; bool autorelease = 1;
int result, orig_code; int orig_code = code;
orig_code = code;
if (asus->driver->key_filter) { if (asus->driver->key_filter) {
asus->driver->key_filter(asus->driver, &code, &key_value, asus->driver->key_filter(asus->driver, &code, &key_value,
@ -3065,27 +3058,8 @@ static void asus_wmi_handle_event_code(int code, struct asus_wmi *asus)
return; return;
} }
if (asus->driver->quirks->tablet_switch_mode == asus_wmi_kbd_dock_devid && if (code == asus->tablet_switch_event_code) {
code == NOTIFY_KBD_DOCK_CHANGE) { asus_wmi_tablet_mode_get_state(asus);
result = asus_wmi_get_devstate_simple(asus,
ASUS_WMI_DEVID_KBD_DOCK);
if (result >= 0) {
input_report_switch(asus->inputdev, SW_TABLET_MODE,
!result);
input_sync(asus->inputdev);
}
return;
}
if (asus->driver->quirks->tablet_switch_mode == asus_wmi_lid_flip_devid &&
code == NOTIFY_LID_FLIP) {
lid_flip_tablet_mode_get_state(asus);
return;
}
if (asus->driver->quirks->tablet_switch_mode == asus_wmi_lid_flip_rog_devid &&
code == NOTIFY_LID_FLIP_ROG) {
lid_flip_rog_tablet_mode_get_state(asus);
return; return;
} }
@ -3714,18 +3688,7 @@ static int asus_hotk_resume(struct device *device)
if (asus_wmi_has_fnlock_key(asus)) if (asus_wmi_has_fnlock_key(asus))
asus_wmi_fnlock_update(asus); asus_wmi_fnlock_update(asus);
switch (asus->driver->quirks->tablet_switch_mode) { asus_wmi_tablet_mode_get_state(asus);
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;
case asus_wmi_lid_flip_rog_devid:
lid_flip_rog_tablet_mode_get_state(asus);
break;
}
return 0; return 0;
} }
@ -3765,18 +3728,7 @@ static int asus_hotk_restore(struct device *device)
if (asus_wmi_has_fnlock_key(asus)) if (asus_wmi_has_fnlock_key(asus))
asus_wmi_fnlock_update(asus); asus_wmi_fnlock_update(asus);
switch (asus->driver->quirks->tablet_switch_mode) { asus_wmi_tablet_mode_get_state(asus);
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;
case asus_wmi_lid_flip_rog_devid:
lid_flip_rog_tablet_mode_get_state(asus);
break;
}
return 0; return 0;
} }