[PATCH 6/13] ACPI / PM: Introduce __acpi_bus_get_power()

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Rafael J. Wysocki
Date: Wednesday, November 24, 2010 - 4:07 pm

From: Rafael J. Wysocki <rjw@sisk.pl>

It sometimes is necessary to get the power state of an ACPI device
without updating its device->power.state field, for example to
avoid inconsistencies between device->power.state and the reference
counters of the device's power resources.  For this purpose introduce
__acpi_bus_get_power() that will return the given device's power
state via a pointer (instead of modifying device->power.state)
and make acpi_bus_get_power() use it.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
 drivers/acpi/bus.c |   48 +++++++++++++++++++++++++++++-------------------
 1 file changed, 29 insertions(+), 19 deletions(-)

Index: linux-2.6/drivers/acpi/bus.c
===================================================================
--- linux-2.6.orig/drivers/acpi/bus.c
+++ linux-2.6/drivers/acpi/bus.c
@@ -196,34 +196,24 @@ EXPORT_SYMBOL(acpi_bus_get_private_data)
                                  Power Management
    -------------------------------------------------------------------------- */
 
-int acpi_bus_get_power(acpi_handle handle, int *state)
+static int __acpi_bus_get_power(struct acpi_device *device, int *state)
 {
 	int result = 0;
 	acpi_status status = 0;
-	struct acpi_device *device = NULL;
 	unsigned long long psc = 0;
 
-
-	result = acpi_bus_get_device(handle, &device);
-	if (result)
-		return result;
+	if (!device || !state)
+		return -EINVAL;
 
 	*state = ACPI_STATE_UNKNOWN;
 
-	if (!device->flags.power_manageable) {
-		/* TBD: Non-recursive algorithm for walking up hierarchy */
-		if (device->parent)
-			*state = device->parent->power.state;
-		else
-			*state = ACPI_STATE_D0;
-	} else {
+	if (device->flags.power_manageable) {
 		/*
 		 * Get the device's power state either directly (via _PSC) or
 		 * indirectly (via power resources).
 		 */
 		if (device->power.flags.power_resources) {
-			result = acpi_power_get_inferred_state(device,
-							&device->power.state);
+			result = acpi_power_get_inferred_state(device, state);
 			if (result)
 				return result;
 		} else if (device->power.flags.explicit_get) {
@@ -231,20 +221,40 @@ int acpi_bus_get_power(acpi_handle handl
 						       NULL, &psc);
 			if (ACPI_FAILURE(status))
 				return -ENODEV;
-			device->power.state = (int)psc;
+			*state = (int)psc;
 		}
-
-		*state = device->power.state;
+	} else {
+		/* TBD: Non-recursive algorithm for walking up hierarchy. */
+		*state = device->parent ?
+			device->parent->power.state : ACPI_STATE_D0;
 	}
 
 	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] power state is D%d\n",
-			  device->pnp.bus_id, device->power.state));
+			  device->pnp.bus_id, *state));
 
 	return 0;
 }
 
+
+int acpi_bus_get_power(acpi_handle handle, int *state)
+{
+	struct acpi_device *device;
+	int result;
+
+	result = acpi_bus_get_device(handle, &device);
+	if (result)
+		return result;
+
+	result = __acpi_bus_get_power(device, state);
+	if (result)
+		return result;
+
+	device->power.state = *state;
+	return 0;
+}
 EXPORT_SYMBOL(acpi_bus_get_power);
 
+
 int acpi_bus_set_power(acpi_handle handle, int state)
 {
 	int result = 0;

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 0/13] ACPI / PM: Rework power resources management, Rafael J. Wysocki, (Wed Nov 24, 4:01 pm)
[PATCH 1/13] ACPI / PM: Check device state before refcount ..., Rafael J. Wysocki, (Wed Nov 24, 4:02 pm)
[PATCH 2/13] ACPI / PM: Do not refcount power resources th ..., Rafael J. Wysocki, (Wed Nov 24, 4:03 pm)
[PATCH 3/13] ACPI / PM: Prevent acpi_power_get_inferred_st ..., Rafael J. Wysocki, (Wed Nov 24, 4:05 pm)
[PATCH 4/13] ACPI / PM: Add functions for manipulating lis ..., Rafael J. Wysocki, (Wed Nov 24, 4:06 pm)
[PATCH 5/13] ACPI / PM: Introduce function for refcounting ..., Rafael J. Wysocki, (Wed Nov 24, 4:06 pm)
[PATCH 6/13] ACPI / PM: Introduce __acpi_bus_get_power(), Rafael J. Wysocki, (Wed Nov 24, 4:07 pm)
[PATCH 7/13] ACPI / PM: Add function for device power stat ..., Rafael J. Wysocki, (Wed Nov 24, 4:08 pm)
[PATCH 8/13] ACPI / PM: Add function for updating device p ..., Rafael J. Wysocki, (Wed Nov 24, 4:09 pm)
[PATCH 9/13] ACPI / PM: Register acpi_power_driver early, Rafael J. Wysocki, (Wed Nov 24, 4:10 pm)
[PATCH 10/13] ACPI / PM: Register power resource devices a ..., Rafael J. Wysocki, (Wed Nov 24, 4:10 pm)
[PATCH 11/13] ACPI / Fan: Rework the handling of power res ..., Rafael J. Wysocki, (Wed Nov 24, 4:11 pm)
[PATCH 12/13] ACPI / PM: Drop acpi_bus_get_power(), Rafael J. Wysocki, (Wed Nov 24, 4:12 pm)
[PATCH 13/13] ACPI / PM: Drop acpi_power_nocheck, Rafael J. Wysocki, (Wed Nov 24, 4:12 pm)
[PATCH] Platform / x86: Make fujitsu_laptop use acpi_bus_u ..., Rafael J. Wysocki, (Fri Nov 26, 2:55 pm)
Re: [PATCH 12/13] ACPI / PM: Drop acpi_bus_get_power(), Rafael J. Wysocki, (Wed Dec 1, 3:07 pm)