diff options
Diffstat (limited to 'sys/dev/acpica/acpi_powerres.c')
-rw-r--r-- | sys/dev/acpica/acpi_powerres.c | 378 |
1 files changed, 204 insertions, 174 deletions
diff --git a/sys/dev/acpica/acpi_powerres.c b/sys/dev/acpica/acpi_powerres.c index 7460b86..0223b32 100644 --- a/sys/dev/acpica/acpi_powerres.c +++ b/sys/dev/acpica/acpi_powerres.c @@ -27,27 +27,14 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); -#include "opt_acpi.h" /* XXX trim includes */ +#include "opt_acpi.h" #include <sys/param.h> #include <sys/kernel.h> -#include <sys/proc.h> #include <sys/malloc.h> #include <sys/bus.h> -#include <sys/conf.h> -#include <sys/ioccom.h> -#include <sys/reboot.h> -#include <sys/sysctl.h> -#include <sys/systm.h> -#include <sys/ctype.h> - -#include <machine/clock.h> - -#include <machine/resource.h> #include "acpi.h" - #include <dev/acpica/acpivar.h> -#include <dev/acpica/acpiio.h> /* * ACPI power resource management. @@ -70,62 +57,58 @@ __FBSDID("$FreeBSD$"); MALLOC_DEFINE(M_ACPIPWR, "acpipwr", "ACPI power resources"); -/* - * Hooks for the ACPI CA debugging infrastructure - */ +/* Hooks for the ACPI CA debugging infrastructure */ #define _COMPONENT ACPI_POWER ACPI_MODULE_NAME("POWERRES") -/* return values from _STA on a power resource */ +/* Return values from _STA on a power resource */ #define ACPI_PWR_OFF 0 #define ACPI_PWR_ON 1 -/* - * A relationship between a power resource and a consumer. - */ +/* A relationship between a power resource and a consumer. */ struct acpi_powerreference { - struct acpi_powerconsumer *ar_consumer; - struct acpi_powerresource *ar_resource; - TAILQ_ENTRY(acpi_powerreference) ar_rlink; /* link on resource list */ - TAILQ_ENTRY(acpi_powerreference) ar_clink; /* link on consumer */ + struct acpi_powerconsumer *ar_consumer; + struct acpi_powerresource *ar_resource; + TAILQ_ENTRY(acpi_powerreference) ar_rlink; /* link on resource list */ + TAILQ_ENTRY(acpi_powerreference) ar_clink; /* link on consumer */ }; -/* - * A power-managed device. - */ +/* A power-managed device. */ struct acpi_powerconsumer { - ACPI_HANDLE ac_consumer; /* device which is powered */ - int ac_state; - TAILQ_ENTRY(acpi_powerconsumer) ac_link; - TAILQ_HEAD(,acpi_powerreference) ac_references; + /* Device which is powered */ + ACPI_HANDLE ac_consumer; + int ac_state; + TAILQ_ENTRY(acpi_powerconsumer) ac_link; + TAILQ_HEAD(,acpi_powerreference) ac_references; }; -/* - * A power resource. - */ +/* A power resource. */ struct acpi_powerresource { - TAILQ_ENTRY(acpi_powerresource) ap_link; - TAILQ_HEAD(,acpi_powerreference) ap_references; - ACPI_HANDLE ap_resource; /* the resource's handle */ - ACPI_INTEGER ap_systemlevel; - ACPI_INTEGER ap_order; + TAILQ_ENTRY(acpi_powerresource) ap_link; + TAILQ_HEAD(,acpi_powerreference) ap_references; + ACPI_HANDLE ap_resource; + ACPI_INTEGER ap_systemlevel; + ACPI_INTEGER ap_order; }; -static TAILQ_HEAD(acpi_powerresource_list, acpi_powerresource) acpi_powerresources; -static TAILQ_HEAD(acpi_powerconsumer_list, acpi_powerconsumer) acpi_powerconsumers; - -static ACPI_STATUS acpi_pwr_register_consumer(ACPI_HANDLE consumer); -static ACPI_STATUS acpi_pwr_deregister_consumer(ACPI_HANDLE consumer); -static ACPI_STATUS acpi_pwr_register_resource(ACPI_HANDLE res); -static ACPI_STATUS acpi_pwr_deregister_resource(ACPI_HANDLE res); -static void acpi_pwr_reference_resource(ACPI_OBJECT *obj, void *arg); -static ACPI_STATUS acpi_pwr_switch_power(void); -static struct acpi_powerresource *acpi_pwr_find_resource(ACPI_HANDLE res); -static struct acpi_powerconsumer *acpi_pwr_find_consumer(ACPI_HANDLE consumer); - -/* - * Initialise our lists. - */ +static TAILQ_HEAD(acpi_powerresource_list, acpi_powerresource) + acpi_powerresources; +static TAILQ_HEAD(acpi_powerconsumer_list, acpi_powerconsumer) + acpi_powerconsumers; + +static ACPI_STATUS acpi_pwr_register_consumer(ACPI_HANDLE consumer); +static ACPI_STATUS acpi_pwr_deregister_consumer(ACPI_HANDLE consumer); +static ACPI_STATUS acpi_pwr_register_resource(ACPI_HANDLE res); +static ACPI_STATUS acpi_pwr_deregister_resource(ACPI_HANDLE res); +static void acpi_pwr_reference_resource(ACPI_OBJECT *obj, + void *arg); +static ACPI_STATUS acpi_pwr_switch_power(void); +static struct acpi_powerresource + *acpi_pwr_find_resource(ACPI_HANDLE res); +static struct acpi_powerconsumer + *acpi_pwr_find_consumer(ACPI_HANDLE consumer); + +/* Initialise our lists. */ static void acpi_pwr_init(void *junk) { @@ -152,11 +135,11 @@ acpi_pwr_register_resource(ACPI_HANDLE res) rp = NULL; buf.Pointer = NULL; - /* look to see if we know about this resource */ + /* Look to see if we know about this resource */ if (acpi_pwr_find_resource(res) != NULL) - return_ACPI_STATUS(AE_OK); /* already know about it */ + return_ACPI_STATUS (AE_OK); /* already know about it */ - /* allocate a new resource */ + /* Allocate a new resource */ if ((rp = malloc(sizeof(*rp), M_ACPIPWR, M_NOWAIT | M_ZERO)) == NULL) { status = AE_NO_MEMORY; goto out; @@ -164,7 +147,7 @@ acpi_pwr_register_resource(ACPI_HANDLE res) TAILQ_INIT(&rp->ap_references); rp->ap_resource = res; - /* get the Power Resource object */ + /* Get the Power Resource object */ buf.Length = ACPI_ALLOCATE_BUFFER; if (ACPI_FAILURE(status = AcpiEvaluateObject(res, NULL, NULL, &buf))) { ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "no power resource object\n")); @@ -172,35 +155,40 @@ acpi_pwr_register_resource(ACPI_HANDLE res) } obj = buf.Pointer; if (obj->Type != ACPI_TYPE_POWER) { - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "questionable power resource object %s\n", acpi_name(res))); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, + "questionable power resource object %s\n", + acpi_name(res))); status = AE_TYPE; goto out; } rp->ap_systemlevel = obj->PowerResource.SystemLevel; rp->ap_order = obj->PowerResource.ResourceOrder; - /* sort the resource into the list */ + /* Sort the resource into the list */ status = AE_OK; srp = TAILQ_FIRST(&acpi_powerresources); - if ((srp == NULL) || (rp->ap_order < srp->ap_order)) { + if (srp == NULL || rp->ap_order < srp->ap_order) { TAILQ_INSERT_HEAD(&acpi_powerresources, rp, ap_link); goto done; } - TAILQ_FOREACH(srp, &acpi_powerresources, ap_link) + TAILQ_FOREACH(srp, &acpi_powerresources, ap_link) { if (rp->ap_order < srp->ap_order) { TAILQ_INSERT_BEFORE(srp, rp, ap_link); goto done; } + } TAILQ_INSERT_TAIL(&acpi_powerresources, rp, ap_link); done: - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "registered power resource %s\n", acpi_name(res))); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, + "registered power resource %s\n", acpi_name(res))); + out: if (buf.Pointer != NULL) AcpiOsFree(buf.Pointer); - if (ACPI_FAILURE(status) && (rp != NULL)) + if (ACPI_FAILURE(status) && rp != NULL) free(rp, M_ACPIPWR); - return_ACPI_STATUS(status); + return_ACPI_STATUS (status); } /* @@ -215,21 +203,22 @@ acpi_pwr_deregister_resource(ACPI_HANDLE res) rp = NULL; - /* find the resource */ + /* Find the resource */ if ((rp = acpi_pwr_find_resource(res)) == NULL) - return_ACPI_STATUS(AE_BAD_PARAMETER); + return_ACPI_STATUS (AE_BAD_PARAMETER); - /* check that there are no consumers referencing this resource */ + /* Check that there are no consumers referencing this resource */ if (TAILQ_FIRST(&rp->ap_references) != NULL) - return_ACPI_STATUS(AE_BAD_PARAMETER); + return_ACPI_STATUS (AE_BAD_PARAMETER); - /* pull it off the list and free it */ + /* Pull it off the list and free it */ TAILQ_REMOVE(&acpi_powerresources, rp, ap_link); free(rp, M_ACPIPWR); - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "deregistered power resource %s\n", acpi_name(res))); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "deregistered power resource %s\n", + acpi_name(res))); - return_ACPI_STATUS(AE_OK); + return_ACPI_STATUS (AE_OK); } /* @@ -244,22 +233,24 @@ acpi_pwr_register_consumer(ACPI_HANDLE consumer) ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - /* check to see whether we know about this consumer already */ + /* Check to see whether we know about this consumer already */ if ((pc = acpi_pwr_find_consumer(consumer)) != NULL) - return_ACPI_STATUS(AE_OK); + return_ACPI_STATUS (AE_OK); - /* allocate a new power consumer */ + /* Allocate a new power consumer */ if ((pc = malloc(sizeof(*pc), M_ACPIPWR, M_NOWAIT)) == NULL) - return_ACPI_STATUS(AE_NO_MEMORY); + return_ACPI_STATUS (AE_NO_MEMORY); TAILQ_INSERT_HEAD(&acpi_powerconsumers, pc, ac_link); TAILQ_INIT(&pc->ac_references); pc->ac_consumer = consumer; - pc->ac_state = ACPI_STATE_UNKNOWN; /* XXX we should try to find its current state */ + /* XXX we should try to find its current state */ + pc->ac_state = ACPI_STATE_UNKNOWN; - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "registered power consumer %s\n", acpi_name(consumer))); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "registered power consumer %s\n", + acpi_name(consumer))); - return_ACPI_STATUS(AE_OK); + return_ACPI_STATUS (AE_OK); } /* @@ -275,20 +266,21 @@ acpi_pwr_deregister_consumer(ACPI_HANDLE consumer) ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - /* find the consumer */ + /* Find the consumer */ if ((pc = acpi_pwr_find_consumer(consumer)) == NULL) - return_ACPI_STATUS(AE_BAD_PARAMETER); + return_ACPI_STATUS (AE_BAD_PARAMETER); - /* make sure the consumer's not referencing anything right now */ + /* Make sure the consumer's not referencing anything right now */ if (TAILQ_FIRST(&pc->ac_references) != NULL) - return_ACPI_STATUS(AE_BAD_PARAMETER); + return_ACPI_STATUS (AE_BAD_PARAMETER); - /* pull the consumer off the list and free it */ + /* Pull the consumer off the list and free it */ TAILQ_REMOVE(&acpi_powerconsumers, pc, ac_link); - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "deregistered power consumer %s\n", acpi_name(consumer))); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "deregistered power consumer %s\n", + acpi_name(consumer))); - return_ACPI_STATUS(AE_OK); + return_ACPI_STATUS (AE_OK); } /* @@ -308,20 +300,20 @@ acpi_pwr_switch_consumer(ACPI_HANDLE consumer, int state) ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - /* find the consumer */ + /* Find the consumer */ if ((pc = acpi_pwr_find_consumer(consumer)) == NULL) { if (ACPI_FAILURE(status = acpi_pwr_register_consumer(consumer))) - return_ACPI_STATUS(status); + return_ACPI_STATUS (status); if ((pc = acpi_pwr_find_consumer(consumer)) == NULL) { - return_ACPI_STATUS(AE_ERROR); /* something very wrong */ + return_ACPI_STATUS (AE_ERROR); /* something very wrong */ } } - /* check for valid transitions */ - if ((pc->ac_state == ACPI_STATE_D3) && (state != ACPI_STATE_D0)) - return_ACPI_STATUS(AE_BAD_PARAMETER); /* can only go to D0 from D3 */ + /* Check for valid transitions */ + if (pc->ac_state == ACPI_STATE_D3 && state != ACPI_STATE_D0) + return_ACPI_STATUS (AE_BAD_PARAMETER); /* can only go to D0 from D3 */ - /* find transition mechanism(s) */ + /* Find transition mechanism(s) */ switch(state) { case ACPI_STATE_D0: method_name = "_PS0"; @@ -340,10 +332,10 @@ acpi_pwr_switch_consumer(ACPI_HANDLE consumer, int state) reslist_name = "_PR3"; break; default: - return_ACPI_STATUS(AE_BAD_PARAMETER); + return_ACPI_STATUS (AE_BAD_PARAMETER); } ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "setup to switch %s D%d -> D%d\n", - acpi_name(consumer), pc->ac_state, state)); + acpi_name(consumer), pc->ac_state, state)); /* * Verify that this state is supported, ie. one of method or @@ -361,26 +353,25 @@ acpi_pwr_switch_consumer(ACPI_HANDLE consumer, int state) method_handle = NULL; if (ACPI_FAILURE(AcpiGetHandle(consumer, reslist_name, &reslist_handle))) reslist_handle = NULL; - if ((reslist_handle == NULL) && (method_handle == NULL)) { + if (reslist_handle == NULL && method_handle == NULL) { if (state == ACPI_STATE_D0) { pc->ac_state = ACPI_STATE_D0; - return_ACPI_STATUS(AE_OK); + return_ACPI_STATUS (AE_OK); } - if (state != ACPI_STATE_D3) { + if (state != ACPI_STATE_D3) goto bad; - } - /* turn off the resources listed in _PR0 to go to D3. */ - if (ACPI_FAILURE(AcpiGetHandle(consumer, "_PR0", &pr0_handle))) { + /* Turn off the resources listed in _PR0 to go to D3. */ + if (ACPI_FAILURE(AcpiGetHandle(consumer, "_PR0", &pr0_handle))) goto bad; - } reslist_buffer.Length = ACPI_ALLOCATE_BUFFER; - if (ACPI_FAILURE(status = AcpiEvaluateObject(pr0_handle, NULL, NULL, &reslist_buffer))) { + status = AcpiEvaluateObject(pr0_handle, NULL, NULL, &reslist_buffer); + if (ACPI_FAILURE(status)) goto bad; - } reslist_object = (ACPI_OBJECT *)reslist_buffer.Pointer; - if ((reslist_object->Type != ACPI_TYPE_PACKAGE) || - (reslist_object->Package.Count == 0)) { + if (reslist_object->Type != ACPI_TYPE_PACKAGE || + reslist_object->Package.Count == 0) { + goto bad; } AcpiOsFree(reslist_buffer.Pointer); @@ -393,27 +384,33 @@ acpi_pwr_switch_consumer(ACPI_HANDLE consumer, int state) */ if (reslist_handle != NULL) { reslist_buffer.Length = ACPI_ALLOCATE_BUFFER; - if (ACPI_FAILURE(status = AcpiEvaluateObject(reslist_handle, NULL, NULL, &reslist_buffer))) { - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "can't evaluate resource list %s\n", - acpi_name(reslist_handle))); + status = AcpiEvaluateObject(reslist_handle, NULL, NULL, + &reslist_buffer); + if (ACPI_FAILURE(status)) { + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, + "can't evaluate resource list %s\n", + acpi_name(reslist_handle))); goto out; } reslist_object = (ACPI_OBJECT *)reslist_buffer.Pointer; if (reslist_object->Type != ACPI_TYPE_PACKAGE) { - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "resource list is not ACPI_TYPE_PACKAGE (%d)\n", - reslist_object->Type)); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, + "resource list is not ACPI_TYPE_PACKAGE (%d)\n", + reslist_object->Type)); status = AE_TYPE; goto out; } } /* - * Now we are ready to switch, so kill off any current power resource references. + * Now we are ready to switch, so kill off any current power + * resource references. */ res_changed = 0; while((pr = TAILQ_FIRST(&pc->ac_references)) != NULL) { res_changed = 1; - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "removing reference to %s\n", acpi_name(pr->ar_resource->ap_resource))); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "removing reference to %s\n", + acpi_name(pr->ar_resource->ap_resource))); TAILQ_REMOVE(&pr->ar_resource->ap_references, pr, ar_rlink); TAILQ_REMOVE(&pc->ac_references, pr, ar_clink); free(pr, M_ACPIPWR); @@ -427,7 +424,8 @@ acpi_pwr_switch_consumer(ACPI_HANDLE consumer, int state) if (reslist_object != NULL) { ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "referencing %d new resources\n", reslist_object->Package.Count)); - acpi_ForeachPackageObject(reslist_object, acpi_pwr_reference_resource, pc); + acpi_ForeachPackageObject(reslist_object, acpi_pwr_reference_resource, + pc); res_changed = 1; } @@ -436,36 +434,43 @@ acpi_pwr_switch_consumer(ACPI_HANDLE consumer, int state) * pass now. */ if (ACPI_FAILURE(status = acpi_pwr_switch_power())) { - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "failed to correctly switch resources to move %s to D%d\n", + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, + "failed to switch resources from %s to D%d\n", acpi_name(consumer), state)); - goto out; /* XXX is this appropriate? Should we return to previous state? */ + + /* XXX is this appropriate? Should we return to previous state? */ + goto out; } - /* invoke power state switch method (if present) */ + /* Invoke power state switch method (if present) */ if (method_handle != NULL) { - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "invoking state transition method %s\n", - acpi_name(method_handle))); - if (ACPI_FAILURE(status = AcpiEvaluateObject(method_handle, NULL, NULL, NULL))) { + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, + "invoking state transition method %s\n", + acpi_name(method_handle))); + status = AcpiEvaluateObject(method_handle, NULL, NULL, NULL); + if (ACPI_FAILURE(status)) { ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "failed to set state - %s\n", - AcpiFormatException(status))); + AcpiFormatException(status))); pc->ac_state = ACPI_STATE_UNKNOWN; - goto out; /* XXX Should we return to previous state? */ + + /* XXX Should we return to previous state? */ + goto out; } } - /* transition was successful */ + /* Transition was successful */ pc->ac_state = state; - return_ACPI_STATUS(AE_OK); + return_ACPI_STATUS (AE_OK); bad: - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "attempt to set unsupported state D%d\n", - state)); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, + "attempt to set unsupported state D%d\n", state)); status = AE_BAD_PARAMETER; out: if (reslist_buffer.Pointer != NULL) AcpiOsFree(reslist_buffer.Pointer); - return_ACPI_STATUS(status); + return_ACPI_STATUS (status); } /* @@ -487,44 +492,48 @@ acpi_pwr_reference_resource(ACPI_OBJECT *obj, void *arg) switch (obj->Type) { case ACPI_TYPE_ANY: ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "building reference from %s to %s\n", - acpi_name(pc->ac_consumer), acpi_name(obj->Reference.Handle))); - + acpi_name(pc->ac_consumer), + acpi_name(obj->Reference.Handle))); res = obj->Reference.Handle; break; - case ACPI_TYPE_STRING: ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "building reference from %s to %s\n", acpi_name(pc->ac_consumer), obj->String.Pointer)); - /* get the handle of the resource */ - if (ACPI_FAILURE(status = AcpiGetHandle(NULL, obj->String.Pointer, &res))) { - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "couldn't find power resource %s\n", - obj->String.Pointer)); + /* Get the handle of the resource */ + status = AcpiGetHandle(NULL, obj->String.Pointer, &res); + if (ACPI_FAILURE(status)) { + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, + "couldn't find power resource %s\n", + obj->String.Pointer)); return_VOID; } break; - default: - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "don't know how to create a power reference to object type %d\n", - obj->Type)); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, + "can't create a power reference for object type %d\n", + obj->Type)); return_VOID; } - /* create/look up the resource */ + /* Create/look up the resource */ if (ACPI_FAILURE(status = acpi_pwr_register_resource(res))) { - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "couldn't register power resource %s - %s\n", - obj->String.Pointer, AcpiFormatException(status))); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, + "couldn't register power resource %s - %s\n", + obj->String.Pointer, AcpiFormatException(status))); return_VOID; } if ((rp = acpi_pwr_find_resource(res)) == NULL) { ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "power resource list corrupted\n")); return_VOID; } - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "found power resource %s\n", acpi_name(rp->ap_resource))); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "found power resource %s\n", + acpi_name(rp->ap_resource))); - /* create a reference between the consumer and resource */ + /* Create a reference between the consumer and resource */ if ((pr = malloc(sizeof(*pr), M_ACPIPWR, M_NOWAIT | M_ZERO)) == NULL) { - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "couldn't allocate memory for a power consumer reference\n")); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, + "allocation failed for a power consumer reference\n")); return_VOID; } pr->ar_consumer = pc; @@ -556,16 +565,20 @@ acpi_pwr_switch_power(void) */ TAILQ_FOREACH(rp, &acpi_powerresources, ap_link) { if (TAILQ_FIRST(&rp->ap_references) == NULL) { - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "%s has no references, not turning on\n", - acpi_name(rp->ap_resource))); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, + "%s has no references, not turning on\n", + acpi_name(rp->ap_resource))); continue; } - /* we could cache this if we trusted it not to change under us */ - if (ACPI_FAILURE(status = acpi_EvaluateInteger(rp->ap_resource, "_STA", &cur))) { + /* We could cache this if we trusted it not to change under us */ + status = acpi_EvaluateInteger(rp->ap_resource, "_STA", &cur); + if (ACPI_FAILURE(status)) { ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "can't get status of %s - %d\n", acpi_name(rp->ap_resource), status)); - continue; /* XXX is this correct? Always switch if in doubt? */ + + /* XXX is this correct? Always switch if in doubt? */ + continue; } /* @@ -574,32 +587,40 @@ acpi_pwr_switch_power(void) * help much. */ if (cur != ACPI_PWR_ON) { - if (ACPI_FAILURE(status = AcpiEvaluateObject(rp->ap_resource, "_ON", NULL, NULL))) { - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "failed to switch %s on - %s\n", - acpi_name(rp->ap_resource), AcpiFormatException(status))); + status = AcpiEvaluateObject(rp->ap_resource, "_ON", NULL, NULL); + if (ACPI_FAILURE(status)) { + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, + "failed to switch %s on - %s\n", + acpi_name(rp->ap_resource), + AcpiFormatException(status))); } else { - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "switched %s on\n", acpi_name(rp->ap_resource))); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "switched %s on\n", + acpi_name(rp->ap_resource))); } } else { - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "%s is already on\n", acpi_name(rp->ap_resource))); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "%s is already on\n", + acpi_name(rp->ap_resource))); } } - /* - * Sweep the list backwards turning things off. - */ - TAILQ_FOREACH_REVERSE(rp, &acpi_powerresources, acpi_powerresource_list, ap_link) { + /* Sweep the list backwards turning things off. */ + TAILQ_FOREACH_REVERSE(rp, &acpi_powerresources, acpi_powerresource_list, + ap_link) { + if (TAILQ_FIRST(&rp->ap_references) != NULL) { - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "%s has references, not turning off\n", - acpi_name(rp->ap_resource))); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, + "%s has references, not turning off\n", + acpi_name(rp->ap_resource))); continue; } - /* we could cache this if we trusted it not to change under us */ - if (ACPI_FAILURE(status = acpi_EvaluateInteger(rp->ap_resource, "_STA", &cur))) { + /* We could cache this if we trusted it not to change under us */ + status = acpi_EvaluateInteger(rp->ap_resource, "_STA", &cur); + if (ACPI_FAILURE(status)) { ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "can't get status of %s - %d\n", acpi_name(rp->ap_resource), status)); - continue; /* XXX is this correct? Always switch if in doubt? */ + /* XXX is this correct? Always switch if in doubt? */ + continue; } /* @@ -608,17 +629,23 @@ acpi_pwr_switch_power(void) * help much. */ if (cur != ACPI_PWR_OFF) { - if (ACPI_FAILURE(status = AcpiEvaluateObject(rp->ap_resource, "_OFF", NULL, NULL))) { - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "failed to switch %s off - %s\n", - acpi_name(rp->ap_resource), AcpiFormatException(status))); + status = AcpiEvaluateObject(rp->ap_resource, "_OFF", NULL, NULL); + if (ACPI_FAILURE(status)) { + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, + "failed to switch %s off - %s\n", + acpi_name(rp->ap_resource), + AcpiFormatException(status))); } else { - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "switched %s off\n", acpi_name(rp->ap_resource))); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "switched %s off\n", + acpi_name(rp->ap_resource))); } } else { - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "%s is already off\n", acpi_name(rp->ap_resource))); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "%s is already off\n", + acpi_name(rp->ap_resource))); } } - return_ACPI_STATUS(AE_OK); + + return_ACPI_STATUS (AE_OK); } /* @@ -631,10 +658,12 @@ acpi_pwr_find_resource(ACPI_HANDLE res) ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - TAILQ_FOREACH(rp, &acpi_powerresources, ap_link) + TAILQ_FOREACH(rp, &acpi_powerresources, ap_link) { if (rp->ap_resource == res) break; - return_PTR(rp); + } + + return_PTR (rp); } /* @@ -647,9 +676,10 @@ acpi_pwr_find_consumer(ACPI_HANDLE consumer) ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - TAILQ_FOREACH(pc, &acpi_powerconsumers, ac_link) + TAILQ_FOREACH(pc, &acpi_powerconsumers, ac_link) { if (pc->ac_consumer == consumer) break; - return_PTR(pc); -} + } + return_PTR (pc); +} |