linux/drivers/acpi
Kieran Clancy ad332c8a45 ACPI / EC: Clear stale EC events on Samsung systems
A number of Samsung notebooks (530Uxx/535Uxx/540Uxx/550Pxx/900Xxx/etc)
continue to log events during sleep (lid open/close, AC plug/unplug,
battery level change), which accumulate in the EC until a buffer fills.
After the buffer is full (tests suggest it holds 8 events), GPEs stop
being triggered for new events. This state persists on wake or even on
power cycle, and prevents new events from being registered until the EC
is manually polled.

This is the root cause of a number of bugs, including AC not being
detected properly, lid close not triggering suspend, and low ambient
light not triggering the keyboard backlight. The bug also seemed to be
responsible for performance issues on at least one user's machine.

Juan Manuel Cabo found the cause of bug and the workaround of polling
the EC manually on wake.

The loop which clears the stale events is based on an earlier patch by
Lan Tianyu (see referenced attachment).

This patch:
 - Adds a function acpi_ec_clear() which polls the EC for stale _Q
   events at most ACPI_EC_CLEAR_MAX (currently 100) times. A warning is
   logged if this limit is reached.
 - Adds a flag EC_FLAGS_CLEAR_ON_RESUME which is set to 1 if the DMI
   system vendor is Samsung. This check could be replaced by several
   more specific DMI vendor/product pairs, but it's likely that the bug
   affects more Samsung products than just the five series mentioned
   above. Further, it should not be harmful to run acpi_ec_clear() on
   systems without the bug; it will return immediately after finding no
   data waiting.
 - Runs acpi_ec_clear() on initialisation (boot), from acpi_ec_add()
 - Runs acpi_ec_clear() on wake, from acpi_ec_unblock_transactions()

References: https://bugzilla.kernel.org/show_bug.cgi?id=44161
References: https://bugzilla.kernel.org/show_bug.cgi?id=45461
References: https://bugzilla.kernel.org/show_bug.cgi?id=57271
References: https://bugzilla.kernel.org/attachment.cgi?id=126801
Suggested-by: Juan Manuel Cabo <juanmanuel.cabo@gmail.com>
Signed-off-by: Kieran Clancy <clancy.kieran@gmail.com>
Reviewed-by: Lan Tianyu <tianyu.lan@intel.com>
Reviewed-by: Dennis Jansen <dennis.jansen@web.de>
Tested-by: Kieran Clancy <clancy.kieran@gmail.com>
Tested-by: Juan Manuel Cabo <juanmanuel.cabo@gmail.com>
Tested-by: Dennis Jansen <dennis.jansen@web.de>
Tested-by: Maurizio D'Addona <mauritiusdadd@gmail.com>
Tested-by: San Zamoyski <san@plusnet.pl>
Cc: All applicable <stable@vger.kernel.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2014-03-06 13:27:23 +01:00
..
acpica ACPICA: Remove bool usage from ACPICA. 2014-01-27 23:59:08 +01:00
apei ACPI and power management updates for 3.14-rc1 2014-01-24 15:51:02 -08:00
ac.c ACPI / AC: fix AC driver compile error when CONFIG_PM_SLEEP is undefined 2014-02-13 15:13:44 +01:00
acpi_cmos_rtc.c ACPI: Add CMOS RTC Operation Region handler support 2013-06-27 21:35:37 +02:00
acpi_extlog.c ACPI and power management updates for 3.14-rc1 2014-01-24 15:51:02 -08:00
acpi_ipmi.c ACPI / IPMI: Cleanup coding styles 2013-09-30 19:46:13 +02:00
acpi_lpss.c Revert "ACPI: Add BayTrail SoC GPIO and LPSS ACPI IDs" 2014-01-18 14:04:58 +01:00
acpi_memhotplug.c ACPI / memhotplug: add parameter to disable memory hotplug 2014-01-16 01:43:49 +01:00
acpi_pad.c ACPI and power management updates for 3.14-rc1 2014-01-24 15:51:02 -08:00
acpi_platform.c ACPI / driver core: Store an ACPI device pointer in struct acpi_dev_node 2013-11-14 23:14:43 +01:00
acpi_processor.c Merge branches 'acpi-processor', 'acpi-hotplug', 'acpi-init', 'acpi-pm' and 'acpica' 2014-01-29 11:47:18 +01:00
battery.c ACPI / battery: fix battery driver compile error when CONFIG_PM_SLEEP is undefined 2014-02-13 15:13:44 +01:00
bgrt.c acpi: bgrt: fix build error due to attribute change 2013-08-22 08:34:39 -07:00
blacklist.c Revert "ACPI: Blacklist Win8 OSI for some HP laptop 2013 models" 2014-02-20 01:33:40 +01:00
bus.c Merge branches 'acpi-processor', 'acpi-hotplug', 'acpi-init', 'acpi-pm' and 'acpica' 2014-01-29 11:47:18 +01:00
button.c ACPI / button: fix button driver compile error when CONFIG_PM_SLEEP is undefined 2014-02-13 15:13:44 +01:00
container.c ACPI / container: Fix error code path in container_device_attach() 2014-02-12 14:55:16 +01:00
custom_method.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
debugfs.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
device_pm.c Merge branches 'acpi-processor', 'acpi-hotplug', 'acpi-init', 'acpi-pm' and 'acpica' 2014-01-29 11:47:18 +01:00
dock.c ACPI / dock: Make 'docked' sysfs attribute work as documented 2014-02-15 01:29:06 +01:00
ec_sys.c ACPI / EC: Mark the function acpi_ec_add_debugfs() as static in ec_sys.c 2014-01-06 00:13:22 +01:00
ec.c ACPI / EC: Clear stale EC events on Samsung systems 2014-03-06 13:27:23 +01:00
event.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
fan.c ACPI / fan: fix fan driver compile error when CONFIG_PM_SLEEP is undefined 2014-02-13 15:13:44 +01:00
glue.c ACPI / bind: Move acpi_get_child() to drivers/ide/ide-acpi.c 2013-12-07 01:05:50 +01:00
hed.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
internal.h Merge branch 'acpi-hotplug' 2014-01-12 23:45:04 +01:00
Kconfig x86/efi: Don't select EFI from certain special ACPI drivers 2013-12-19 21:32:46 +01:00
Makefile ACPI and power management updates for 3.13-rc1 2013-11-14 13:41:48 +09:00
numa.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
nvs.c ACPI / NVS: Include appropriate header file in nvs.c 2014-01-06 00:13:22 +01:00
osl.c Merge branch 'acpi-hotplug' 2014-01-12 23:45:04 +01:00
pci_irq.c ACPI / PCI: Fix memory leak in acpi_pci_irq_enable() 2014-02-18 15:47:23 +01:00
pci_link.c ACPI / PCI: Include appropriate header file in pci_link.c 2014-01-06 00:13:22 +01:00
pci_root.c ACPI and power management updates for 3.14-rc1 2014-01-24 15:51:02 -08:00
pci_slot.c ACPI / PCI: Include appropriate header file in pci_slot.c 2014-01-06 00:13:22 +01:00
power.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
proc.c ACPI / proc: remove unneeded NULL check 2014-02-05 01:06:21 +01:00
processor_core.c Merge branches 'acpi-processor', 'acpi-hotplug', 'acpi-init', 'acpi-pm' and 'acpica' 2014-01-29 11:47:18 +01:00
processor_driver.c ACPI / processor: use ACPI_COMPANION() to get ACPI device 2013-12-07 01:41:01 +01:00
processor_idle.c ACPI and power management updates for 3.14-rc1 2014-01-24 15:51:02 -08:00
processor_perflib.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
processor_thermal.c ACPI: correct minor typos 2013-12-07 01:38:45 +01:00
processor_throttling.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
reboot.c Revert "ACPI: ignore FADT reset-reg-sup flag" 2012-04-20 11:19:35 -07:00
resource.c ACPI: introduce helper function acpi_has_method() 2013-07-15 01:33:10 +02:00
sbs.c Merge branches 'acpi-pm' and 'acpi-video' 2014-02-21 01:28:12 +01:00
sbshc.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
sbshc.h
scan.c ACPI / hotplug: Fix panic on eject to ejected device 2014-02-05 12:14:43 +01:00
sleep.c Merge branches 'acpi-gpe', 'acpi-video', 'acpi-thermal', 'acpi-processor', 'acpi-sleep' 2014-01-12 23:46:55 +01:00
sleep.h ACPI: Drop power resources driver 2013-01-17 14:11:06 +01:00
sysfs.c Merge branches 'acpi-processor', 'acpi-hotplug', 'acpi-init', 'acpi-pm' and 'acpica' 2014-01-29 11:47:18 +01:00
tables.c ACPI / tables: Return proper error codes from acpi_table_parse() and fix comment. 2014-01-06 12:33:06 +01:00
thermal.c ACPI / thermal: fix thermal driver compile error when CONFIG_PM_SLEEP is undefined 2014-02-13 15:13:45 +01:00
utils.c ACPI / utils: remove a pointless NULL check 2014-02-05 01:05:24 +01:00
video_detect.c ACPI / video: Add systems that should favour native backlight interface 2014-02-20 01:33:40 +01:00
video.c ACPI / video: Add systems that should favour native backlight interface 2014-02-20 01:33:40 +01:00
wakeup.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00