From 31c0a6bb3195f67b0aa31617153cd7119743dc58 Mon Sep 17 00:00:00 2001 From: marcel Date: Wed, 5 Mar 2008 18:39:01 +0000 Subject: o We don't have to keep track of the PIC, nor do we have to make sure it's probed first. The PowerPC platform code deals with everything. As such, probe devices in order of their location in the memory map. o Refactor the ocpbus_alloc_resource for readability and make sure we set the RID in the resource as per the new convention. --- sys/powerpc/mpc85xx/ocpbus.c | 67 ++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 28 deletions(-) (limited to 'sys/powerpc/mpc85xx/ocpbus.c') 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); } -- cgit v1.1