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 |
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 --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); /*
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(-)