Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/acpi Add detachment routine.
details: https://anonhg.NetBSD.org/src/rev/b505528863fa
branches: trunk
changeset: 751288:b505528863fa
user: jruoho <jruoho%NetBSD.org@localhost>
date: Sun Jan 31 07:34:10 2010 +0000
description:
Add detachment routine.
diffstat:
sys/dev/acpi/acpi_acad.c | 63 +++++++++++++++++++++++++++++++++++------------
1 files changed, 47 insertions(+), 16 deletions(-)
diffs (120 lines):
diff -r afc6eb6fb43c -r b505528863fa sys/dev/acpi/acpi_acad.c
--- a/sys/dev/acpi/acpi_acad.c Sun Jan 31 07:32:35 2010 +0000
+++ b/sys/dev/acpi/acpi_acad.c Sun Jan 31 07:34:10 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_acad.c,v 1.37 2010/01/30 18:07:06 jruoho Exp $ */
+/* $NetBSD: acpi_acad.c,v 1.38 2010/01/31 07:34:10 jruoho Exp $ */
/*
* Copyright 2001 Wasabi Systems, Inc.
@@ -44,7 +44,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_acad.c,v 1.37 2010/01/30 18:07:06 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_acad.c,v 1.38 2010/01/31 07:34:10 jruoho Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -86,12 +86,9 @@
#define AACAD_CLEAR(sc, f) (void)((sc)->sc_flags &= ~(f))
#define AACAD_ISSET(sc, f) ((sc)->sc_flags & (f))
-static int acpiacad_match(device_t, cfdata_t, void *);
+static int acpiacad_match(device_t, cfdata_t, void *);
static void acpiacad_attach(device_t, device_t, void *);
-
-CFATTACH_DECL_NEW(acpiacad, sizeof(struct acpiacad_softc),
- acpiacad_match, acpiacad_attach, NULL, NULL);
-
+static int acpiacad_detach(device_t, int);
static void acpiacad_get_status(void *);
static void acpiacad_clear_status(struct acpiacad_softc *);
static void acpiacad_notify_handler(ACPI_HANDLE, UINT32, void *);
@@ -99,6 +96,9 @@
static void acpiacad_refresh(struct sysmon_envsys *, envsys_data_t *);
static bool acpiacad_resume(device_t, pmf_qual_t);
+CFATTACH_DECL_NEW(acpiacad, sizeof(struct acpiacad_softc),
+ acpiacad_match, acpiacad_attach, acpiacad_detach, NULL);
+
/*
* acpiacad_match:
*
@@ -140,6 +140,7 @@
return;
}
+ sc->sc_sme = NULL;
sc->sc_status = -1;
rv = AcpiInstallNotifyHandler(sc->sc_node->ad_handle,
@@ -162,6 +163,34 @@
}
/*
+ * acpiacad_detach:
+ *
+ * Autoconfiguration `detach' routine.
+ */
+static int
+acpiacad_detach(device_t self, int flags)
+{
+ struct acpiacad_softc *sc = device_private(self);
+ ACPI_STATUS rv;
+
+ rv = AcpiRemoveNotifyHandler(sc->sc_node->ad_handle,
+ ACPI_ALL_NOTIFY, acpiacad_notify_handler);
+
+ if (ACPI_FAILURE(rv))
+ return EBUSY;
+
+ mutex_destroy(&sc->sc_mtx);
+
+ if (sc->sc_sme != NULL)
+ sysmon_envsys_unregister(sc->sc_sme);
+
+ pmf_device_deregister(self);
+ sysmon_pswitch_unregister(&sc->sc_smpsw);
+
+ return 0;
+}
+
+/*
* acpiacad_resume:
*
* Clear status after resuming to fetch new status.
@@ -298,11 +327,8 @@
sc->sc_sensor.units = ENVSYS_INDICATOR;
strlcpy(sc->sc_sensor.desc, "connected", sizeof(sc->sc_sensor.desc));
- if (sysmon_envsys_sensor_attach(sc->sc_sme, &sc->sc_sensor)) {
- aprint_error_dev(dv, "unable to add sensor\n");
- sysmon_envsys_destroy(sc->sc_sme);
- return;
- }
+ if (sysmon_envsys_sensor_attach(sc->sc_sme, &sc->sc_sensor) != 0)
+ goto fail;
sc->sc_sme->sme_name = device_xname(dv);
sc->sc_sme->sme_cookie = dv;
@@ -310,10 +336,15 @@
sc->sc_sme->sme_class = SME_CLASS_ACADAPTER;
sc->sc_sme->sme_flags = SME_INIT_REFRESH;
- if (sysmon_envsys_register(sc->sc_sme)) {
- aprint_error_dev(dv, "unable to register with sysmon\n");
- sysmon_envsys_destroy(sc->sc_sme);
- }
+ if (sysmon_envsys_register(sc->sc_sme) != 0)
+ goto fail;
+
+ return;
+
+fail:
+ aprint_error_dev(dv, "failed to initialize sysmon\n");
+ sysmon_envsys_destroy(sc->sc_sme);
+ sc->sc_sme = NULL;
}
static void
Home |
Main Index |
Thread Index |
Old Index