Module Name:    src
Committed By:   jruoho
Date:           Sun Jan 31 06:10:53 UTC 2010

Modified Files:
        src/sys/dev/acpi: acpi_bat.c acpi_button.c

Log Message:
Add detachment routines.


To generate a diff of this commit:
cvs rdiff -u -r1.79 -r1.80 src/sys/dev/acpi/acpi_bat.c
cvs rdiff -u -r1.29 -r1.30 src/sys/dev/acpi/acpi_button.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/acpi/acpi_bat.c
diff -u src/sys/dev/acpi/acpi_bat.c:1.79 src/sys/dev/acpi/acpi_bat.c:1.80
--- src/sys/dev/acpi/acpi_bat.c:1.79	Wed Jan 27 22:17:28 2010
+++ src/sys/dev/acpi/acpi_bat.c	Sun Jan 31 06:10:53 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi_bat.c,v 1.79 2010/01/27 22:17:28 drochner Exp $	*/
+/*	$NetBSD: acpi_bat.c,v 1.80 2010/01/31 06:10:53 jruoho Exp $	*/
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -75,7 +75,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_bat.c,v 1.79 2010/01/27 22:17:28 drochner Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_bat.c,v 1.80 2010/01/31 06:10:53 jruoho Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -188,6 +188,7 @@
 
 static int	    acpibat_match(device_t, cfdata_t, void *);
 static void	    acpibat_attach(device_t, device_t, void *);
+static int	    acpibat_detach(device_t, int);
 static int          acpibat_get_sta(device_t);
 static ACPI_OBJECT *acpibat_get_object(ACPI_HANDLE, const char *, int);
 static void         acpibat_get_info(device_t);
@@ -200,7 +201,7 @@
 static bool	    acpibat_resume(device_t, pmf_qual_t);
 
 CFATTACH_DECL_NEW(acpibat, sizeof(struct acpibat_softc),
-    acpibat_match, acpibat_attach, NULL, NULL);
+    acpibat_match, acpibat_attach, acpibat_detach, NULL);
 
 /*
  * acpibat_match:
@@ -235,6 +236,7 @@
 
 	sc->sc_node = aa->aa_node;
 	sc->sc_present = 0;
+	sc->sc_sme = NULL;
 
 	mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_NONE);
 	cv_init(&sc->sc_condvar, device_xname(self));
@@ -252,6 +254,34 @@
 }
 
 /*
+ * acpibat_detach:
+ *
+ *	Autoconfiguration `detach' routine.
+ */
+static int
+acpibat_detach(device_t self, int flags)
+{
+	struct acpibat_softc *sc = device_private(self);
+	ACPI_STATUS rv;
+
+	rv = AcpiRemoveNotifyHandler(sc->sc_node->ad_handle,
+	    ACPI_ALL_NOTIFY, acpibat_notify_handler);
+
+	if (ACPI_FAILURE(rv))
+		return EBUSY;
+
+	cv_destroy(&sc->sc_condvar);
+	mutex_destroy(&sc->sc_mutex);
+
+	if (sc->sc_sme != NULL)
+		sysmon_envsys_unregister(sc->sc_sme);
+
+	pmf_device_deregister(self);
+
+	return 0;
+}
+
+/*
  * acpibat_get_sta:
  *
  *	Evaluate whether the battery is present or absent.
@@ -694,6 +724,7 @@
 fail:
 	aprint_error_dev(dv, "failed to initialize sysmon\n");
 	sysmon_envsys_destroy(sc->sc_sme);
+	sc->sc_sme = NULL;
 }
 
 static void

Index: src/sys/dev/acpi/acpi_button.c
diff -u src/sys/dev/acpi/acpi_button.c:1.29 src/sys/dev/acpi/acpi_button.c:1.30
--- src/sys/dev/acpi/acpi_button.c:1.29	Sat Jan 30 18:35:48 2010
+++ src/sys/dev/acpi/acpi_button.c	Sun Jan 31 06:10:53 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi_button.c,v 1.29 2010/01/30 18:35:48 jruoho Exp $	*/
+/*	$NetBSD: acpi_button.c,v 1.30 2010/01/31 06:10:53 jruoho Exp $	*/
 
 /*
  * Copyright 2001, 2003 Wasabi Systems, Inc.
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_button.c,v 1.29 2010/01/30 18:35:48 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_button.c,v 1.30 2010/01/31 06:10:53 jruoho Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -75,13 +75,13 @@
 
 static int	acpibut_match(device_t, cfdata_t, void *);
 static void	acpibut_attach(device_t, device_t, void *);
-
-CFATTACH_DECL_NEW(acpibut, sizeof(struct acpibut_softc),
-    acpibut_match, acpibut_attach, NULL, NULL);
-
+static int	acpibut_detach(device_t, int);
 static void	acpibut_pressed_event(void *);
 static void	acpibut_notify_handler(ACPI_HANDLE, UINT32, void *);
 
+CFATTACH_DECL_NEW(acpibut, sizeof(struct acpibut_softc),
+    acpibut_match, acpibut_attach, acpibut_detach, NULL);
+
 /*
  * acpibut_match:
  *
@@ -158,6 +158,29 @@
 }
 
 /*
+ * acpibut_detach:
+ *
+ *	Autoconfiguration `detach' routine.
+ */
+static int
+acpibut_detach(device_t self, int flags)
+{
+	struct acpibut_softc *sc = device_private(self);
+	ACPI_STATUS rv;
+
+	rv = AcpiRemoveNotifyHandler(sc->sc_node->ad_handle,
+	    ACPI_DEVICE_NOTIFY, acpibut_notify_handler);
+
+	if (ACPI_FAILURE(rv))
+		return EBUSY;
+
+	pmf_device_deregister(self);
+	sysmon_pswitch_unregister(&sc->sc_smpsw);
+
+	return 0;
+}
+
+/*
  * acpibut_pressed_event:
  *
  *	Deal with a button being pressed.

Reply via email to