From 462b2a5e44517ed399d7591368dd987350314cd7 Mon Sep 17 00:00:00 2001 From: njl Date: Mon, 12 Jul 2004 20:53:04 +0000 Subject: Add the ability to detach a battery. Now batteries that are detached are also removed from the battery list. --- sys/dev/acpica/acpi_battery.c | 16 ++++++++++++++++ sys/dev/acpica/acpi_cmbat.c | 17 ++++++++++++++++- sys/dev/acpica/acpivar.h | 1 + 3 files changed, 33 insertions(+), 1 deletion(-) (limited to 'sys/dev') 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); -- cgit v1.1