ACPI: Introduce ACPI D3_COLD state support
authorZhang Rui <rui.zhang@intel.com>
Thu, 29 Mar 2012 06:09:38 +0000 (14:09 +0800)
committerLen Brown <len.brown@intel.com>
Fri, 30 Mar 2012 05:47:00 +0000 (01:47 -0400)
If a device has _PR3, it means the device supports D3_COLD.
Add the ability to validate and enter D3_COLD state in ACPI.

Signed-off-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/power.c
drivers/acpi/scan.c

index 9ac2a9fa90ff23092c96b9b1b51af5a83f1d598e..0d681fb7428b280b6fe2387befdda17187696a6b 100644 (file)
@@ -500,14 +500,14 @@ int acpi_power_transition(struct acpi_device *device, int state)
 {
        int result;
 
-       if (!device || (state < ACPI_STATE_D0) || (state > ACPI_STATE_D3))
+       if (!device || (state < ACPI_STATE_D0) || (state > ACPI_STATE_D3_COLD))
                return -EINVAL;
 
        if (device->power.state == state)
                return 0;
 
        if ((device->power.state < ACPI_STATE_D0)
-           || (device->power.state > ACPI_STATE_D3))
+           || (device->power.state > ACPI_STATE_D3_COLD))
                return -ENODEV;
 
        /* TBD: Resources must be ordered. */
index 8ab80bafe3f1604f3e05e7287ed5fe4f9ed1e6fb..571396cf6110e60d2707a2ff01df1ed5d8e27559 100644 (file)
@@ -885,6 +885,13 @@ static int acpi_bus_get_power_flags(struct acpi_device *device)
                                acpi_bus_add_power_resource(ps->resources.handles[j]);
                }
 
+               /* The exist of _PR3 indicates D3Cold support */
+               if (i == ACPI_STATE_D3) {
+                       status = acpi_get_handle(device->handle, object_name, &handle);
+                       if (ACPI_SUCCESS(status))
+                               device->power.states[ACPI_STATE_D3_COLD].flags.valid = 1;
+               }
+
                /* Evaluate "_PSx" to see if we can do explicit sets */
                object_name[2] = 'S';
                status = acpi_get_handle(device->handle, object_name, &handle);