diff options
Diffstat (limited to 'sys/contrib/dev/acpica/hwsleep.c')
-rw-r--r-- | sys/contrib/dev/acpica/hwsleep.c | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/sys/contrib/dev/acpica/hwsleep.c b/sys/contrib/dev/acpica/hwsleep.c index ba7b341..0b29ce0 100644 --- a/sys/contrib/dev/acpica/hwsleep.c +++ b/sys/contrib/dev/acpica/hwsleep.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Name: hwsleep.c - ACPI Hardware Sleep/Wake Interface - * $Revision: 7 $ + * $Revision: 11 $ * *****************************************************************************/ @@ -119,7 +119,7 @@ #include "acnamesp.h" #include "achware.h" -#define _COMPONENT HARDWARE +#define _COMPONENT ACPI_HARDWARE MODULE_NAME ("hwsleep") @@ -228,30 +228,32 @@ AcpiGetFirmwareWakingVector ( ACPI_STATUS AcpiEnterSleepState ( - UINT8 SleepState) + UINT8 SleepState) { - ACPI_STATUS Status; - ACPI_OBJECT_LIST ArgList; - ACPI_OBJECT Arg; - UINT8 TypeA; - UINT8 TypeB; - UINT16 PM1AControl; - UINT16 PM1BControl; + ACPI_STATUS Status; + ACPI_OBJECT_LIST ArgList; + ACPI_OBJECT Arg; + UINT8 TypeA; + UINT8 TypeB; + UINT16 PM1AControl; + UINT16 PM1BControl; + FUNCTION_TRACE ("AcpiEnterSleepState"); - + + /* * _PSW methods could be run here to enable wake-on keyboard, LAN, etc. */ - Status = AcpiHwObtainSleepTypeRegisterData(SleepState, &TypeA, &TypeB); - - if (!ACPI_SUCCESS(Status)) + Status = AcpiHwObtainSleepTypeRegisterData (SleepState, &TypeA, &TypeB); + if (!ACPI_SUCCESS (Status)) { return Status; } /* run the _PTS and _GTS methods */ + MEMSET(&ArgList, 0, sizeof(ArgList)); ArgList.Count = 1; ArgList.Pointer = &Arg; @@ -262,21 +264,25 @@ AcpiEnterSleepState ( AcpiEvaluateObject(NULL, "\\_PTS", &ArgList, NULL); AcpiEvaluateObject(NULL, "\\_GTS", &ArgList, NULL); - + /* clear wake status */ + AcpiHwRegisterBitAccess(ACPI_WRITE, ACPI_MTX_LOCK, WAK_STS, 1); PM1AControl = (UINT16) AcpiHwRegisterRead(ACPI_MTX_LOCK, PM1_CONTROL); /* mask off SLP_EN and SLP_TYP fields */ + PM1AControl &= 0xC3FF; - + /* mask in SLP_EN */ + PM1AControl |= (1 << AcpiHwGetBitShift (SLP_EN_MASK)); - + PM1BControl = PM1AControl; /* mask in SLP_TYP */ + PM1AControl |= (TypeA << AcpiHwGetBitShift (SLP_TYPE_X_MASK)); PM1BControl |= (TypeB << AcpiHwGetBitShift (SLP_TYPE_X_MASK)); @@ -286,8 +292,10 @@ AcpiEnterSleepState ( AcpiHwRegisterWrite(ACPI_MTX_LOCK, PM1A_CONTROL, PM1AControl); AcpiHwRegisterWrite(ACPI_MTX_LOCK, PM1B_CONTROL, PM1BControl); - AcpiHwRegisterWrite(ACPI_MTX_LOCK, PM1_CONTROL, - (1 << AcpiHwGetBitShift (SLP_EN_MASK))); + + /* one system won't work with this, one won't work without */ + /*AcpiHwRegisterWrite(ACPI_MTX_LOCK, PM1_CONTROL, + (1 << AcpiHwGetBitShift (SLP_EN_MASK)));*/ enable(); |