aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/scan.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-02-09 09:29:20 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-02-13 07:46:38 -0500
commit0aa120a0138398d6597350f4c1dcb46d14be1a0b (patch)
tree15203990a9ffa34a5d51078702dc77c17d8c9855 /drivers/acpi/scan.c
parentf058cdf4cf3e5181172455f90fc73f2127b6ddf8 (diff)
ACPI / scan: Full transition to D3cold in acpi_device_unregister()
In order to drop reference counts of all power resources used by an ACPI device node being removed, acpi_device_unregister() calls acpi_power_transition(device, ACPI_STATE_D3_COLD), which effectively transitions the device node into D3cold if it uses any power resources. However, for some device nodes it may not be appropriate to remove power from them entirely before putting them into D3hot before. On the other hand, executing _PS3 for devices that don't use power resources before removing them shouldn't really hurt. In fact, that is done by acpi_bus_hot_remove_device(), but this is not the right place to do it, because the bus trimming may have caused power to be removed from the device node in question already before. For these reasons, make acpi_device_unregister() carry out full power-off transition for all device nodes supporting that and remove the direct evaluation of _PS3 from acpi_bus_hot_remove_device(). Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi/scan.c')
-rw-r--r--drivers/acpi/scan.c13
1 files changed, 4 insertions, 9 deletions
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 75fb14fc19e8..c7676ee8eca4 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -125,12 +125,6 @@ void acpi_bus_hot_remove_device(void *context)
125 /* Device node has been released. */ 125 /* Device node has been released. */
126 device = NULL; 126 device = NULL;
127 127
128 /* power off device */
129 status = acpi_evaluate_object(handle, "_PS3", NULL, NULL);
130 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND)
131 printk(KERN_WARNING PREFIX
132 "Power-off device failed\n");
133
134 if (ACPI_SUCCESS(acpi_get_handle(handle, "_LCK", &temp))) { 128 if (ACPI_SUCCESS(acpi_get_handle(handle, "_LCK", &temp))) {
135 arg_list.count = 1; 129 arg_list.count = 1;
136 arg_list.pointer = &arg; 130 arg_list.pointer = &arg;
@@ -780,10 +774,11 @@ static void acpi_device_unregister(struct acpi_device *device)
780 774
781 device_del(&device->dev); 775 device_del(&device->dev);
782 /* 776 /*
783 * Drop the reference counts of all power resources the device depends 777 * Transition the device to D3cold to drop the reference counts of all
784 * on and turn off the ones that have no more references. 778 * power resources the device depends on and turn off the ones that have
779 * no more references.
785 */ 780 */
786 acpi_power_transition(device, ACPI_STATE_D3_COLD); 781 acpi_device_set_power(device, ACPI_STATE_D3_COLD);
787 put_device(&device->dev); 782 put_device(&device->dev);
788} 783}
789 784