Commit c98dc61e authored by Hans de Goede's avatar Hans de Goede
Browse files

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



The 3 different tablet-mode-switch initialization paths repeat a lot
of the same code. Add a helper function for this.

This also makes the error-handling for the kbd_dock_devid case consistent
with the other 2 cases.

Cc: Luke D. Jones <luke@ljones.dev>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20220824151145.1448010-1-hdegoede@redhat.com
parent e397c3c4
Loading
Loading
Loading
Loading
+22 −33
Original line number Original line Diff line number Diff line
@@ -484,13 +484,28 @@ static bool asus_wmi_dev_is_present(struct asus_wmi *asus, u32 dev_id)
}
}


/* Input **********************************************************************/
/* Input **********************************************************************/
static void asus_wmi_tablet_sw_init(struct asus_wmi *asus, u32 dev_id, int event_code)
{
	struct device *dev = &asus->platform_device->dev;
	int result;

	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) {
		input_set_capability(asus->inputdev, EV_SW, SW_TABLET_MODE);
		input_report_switch(asus->inputdev, SW_TABLET_MODE, result);
	} else if (result == -ENODEV) {
		dev_err(dev, "This device has tablet-mode-switch quirk but got ENODEV checking it. This is a bug.");
	} else {
		dev_err(dev, "Error checking for tablet-mode-switch: %d\n", result);
	}
}


static int asus_wmi_input_init(struct asus_wmi *asus)
static int asus_wmi_input_init(struct asus_wmi *asus)
{
{
	struct device *dev;
	struct device *dev = &asus->platform_device->dev;
	int err, result;
	int err;

	dev = &asus->platform_device->dev;


	asus->inputdev = input_allocate_device();
	asus->inputdev = input_allocate_device();
	if (!asus->inputdev)
	if (!asus->inputdev)
@@ -510,39 +525,13 @@ static int asus_wmi_input_init(struct asus_wmi *asus)
	case asus_wmi_no_tablet_switch:
	case asus_wmi_no_tablet_switch:
		break;
		break;
	case asus_wmi_kbd_dock_devid:
	case asus_wmi_kbd_dock_devid:
		result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_KBD_DOCK);
		asus_wmi_tablet_sw_init(asus, ASUS_WMI_DEVID_KBD_DOCK, NOTIFY_KBD_DOCK_CHANGE);
		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) {
			dev_err(dev, "Error checking for keyboard-dock: %d\n", result);
		}
		break;
		break;
	case asus_wmi_lid_flip_devid:
	case asus_wmi_lid_flip_devid:
		result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_LID_FLIP);
		asus_wmi_tablet_sw_init(asus, ASUS_WMI_DEVID_LID_FLIP, NOTIFY_LID_FLIP);
		if (result < 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) {
			dev_err(dev, "This device has lid_flip quirk but got ENODEV checking it. This is a bug.");
		} else {
			dev_err(dev, "Error checking for lid-flip: %d\n", result);
		}
		break;
		break;
	case asus_wmi_lid_flip_rog_devid:
	case asus_wmi_lid_flip_rog_devid:
		result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_LID_FLIP_ROG);
		asus_wmi_tablet_sw_init(asus, ASUS_WMI_DEVID_LID_FLIP_ROG, NOTIFY_LID_FLIP_ROG);
		if (result < 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) {
			dev_err(dev, "This device has lid-flip-rog quirk but got ENODEV checking it. This is a bug.");
		} else {
			dev_err(dev, "Error checking for lid-flip: %d\n", result);
		}
		break;
		break;
	}
	}