diff mbox series

[2/2] platform/x86: intel-vbtn: Update tablet mode switch at end of probe

Message ID 20240329143206.2977734-3-gwendal@chromium.org (mailing list archive)
State Accepted, archived
Delegated to: Ilpo Järvinen
Headers show
Series platform/x86: intel-vbtn: Fix ASUS VivoBook boot state | expand

Commit Message

Gwendal Grignou March 29, 2024, 2:32 p.m. UTC
ACER Vivobook Flip (TP401NAS) virtual intel switch is implemented as
follow:

   Device (VGBI)
   {
       Name (_HID, EisaId ("INT33D6") ...
       Name (VBDS, Zero)
       Method (_STA, 0, Serialized)  // _STA: Status ...
       Method (VBDL, 0, Serialized)
       {
           PB1E |= 0x20
           VBDS |= 0x40
       }
       Method (VGBS, 0, Serialized)
       {
           Return (VBDS) /* \_SB_.PCI0.SBRG.EC0_.VGBI.VBDS */
       }
       ...
    }

By default VBDS is set to 0. At boot it is set to clamshell (bit 6 set)
only after method VBDL is executed.

Since VBDL is now evaluated in the probe routine later, after the device
is registered, the retrieved value of VBDS was still 0 ("tablet mode")
when setting up the virtual switch.

Make sure to evaluate VGBS after VBDL, to ensure the
convertible boots in clamshell mode, the expected default.

Fixes: 26173179fae1 ("platform/x86: intel-vbtn: Eval VBDL after registering our notifier")
Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
---
 drivers/platform/x86/intel/vbtn.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

Kuppuswamy Sathyanarayanan March 29, 2024, 6:50 p.m. UTC | #1
On 3/29/24 7:32 AM, Gwendal Grignou wrote:
> ACER Vivobook Flip (TP401NAS) virtual intel switch is implemented as
> follow:
>
>    Device (VGBI)
>    {
>        Name (_HID, EisaId ("INT33D6") ...
>        Name (VBDS, Zero)
>        Method (_STA, 0, Serialized)  // _STA: Status ...
>        Method (VBDL, 0, Serialized)
>        {
>            PB1E |= 0x20
>            VBDS |= 0x40
>        }
>        Method (VGBS, 0, Serialized)
>        {
>            Return (VBDS) /* \_SB_.PCI0.SBRG.EC0_.VGBI.VBDS */
>        }
>        ...
>     }
>
> By default VBDS is set to 0. At boot it is set to clamshell (bit 6 set)
> only after method VBDL is executed.
>
> Since VBDL is now evaluated in the probe routine later, after the device
> is registered, the retrieved value of VBDS was still 0 ("tablet mode")
> when setting up the virtual switch.
>
> Make sure to evaluate VGBS after VBDL, to ensure the
> convertible boots in clamshell mode, the expected default.
>
> Fixes: 26173179fae1 ("platform/x86: intel-vbtn: Eval VBDL after registering our notifier")
> Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
> ---

Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>

>  drivers/platform/x86/intel/vbtn.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/platform/x86/intel/vbtn.c b/drivers/platform/x86/intel/vbtn.c
> index 48f0ac19d6ddf..79bb2c801daa9 100644
> --- a/drivers/platform/x86/intel/vbtn.c
> +++ b/drivers/platform/x86/intel/vbtn.c
> @@ -136,8 +136,6 @@ static int intel_vbtn_input_setup(struct platform_device *device)
>  	priv->switches_dev->id.bustype = BUS_HOST;
>  
>  	if (priv->has_switches) {
> -		detect_tablet_mode(&device->dev);
> -
>  		ret = input_register_device(priv->switches_dev);
>  		if (ret)
>  			return ret;
> @@ -312,6 +310,9 @@ static int intel_vbtn_probe(struct platform_device *device)
>  		if (ACPI_FAILURE(status))
>  			dev_err(&device->dev, "Error VBDL failed with ACPI status %d\n", status);
>  	}
> +	// Check switches after buttons since VBDL may have side effects.
> +	if (has_switches)
> +		detect_tablet_mode(&device->dev);
>  
>  	device_init_wakeup(&device->dev, true);
>  	/*
diff mbox series

Patch

diff --git a/drivers/platform/x86/intel/vbtn.c b/drivers/platform/x86/intel/vbtn.c
index 48f0ac19d6ddf..79bb2c801daa9 100644
--- a/drivers/platform/x86/intel/vbtn.c
+++ b/drivers/platform/x86/intel/vbtn.c
@@ -136,8 +136,6 @@  static int intel_vbtn_input_setup(struct platform_device *device)
 	priv->switches_dev->id.bustype = BUS_HOST;
 
 	if (priv->has_switches) {
-		detect_tablet_mode(&device->dev);
-
 		ret = input_register_device(priv->switches_dev);
 		if (ret)
 			return ret;
@@ -312,6 +310,9 @@  static int intel_vbtn_probe(struct platform_device *device)
 		if (ACPI_FAILURE(status))
 			dev_err(&device->dev, "Error VBDL failed with ACPI status %d\n", status);
 	}
+	// Check switches after buttons since VBDL may have side effects.
+	if (has_switches)
+		detect_tablet_mode(&device->dev);
 
 	device_init_wakeup(&device->dev, true);
 	/*