linux/drivers/platform/x86
Yurii Pavlovskyi 1a373d15e2 platform/x86: asus-wmi: Support WMI event queue
Event codes are expected to be retrieved from a queue on at least some
models. Specifically, very likely the ACPI WMI devices with _UID ATK are
queued whereas those with ASUSWMI are not [1].

The WMI event codes are pushed into a circular buffer queue. After the INIT
method is called, ACPI code is allowed to push events into this buffer.
The INIT method cannot be reverted. If the module is unloaded and an event
(such as hotkey press) gets emitted before inserting it back the events get
processed delayed by one or if the queue overflows, additionally delayed by
about 3 seconds.

It might be considered a minor issue and no normal user would likely
observe this (there is little reason unloading the driver), but it does
significantly frustrate a developer who is unlucky enough to encounter
this. Therefore, the fallback to unqueued behavior occurs whenever
something unexpected happens.

The fix flushes the old key codes out of the queue on load. After receiving
event the queue is read until either ..FFFF or 1 is encountered. Also as
noted in [1] it is checked whether notify code is equal to 0xFF before
enabling queue processing in WMI notify handler.

DSDT examples:

FX505GM
Device (ATKD)
{ ..
    Name (ATKQ, Package (0x10)
    {
        0xFFFFFFFF, ..
    }

    Method (IANQ, 1, Serialized)
    {
        If ((AQNO >= 0x10))
        {
            Local0 = 0x64
            While ((Local0 && (AQNO >= 0x10)))
            {
                Local0--
                Sleep (0x0A)
            }
            ...
        ..
        AQTI++
        AQTI &= 0x0F
        ATKQ [AQTI] = Arg0
        ...
    }

    Method (GANQ, 0, Serialized)
    {
        ..
        If (AQNO)
        {
            ...
            Local0 = DerefOf (ATKQ [AQHI])
            AQHI++
            AQHI &= 0x0F
            Return (Local0)
        }

        Return (One)
    }

This code is almost identical to K54C, which does return Ones on empty
queue.

K54C:
Method (GANQ, 0, Serialized)
{
    If (AQNO)
    {
        ...
        Return (Local0)
    }

    Return (Ones)
}

[1] Link: https://lkml.org/lkml/2019/4/12/104

Signed-off-by: Yurii Pavlovskyi <yurii.pavlovskyi@gmail.com>
Suggested-by: Daniel Drake <drake@endlessm.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
2019-06-17 15:22:47 +03:00
..
acer-wireless.c
acer-wmi.c platform/x86: acer-wmi: no need to check return value of debugfs_create functions 2019-06-17 15:20:58 +03:00
acerhdf.c platform/x86: acerhdf: restructure to allow large BIOS table be __initconst 2018-09-27 12:18:08 +03:00
alienware-wmi.c platform/x86: alienware-wmi: printing the wrong error code 2019-05-09 00:33:02 +03:00
amilo-rfkill.c
apple-gmux.c platform/x86: apple-gmux: fix gmux_get_client_id()'s return type 2018-04-24 19:55:33 +03:00
asus-laptop.c platform/x86: Simplify getting .drvdata 2018-04-23 08:52:59 -07:00
asus-nb-wmi.c platform/x86: asus-wmi: Only Tell EC the OS will handle display hotkeys from asus_nb_wmi 2019-06-12 11:54:16 +03:00
asus-wireless.c platform/x86: asus-wireless: Fix uninitialized symbol usage 2018-07-02 16:48:22 +03:00
asus-wmi.c platform/x86: asus-wmi: Support WMI event queue 2019-06-17 15:22:47 +03:00
asus-wmi.h platform/x86: asus-wmi: Only Tell EC the OS will handle display hotkeys from asus_nb_wmi 2019-06-12 11:54:16 +03:00
classmate-laptop.c
compal-laptop.c treewide: Use DEVICE_ATTR_RW 2018-01-09 16:33:31 +01:00
dcdbas.c firmware: dcdbas: include linux/io.h 2018-10-03 11:27:22 +03:00
dcdbas.h firmware: dcdbas: Move dcdbas to drivers/platform/x86 2018-09-27 12:18:15 +03:00
dell_rbu.c platform/x86: dell_rbu: fix lock imbalance in img_update_realloc 2019-02-23 09:20:56 -08:00
dell-laptop.c platform/x86: dell-laptop: no need to check return value of debugfs_create functions 2019-06-17 15:20:58 +03:00
dell-rbtn.c platform/x86: dell-rbtn: Add missing #include 2019-04-08 20:12:13 +03:00
dell-rbtn.h
dell-smbios-base.c platform/x86: dell-smbios-base: Support systems without tokens 2018-06-26 15:01:52 -07:00
dell-smbios-smm.c firmware: dcdbas: Move dcdbas to drivers/platform/x86 2018-09-27 12:18:15 +03:00
dell-smbios-wmi.c platform/x86: dell-smbios-wmi: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS() 2019-03-07 08:46:29 -08:00
dell-smbios.h platform/x86: dell-smbios: Link all dell-smbios-* modules together 2018-03-09 09:35:42 -08:00
dell-smo8800.c
dell-wmi-aio.c
dell-wmi-descriptor.c platform/x86: dell-wmi-descriptor: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS() 2019-03-07 08:46:29 -08:00
dell-wmi-descriptor.h
dell-wmi-led.c
dell-wmi.c platform/x86: dell-wmi: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS() 2019-03-07 08:46:29 -08:00
eeepc-laptop.c PCI: hotplug: Embed hotplug_slot 2018-09-18 17:52:15 -05:00
eeepc-wmi.c
fujitsu-laptop.c platform/x86: fujitsu-laptop: Simplify soft key handling 2018-04-19 16:25:54 -07:00
fujitsu-tablet.c
gpd-pocket-fan.c platform/x86: GPD pocket fan: fix spelling mistake: "Mill-celcius" -> "millicelsius" 2018-02-15 12:21:48 +02:00
hdaps.c
hp_accel.c platform/x86: hp_accel: Add support for HP ProBook 450 G0 2019-06-12 12:42:27 +03:00
hp-wireless.c
hp-wmi.c
huawei-wmi.c platform/x86: huawei-wmi: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS() 2019-03-07 08:46:29 -08:00
i2c-multi-instantiate.c ACPI / scan: Create platform device for BSG2150 ACPI nodes 2019-02-05 19:38:20 +02:00
ibm_rtl.c
ideapad-laptop.c platform/x86: ideapad-laptop: no need to check return value of debugfs_create functions 2019-06-17 15:20:58 +03:00
intel_atomisp2_pm.c platform/x86: Fix config space access for intel_atomisp2_pm 2018-12-03 21:40:03 +02:00
intel_bxtwc_tmu.c platform/x86: intel_bxtwc_tmu: Convert to use SPDX identifier 2018-09-27 12:18:16 +03:00
intel_cht_int33fe.c platform/x86: intel_cht_int33fe: Remove old style mux connections 2019-02-14 10:52:25 +01:00
intel_chtdc_ti_pwrbtn.c platform/x86: intel_chtdc_ti_pwrbtn: Add SPDX identifier 2018-09-27 12:18:16 +03:00
intel_int0002_vgpio.c platform/x86: intel_int0002_vgpio: Only implement irq_set_wake on Bay Trail 2019-02-05 20:28:54 +02:00
intel_ips.c platform/x86: intel_ips: Convert to use DEFINE_SHOW_ATTRIBUTE macro 2018-12-03 21:40:03 +02:00
intel_ips.h platform/x86: intel-ips: Convert to use SPDX identifier 2018-09-27 12:18:16 +03:00
intel_menlow.c platform/x86: intel_menlow: avoid null pointer deference error 2019-06-12 12:42:27 +03:00
intel_mid_powerbtn.c platform-drivers-x86 for v4.20-1 2018-11-01 08:42:21 -07:00
intel_mid_thermal.c platform/x86: intel_mid_thermal: Convert to use SPDX identifier 2018-09-27 12:18:17 +03:00
intel_mrfld_pwrbtn.c platform/x86: Add support for Basin Cove power button 2019-05-09 00:33:03 +03:00
intel_oaktrail.c platform/x86: intel_oaktrail: Convert to use SPDX identifier 2018-09-27 12:18:18 +03:00
intel_pmc_core.c platform/x86: intel_pmc: no need to check return value of debugfs_create functions 2019-06-17 15:20:58 +03:00
intel_pmc_core.h platform/x86: intel_pmc_core: Allow to dump debug registers on S0ix failure 2019-05-06 17:54:42 +03:00
intel_pmc_ipc.c platform/x86: intel_pmc_ipc: Don't map non-used optional resources 2019-05-06 17:54:04 +03:00
intel_punit_ipc.c platform/x86: intel_punit_ipc: Revert "Fix resource ioremap warning" 2019-05-06 17:54:13 +03:00
intel_scu_ipc.c platform/x86: intel_scu_ipc: Convert to use SPDX identifier 2018-09-27 12:18:19 +03:00
intel_scu_ipcutil.c platform/x86: intel_scu_ipc: Convert to use SPDX identifier 2018-09-27 12:18:19 +03:00
intel_telemetry_core.c platform/x86: intel_telemetry: Convert to use SPDX identifier 2018-09-27 12:18:20 +03:00
intel_telemetry_debugfs.c platform/x86: intel_telemetry: no need to check return value of debugfs_create functions 2019-06-17 15:20:58 +03:00
intel_telemetry_pltdrv.c platform-drivers-x86 for v4.20-1 2018-11-01 08:42:21 -07:00
intel_turbo_max_3.c platform/x86: intel_turbo_max_3: Convert to use SPDX identifier 2018-09-27 12:18:20 +03:00
intel-hid.c platform/x86: intel-hid: Missing power button release on some Dell models 2019-01-26 11:07:34 -08:00
intel-rst.c platform/x86: intel-rst: Convert to use SPDX identifier 2018-09-27 12:18:19 +03:00
intel-smartconnect.c platform/x86: intel-smartconnect: Convert to use SPDX identifier 2018-09-27 12:18:19 +03:00
intel-vbtn.c platform/x86: intel-vbtn: Report switch events when event wakes device 2019-06-12 11:54:16 +03:00
intel-wmi-thunderbolt.c platform/x86: intel-wmi-thunderbolt: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS() 2019-03-07 08:46:29 -08:00
Kconfig platform/x86: Remove left-over BACKLIGHT_LCD_SUPPORT 2019-06-12 12:41:47 +03:00
lg-laptop.c platform/x86: Add LG Gram laptop special features driver 2018-10-19 19:21:57 +03:00
Makefile platform/x86: Add support for Basin Cove power button 2019-05-09 00:33:03 +03:00
mlx-platform.c platform/x86: mlx-platform: Fix parent device in i2c-mux-reg device registration 2019-06-12 11:54:16 +03:00
msi-laptop.c
msi-wmi.c
mxm-wmi.c
panasonic-laptop.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
pcengines-apuv2.c platform/x86: pcengines-apuv2: Make two symbols static 2019-06-12 12:42:27 +03:00
peaq-wmi.c
pmc_atom.c platform/x86: pmc_atom: no need to check return value of debugfs_create functions 2019-06-17 15:20:58 +03:00
samsung-laptop.c platform/x86: samsung-laptop: no need to check return value of debugfs_create functions 2019-06-17 15:20:58 +03:00
samsung-q10.c
sony-laptop.c platform/x86: sony-laptop: Fix unintentional fall-through 2019-05-09 00:33:02 +03:00
surface3_button.c
surface3-wmi.c
surfacepro3_button.c platform/x86: surfacepro3: Support for wakeup from suspend-to-idle 2018-01-11 18:54:50 +01:00
tc1100-wmi.c
thinkpad_acpi.c platform/x86: thinkpad_acpi: cleanup for Thinkpad ACPI led 2019-05-09 00:33:03 +03:00
topstar-laptop.c platform/x86: topstar-laptop: replace licence text with SPDX tag 2018-02-23 18:43:42 +02:00
toshiba_acpi.c platform/x86: toshiba_acpi: Fix defined but not used build warnings 2018-07-21 09:26:45 -07:00
toshiba_bluetooth.c
toshiba_haps.c
toshiba-wmi.c
touchscreen_dmi.c platform/x86: touchscreen_dmi: Add info for the CHUWI Hi10 Plus tablet. 2019-06-12 11:55:01 +03:00
wmi-bmof.c platform/x86: wmi-bmof: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS() 2019-03-07 08:46:29 -08:00
wmi.c platform/x86: wmi: Add function to get _UID of WMI device 2019-06-17 15:22:47 +03:00
xo1-rfkill.c
xo15-ebook.c