summaryrefslogtreecommitdiffstats
path: root/sys/dev/acpica/acpi_acad.c
diff options
context:
space:
mode:
authoriwasaki <iwasaki@FreeBSD.org>2002-11-03 10:49:24 +0000
committeriwasaki <iwasaki@FreeBSD.org>2002-11-03 10:49:24 +0000
commitd9788486227b0e8d3ca3f9538e8689742e19c592 (patch)
tree0364af86aac1f458e1106c83143eaf9dff085b7b /sys/dev/acpica/acpi_acad.c
parentf83a3fa3ad21dc6517182b1d2684f2b8e8f794d5 (diff)
downloadFreeBSD-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.c38
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.
*/
OpenPOWER on IntegriCloud