Lines Matching +full:power +full:- +full:on
1 /*-
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
40 * ACPI power resource management.
42 * Power resource behaviour is slightly complicated by the fact that
43 * a single power resource may provide power for more than one device.
44 * Thus, we must track the device(s) being powered by a given power
48 * ugly case where we may turn off power to a device which is in use because
49 * we don't know that it depends on a given resource. We should perhaps
53 * on, turned off, etc.
56 static MALLOC_DEFINE(M_ACPIPWR, "acpipwr", "ACPI power resources");
62 /* Return values from _STA on a power resource */
66 /* A relationship between a power resource and a consumer. */
70 TAILQ_ENTRY(acpi_powerreference) ar_rlink; /* link on resource list */
71 TAILQ_ENTRY(acpi_powerreference) ar_clink; /* link on consumer */
74 /* A power-managed device. */
83 /* A power resource. */
96 ACPI_SERIAL_DECL(powerres, "ACPI power resources");
117 * Register a power resource.
144 TAILQ_INIT(&rp->ap_references); in acpi_pwr_register_resource()
145 rp->ap_resource = res; in acpi_pwr_register_resource()
147 /* Get the Power Resource object */ in acpi_pwr_register_resource()
150 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "no power resource object\n")); in acpi_pwr_register_resource()
154 if (obj->Type != ACPI_TYPE_POWER) { in acpi_pwr_register_resource()
156 "questionable power resource object %s\n", in acpi_pwr_register_resource()
161 rp->ap_systemlevel = obj->PowerResource.SystemLevel; in acpi_pwr_register_resource()
162 rp->ap_order = obj->PowerResource.ResourceOrder; in acpi_pwr_register_resource()
167 if (srp == NULL || rp->ap_order < srp->ap_order) { in acpi_pwr_register_resource()
172 if (rp->ap_order < srp->ap_order) { in acpi_pwr_register_resource()
181 "registered power resource %s\n", acpi_name(res))); in acpi_pwr_register_resource()
193 * Deregister a power resource.
210 if (TAILQ_FIRST(&rp->ap_references) != NULL) in acpi_pwr_deregister_resource()
217 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "deregistered power resource %s\n", in acpi_pwr_deregister_resource()
225 * Register a power consumer.
241 /* Allocate a new power consumer */ in acpi_pwr_register_consumer()
245 TAILQ_INIT(&pc->ac_references); in acpi_pwr_register_consumer()
246 pc->ac_consumer = consumer; in acpi_pwr_register_consumer()
249 pc->ac_state = ACPI_STATE_UNKNOWN; in acpi_pwr_register_consumer()
251 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "registered power consumer %s\n", in acpi_pwr_register_consumer()
259 * Deregister a power consumer.
277 if (TAILQ_FIRST(&pc->ac_references) != NULL) in acpi_pwr_deregister_consumer()
284 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "deregistered power consumer %s\n", in acpi_pwr_deregister_consumer()
292 * Set a power consumer to a particular power state.
306 /* It's never ok to switch a non-existent consumer. */ in acpi_pwr_switch_consumer()
318 panic("acpi added power consumer but can't find it"); in acpi_pwr_switch_consumer()
323 if (pc->ac_state == ACPI_STATE_D3 && state != ACPI_STATE_D0) in acpi_pwr_switch_consumer()
347 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "setup to switch %s D%d -> D%d\n", in acpi_pwr_switch_consumer()
348 acpi_name(consumer), pc->ac_state, state)); in acpi_pwr_switch_consumer()
366 pc->ac_state = ACPI_STATE_D0; in acpi_pwr_switch_consumer()
378 * no _PR0 method, this object doesn't support ACPI power states. in acpi_pwr_switch_consumer()
407 * Check that we can actually fetch the list of power resources in acpi_pwr_switch_consumer()
420 if (reslist_object->Type != ACPI_TYPE_PACKAGE) { in acpi_pwr_switch_consumer()
423 reslist_object->Type)); in acpi_pwr_switch_consumer()
430 * Now we are ready to switch, so kill off any current power in acpi_pwr_switch_consumer()
436 * Add new power resource references, if we have any. Traverse the in acpi_pwr_switch_consumer()
442 reslist_object->Package.Count)); in acpi_pwr_switch_consumer()
460 /* Invoke power state switch method (if present) */ in acpi_pwr_switch_consumer()
467 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "failed to set state - %s\n", in acpi_pwr_switch_consumer()
469 pc->ac_state = ACPI_STATE_UNKNOWN; in acpi_pwr_switch_consumer()
477 pc->ac_state = state; in acpi_pwr_switch_consumer()
487 /* Enable or disable a power resource for wake */
506 panic("acpi wake added power consumer but can't find it"); in acpi_pwr_wake_enable()
527 * Called to create a reference between a power consumer and a power resource
545 "can't create a power reference for object type %d\n", in acpi_pwr_reference_resource()
546 obj->Type)); in acpi_pwr_reference_resource()
553 "couldn't register power resource %s - %s\n", in acpi_pwr_reference_resource()
554 obj->String.Pointer, AcpiFormatException(status))); in acpi_pwr_reference_resource()
558 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "power resource list corrupted\n")); in acpi_pwr_reference_resource()
561 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "found power resource %s\n", in acpi_pwr_reference_resource()
562 acpi_name(rp->ap_resource))); in acpi_pwr_reference_resource()
567 "allocation failed for a power consumer reference\n")); in acpi_pwr_reference_resource()
570 pr->ar_consumer = pc; in acpi_pwr_reference_resource()
571 pr->ar_resource = rp; in acpi_pwr_reference_resource()
572 TAILQ_INSERT_TAIL(&pc->ac_references, pr, ar_clink); in acpi_pwr_reference_resource()
573 TAILQ_INSERT_TAIL(&rp->ap_references, pr, ar_rlink); in acpi_pwr_reference_resource()
588 while ((pr = TAILQ_FIRST(&pc->ac_references)) != NULL) { in acpi_pwr_dereference_resource()
590 acpi_name(pr->ar_resource->ap_resource))); in acpi_pwr_dereference_resource()
591 TAILQ_REMOVE(&pr->ar_resource->ap_references, pr, ar_rlink); in acpi_pwr_dereference_resource()
592 TAILQ_REMOVE(&pc->ac_references, pr, ar_clink); in acpi_pwr_dereference_resource()
601 * Switch power resources to conform to the desired state.
603 * Consumers may have modified the power resource list in an arbitrary
617 * Sweep the list forwards turning things on. in acpi_pwr_switch_power()
620 if (TAILQ_FIRST(&rp->ap_references) == NULL) { in acpi_pwr_switch_power()
622 "%s has no references, not turning on\n", in acpi_pwr_switch_power()
623 acpi_name(rp->ap_resource))); in acpi_pwr_switch_power()
627 status = acpi_GetInteger(rp->ap_resource, "_STA", &cur); in acpi_pwr_switch_power()
629 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "can't get status of %s - %d\n", in acpi_pwr_switch_power()
630 acpi_name(rp->ap_resource), status)); in acpi_pwr_switch_power()
641 status = AcpiEvaluateObject(rp->ap_resource, "_ON", NULL, NULL); in acpi_pwr_switch_power()
644 "failed to switch %s on - %s\n", in acpi_pwr_switch_power()
645 acpi_name(rp->ap_resource), in acpi_pwr_switch_power()
648 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "switched %s on\n", in acpi_pwr_switch_power()
649 acpi_name(rp->ap_resource))); in acpi_pwr_switch_power()
652 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "%s is already on\n", in acpi_pwr_switch_power()
653 acpi_name(rp->ap_resource))); in acpi_pwr_switch_power()
660 if (TAILQ_FIRST(&rp->ap_references) != NULL) { in acpi_pwr_switch_power()
663 acpi_name(rp->ap_resource))); in acpi_pwr_switch_power()
667 status = acpi_GetInteger(rp->ap_resource, "_STA", &cur); in acpi_pwr_switch_power()
669 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "can't get status of %s - %d\n", in acpi_pwr_switch_power()
670 acpi_name(rp->ap_resource), status)); in acpi_pwr_switch_power()
681 status = AcpiEvaluateObject(rp->ap_resource, "_OFF", NULL, NULL); in acpi_pwr_switch_power()
684 "failed to switch %s off - %s\n", in acpi_pwr_switch_power()
685 acpi_name(rp->ap_resource), in acpi_pwr_switch_power()
689 acpi_name(rp->ap_resource))); in acpi_pwr_switch_power()
693 acpi_name(rp->ap_resource))); in acpi_pwr_switch_power()
701 * Find a power resource's control structure.
712 if (rp->ap_resource == res) in acpi_pwr_find_resource()
720 * Find a power consumer's control structure.
731 if (pc->ac_consumer == consumer) in acpi_pwr_find_consumer()