diff options
author | njl <njl@FreeBSD.org> | 2004-07-12 20:53:04 +0000 |
---|---|---|
committer | njl <njl@FreeBSD.org> | 2004-07-12 20:53:04 +0000 |
commit | 462b2a5e44517ed399d7591368dd987350314cd7 (patch) | |
tree | 0146d2202dcd106cdcdb032645f2035168a57862 | |
parent | 7b5fb1c0fe7951487bba2244d8e9f2bee0f7c77c (diff) | |
download | FreeBSD-src-462b2a5e44517ed399d7591368dd987350314cd7.zip FreeBSD-src-462b2a5e44517ed399d7591368dd987350314cd7.tar.gz |
Add the ability to detach a battery. Now batteries that are detached are
also removed from the battery list.
-rw-r--r-- | sys/dev/acpica/acpi_battery.c | 16 | ||||
-rw-r--r-- | sys/dev/acpica/acpi_cmbat.c | 17 | ||||
-rw-r--r-- | sys/dev/acpica/acpivar.h | 1 |
3 files changed, 33 insertions, 1 deletions
diff --git a/sys/dev/acpica/acpi_battery.c b/sys/dev/acpica/acpi_battery.c index 51af72d..ec5e844 100644 --- a/sys/dev/acpica/acpi_battery.c +++ b/sys/dev/acpica/acpi_battery.c @@ -241,3 +241,19 @@ acpi_battery_register(int type, int phys_unit) return (0); } + +int +acpi_battery_remove(int type, int phys_unit) +{ + struct acpi_batteries *bp, *tmp; + + TAILQ_FOREACH_SAFE(bp, &acpi_batteries, link, tmp) { + if (bp->battdesc.type == type && bp->battdesc.phys_unit == phys_unit) { + TAILQ_REMOVE(&acpi_batteries, bp, link); + acpi_batteries_units--; + free(bp, M_ACPIBATT); + return (0); + } + } + return (ENOENT); +} diff --git a/sys/dev/acpica/acpi_cmbat.c b/sys/dev/acpica/acpi_cmbat.c index d0f6f03..ec6730e 100644 --- a/sys/dev/acpica/acpi_cmbat.c +++ b/sys/dev/acpica/acpi_cmbat.c @@ -73,6 +73,7 @@ struct acpi_cmbat_softc { int min; int full_charge_time; int initializing; + int phys_unit; }; static struct timespec acpi_cmbat_info_lastupdated; @@ -87,6 +88,7 @@ static void acpi_cmbat_get_bif(void *); static void acpi_cmbat_notify_handler(ACPI_HANDLE, UINT32, void *); static int acpi_cmbat_probe(device_t); static int acpi_cmbat_attach(device_t); +static int acpi_cmbat_detach(device_t); static int acpi_cmbat_resume(device_t); static int acpi_cmbat_ioctl(u_long, caddr_t, void *); static int acpi_cmbat_is_bst_valid(struct acpi_bst*); @@ -98,6 +100,7 @@ static device_method_t acpi_cmbat_methods[] = { /* Device interface */ DEVMETHOD(device_probe, acpi_cmbat_probe), DEVMETHOD(device_attach, acpi_cmbat_attach), + DEVMETHOD(device_detach, acpi_cmbat_detach), DEVMETHOD(device_resume, acpi_cmbat_resume), {0, 0} @@ -339,7 +342,8 @@ acpi_cmbat_attach(device_t dev) return (error); } - error = acpi_battery_register(ACPI_BATT_TYPE_CMBAT, acpi_cmbat_units); + sc->phys_unit = acpi_cmbat_units; + error = acpi_battery_register(ACPI_BATT_TYPE_CMBAT, sc->phys_unit); if (error != 0) return (error); @@ -352,6 +356,17 @@ acpi_cmbat_attach(device_t dev) } static int +acpi_cmbat_detach(device_t dev) +{ + struct acpi_cmbat_softc *sc; + + sc = device_get_softc(dev); + acpi_battery_remove(ACPI_BATT_TYPE_CMBAT, sc->phys_unit); + acpi_cmbat_units--; + return (0); +} + +static int acpi_cmbat_resume(device_t dev) { AcpiOsQueueForExecution(OSD_PRIORITY_LO, acpi_cmbat_init_battery, dev); diff --git a/sys/dev/acpica/acpivar.h b/sys/dev/acpica/acpivar.h index a378110..251a09d 100644 --- a/sys/dev/acpica/acpivar.h +++ b/sys/dev/acpica/acpivar.h @@ -338,6 +338,7 @@ struct acpi_battinfo; struct acpi_battdesc; int acpi_battery_register(int, int); +int acpi_battery_remove(int, int); int acpi_battery_get_battinfo(int, struct acpi_battinfo *); int acpi_battery_get_units(void); int acpi_battery_get_info_expire(void); |