linux-stable/drivers/acpi
Mika Westerberg 71b65445f0 ACPI / PM: Use target_state to set the device power state
Commit 20dacb71ad ("ACPI / PM: Rework device power management to follow
ACPI 6") changed the device power management to use D3hot if the device
in question does not have _PR3 method even if D3cold was requested by the
caller.

However, if the device has _PR3 device->power.state is also set to D3hot
instead of D3Cold after power resources have been turned off because
device->power.state will be assigned from "state" instead of
"target_state".

Next time the device is transitioned to D0, acpi_power_transition() will
find that the current power state of the device is D3hot instead of D3cold
which causes it to power down all resources required for the current
(wrong) state D3hot.

Below is a simplified ASL example of a real touch panel device which
triggers the problem:

  Scope (TPL1)
  {
      Name (_PR0, Package (1) { \_SB.PCI0.I2C1.PXTC })
      Name (_PR3, Package (1) { \_SB.PCI0.I2C1.PXTC })
      ...
  }

In both D0 and D3hot the same power resource is required. However, when
acpi_power_transition() turns off power resources required for D3hot (as
the device is transitioned to D0) it powers down PXTC which then makes the
device to lose its power.

Fix this by assigning "target_state" to the device power state instead of
"state" that is always D3hot even for devices with valid _PR3.

Fixes: 20dacb71ad (ACPI / PM: Rework device power management to follow ACPI 6)
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2015-07-28 16:29:08 +02:00
..
acpica Revert 'Revert "ACPICA: Permanently set _REV to the value '2'."' 2015-07-03 01:06:04 +02:00
apei Power management and ACPI material for v4.2-rc1 2015-06-23 14:18:07 -07:00
pmic ACPI/PMIC: Fix typo in MODULE_DESCRIPTION in intel_pmic_crc.c 2015-03-26 21:34:51 +01:00
ac.c ACPI / AC: constify DMI system id table 2015-06-15 14:14:49 +02:00
acpi_apd.c ACPI: add AMD ACPI2Platform device support for x86 system 2015-02-06 15:42:16 +01:00
acpi_cmos_rtc.c ACPI / RTC: Fix CMOS RTC opregion handler accesses to wrong addresses 2014-09-08 15:38:41 +02:00
acpi_extlog.c ACPI and power management updates for 3.17-rc1 2014-08-06 20:34:19 -07:00
acpi_ipmi.c
acpi_lpat.c ACPI / LPAT: Common table processing functions 2015-01-29 21:02:10 +08:00
acpi_lpss.c ACPI / LPSS: Fix up acpi_lpss_create_device() 2015-07-07 00:31:47 +02:00
acpi_memhotplug.c ACPICA: Resources: Provide common part for struct acpi_resource_address structures. 2015-01-26 16:09:56 +01:00
acpi_pad.c sched/topology: Rename topology_thread_cpumask() to topology_sibling_cpumask() 2015-05-27 15:22:15 +02:00
acpi_platform.c ACPI / scan: Parse _CCA and setup device coherency 2015-06-15 14:40:48 +02:00
acpi_pnp.c ACPI / PNP: add two IDs to list for PNPACPI device enumeration 2015-05-04 16:03:12 +02:00
acpi_processor.c ACPI / processor: Introduce invalid_phys_cpuid() 2015-05-13 23:28:16 +02:00
acpi_video.c ACPI / video: Make acpi_video_unregister_backlight() private 2015-06-19 01:12:50 +02:00
battery.c ACPI / battery: mark DMI table as __initconst 2015-06-15 14:23:44 +02:00
battery.h ACPI / battery: move some ACPI_BATTERY_* definitions to header 2014-03-19 01:57:46 +01:00
bgrt.c
blacklist.c ACPI / init: Make it possible to override _REV 2015-07-03 01:06:00 +02:00
bus.c ACPI / init: Switch over platform to the ACPI mode later 2015-06-10 23:51:27 +02:00
button.c ACPI / button: Do not propagate wakeup-from-suspend events 2014-07-23 00:59:04 +02:00
cm_sbs.c ACPI: Revert "ACPI: Remove CONFIG_ACPI_PROCFS_POWER and cm_sbsc.c" 2014-05-06 01:52:09 +02:00
container.c ACPI / hotplug: Generate online uevents for ACPI containers 2014-09-21 02:58:18 +02: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 ACPI / PM: Use target_state to set the device power state 2015-07-28 16:29:08 +02:00
dock.c driver core / ACPI: Represent ACPI companions using fwnode_handle 2015-03-16 23:49:03 +01:00
ec.c ACPI / EC: Fix a code coverity issue when QR_EC transactions are failed. 2015-06-15 14:35:59 +02: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
event.c netlink: make nlmsg_end() and genlmsg_end() void 2015-01-18 01:03:45 -05:00
fan.c ACPI / PM: Rework device power management to follow ACPI 6 2015-05-16 01:55:35 +02:00
glue.c ACPI / scan: Parse _CCA and setup device coherency 2015-06-15 14:40:48 +02:00
gsi.c ACPI: move arm64 GSI IRQ model to generic GSI IRQ layer 2015-03-26 15:13:09 +00:00
hed.c ACPI / HED: constify ACPI device ids 2015-06-15 14:28:32 +02:00
int340x_thermal.c ACPI/int340x_thermal: enumerate INT3401 for Intel SoC DTS thermal driver 2015-01-06 08:17:14 +08:00
internal.h Additional ACPICA material for v4.2-rc1 2015-07-02 17:11:28 -07:00
ioapic.c x86/irq, ACPI: Implement ACPI driver to support IOAPIC hotplug 2015-02-05 15:09:26 +01:00
Kconfig Additional ACPICA material for v4.2-rc1 2015-07-02 17:11:28 -07:00
Makefile The libnvdimm sub-system introduces, in addition to the libnvdimm-core, 2015-06-29 10:34:42 -07:00
nfit.c nfit: add support for NVDIMM "latch" flag 2015-07-10 14:43:50 -04:00
nfit.h nfit: add support for NVDIMM "latch" flag 2015-07-10 14:43:50 -04:00
numa.c acpi: Add acpi_map_pxm_to_online_node() 2015-06-26 11:23:38 -04:00
nvs.c ACPI: Clean up acpi_os_map/unmap_memory() to eliminate __iomem. 2014-05-27 18:13:08 +02:00
osl.c ACPI / PNP: Reserve ACPI resources at the fs_initcall_sync stage 2015-07-06 23:52:21 +02:00
pci_irq.c Power management and ACPI material for v4.2-rc1 2015-06-23 14:18:07 -07:00
pci_link.c ACPI: Remove duplicate definitions of PREFIX 2014-03-19 02:01:57 +01:00
pci_root.c PCI: Don't clear ASPM bits when the FADT declares it's unsupported 2015-04-09 14:20:11 -05: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 / PM: Turn power resources on and off in the right order during resume 2015-05-25 23:59:54 +02:00
proc.c ACPI / proc: remove unneeded NULL check 2014-02-05 01:06:21 +01:00
processor_core.c ACPI / processor: Introduce invalid_phys_cpuid() 2015-05-13 23:28:16 +02:00
processor_driver.c ACPI / processor: Make acpi_cpu_soft_notify() process CPU FROZEN events 2014-08-06 22:22:03 +02:00
processor_idle.c ACPI / processor: constify DMI system id table 2015-06-15 14:29:48 +02:00
processor_pdc.c ACPI / processor: Introduce invalid_logical_cpuid() 2015-05-13 23:28:14 +02:00
processor_perflib.c ACPI / processor: use acpi_evaluate_ost() to replace open-coded version 2014-02-21 00:27:47 +01:00
processor_thermal.c ACPI: correct minor typos 2013-12-07 01:38:45 +01:00
processor_throttling.c ACPI / processor: Rework processor throttling with work_on_cpu() 2014-02-27 00:21:05 +01:00
property.c ACPI / property: Define a symbol for PRP0001 2015-05-22 23:57:14 +02:00
reboot.c
resource.c Merge branches 'pm-cpuidle', 'pm-cpufreq' and 'acpi-resources' 2015-07-16 23:47:19 +02:00
sbs.c ACPI / SBS: Enable battery manager when present 2015-04-29 00:04:29 +02:00
sbshc.c ACPI / SBS: Add 5 us delay to fix SBS hangs on MacBook 2015-04-30 23:18:11 +02:00
sbshc.h
scan.c ACPI / scan: Add support for ACPI _CLS device matching 2015-07-07 01:55:20 +02:00
sleep.c ACPI / PM: Enable all wakeup GPEs in suspend-to-idle 2015-03-30 01:52:02 +02:00
sleep.h ACPI / sleep: Drop acpi_suspend() which is not used 2015-03-18 12:53:21 +01:00
sysfs.c ACPI / sysfs: Treat the count field of counter_show() as unsigned 2015-03-10 01:03:30 +01:00
tables.c ACPI / table: Print GIC information when MADT is parsed 2015-03-25 11:49:31 +00:00
thermal.c thermal: of: fix cooling device weights in device tree 2015-05-04 21:27:50 -07:00
utils.c acpi-video-detect: video: Make video_detect code part of the video module 2015-06-19 01:10:36 +02:00
video_detect.c ACPI / video: Make acpi_video_unregister_backlight() private 2015-06-19 01:12:50 +02:00
wakeup.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00