Deleted Added
sdiff udiff text old ( 128252 ) new ( 130208 )
full compact
1/*-
2 * Copyright (c) 2001 Michael Smith
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: head/sys/dev/acpica/acpi_powerres.c 128252 2004-04-14 17:58:19Z njl $");
29
30#include "opt_acpi.h"
31#include <sys/param.h>
32#include <sys/kernel.h>
33#include <sys/malloc.h>
34#include <sys/bus.h>
35
36#include "acpi.h"

--- 284 unchanged lines hidden (view full) ---

321 }
322 }
323
324 /* Check for valid transitions */
325 if (pc->ac_state == ACPI_STATE_D3 && state != ACPI_STATE_D0)
326 return_ACPI_STATUS (AE_BAD_PARAMETER); /* can only go to D0 from D3 */
327
328 /* Find transition mechanism(s) */
329 switch(state) {
330 case ACPI_STATE_D0:
331 method_name = "_PS0";
332 reslist_name = "_PR0";
333 break;
334 case ACPI_STATE_D1:
335 method_name = "_PS1";
336 reslist_name = "_PR1";
337 break;

--- 16 unchanged lines hidden (view full) ---

354 * reslist must be present. We need to do this before we go
355 * dereferencing resources (since we might be trying to go to
356 * a state we don't support).
357 *
358 * Note that if any states are supported, the device has to
359 * support D0 and D3. It's never an error to try to go to
360 * D0.
361 */
362 reslist_buffer.Pointer = NULL;
363 reslist_object = NULL;
364 if (ACPI_FAILURE(AcpiGetHandle(consumer, method_name, &method_handle)))
365 method_handle = NULL;
366 if (ACPI_FAILURE(AcpiGetHandle(consumer, reslist_name, &reslist_handle)))
367 reslist_handle = NULL;
368 if (reslist_handle == NULL && method_handle == NULL) {
369 if (state == ACPI_STATE_D0) {
370 pc->ac_state = ACPI_STATE_D0;
371 return_ACPI_STATUS (AE_OK);
372 }
373 if (state != ACPI_STATE_D3)
374 goto bad;
375
376 /* Turn off the resources listed in _PR0 to go to D3. */
377 if (ACPI_FAILURE(AcpiGetHandle(consumer, "_PR0", &pr0_handle)))
378 goto bad;
379 reslist_buffer.Length = ACPI_ALLOCATE_BUFFER;
380 status = AcpiEvaluateObject(pr0_handle, NULL, NULL, &reslist_buffer);
381 if (ACPI_FAILURE(status))
382 goto bad;
383 reslist_object = (ACPI_OBJECT *)reslist_buffer.Pointer;
384 if (reslist_object->Type != ACPI_TYPE_PACKAGE ||
385 reslist_object->Package.Count == 0) {
386
387 goto bad;
388 }
389 AcpiOsFree(reslist_buffer.Pointer);
390 reslist_buffer.Pointer = NULL;
391 reslist_object = NULL;
392 }
393
394 /*
395 * Check that we can actually fetch the list of power resources
396 */

--- 17 unchanged lines hidden (view full) ---

414 }
415 }
416
417 /*
418 * Now we are ready to switch, so kill off any current power
419 * resource references.
420 */
421 res_changed = 0;
422 while((pr = TAILQ_FIRST(&pc->ac_references)) != NULL) {
423 res_changed = 1;
424 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "removing reference to %s\n",
425 acpi_name(pr->ar_resource->ap_resource)));
426 TAILQ_REMOVE(&pr->ar_resource->ap_references, pr, ar_rlink);
427 TAILQ_REMOVE(&pc->ac_references, pr, ar_clink);
428 free(pr, M_ACPIPWR);
429 }
430

--- 41 unchanged lines hidden (view full) ---

472
473 /* Transition was successful */
474 pc->ac_state = state;
475 return_ACPI_STATUS (AE_OK);
476
477 bad:
478 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS,
479 "attempt to set unsupported state D%d\n", state));
480 status = AE_BAD_PARAMETER;
481
482 out:
483 if (reslist_buffer.Pointer != NULL)
484 AcpiOsFree(reslist_buffer.Pointer);
485 return_ACPI_STATUS (status);
486}
487
488/*

--- 189 unchanged lines hidden ---