summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/powerpc/mpc85xx/ocpbus.c67
1 files changed, 39 insertions, 28 deletions
diff --git a/sys/powerpc/mpc85xx/ocpbus.c b/sys/powerpc/mpc85xx/ocpbus.c
index 903a8e2..9099fa7 100644
--- a/sys/powerpc/mpc85xx/ocpbus.c
+++ b/sys/powerpc/mpc85xx/ocpbus.c
@@ -55,7 +55,6 @@ extern struct bus_space bs_be_tag;
struct ocpbus_softc {
struct rman sc_mem;
struct rman sc_irq;
- device_t sc_pic;
};
struct ocp_devinfo {
@@ -223,22 +222,20 @@ ocpbus_attach (device_t dev)
sc = device_get_softc(dev);
- /* Add child device nodes. Start with the PIC. */
- sc->sc_pic = ocpbus_mk_child(dev, OCPBUS_DEVTYPE_PIC, 0);
-
+ ocpbus_mk_child(dev, OCPBUS_DEVTYPE_I2C, 0);
+ ocpbus_mk_child(dev, OCPBUS_DEVTYPE_I2C, 1);
ocpbus_mk_child(dev, OCPBUS_DEVTYPE_UART, 0);
ocpbus_mk_child(dev, OCPBUS_DEVTYPE_UART, 1);
+ ocpbus_mk_child(dev, OCPBUS_DEVTYPE_LBC, 0);
+ ocpbus_mk_child(dev, OCPBUS_DEVTYPE_PCIB, 0);
+ ocpbus_mk_child(dev, OCPBUS_DEVTYPE_PCIB, 1);
+ ocpbus_mk_child(dev, OCPBUS_DEVTYPE_PCIB, 2);
ocpbus_mk_child(dev, OCPBUS_DEVTYPE_TSEC, 0);
ocpbus_mk_child(dev, OCPBUS_DEVTYPE_TSEC, 1);
ocpbus_mk_child(dev, OCPBUS_DEVTYPE_TSEC, 2);
ocpbus_mk_child(dev, OCPBUS_DEVTYPE_TSEC, 3);
- ocpbus_mk_child(dev, OCPBUS_DEVTYPE_PCIB, 0);
- ocpbus_mk_child(dev, OCPBUS_DEVTYPE_PCIB, 1);
- ocpbus_mk_child(dev, OCPBUS_DEVTYPE_PCIB, 2);
- ocpbus_mk_child(dev, OCPBUS_DEVTYPE_LBC, 0);
+ ocpbus_mk_child(dev, OCPBUS_DEVTYPE_PIC, 0);
ocpbus_mk_child(dev, OCPBUS_DEVTYPE_QUICC, 0);
- ocpbus_mk_child(dev, OCPBUS_DEVTYPE_I2C, 0);
- ocpbus_mk_child(dev, OCPBUS_DEVTYPE_I2C, 1);
/* Set up IRQ rman */
start = 0;
@@ -429,7 +426,8 @@ ocpbus_alloc_resource(device_t dev, device_t child, int type, int *rid,
sc = device_get_softc(dev);
- if (type == SYS_RES_IRQ) {
+ switch (type) {
+ case SYS_RES_IRQ:
if (start == 0ul && end == ~0ul) {
error = ocpbus_get_resource(dev, child, type, *rid,
&start, &count);
@@ -437,29 +435,42 @@ ocpbus_alloc_resource(device_t dev, device_t child, int type, int *rid,
return (NULL);
}
- rv = rman_reserve_resource(&sc->sc_irq, start - PIC_IRQ_START,
- start - PIC_IRQ_START, 1, flags, child);
- return (rv);
- }
+ /*
+ * ISA interrupts (IRQ 0-15) are remapped by the
+ * PCI driver. Make sure this happened.
+ */
+ if (start < PIC_IRQ_START)
+ return (NULL);
+
+ rv = rman_reserve_resource(&sc->sc_irq, start - PIC_IRQ_START,
+ start - PIC_IRQ_START + count - 1, count, flags, child);
+ if (rv == NULL)
+ return (NULL);
+ break;
- if (type != SYS_RES_MEMORY)
- return (NULL);
+ case SYS_RES_MEMORY:
+ if (start != 0ul || end != ~0ul)
+ return (NULL);
- if (start != 0ul || end != ~0ul)
- return (NULL);
+ error = ocpbus_get_resource(dev, child, type, *rid, &start,
+ &count);
+ if (error)
+ return (NULL);
- error = ocpbus_get_resource(dev, child, type, *rid, &start, &count);
- if (error)
- return (NULL);
+ rv = rman_reserve_resource(&sc->sc_mem, start,
+ start + count - 1, count, flags, child);
+ if (rv == NULL)
+ return (NULL);
+
+ rman_set_bustag(rv, &bs_be_tag);
+ rman_set_bushandle(rv, rman_get_start(rv));
+ break;
- end = start + count - 1;
- rv = rman_reserve_resource(&sc->sc_mem, start, end, count, flags,
- child);
- if (rv == NULL)
+ default:
return (NULL);
+ }
- rman_set_bustag(rv, &bs_be_tag);
- rman_set_bushandle(rv, rman_get_start(rv));
+ rman_set_rid(rv, *rid);
return (rv);
}
OpenPOWER on IntegriCloud