[PATCH v3 2/2] asus-wmi: Add support for ROG X13 tablet mode

Luke D. Jones posted 2 patches 3 years, 8 months ago
[PATCH v3 2/2] asus-wmi: Add support for ROG X13 tablet mode
Posted by Luke D. Jones 3 years, 8 months ago
Add quirk for ASUS ROG X13 Flow 2-in-1 to enable tablet mode with
lid flip (all screen rotations).

Signed-off-by: Luke D. Jones <luke@ljones.dev>
---
 drivers/platform/x86/asus-nb-wmi.c         | 15 +++++++++
 drivers/platform/x86/asus-wmi.c            | 37 ++++++++++++++++++++++
 drivers/platform/x86/asus-wmi.h            |  1 +
 include/linux/platform_data/x86/asus-wmi.h |  1 +
 4 files changed, 54 insertions(+)

diff --git a/drivers/platform/x86/asus-nb-wmi.c b/drivers/platform/x86/asus-nb-wmi.c
index 3a93e056c4e1..d4cc6afc1861 100644
--- a/drivers/platform/x86/asus-nb-wmi.c
+++ b/drivers/platform/x86/asus-nb-wmi.c
@@ -123,6 +123,11 @@ static struct quirk_entry quirk_asus_use_lid_flip_devid = {
 	.tablet_switch_mode = asus_wmi_lid_flip_devid,
 };
 
+static struct quirk_entry quirk_asus_tablet_mode = {
+	.wmi_backlight_set_devstate = true,
+	.tablet_switch_mode = asus_wmi_lid_flip_rog_devid,
+};
+
 static int dmi_matched(const struct dmi_system_id *dmi)
 {
 	pr_info("Identified laptop model '%s'\n", dmi->ident);
@@ -471,6 +476,15 @@ static const struct dmi_system_id asus_quirks[] = {
 		},
 		.driver_data = &quirk_asus_use_lid_flip_devid,
 	},
+	{
+		.callback = dmi_matched,
+		.ident = "ASUS ROG FLOW X13",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+			DMI_MATCH(DMI_PRODUCT_NAME, "GV301Q"),
+		},
+		.driver_data = &quirk_asus_tablet_mode,
+	},
 	{},
 };
 
@@ -575,6 +589,7 @@ static const struct key_entry asus_nb_wmi_keymap[] = {
 	{ KE_KEY, 0xC5, { KEY_KBDILLUMDOWN } },
 	{ KE_IGNORE, 0xC6, },  /* Ambient Light Sensor notification */
 	{ KE_KEY, 0xFA, { KEY_PROG2 } },           /* Lid flip action */
+	{ KE_KEY, 0xBD, { KEY_PROG2 } }, /* Lid flip action on ROG xflow laptops */
 	{ KE_END, 0},
 };
 
diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
index 029c26a218e1..8b8ab48a644e 100644
--- a/drivers/platform/x86/asus-wmi.c
+++ b/drivers/platform/x86/asus-wmi.c
@@ -69,6 +69,7 @@ module_param(fnlock_default, bool, 0444);
 #define NOTIFY_KBD_FBM			0x99
 #define NOTIFY_KBD_TTP			0xae
 #define NOTIFY_LID_FLIP			0xfa
+#define NOTIFY_LID_FLIP_ROG		0xbd
 
 #define ASUS_WMI_FNLOCK_BIOS_DISABLED	BIT(0)
 
@@ -551,6 +552,19 @@ static int asus_wmi_input_init(struct asus_wmi *asus)
 			dev_err(dev, "Error checking for lid-flip: %d\n", result);
 		}
 		break;
+	case asus_wmi_lid_flip_rog_devid:
+		result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_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;
 	}
 
 	err = input_register_device(asus->inputdev);
@@ -585,6 +599,17 @@ static void lid_flip_tablet_mode_get_state(struct asus_wmi *asus)
 	}
 }
 
+static void lid_flip_rog_tablet_mode_get_state(struct asus_wmi *asus)
+{
+	int result;
+
+	result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_LID_FLIP_ROG);
+	if (result >= 0) {
+		input_report_switch(asus->inputdev, SW_TABLET_MODE, result);
+		input_sync(asus->inputdev);
+	}
+}
+
 /* dGPU ********************************************************************/
 static int dgpu_disable_check_present(struct asus_wmi *asus)
 {
@@ -3431,6 +3456,12 @@ static void asus_wmi_handle_event_code(int code, struct asus_wmi *asus)
 			return;
 		}
 		break;
+	case asus_wmi_lid_flip_rog_devid:
+		if (code == NOTIFY_LID_FLIP_ROG) {
+			lid_flip_rog_tablet_mode_get_state(asus);
+			return;
+		}
+		break;
 	}
 
 	if (asus->fan_boost_mode_available && code == NOTIFY_KBD_FBM) {
@@ -4105,6 +4136,9 @@ static int asus_hotk_resume(struct device *device)
 	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;
@@ -4153,6 +4187,9 @@ static int asus_hotk_restore(struct device *device)
 	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;
diff --git a/drivers/platform/x86/asus-wmi.h b/drivers/platform/x86/asus-wmi.h
index 413920bad0c6..0187f13d2414 100644
--- a/drivers/platform/x86/asus-wmi.h
+++ b/drivers/platform/x86/asus-wmi.h
@@ -29,6 +29,7 @@ enum asus_wmi_tablet_switch_mode {
 	asus_wmi_no_tablet_switch,
 	asus_wmi_kbd_dock_devid,
 	asus_wmi_lid_flip_devid,
+	asus_wmi_lid_flip_rog_devid,
 };
 
 struct quirk_entry {
diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h
index 3faeb98f6ea9..69c5308ed4c5 100644
--- a/include/linux/platform_data/x86/asus-wmi.h
+++ b/include/linux/platform_data/x86/asus-wmi.h
@@ -64,6 +64,7 @@
 #define ASUS_WMI_DEVID_PANEL_OD		0x00050019
 #define ASUS_WMI_DEVID_CAMERA		0x00060013
 #define ASUS_WMI_DEVID_LID_FLIP		0x00060062
+#define ASUS_WMI_DEVID_LID_FLIP_ROG	0x00060077
 
 /* Storage */
 #define ASUS_WMI_DEVID_CARDREADER	0x00080013
-- 
2.37.1
Re: [PATCH v3 2/2] asus-wmi: Add support for ROG X13 tablet mode
Posted by Andy Shevchenko 3 years, 8 months ago
On Tue, Aug 9, 2022 at 5:31 AM Luke D. Jones <luke@ljones.dev> wrote:
>
> Add quirk for ASUS ROG X13 Flow 2-in-1 to enable tablet mode with
> lid flip (all screen rotations).

...

>         { KE_IGNORE, 0xC6, },  /* Ambient Light Sensor notification */
>         { KE_KEY, 0xFA, { KEY_PROG2 } },           /* Lid flip action */
> +       { KE_KEY, 0xBD, { KEY_PROG2 } }, /* Lid flip action on ROG xflow laptops */

Shouldn't you keep it sorted by value?

...

>  #define NOTIFY_KBD_FBM                 0x99
>  #define NOTIFY_KBD_TTP                 0xae
>  #define NOTIFY_LID_FLIP                        0xfa
> +#define NOTIFY_LID_FLIP_ROG            0xbd

Ditto.

...

> +static void lid_flip_rog_tablet_mode_get_state(struct asus_wmi *asus)
> +{
> +       int result;
> +
> +       result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_LID_FLIP_ROG);
> +       if (result >= 0) {

You missed the second part of my comment. Please, read carefully _all_
reviewer's comments.

> +               input_report_switch(asus->inputdev, SW_TABLET_MODE, result);
> +               input_sync(asus->inputdev);
> +       }
> +}

...

Overall, it's getting better!

-- 
With Best Regards,
Andy Shevchenko
Re: [PATCH v3 2/2] asus-wmi: Add support for ROG X13 tablet mode
Posted by Hans de Goede 3 years, 8 months ago
Hi,

On 8/9/22 10:40, Andy Shevchenko wrote:
> On Tue, Aug 9, 2022 at 5:31 AM Luke D. Jones <luke@ljones.dev> wrote:
>>
>> Add quirk for ASUS ROG X13 Flow 2-in-1 to enable tablet mode with
>> lid flip (all screen rotations).
> 
> ...
> 
>>         { KE_IGNORE, 0xC6, },  /* Ambient Light Sensor notification */
>>         { KE_KEY, 0xFA, { KEY_PROG2 } },           /* Lid flip action */
>> +       { KE_KEY, 0xBD, { KEY_PROG2 } }, /* Lid flip action on ROG xflow laptops */
> 
> Shouldn't you keep it sorted by value?

Actually as I mentioned in my review of v1, we don't want this
addition at all, see:

https://lore.kernel.org/platform-driver-x86/d9d79f9b-f3ab-c07e-9e18-5760ff828487@redhat.com/

Regards,

Hans


> 
> ...
> 
>>  #define NOTIFY_KBD_FBM                 0x99
>>  #define NOTIFY_KBD_TTP                 0xae
>>  #define NOTIFY_LID_FLIP                        0xfa
>> +#define NOTIFY_LID_FLIP_ROG            0xbd
> 
> Ditto.
> 
> ...
> 
>> +static void lid_flip_rog_tablet_mode_get_state(struct asus_wmi *asus)
>> +{
>> +       int result;
>> +
>> +       result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_LID_FLIP_ROG);
>> +       if (result >= 0) {
> 
> You missed the second part of my comment. Please, read carefully _all_
> reviewer's comments.
> 
>> +               input_report_switch(asus->inputdev, SW_TABLET_MODE, result);
>> +               input_sync(asus->inputdev);
>> +       }
>> +}
> 
> ...
> 
> Overall, it's getting better!
>
Re: [PATCH v3 2/2] asus-wmi: Add support for ROG X13 tablet mode
Posted by Luke Jones 3 years, 8 months ago
Hello,

On Tue, Aug 9 2022 at 10:46:11 +0200, Hans de Goede 
<hdegoede@redhat.com> wrote:
> Hi,
> 
> On 8/9/22 10:40, Andy Shevchenko wrote:
>>  On Tue, Aug 9, 2022 at 5:31 AM Luke D. Jones <luke@ljones.dev> 
>> wrote:
>>> 
>>>  Add quirk for ASUS ROG X13 Flow 2-in-1 to enable tablet mode with
>>>  lid flip (all screen rotations).
>> 
>>  ...
>> 
>>>          { KE_IGNORE, 0xC6, },  /* Ambient Light Sensor 
>>> notification */
>>>          { KE_KEY, 0xFA, { KEY_PROG2 } },           /* Lid flip 
>>> action */
>>>  +       { KE_KEY, 0xBD, { KEY_PROG2 } }, /* Lid flip action on ROG 
>>> xflow laptops */
>> 
>>  Shouldn't you keep it sorted by value?
> 
> Actually as I mentioned in my review of v1, we don't want this
> addition at all, see:
> 
> https://lore.kernel.org/platform-driver-x86/d9d79f9b-f3ab-c07e-9e18-5760ff828487@redhat.com/
> 

My apologies, I will fix this.


> Regards,
> 
> Hans
> 
> 
>> 
>>  ...
>> 
>>>   #define NOTIFY_KBD_FBM                 0x99
>>>   #define NOTIFY_KBD_TTP                 0xae
>>>   #define NOTIFY_LID_FLIP                        0xfa
>>>  +#define NOTIFY_LID_FLIP_ROG            0xbd
>> 
>>  Ditto.
>> 
>>  ...
>> 
>>>  +static void lid_flip_rog_tablet_mode_get_state(struct asus_wmi 
>>> *asus)
>>>  +{
>>>  +       int result;
>>>  +
>>>  +       result = asus_wmi_get_devstate_simple(asus, 
>>> ASUS_WMI_DEVID_LID_FLIP_ROG);
>>>  +       if (result >= 0) {
>> 
>>  You missed the second part of my comment. Please, read carefully 
>> _all_
>>  reviewer's comments.
>> 
>>>  +               input_report_switch(asus->inputdev, 
>>> SW_TABLET_MODE, result);
>>>  +               input_sync(asus->inputdev);
>>>  +       }
>>>  +}
>> 
>>  ...
>> 
>>  Overall, it's getting better!
>> 
>