PERFORCE change 98406 for review

Warner Losh imp at FreeBSD.org
Sat Jun 3 18:09:11 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=98406

Change 98406 by imp at imp_lighthouse on 2006/06/03 18:06:49

	Keep track of resources better.
	Implement the sdhc_host device.  Not 100% sure we need this extra
	layer of indirection, but it may be useful.

Affected files ...

.. //depot/projects/arm/src/sys/dev/sdhc/sdhc.c#3 edit
.. //depot/projects/arm/src/sys/dev/sdhc/sdhc_pci.c#7 edit
.. //depot/projects/arm/src/sys/dev/sdhc/sdhcvar.h#3 edit

Differences ...

==== //depot/projects/arm/src/sys/dev/sdhc/sdhc.c#3 (text+ko) ====

@@ -35,6 +35,7 @@
 #include <sys/param.h>
 #include <sys/bus.h>
 #include <sys/kernel.h>
+#include <sys/malloc.h>
 #include <sys/module.h>
 #include <sys/systm.h>
 
@@ -105,20 +106,84 @@
 	return (0);
 }
 
-void
-sdhc_child_detached(device_t dev, device_t child)
+int
+sdhc_attach(device_t dev)
 {
-	// XXX
+	return (0);
 }
 
 int
-sdhc_attach(device_t dev)
+sdhc_detach(device_t dev)
+{
+	struct sdhc_softc *sc = device_get_softc(dev);
+	int numdevs, tmp, i;
+	device_t *devlist;
+
+	bus_generic_detach(dev);
+
+	for (i = 0; i < sc->nres; i++)
+		bus_free_resource(dev, SYS_RES_MEMORY, sc->res[i]);
+
+	// Since we create these devices in attach, we have to delete them
+	// in detach.
+	device_get_children(dev, &devlist, &numdevs);
+	for (tmp = 0; tmp < numdevs; tmp++)
+		device_delete_child(dev, devlist[tmp]);
+	free(devlist, M_TEMP);
+
+	return (0);
+}
+
+struct sdhc_host_softc 
+{
+	int dummy;
+};
+
+static int
+sdhc_host_probe(device_t dev)
+{
+	return (0);
+}
+
+static int
+sdhc_host_attach(device_t dev)
 {
+	device_add_child(dev, "mmcbus", -1);
 	return (0);
 }
 
-int
-sdhc_detach(device_t dev)
+static int
+sdhc_host_detach(device_t dev)
 {
-	return (bus_generic_detach(dev));
+	int numdevs, tmp;
+	device_t *devlist;
+
+	// Since we create these devices in attach, we have to delete them
+	// in detach.
+	device_get_children(dev, &devlist, &numdevs);
+	for (tmp = 0; tmp < numdevs; tmp++)
+		device_delete_child(dev, devlist[tmp]);
+	free(devlist, M_TEMP);
+
+	return (0);
+	
 }
+
+static device_method_t sdhc_host_methods[] = {
+	/* Device interface */
+	DEVMETHOD(device_probe,			sdhc_host_probe),
+	DEVMETHOD(device_attach,		sdhc_host_attach),
+	DEVMETHOD(device_detach,		sdhc_host_detach),
+
+	{ 0, 0 }
+};
+
+static driver_t sdhc_host_driver = {
+	"sdhc_host",
+	sdhc_host_methods,
+	sizeof(struct sdhc_host_softc),
+};
+
+devclass_t sdhc_host_devclass;
+
+DRIVER_MODULE(sdhc_host, sdhc, sdhc_host_driver, sdhc_host_devclass, 0, 0);

==== //depot/projects/arm/src/sys/dev/sdhc/sdhc_pci.c#7 (text+ko) ====

@@ -74,6 +74,7 @@
 		res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &i, RF_ACTIVE);
 		if (res == NULL)
 			continue;
+		sc->res[sc->nres++] = res;
 		child = device_add_child(dev, "sdhc_host", -1);
 		if (child == NULL) {
 			device_printf(child, "Can't add host slot rid %#x\n",
@@ -101,7 +102,6 @@
 	DEVMETHOD(bus_write_ivar,		sdhc_write_ivar),
 	DEVMETHOD(bus_alloc_resource,		sdhc_alloc_resource),
 	DEVMETHOD(bus_release_resource,		sdhc_release_resource),
-	DEVMETHOD(bus_child_detached,		sdhc_child_detached),
 
 	{ 0, 0 }
 };

==== //depot/projects/arm/src/sys/dev/sdhc/sdhcvar.h#3 (text+ko) ====

@@ -27,10 +27,14 @@
 #ifndef DEV_SDHC_SDHCVAR_H
 #define DEV_SDHC_SDHCVAR_H
 
+#define SDHC_MAX_RES 6
+
 struct sdhc_softc 
 {
 	int flags;
 #define SDHC_FLAG_HASDMA	1
+	int nres;
+	struct resource *res[SDHC_MAX_RES];
 };
 
 struct sdhc_ivars


More information about the p4-projects mailing list