lkml.org 
[lkml]   [2019]   [Jan]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.9 01/36] platform/x86: asus-wmi: Tell the EC the OS will handle the display off hotkey
    Date
    From: João Paulo Rechi Vita <jprvita@gmail.com>

    [ Upstream commit 78f3ac76d9e5219589718b9e4733bee21627b3f5 ]

    In the past, Asus firmwares would change the panel backlight directly
    through the EC when the display off hotkey (Fn+F7) was pressed, and
    only notify the OS of such change, with 0x33 when the LCD was ON and
    0x34 when the LCD was OFF. These are currently mapped to
    KEY_DISPLAYTOGGLE and KEY_DISPLAY_OFF, respectively.

    Most recently the EC on Asus most machines lost ability to toggle the
    LCD backlight directly, but unless the OS informs the firmware it is
    going to handle the display toggle hotkey events, the firmware still
    tries change the brightness through the EC, to no effect. The end result
    is a long list (at Endless we counted 11) of Asus laptop models where
    the display toggle hotkey does not perform any action. Our firmware
    engineers contacts at Asus were surprised that there were still machines
    out there with the old behavior.

    Calling WMNB(ASUS_WMI_DEVID_BACKLIGHT==0x00050011, 2) on the _WDG device
    tells the firmware that it should let the OS handle the display toggle
    event, in which case it will simply notify the OS of a key press with
    0x35, as shown by the DSDT excerpts bellow.

    Scope (_SB)
    {
    (...)

    Device (ATKD)
    {
    (...)

    Name (_WDG, Buffer (0x28)
    {
    /* 0000 */ 0xD0, 0x5E, 0x84, 0x97, 0x6D, 0x4E, 0xDE, 0x11,
    /* 0008 */ 0x8A, 0x39, 0x08, 0x00, 0x20, 0x0C, 0x9A, 0x66,
    /* 0010 */ 0x4E, 0x42, 0x01, 0x02, 0x35, 0xBB, 0x3C, 0x0B,
    /* 0018 */ 0xC2, 0xE3, 0xED, 0x45, 0x91, 0xC2, 0x4C, 0x5A,
    /* 0020 */ 0x6D, 0x19, 0x5D, 0x1C, 0xFF, 0x00, 0x01, 0x08
    })
    Method (WMNB, 3, Serialized)
    {
    CreateDWordField (Arg2, Zero, IIA0)
    CreateDWordField (Arg2, 0x04, IIA1)
    Local0 = (Arg1 & 0xFFFFFFFF)

    (...)

    If ((Local0 == 0x53564544))
    {
    (...)

    If ((IIA0 == 0x00050011))
    {
    If ((IIA1 == 0x02))
    {
    ^^PCI0.SBRG.EC0.SPIN (0x72, One)
    ^^PCI0.SBRG.EC0.BLCT = One
    }

    Return (One)
    }
    }
    (...)
    }
    (...)
    }
    (...)
    }
    (...)

    Scope (_SB.PCI0.SBRG.EC0)
    {
    (...)

    Name (BLCT, Zero)

    (...)

    Method (_Q10, 0, NotSerialized) // _Qxx: EC Query
    {
    If ((BLCT == Zero))
    {
    Local0 = One
    Local0 = RPIN (0x72)
    Local0 ^= One
    SPIN (0x72, Local0)
    If (ATKP)
    {
    Local0 = (0x34 - Local0)
    ^^^^ATKD.IANE (Local0)
    }
    }
    ElseIf ((BLCT == One))
    {
    If (ATKP)
    {
    ^^^^ATKD.IANE (0x35)
    }
    }
    }
    (...)
    }

    Signed-off-by: João Paulo Rechi Vita <jprvita@endlessm.com>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/platform/x86/asus-wmi.c | 3 ++-
    1 file changed, 2 insertions(+), 1 deletion(-)

    diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
    index ed277685da1d..10bd13b30178 100644
    --- a/drivers/platform/x86/asus-wmi.c
    +++ b/drivers/platform/x86/asus-wmi.c
    @@ -2154,7 +2154,8 @@ static int asus_wmi_add(struct platform_device *pdev)
    err = asus_wmi_backlight_init(asus);
    if (err && err != -ENODEV)
    goto fail_backlight;
    - }
    + } else
    + err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT, 2, NULL);

    status = wmi_install_notify_handler(asus->driver->event_guid,
    asus_wmi_notify, asus);
    --
    2.19.1
    \
     
     \ /
      Last update: 2019-01-08 20:43    [W:2.122 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site