diff options
author | iwasaki <iwasaki@FreeBSD.org> | 2002-11-03 10:49:24 +0000 |
---|---|---|
committer | iwasaki <iwasaki@FreeBSD.org> | 2002-11-03 10:49:24 +0000 |
commit | d9788486227b0e8d3ca3f9538e8689742e19c592 (patch) | |
tree | 0364af86aac1f458e1106c83143eaf9dff085b7b /sys/dev/acpica/acpi_acad.c | |
parent | f83a3fa3ad21dc6517182b1d2684f2b8e8f794d5 (diff) | |
download | FreeBSD-src-d9788486227b0e8d3ca3f9538e8689742e19c592.zip FreeBSD-src-d9788486227b0e8d3ca3f9538e8689742e19c592.tar.gz |
Add status initialization code for acpi_cmbat and acpi_acad,
acpi_cmbat_init_battery() and acpi_cmbat_init_acline() respectively.
Call acpi_cmbat_init_battery() from acpi_cmbat_resume() too just in
case.
This is a workaround for embedded controller operations which is
unstable for about a minute (typically 30 or 40 sec.) at boot time.
Diffstat (limited to 'sys/dev/acpica/acpi_acad.c')
-rw-r--r-- | sys/dev/acpica/acpi_acad.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/sys/dev/acpica/acpi_acad.c b/sys/dev/acpica/acpi_acad.c index 2c9daf9..d7e8ebd 100644 --- a/sys/dev/acpica/acpi_acad.c +++ b/sys/dev/acpica/acpi_acad.c @@ -59,9 +59,12 @@ static int acpi_acad_probe(device_t); static int acpi_acad_attach(device_t); static int acpi_acad_ioctl(u_long, caddr_t, void *); static int acpi_acad_sysctl(SYSCTL_HANDLER_ARGS); +static void acpi_acad_init_acline(void *arg); struct acpi_acad_softc { int status; + + int initializing; }; static void @@ -157,7 +160,9 @@ acpi_acad_attach(device_t dev) /* Get initial status after whole system is up. */ sc->status = -1; - AcpiOsQueueForExecution(OSD_PRIORITY_LO, acpi_acad_get_status, dev); + sc->initializing = 0; + + AcpiOsQueueForExecution(OSD_PRIORITY_LO, acpi_acad_init_acline, dev); return(0); } @@ -215,6 +220,37 @@ acpi_acad_sysctl(SYSCTL_HANDLER_ARGS) return (error); } +static void +acpi_acad_init_acline(void *arg) +{ + int retry; + int status; + device_t dev = (device_t)arg; + struct acpi_acad_softc *sc = device_get_softc(dev); +#define ACPI_ACAD_RETRY_MAX 6 + + if (sc->initializing) { + return; + } + + sc->initializing = 1; + + ACPI_VPRINT(dev, acpi_device_get_parent_softc(dev), + "acline initialization start\n"); + + status = 0; + for (retry = 0; retry < ACPI_ACAD_RETRY_MAX; retry++, AcpiOsSleep(10, 0)) { + acpi_acad_get_status(dev); + if (status != sc->status) + break; + } + + ACPI_VPRINT(dev, acpi_device_get_parent_softc(dev), + "acline initialization done, tried %d times\n", retry+1); + + sc->initializing = 0; +} + /* * Public interfaces. */ |