Module Name:    src
Committed By:   riastradh
Date:           Tue Apr  1 17:48:39 UTC 2014

Modified Files:
        src/sys/conf: files
        src/sys/dev/acpi: apple_smc_acpi.c
        src/sys/dev/ic: apple_smc.c apple_smc.h apple_smc_fan.c
            apple_smc_temp.c apple_smcvar.h
        src/sys/modules/apple_smc: Makefile
Added Files:
        src/sys/modules/apple_smc_acpi: Makefile apple_smc_acpi.ioconf
        src/sys/modules/apple_smc_fan: Makefile apple_smc_fan.ioconf
        src/sys/modules/apple_smc_temp: Makefile apple_smc_temp.ioconf

Log Message:
Rework Apple SMC attachment goo and split into multiple modules.

The four modules are apple_smc for the core functions, apple_smc_acpi
for attachment at acpi, and apple_smc_fan & apple_smc_temp for stuff
on the SMC.

Seems like there's a lot more bookkeeping necessary to maintain
children of an applesmc device implemented by loadable modules.
Maybe there's a better way I just haven't figured out yet.


To generate a diff of this commit:
cvs rdiff -u -r1.1088 -r1.1089 src/sys/conf/files
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/acpi/apple_smc_acpi.c
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/ic/apple_smc.c \
    src/sys/dev/ic/apple_smc.h src/sys/dev/ic/apple_smc_fan.c \
    src/sys/dev/ic/apple_smc_temp.c src/sys/dev/ic/apple_smcvar.h
cvs rdiff -u -r1.1 -r1.2 src/sys/modules/apple_smc/Makefile
cvs rdiff -u -r0 -r1.1 src/sys/modules/apple_smc_acpi/Makefile \
    src/sys/modules/apple_smc_acpi/apple_smc_acpi.ioconf
cvs rdiff -u -r0 -r1.1 src/sys/modules/apple_smc_fan/Makefile \
    src/sys/modules/apple_smc_fan/apple_smc_fan.ioconf
cvs rdiff -u -r0 -r1.1 src/sys/modules/apple_smc_temp/Makefile \
    src/sys/modules/apple_smc_temp/apple_smc_temp.ioconf

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

Modified files:

Index: src/sys/conf/files
diff -u src/sys/conf/files:1.1088 src/sys/conf/files:1.1089
--- src/sys/conf/files:1.1088	Tue Apr  1 17:47:36 2014
+++ src/sys/conf/files	Tue Apr  1 17:48:39 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: files,v 1.1088 2014/04/01 17:47:36 riastradh Exp $
+#	$NetBSD: files,v 1.1089 2014/04/01 17:48:39 riastradh Exp $
 #	@(#)files.newconf	7.5 (Berkeley) 5/10/93
 
 version 	20100430
@@ -1097,7 +1097,8 @@ file	dev/ic/lan9118.c		smsh
 
 # Apple System Management Controller
 #
-device	applesmc {}
+define	applesmcbus	{ }
+device	applesmc	{ }: applesmcbus
 file	dev/ic/apple_smc.c		applesmc
 
 # Apple SMC fan sensors and control
@@ -1110,7 +1111,7 @@ device	applesmctemp: applesmc, sysmon_en
 attach	applesmctemp at applesmc with apple_smc_temp
 file	dev/ic/apple_smc_temp.c		applesmctemp
 
-# Apple SMC accelerometer
+# Apple SMC accelerometer (not yet implemented!)
 #device	applesmcaccel: applesmc, sysmon_envsys
 #attach	applesmcaccel at applesmc with apple_smc_accel
 #file	dev/ic/apple_smc_accel.c	applesmcaccel

Index: src/sys/dev/acpi/apple_smc_acpi.c
diff -u src/sys/dev/acpi/apple_smc_acpi.c:1.1 src/sys/dev/acpi/apple_smc_acpi.c:1.2
--- src/sys/dev/acpi/apple_smc_acpi.c:1.1	Tue Apr  1 17:47:36 2014
+++ src/sys/dev/acpi/apple_smc_acpi.c	Tue Apr  1 17:48:39 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: apple_smc_acpi.c,v 1.1 2014/04/01 17:47:36 riastradh Exp $	*/
+/*	$NetBSD: apple_smc_acpi.c,v 1.2 2014/04/01 17:48:39 riastradh Exp $	*/
 
 /*
  * Apple System Management Controller: ACPI Attachment
@@ -31,10 +31,12 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: apple_smc_acpi.c,v 1.1 2014/04/01 17:47:36 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: apple_smc_acpi.c,v 1.2 2014/04/01 17:48:39 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/module.h>
 
 #include <dev/acpi/acpireg.h>
 #include <dev/acpi/acpivar.h>
@@ -52,9 +54,16 @@ struct apple_smc_acpi_softc {
 static int	apple_smc_acpi_match(device_t, cfdata_t, void *);
 static void	apple_smc_acpi_attach(device_t, device_t, void *);
 static int	apple_smc_acpi_detach(device_t, int);
-
-CFATTACH_DECL_NEW(apple_smc_acpi, sizeof(struct apple_smc_acpi_softc),
-    apple_smc_acpi_match, apple_smc_acpi_attach, apple_smc_acpi_detach, NULL);
+static int	apple_smc_acpi_rescan(device_t, const char *, const int *);
+static void	apple_smc_acpi_child_detached(device_t, device_t);
+
+CFATTACH_DECL2_NEW(apple_smc_acpi, sizeof(struct apple_smc_acpi_softc),
+    apple_smc_acpi_match,
+    apple_smc_acpi_attach,
+    apple_smc_acpi_detach,
+    NULL /* activate */,
+    apple_smc_acpi_rescan,
+    apple_smc_acpi_child_detached);
 
 static const char *const apple_smc_ids[] = {
 	"APP0001",
@@ -143,3 +152,56 @@ apple_smc_acpi_detach(device_t self, int
 
 	return 0;
 }
+
+static int
+apple_smc_acpi_rescan(device_t self, const char *ifattr, const int *locs)
+{
+	struct apple_smc_acpi_softc *const sc = device_private(self);
+
+	return apple_smc_rescan(&sc->sc_smc, ifattr, locs);
+}
+
+static void
+apple_smc_acpi_child_detached(device_t self, device_t child)
+{
+	struct apple_smc_acpi_softc *const sc = device_private(self);
+
+	apple_smc_child_detached(&sc->sc_smc, child);
+}
+
+MODULE(MODULE_CLASS_DRIVER, apple_smc_acpi, "apple_smc");
+
+#ifdef _MODULE
+#include "ioconf.c"
+#endif
+
+static int
+apple_smc_acpi_modcmd(modcmd_t cmd, void *arg __unused)
+{
+	int error;
+
+	switch (cmd) {
+	case MODULE_CMD_INIT:
+#ifdef _MODULE
+		error = config_init_component(cfdriver_ioconf_apple_smc_acpi,
+		    cfattach_ioconf_apple_smc_acpi,
+		    cfdata_ioconf_apple_smc_acpi);
+		if (error)
+			return error;
+#endif
+		return 0;
+
+	case MODULE_CMD_FINI:
+#ifdef _MODULE
+		error = config_fini_component(cfdriver_ioconf_apple_smc_acpi,
+		    cfattach_ioconf_apple_smc_acpi,
+		    cfdata_ioconf_apple_smc_acpi);
+		if (error)
+			return error;
+#endif
+		return 0;
+
+	default:
+		return ENOTTY;
+	}
+}

Index: src/sys/dev/ic/apple_smc.c
diff -u src/sys/dev/ic/apple_smc.c:1.1 src/sys/dev/ic/apple_smc.c:1.2
--- src/sys/dev/ic/apple_smc.c:1.1	Tue Apr  1 17:47:36 2014
+++ src/sys/dev/ic/apple_smc.c	Tue Apr  1 17:48:39 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: apple_smc.c,v 1.1 2014/04/01 17:47:36 riastradh Exp $	*/
+/*	$NetBSD: apple_smc.c,v 1.2 2014/04/01 17:48:39 riastradh Exp $	*/
 
 /*
  * Apple System Management Controller
@@ -34,14 +34,17 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: apple_smc.c,v 1.1 2014/04/01 17:47:36 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: apple_smc.c,v 1.2 2014/04/01 17:48:39 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
 #include <sys/device.h>
 #include <sys/errno.h>
 #include <sys/kmem.h>
+#include <sys/module.h>
 #include <sys/mutex.h>
+#include <sys/rbtree.h>
+#include <sys/rwlock.h>
 #if 0                           /* XXX sysctl */
 #include <sys/sysctl.h>
 #endif
@@ -51,9 +54,13 @@ __KERNEL_RCSID(0, "$NetBSD: apple_smc.c,
 #include <dev/ic/apple_smcreg.h>
 #include <dev/ic/apple_smcvar.h>
 
-static void	apple_smc_rescan1(struct apple_smc_tag *,
-		    struct apple_smc_attach_args *,
-		    const char *, const char *, device_t *);
+#define	APPLE_SMC_BUS	"applesmcbus"
+
+static int	apple_smc_dev_compare_nodes(void *, const void *,
+		    const void *);
+static int	apple_smc_dev_compare_key(void *, const void *, const void *);
+static int	apple_smc_init(void);
+static int	apple_smc_fini(void);
 static uint8_t	apple_smc_bus_read_1(struct apple_smc_tag *, bus_size_t);
 static void	apple_smc_bus_write_1(struct apple_smc_tag *, bus_size_t,
 		    uint8_t);
@@ -67,51 +74,157 @@ static int	apple_smc_input(struct apple_
 		    const char *, void *, uint8_t);
 static int	apple_smc_output(struct apple_smc_tag *, uint8_t,
 		    const char *, const void *, uint8_t);
+
+struct apple_smc_dev {
+	char		asd_name[APPLE_SMC_DEVICE_NAME_SIZE];
+	rb_node_t	asd_node;
+	device_t	asd_dev[];
+};
 
-void
-apple_smc_attach(struct apple_smc_tag *smc)
+static int
+apple_smc_dev_compare_nodes(void *context __unused, const void *va,
+    const void *vb)
 {
+	const struct apple_smc_dev *const a = va;
+	const struct apple_smc_dev *const b = vb;
 
-	mutex_init(&smc->smc_lock, MUTEX_DEFAULT, IPL_NONE);
+	return strncmp(a->asd_name, b->asd_name, APPLE_SMC_DEVICE_NAME_SIZE);
+}
 
-#if 0				/* XXX sysctl */
-	apple_smc_sysctl_setup(smc);
+static int
+apple_smc_dev_compare_key(void *context __unused, const void *vn,
+    const void *vk)
+{
+	const struct apple_smc_dev *const dev = vn;
+	const char *const key = vk;
+
+	return strncmp(dev->asd_name, key, APPLE_SMC_DEVICE_NAME_SIZE);
+}
+
+static krwlock_t apple_smc_registered_devices_lock;
+static rb_tree_t apple_smc_registered_devices;
+static unsigned int apple_smc_n_registered_devices;
+
+static const rb_tree_ops_t apple_smc_dev_tree_ops = {
+	.rbto_compare_nodes	= &apple_smc_dev_compare_nodes,
+	.rbto_compare_key	= &apple_smc_dev_compare_key,
+	.rbto_node_offset	= offsetof(struct apple_smc_dev, asd_node),
+};
+
+static int
+apple_smc_init(void)
+{
+
+	rw_init(&apple_smc_registered_devices_lock);
+	rb_tree_init(&apple_smc_registered_devices, &apple_smc_dev_tree_ops);
+	apple_smc_n_registered_devices = 0;
+
+	/* Success!  */
+	return 0;
+}
+
+static int
+apple_smc_fini(void)
+{
+
+	/* Refuse to unload if there remain any registered devices.  */
+	if (apple_smc_n_registered_devices)
+		return EBUSY;
+
+	/* The tree should be empty in this case.  */
+	KASSERT(rb_tree_iterate(&apple_smc_registered_devices, NULL,
+		RB_DIR_RIGHT) == NULL);
+
+#if 0				/* XXX no rb_tree_destroy */
+	rb_tree_destroy(&apple_smc_registered_devices);
 #endif
+	rw_destroy(&apple_smc_registered_devices_lock);
 
-        (void)apple_smc_rescan(smc, NULL, NULL);
+	/* Success!  */
+	return 0;
 }
 
 int
-apple_smc_rescan(struct apple_smc_tag *smc, const char *ifattr,
-    const int *locators)
+apple_smc_register_device(const char name[APPLE_SMC_DEVICE_NAME_SIZE])
 {
-	struct apple_smc_attach_args asa;
+	int error;
 
-	(void)locators;		/* ignore */
+	/* Paranoia about null termination.  */
+	KASSERT(name[strnlen(name, (sizeof(name) - 1))] == '\0');
 
-	(void)memset(&asa, 0, sizeof asa);
-	asa.asa_smc = smc;
-#if 0				/* XXX sysctl */
-	asa.asa_sysctlnode = smc->smc_sysctlnode;
-#endif
+	/* Make a new record for the registration.  */
+	struct apple_smc_dev *const dev =
+	    kmem_alloc(offsetof(struct apple_smc_dev, asd_dev[0]), KM_SLEEP);
+	(void)strlcpy(dev->asd_name, name, sizeof(dev->asd_name));
+
+	rw_enter(&apple_smc_registered_devices_lock, RW_WRITER);
+
+	/* Fail if there are too many.  We really oughtn't get here.  */
+	if (apple_smc_n_registered_devices == UINT_MAX) {
+		error = ENOMEM;
+		goto out;
+	}
 
-	apple_smc_rescan1(smc, &asa, ifattr, "applesmcfan", &smc->smc_fan);
-	apple_smc_rescan1(smc, &asa, ifattr, "applesmctemp", &smc->smc_temp);
-#if 0				/* XXX accelerometer */
-	apple_smc_rescan1(smc, &asa, ifattr, "applesmcaccel",
-	    &smc->smc_accelfan);
-#endif
+	/* Fail if the name is already registered.  */
+	struct apple_smc_dev *const collision =
+	    rb_tree_insert_node(&apple_smc_registered_devices, dev);
+	if (collision != dev) {
+		kmem_free(dev, offsetof(struct apple_smc_dev, asd_dev[0]));
+		error = EEXIST;
+		goto out;
+	}
 
-        return 0;
+	/* Success!  */
+	apple_smc_n_registered_devices++;
+	error = 0;
+
+out:
+	rw_exit(&apple_smc_registered_devices_lock);
+	return error;
 }
 
-static void
-apple_smc_rescan1(struct apple_smc_tag *smc, struct apple_smc_attach_args *asa,
-    const char *ifattr, const char *ifa_conf, device_t *devp)
+void
+apple_smc_unregister_device(const char name[APPLE_SMC_DEVICE_NAME_SIZE])
 {
 
-	if (ifattr_match(ifattr, ifa_conf) && *devp == NULL)
-		*devp = config_found_ia(smc->smc_dev, ifa_conf, asa, NULL);
+	KASSERT(name[strnlen(name, (sizeof(name) - 1))] == '\0');
+
+	rw_enter(&apple_smc_registered_devices_lock, RW_WRITER);
+
+	/* Find the node.  */
+	struct apple_smc_dev *const dev =
+	    rb_tree_find_node(&apple_smc_registered_devices, name);
+	if (dev == NULL) {
+		printf("%s: device was never registered: %s\n", __func__,
+		    name);
+		goto out;
+	}
+
+	/* If we found one, this ought to be at least 1.  */
+	KASSERT(apple_smc_n_registered_devices > 0);
+
+	/* Remove it, but wait until unlocked to free it (paranoia).  */
+	rb_tree_remove_node(&apple_smc_registered_devices, dev);
+	apple_smc_n_registered_devices--;
+
+out:
+	rw_exit(&apple_smc_registered_devices_lock);
+	if (dev != NULL)
+		kmem_free(dev, offsetof(struct apple_smc_dev, asd_dev[0]));
+}
+
+void
+apple_smc_attach(struct apple_smc_tag *smc)
+{
+
+	mutex_init(&smc->smc_lock, MUTEX_DEFAULT, IPL_NONE);
+	rb_tree_init(&smc->smc_devices, &apple_smc_dev_tree_ops);
+
+#if 0				/* XXX sysctl */
+	apple_smc_sysctl_setup(smc);
+#endif
+
+        (void)apple_smc_rescan(smc, NULL, NULL);
 }
 
 int
@@ -130,6 +243,109 @@ apple_smc_detach(struct apple_smc_tag *s
 	return 0;
 }
 
+int
+apple_smc_rescan(struct apple_smc_tag *smc, const char *ifattr,
+    const int *locators __unused)
+{
+	struct apple_smc_attach_args asa;
+	struct apple_smc_dev *registered, *attached;
+	device_t child;
+
+	if (!ifattr_match(ifattr, APPLE_SMC_BUS))
+		return 0;
+
+	(void)memset(&asa, 0, sizeof asa);
+	asa.asa_smc = smc;
+#if 0				/* XXX sysctl */
+	asa.asa_sysctlnode = smc->smc_sysctlnode;
+#endif
+
+	/*
+	 * Go through all the registered SMC devices and try to attach
+	 * them.
+	 *
+	 * XXX Horrible quadratic-time loop to avoid holding the rwlock
+	 * during allocation.  Fortunately, there are not likely to be
+	 * many of these devices.
+	 */
+restart:
+	registered = NULL;
+	rw_enter(&apple_smc_registered_devices_lock, RW_READER);
+	while ((registered = rb_tree_iterate(&apple_smc_registered_devices,
+		    registered, RB_DIR_RIGHT)) != NULL) {
+		char name[APPLE_SMC_DEVICE_NAME_SIZE];
+		CTASSERT(sizeof(name) == sizeof(registered->asd_name));
+
+		/* Paranoia about null termination.  */
+		KASSERT(registered->asd_name[strnlen(registered->asd_name,
+				(sizeof(registered->asd_name) - 1))] == '\0');
+
+		/* Skip it if we already have it attached.  */
+		attached = rb_tree_find_node(&smc->smc_devices,
+		    registered->asd_name);
+		if (attached != NULL)
+			continue;
+
+		/* Try to match it autoconfily.  */
+		asa.asa_device = registered->asd_name;
+		child = config_found_ia(smc->smc_dev, APPLE_SMC_BUS, &asa,
+		    NULL);
+		if (child == NULL)
+			continue;
+
+		/* Save the name while we drop the lock.  */
+		(void)strlcpy(name, registered->asd_name, sizeof(name));
+
+		/* Drop the lock so we can allocate.  */
+		rw_exit(&apple_smc_registered_devices_lock);
+
+		/* Create a new record for the attachment.  */
+		attached = kmem_alloc(offsetof(struct apple_smc_dev,
+			asd_dev[1]), KM_SLEEP);
+		(void)strlcpy(attached->asd_name, name, sizeof(name));
+		attached->asd_dev[0] = child;
+
+		/* Store it in the tree.  */
+		struct apple_smc_dev *const collision __unused =
+		    rb_tree_insert_node(&smc->smc_devices, attached);
+		KASSERT(collision == attached);
+
+		/* Start back at the beginning since we dropped the lock.  */
+		goto restart;
+	}
+	rw_exit(&apple_smc_registered_devices_lock);
+
+	/* Success!  */
+        return 0;
+}
+
+void
+apple_smc_child_detached(struct apple_smc_tag *smc, device_t child)
+{
+	struct apple_smc_dev *dev, *next;
+	bool done = false;
+
+	/*
+	 * Go through the list of attached devices safely with respect
+	 * to removal and remove any matching entries.  There should be
+	 * only one, but paranoia.
+	 */
+	for (dev = rb_tree_iterate(&smc->smc_devices, NULL, RB_DIR_RIGHT);
+	     (dev != NULL?
+		 (next = rb_tree_iterate(&smc->smc_devices, dev,
+		     RB_DIR_RIGHT), true)
+		 : false);
+	     dev = next) {
+		if (dev->asd_dev[0] != child)
+			continue;
+		if (done)
+			printf("apple smc child doubly attached: %s\n",
+			    dev->asd_name);
+		rb_tree_remove_node(&smc->smc_devices, dev);
+		kmem_free(dev, offsetof(struct apple_smc_dev, asd_dev[1]));
+	}
+}
+
 static uint8_t
 apple_smc_bus_read_1(struct apple_smc_tag *smc, bus_size_t reg)
 {
@@ -203,15 +419,7 @@ apple_smc_write_data(struct apple_smc_ta
 
 	return apple_smc_write(smc, APPLE_SMC_DATA, data);
 }
-
-struct apple_smc_key {
-	char ask_name[4 + 1];
-	struct apple_smc_desc ask_desc;
-#ifdef DIAGNOSTIC
-	struct apple_smc_tag *ask_smc;
-#endif
-};
-
+
 static int
 apple_smc_begin(struct apple_smc_tag *smc, uint8_t cmd, const char *key,
     uint8_t size)
@@ -288,6 +496,14 @@ out:
 	mutex_exit(&smc->smc_lock);
 	return error;
 }
+
+struct apple_smc_key {
+	char ask_name[4 + 1];
+	struct apple_smc_desc ask_desc;
+#ifdef DIAGNOSTIC
+	struct apple_smc_tag *ask_smc;
+#endif
+};
 
 const char *
 apple_smc_key_name(const struct apple_smc_key *key)
@@ -430,7 +646,7 @@ apple_smc_key_search(struct apple_smc_ta
 	*result = start;
 	return 0;
 }
-
+
 int
 apple_smc_read_key(struct apple_smc_tag *smc, const struct apple_smc_key *key,
     void *buffer, uint8_t size)
@@ -522,3 +738,21 @@ apple_smc_write_key_4(struct apple_smc_t
 
 	return apple_smc_write_key(smc, key, &v_be, 4);
 }
+
+MODULE(MODULE_CLASS_MISC, apple_smc, NULL)
+
+static int
+apple_smc_modcmd(modcmd_t cmd, void *data __unused)
+{
+
+	switch (cmd) {
+	case MODULE_CMD_INIT:
+		return apple_smc_init();
+
+	case MODULE_CMD_FINI:
+		return apple_smc_fini();
+
+	default:
+		return ENOTTY;
+	}
+}
Index: src/sys/dev/ic/apple_smc.h
diff -u src/sys/dev/ic/apple_smc.h:1.1 src/sys/dev/ic/apple_smc.h:1.2
--- src/sys/dev/ic/apple_smc.h:1.1	Tue Apr  1 17:47:36 2014
+++ src/sys/dev/ic/apple_smc.h	Tue Apr  1 17:48:39 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: apple_smc.h,v 1.1 2014/04/01 17:47:36 riastradh Exp $	*/
+/*	$NetBSD: apple_smc.h,v 1.2 2014/04/01 17:48:39 riastradh Exp $	*/
 
 /*
  * Apple System Management Controller Interface
@@ -42,6 +42,7 @@ struct apple_smc_tag;
 
 struct apple_smc_attach_args {
 	struct apple_smc_tag	*asa_smc;
+	const char		*asa_device;
 };
 
 struct apple_smc_key;
@@ -106,4 +107,9 @@ int	apple_smc_write_key_2(struct apple_s
 int	apple_smc_write_key_4(struct apple_smc_tag *,
 	    const struct apple_smc_key *, uint32_t);
 
+#define	APPLE_SMC_DEVICE_NAME_SIZE	0x20
+
+int	apple_smc_register_device(const char[APPLE_SMC_DEVICE_NAME_SIZE]);
+void	apple_smc_unregister_device(const char[APPLE_SMC_DEVICE_NAME_SIZE]);
+
 #endif  /* _DEV_IC_APPLE_SMC_H_ */
Index: src/sys/dev/ic/apple_smc_fan.c
diff -u src/sys/dev/ic/apple_smc_fan.c:1.1 src/sys/dev/ic/apple_smc_fan.c:1.2
--- src/sys/dev/ic/apple_smc_fan.c:1.1	Tue Apr  1 17:47:36 2014
+++ src/sys/dev/ic/apple_smc_fan.c	Tue Apr  1 17:48:39 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: apple_smc_fan.c,v 1.1 2014/04/01 17:47:36 riastradh Exp $	*/
+/*	$NetBSD: apple_smc_fan.c,v 1.2 2014/04/01 17:48:39 riastradh Exp $	*/
 
 /*
  * Apple System Management Controller: Fans
@@ -34,12 +34,13 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: apple_smc_fan.c,v 1.1 2014/04/01 17:47:36 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: apple_smc_fan.c,v 1.2 2014/04/01 17:48:39 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
 #include <sys/device.h>
 #include <sys/kmem.h>
+#include <sys/module.h>
 #if 0                           /* XXX sysctl */
 #include <sys/sysctl.h>
 #endif
@@ -49,6 +50,8 @@ __KERNEL_RCSID(0, "$NetBSD: apple_smc_fa
 
 #include <dev/sysmon/sysmonvar.h>
 
+#define APPLE_SMC_DEVICE	"applesmcfan"
+
 #define	APPLE_SMC_NFANS_KEY		"FNum"
 
 static const struct fan_sensor {
@@ -115,6 +118,9 @@ apple_smc_fan_match(device_t parent, cfd
 	int rv = 0;
 	int error;
 
+	if (strcmp(asa->asa_device, APPLE_SMC_DEVICE) != 0)
+		goto out0;
+
 	error = apple_smc_named_key(asa->asa_smc, APPLE_SMC_NFANS_KEY,
 	    APPLE_SMC_TYPE_UINT8, &nfans_key);
 	if (error)
@@ -404,3 +410,46 @@ apple_smc_fan_sysctl_setup_1(struct appl
 {
 }
 #endif
+
+MODULE(MODULE_CLASS_DRIVER, apple_smc_fan, "apple_smc");
+
+#ifdef _MODULE
+#include "ioconf.c"
+#endif
+
+static int
+apple_smc_fan_modcmd(modcmd_t cmd, void *arg __unused)
+{
+	int error;
+
+	switch (cmd) {
+	case MODULE_CMD_INIT:
+		error = apple_smc_register_device(APPLE_SMC_DEVICE);
+		if (error)
+			return error;
+#ifdef _MODULE
+		error = config_init_component(cfdriver_ioconf_apple_smc_fan,
+		    cfattach_ioconf_apple_smc_fan,
+		    cfdata_ioconf_apple_smc_fan);
+		if (error) {
+			apple_smc_unregister_device(APPLE_SMC_DEVICE);
+			return error;
+		}
+#endif
+		return 0;
+
+	case MODULE_CMD_FINI:
+#ifdef _MODULE
+		error = config_fini_component(cfdriver_ioconf_apple_smc_fan,
+		    cfattach_ioconf_apple_smc_fan,
+		    cfdata_ioconf_apple_smc_fan);
+		if (error)
+			return error;
+#endif
+		apple_smc_unregister_device(APPLE_SMC_DEVICE);
+		return 0;
+
+	default:
+		return ENOTTY;
+	}
+}
Index: src/sys/dev/ic/apple_smc_temp.c
diff -u src/sys/dev/ic/apple_smc_temp.c:1.1 src/sys/dev/ic/apple_smc_temp.c:1.2
--- src/sys/dev/ic/apple_smc_temp.c:1.1	Tue Apr  1 17:47:36 2014
+++ src/sys/dev/ic/apple_smc_temp.c	Tue Apr  1 17:48:39 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: apple_smc_temp.c,v 1.1 2014/04/01 17:47:36 riastradh Exp $	*/
+/*	$NetBSD: apple_smc_temp.c,v 1.2 2014/04/01 17:48:39 riastradh Exp $	*/
 
 /*
  * Apple System Management Controller: Temperature Sensors
@@ -34,18 +34,21 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: apple_smc_temp.c,v 1.1 2014/04/01 17:47:36 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: apple_smc_temp.c,v 1.2 2014/04/01 17:48:39 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
 #include <sys/device.h>
 #include <sys/kmem.h>
+#include <sys/module.h>
 #include <sys/systm.h>
 
 #include <dev/ic/apple_smc.h>
 
 #include <dev/sysmon/sysmonvar.h>
 
+#define APPLE_SMC_DEVICE	"applesmctemp"
+
 struct apple_smc_temp_softc {
 	device_t		sc_dev;
 	struct apple_smc_tag	*sc_smc;
@@ -90,6 +93,9 @@ apple_smc_temp_match(device_t parent, cf
 	uint32_t nsensors;
 	int error;
 
+	if (strcmp(asa->asa_device, APPLE_SMC_DEVICE) != 0)
+		return 0;
+
 	error = apple_smc_temp_count_sensors(asa->asa_smc, &nsensors);
 	if (error)
 		return 0;
@@ -359,3 +365,46 @@ apple_smc_bound_temp_sensors(struct appl
 
 	return 0;
 }
+
+MODULE(MODULE_CLASS_DRIVER, apple_smc_temp, "apple_smc");
+
+#ifdef _MODULE
+#include "ioconf.c"
+#endif
+
+static int
+apple_smc_temp_modcmd(modcmd_t cmd, void *arg __unused)
+{
+	int error;
+
+	switch (cmd) {
+	case MODULE_CMD_INIT:
+		error = apple_smc_register_device(APPLE_SMC_DEVICE);
+		if (error)
+			return error;
+#ifdef _MODULE
+		error = config_init_component(cfdriver_ioconf_apple_smc_temp,
+		    cfattach_ioconf_apple_smc_temp,
+		    cfdata_ioconf_apple_smc_temp);
+		if (error) {
+			apple_smc_unregister_device(APPLE_SMC_DEVICE);
+			return error;
+		}
+#endif
+		return 0;
+
+	case MODULE_CMD_FINI:
+#ifdef _MODULE
+		error = config_fini_component(cfdriver_ioconf_apple_smc_temp,
+		    cfattach_ioconf_apple_smc_temp,
+		    cfdata_ioconf_apple_smc_temp);
+		if (error)
+			return error;
+#endif
+		apple_smc_unregister_device(APPLE_SMC_DEVICE);
+		return 0;
+
+	default:
+		return ENOTTY;
+	}
+}
Index: src/sys/dev/ic/apple_smcvar.h
diff -u src/sys/dev/ic/apple_smcvar.h:1.1 src/sys/dev/ic/apple_smcvar.h:1.2
--- src/sys/dev/ic/apple_smcvar.h:1.1	Tue Apr  1 17:47:36 2014
+++ src/sys/dev/ic/apple_smcvar.h	Tue Apr  1 17:48:39 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: apple_smcvar.h,v 1.1 2014/04/01 17:47:36 riastradh Exp $	*/
+/*	$NetBSD: apple_smcvar.h,v 1.2 2014/04/01 17:48:39 riastradh Exp $	*/
 
 /*
  * Apple System Management Controller State
@@ -39,8 +39,9 @@
 #include <sys/param.h>
 #include <sys/types.h>
 #include <sys/bus.h>
-#include <sys/device.h>
+#include <sys/device_if.h>
 #include <sys/mutex.h>
+#include <sys/rbtree.h>
 
 struct apple_smc_tag {
 	device_t		smc_dev;
@@ -55,16 +56,12 @@ struct apple_smc_tag {
 	const struct sysctlnode	*smc_sysctlnode;
 #endif
 
-	device_t		smc_fan;
-	device_t		smc_temp;
-#if 0				/* XXX accelerometer */
-	device_t		smc_accel;
-#endif
+	rb_tree_t		smc_devices;
 };
 
-void		apple_smc_attach(struct apple_smc_tag *);
-int		apple_smc_rescan(struct apple_smc_tag *, const char *,
-		    const int *);
-int		apple_smc_detach(struct apple_smc_tag *, int);
+void	apple_smc_attach(struct apple_smc_tag *);
+int	apple_smc_detach(struct apple_smc_tag *, int);
+int	apple_smc_rescan(struct apple_smc_tag *, const char *, const int *);
+void	apple_smc_child_detached(struct apple_smc_tag *, device_t);
 
 #endif  /* _DEV_IC_APPLE_SMCVAR_H_ */

Index: src/sys/modules/apple_smc/Makefile
diff -u src/sys/modules/apple_smc/Makefile:1.1 src/sys/modules/apple_smc/Makefile:1.2
--- src/sys/modules/apple_smc/Makefile:1.1	Tue Apr  1 17:47:36 2014
+++ src/sys/modules/apple_smc/Makefile	Tue Apr  1 17:48:39 2014
@@ -1,13 +1,11 @@
-# $NetBSD: Makefile,v 1.1 2014/04/01 17:47:36 riastradh Exp $
+# $NetBSD: Makefile,v 1.2 2014/04/01 17:48:39 riastradh Exp $
 
 .include "../Makefile.inc"
 
 .PATH:	${S}/dev/ic
-.PATH:	${S}/dev/acpi
 
 KMOD=	apple_smc
-IOCONF=	apple_smc.ioconf
-SRCS=	apple_smc.c apple_smc_acpi.c apple_smc_fan.c apple_smc_temp.c
+SRCS=	apple_smc.c
 
 WARNS=	4
 

Added files:

Index: src/sys/modules/apple_smc_acpi/Makefile
diff -u /dev/null src/sys/modules/apple_smc_acpi/Makefile:1.1
--- /dev/null	Tue Apr  1 17:48:39 2014
+++ src/sys/modules/apple_smc_acpi/Makefile	Tue Apr  1 17:48:39 2014
@@ -0,0 +1,15 @@
+# $NetBSD: Makefile,v 1.1 2014/04/01 17:48:39 riastradh Exp $
+
+.include "../Makefile.inc"
+
+.PATH:	${S}/dev/acpi
+
+KMOD=	apple_smc_acpi
+IOCONF=	apple_smc_acpi.ioconf
+SRCS=	apple_smc_acpi.c
+
+WARNS=	4
+
+CPPFLAGS+=	-DDIAGNOSTIC
+
+.include <bsd.kmodule.mk>
Index: src/sys/modules/apple_smc_acpi/apple_smc_acpi.ioconf
diff -u /dev/null src/sys/modules/apple_smc_acpi/apple_smc_acpi.ioconf:1.1
--- /dev/null	Tue Apr  1 17:48:39 2014
+++ src/sys/modules/apple_smc_acpi/apple_smc_acpi.ioconf	Tue Apr  1 17:48:39 2014
@@ -0,0 +1,10 @@
+# $NetBSD: apple_smc_acpi.ioconf,v 1.1 2014/04/01 17:48:39 riastradh Exp $
+
+ioconf apple_smc_acpi
+
+include "conf/files"
+include "dev/acpi/files.acpi"
+
+pseudo-root	acpi*
+
+applesmc*	at acpi?

Index: src/sys/modules/apple_smc_fan/Makefile
diff -u /dev/null src/sys/modules/apple_smc_fan/Makefile:1.1
--- /dev/null	Tue Apr  1 17:48:39 2014
+++ src/sys/modules/apple_smc_fan/Makefile	Tue Apr  1 17:48:39 2014
@@ -0,0 +1,15 @@
+# $NetBSD: Makefile,v 1.1 2014/04/01 17:48:39 riastradh Exp $
+
+.include "../Makefile.inc"
+
+.PATH:	${S}/dev/ic
+
+KMOD=	apple_smc_fan
+IOCONF=	apple_smc_fan.ioconf
+SRCS=	apple_smc_fan.c
+
+WARNS=	4
+
+CPPFLAGS+=	-DDIAGNOSTIC
+
+.include <bsd.kmodule.mk>
Index: src/sys/modules/apple_smc_fan/apple_smc_fan.ioconf
diff -u /dev/null src/sys/modules/apple_smc_fan/apple_smc_fan.ioconf:1.1
--- /dev/null	Tue Apr  1 17:48:39 2014
+++ src/sys/modules/apple_smc_fan/apple_smc_fan.ioconf	Tue Apr  1 17:48:39 2014
@@ -0,0 +1,9 @@
+# $NetBSD: apple_smc_fan.ioconf,v 1.1 2014/04/01 17:48:39 riastradh Exp $
+
+ioconf apple_smc_fan
+
+include "conf/files"
+
+pseudo-root	applesmcbus*
+
+applesmcfan*	at applesmcbus?

Index: src/sys/modules/apple_smc_temp/Makefile
diff -u /dev/null src/sys/modules/apple_smc_temp/Makefile:1.1
--- /dev/null	Tue Apr  1 17:48:39 2014
+++ src/sys/modules/apple_smc_temp/Makefile	Tue Apr  1 17:48:39 2014
@@ -0,0 +1,15 @@
+# $NetBSD: Makefile,v 1.1 2014/04/01 17:48:39 riastradh Exp $
+
+.include "../Makefile.inc"
+
+.PATH:	${S}/dev/ic
+
+KMOD=	apple_smc_temp
+IOCONF=	apple_smc_temp.ioconf
+SRCS=	apple_smc_temp.c
+
+WARNS=	4
+
+CPPFLAGS+=	-DDIAGNOSTIC
+
+.include <bsd.kmodule.mk>
Index: src/sys/modules/apple_smc_temp/apple_smc_temp.ioconf
diff -u /dev/null src/sys/modules/apple_smc_temp/apple_smc_temp.ioconf:1.1
--- /dev/null	Tue Apr  1 17:48:39 2014
+++ src/sys/modules/apple_smc_temp/apple_smc_temp.ioconf	Tue Apr  1 17:48:39 2014
@@ -0,0 +1,9 @@
+# $NetBSD: apple_smc_temp.ioconf,v 1.1 2014/04/01 17:48:39 riastradh Exp $
+
+ioconf apple_smc_temp
+
+include "conf/files"
+
+pseudo-root	applesmcbus*
+
+applesmctemp*	at applesmcbus?

Reply via email to