diff options
Diffstat (limited to 'sys/dev/acpi/acpi.c')
-rw-r--r-- | sys/dev/acpi/acpi.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/sys/dev/acpi/acpi.c b/sys/dev/acpi/acpi.c index a8b84a3..afd39a6 100644 --- a/sys/dev/acpi/acpi.c +++ b/sys/dev/acpi/acpi.c @@ -153,6 +153,7 @@ static void acpi_process_event(acpi_softc_t *sc, u_int32_t status_0, u_int32_t status_1); static void acpi_intr(void *data); static void acpi_enable_events(acpi_softc_t *sc); +static void acpi_clear_ignore_events(void *arg); /* New-bus dependent code */ static acpi_softc_t *acpi_get_softc(dev_t dev); @@ -834,6 +835,10 @@ acpi_trans_sleeping_state(acpi_softc_t *sc, u_int8_t state) val_a = ACPI_PM1_WAK_STS; val_b = ACPI_PM1_WAK_STS; acpi_io_pm1_status(sc, ACPI_REGISTERS_OUTPUT, &val_a, &val_b); + + /* ignore power button and sleep button events for 5 sec. */ + sc->ignore_events = ACPI_PM1_PWRBTN_EN | ACPI_PM1_SLPBTN_EN; + timeout(acpi_clear_ignore_events, (caddr_t)sc, hz * 5); } acpi_io_pm1_control(sc, ACPI_REGISTERS_INPUT, &val_a, &val_b); @@ -1001,11 +1006,19 @@ acpi_process_event(acpi_softc_t *sc, u_int32_t status_a, u_int32_t status_b, { if (status_a & ACPI_PM1_PWRBTN_EN || status_b & ACPI_PM1_PWRBTN_EN) { - acpi_set_sleeping_state(sc, ACPI_S_STATE_S5); + if (sc->ignore_events & ACPI_PM1_PWRBTN_EN) { + ACPI_DEBUGPRINT("PWRBTN event ingnored\n"); + } else { + acpi_set_sleeping_state(sc, ACPI_S_STATE_S5); + } } if (status_a & ACPI_PM1_SLPBTN_EN || status_b & ACPI_PM1_SLPBTN_EN) { - acpi_set_sleeping_state(sc, ACPI_S_STATE_S1); + if (sc->ignore_events & ACPI_PM1_SLPBTN_EN) { + ACPI_DEBUGPRINT("SLPBTN event ingnored\n"); + } else { + acpi_set_sleeping_state(sc, ACPI_S_STATE_S1); + } } } @@ -1166,6 +1179,14 @@ acpi_enable_events(acpi_softc_t *sc) acpi_io_pm_timer(sc, ACPI_REGISTERS_INPUT, &status_a); } +static void +acpi_clear_ignore_events(void *arg) +{ + + ((acpi_softc_t *)arg)->ignore_events = 0; + ACPI_DEBUGPRINT("ignore events cleared\n"); +} + /* * Character device stuff */ |