PERFORCE change 136703 for review

Marcel Moolenaar marcel at FreeBSD.org
Sun Mar 2 23:46:56 UTC 2008


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

Change 136703 by marcel at marcel_xcllnt on 2008/03/02 23:46:50

	Fix quicc(4) WRT resource handling.

Affected files ...

.. //depot/projects/e500/sys/dev/quicc/quicc_bfe.h#3 edit
.. //depot/projects/e500/sys/dev/quicc/quicc_bfe_ocp.c#2 edit
.. //depot/projects/e500/sys/dev/quicc/quicc_core.c#4 edit
.. //depot/projects/e500/sys/powerpc/conf/MPC85XX#4 edit

Differences ...

==== //depot/projects/e500/sys/dev/quicc/quicc_bfe.h#3 (text+ko) ====

@@ -44,6 +44,7 @@
 	void		*sc_icookie;
 	int		sc_irid;
 
+	struct rman	sc_rman;
 	struct quicc_device *sc_device;
 
 	u_int		sc_clock;

==== //depot/projects/e500/sys/dev/quicc/quicc_bfe_ocp.c#2 (text+ko) ====

@@ -37,6 +37,7 @@
 #include <sys/lock.h>
 #include <sys/malloc.h>
 #include <sys/module.h>
+#include <sys/rman.h>
 #include <sys/tty.h>
 #include <machine/bus.h>
 

==== //depot/projects/e500/sys/dev/quicc/quicc_core.c#4 (text+ko) ====

@@ -64,7 +64,7 @@
 MALLOC_DEFINE(M_QUICC, "QUICC", "QUICC driver");
 
 struct quicc_device {
-	struct resource	qd_rres;
+	struct rman	*qd_rman;
 	struct resource_list qd_rlist;
 	device_t	qd_dev;
 	int		qd_devtype;
@@ -115,6 +115,23 @@
 	if (sc->sc_rres == NULL)
 		return (ENXIO);
 
+	start = rman_get_start(sc->sc_rres);
+	size = rman_get_size(sc->sc_rres);
+
+	sc->sc_rman.rm_start = start;
+	sc->sc_rman.rm_end = start + size - 1;
+	sc->sc_rman.rm_type = RMAN_ARRAY;
+	sc->sc_rman.rm_descr = "QUICC resources";
+	error = rman_init(&sc->sc_rman);
+	if (!error)
+		error = rman_manage_region(&sc->sc_rman, start,
+		    start + size - 1);
+	if (error) {
+		bus_release_resource(dev, sc->sc_rtype, sc->sc_rrid,
+		    sc->sc_rres);
+		return (error);
+	}
+
 	/*
 	 * Allocate interrupt resource.
 	 */
@@ -161,16 +178,11 @@
 	    M_WAITOK | M_ZERO);
 
 	qd->qd_devtype = QUICC_DEVTYPE_SCC;
+	qd->qd_rman = &sc->sc_rman;
 	resource_list_init(&qd->qd_rlist);
 
-	start = rman_get_start(sc->sc_rres);
-	size = rman_get_size(sc->sc_rres);
 	resource_list_add(&qd->qd_rlist, sc->sc_rtype, 0, start,
-                    start + size - 1, size);
-	rle = resource_list_find(&qd->qd_rlist, sc->sc_rtype, 0);
-	rle->res = &qd->qd_rres;
-	rman_set_bushandle(rle->res, rman_get_bushandle(sc->sc_rres));
-	rman_set_bustag(rle->res, rman_get_bustag(sc->sc_rres));
+	    start + size - 1, size);
 
 	resource_list_add(&qd->qd_rlist, SYS_RES_IRQ, 0, 0xf00, 0xf00, 1);
 	rle = resource_list_find(&qd->qd_rlist, SYS_RES_IRQ, 0);
@@ -178,7 +190,7 @@
 
 	qd->qd_dev = device_add_child(dev, NULL, -1);
 	device_set_ivars(qd->qd_dev, (void *)qd);
-        error = device_probe_and_attach(qd->qd_dev);
+	error = device_probe_and_attach(qd->qd_dev);
 
 	/* Enable all SCC interrupts. */
 	quicc_write4(sc->sc_rres, QUICC_REG_SIMR_L, 0x00f00000);
@@ -256,7 +268,18 @@
 
 	qd = device_get_ivars(child);
 	rle = resource_list_find(&qd->qd_rlist, type, *rid);
-	return (rle != NULL) ? rle->res : NULL;
+	if (rle == NULL)
+		return (NULL);
+
+	if (rle->res == NULL) {
+		rle->res = rman_reserve_resource(qd->qd_rman, rle->start,
+		    rle->start + rle->count - 1, rle->count, flags, child);
+		if (rle->res != NULL) {
+			rman_set_bustag(rle->res, &bs_be_tag);
+			rman_set_bushandle(rle->res, rle->start);
+		}
+	}
+	return (rle->res);
 }
 
 int

==== //depot/projects/e500/sys/powerpc/conf/MPC85XX#4 (text+ko) ====

@@ -52,7 +52,7 @@
 device		miibus
 device		pci
 device		pty
-#device		quicc
+device		quicc
 device		random
 #device		rl
 device		scbus


More information about the p4-projects mailing list