diff options
author | Jordan Hargrave <jordan@cvs.openbsd.org> | 2010-10-05 16:59:03 +0000 |
---|---|---|
committer | Jordan Hargrave <jordan@cvs.openbsd.org> | 2010-10-05 16:59:03 +0000 |
commit | 1e68210289bef7c3dc6e82401c42fd95af374f46 (patch) | |
tree | 9f9ea4a0ab661401f1f931cd969c92fc7e4cabaa /sys/dev | |
parent | 169801b3f5f1368a9d6cbb75b44320fe3bd7affa (diff) |
Added acpi_disable_allgpes function to clear GPE status
ok deraadt
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/acpi/acpi.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/sys/dev/acpi/acpi.c b/sys/dev/acpi/acpi.c index 346bc412024..80c6c014772 100644 --- a/sys/dev/acpi/acpi.c +++ b/sys/dev/acpi/acpi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: acpi.c,v 1.216 2010/10/05 16:17:55 deraadt Exp $ */ +/* $OpenBSD: acpi.c,v 1.217 2010/10/05 16:59:02 jordan Exp $ */ /* * Copyright (c) 2005 Thorsten Lockert <tholo@sigmasoft.com> * Copyright (c) 2005 Jordan Hargrave <jordan@openbsd.org> @@ -134,6 +134,8 @@ struct gpe_block *acpi_find_gpe(struct acpi_softc *, int); void acpi_enable_onegpe(struct acpi_softc *, int, int); int acpi_gpe(struct acpi_softc *, int, void *); +void acpi_disable_allgpes(struct acpi_softc *); + #endif /* SMALL_KERNEL */ /* XXX move this into dsdt softc at some point */ @@ -1600,10 +1602,7 @@ acpi_init_gpes(struct acpi_softc *sc) ngpe = 0; /* Clear GPE status */ - for (idx = 0; idx < sc->sc_lastgpe; idx += 8) { - acpi_write_pmreg(sc, ACPIREG_GPE_EN, idx>>3, 0); - acpi_write_pmreg(sc, ACPIREG_GPE_STS, idx>>3, -1); - } + acpi_disable_allgpes(sc); for (idx = 0; idx < sc->sc_lastgpe; idx++) { /* Search Level-sensitive GPES */ snprintf(name, sizeof(name), "\\_GPE._L%.2X", idx); @@ -1638,15 +1637,10 @@ acpi_susp_resume_gpewalk(struct acpi_softc *sc, int state, int wake_gpe_state) { struct acpi_wakeq *wentry; - int idx; u_int32_t gpe; /* Clear GPE status */ - for (idx = 0; idx < sc->sc_lastgpe; idx += 8) { - acpi_write_pmreg(sc, ACPIREG_GPE_EN, idx>>3, 0); - acpi_write_pmreg(sc, ACPIREG_GPE_STS, idx>>3, -1); - } - + acpi_disable_allgpes(sc); SIMPLEQ_FOREACH(wentry, &sc->sc_wakedevs, q_next) { dnprintf(10, "%.4s(S%d) gpe %.2x\n", wentry->q_node->name, wentry->q_state, @@ -1667,6 +1661,20 @@ acpi_susp_resume_gpewalk(struct acpi_softc *sc, int state, } } +void +acpi_disable_allgpes(struct acpi_softc *sc) +{ + int idx, s; + + /* Clear GPE status */ + s = spltty(); + for (idx = 0; idx < sc->sc_lastgpe; idx += 8) { + acpi_write_pmreg(sc, ACPIREG_GPE_EN, idx >> 3, 0); + acpi_write_pmreg(sc, ACPIREG_GPE_STS, idx >> 3, -1); + } + splx(s); +} + int acpi_sleep_state(struct acpi_softc *sc, int state) { |