diff options
Diffstat (limited to 'sys/powerpc/powermac/openpic_macio.c')
-rw-r--r-- | sys/powerpc/powermac/openpic_macio.c | 156 |
1 files changed, 12 insertions, 144 deletions
diff --git a/sys/powerpc/powermac/openpic_macio.c b/sys/powerpc/powermac/openpic_macio.c index c04c373..822804e 100644 --- a/sys/powerpc/powermac/openpic_macio.c +++ b/sys/powerpc/powermac/openpic_macio.c @@ -26,15 +26,6 @@ * */ -/* - * The macio attachment for the OpenPIC interrupt controller. - * A nexus driver is defined so the number of interrupts can be - * determined early in the boot sequence before the hardware - * is accessed - the interrupt i/f is installed at this time, - * and when h/w is finally accessed, interrupt sources allocated - * prior to this are activated - */ - #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); @@ -65,123 +56,33 @@ __FBSDID("$FreeBSD$"); #include "pic_if.h" -struct openpic_ofw_softc { - struct openpic_softc osc; - struct resource *sc_memr; /* macio bus resource */ - device_t sc_ndev; /* nexus device */ -}; - -static struct openpic_ofw_softc *ofwpicsoftc; - /* * MacIO interface */ -static void openpic_ofw_identify(driver_t *, device_t); -static int openpic_ofw_probe(device_t); -static int openpic_ofw_attach(device_t); static int openpic_macio_probe(device_t); -static int openpic_macio_attach(device_t); - -/* - * Nexus attachment - */ -static device_method_t openpic_ofw_methods[] = { - /* Device interface */ - DEVMETHOD(device_identify, openpic_ofw_identify), - DEVMETHOD(device_probe, openpic_ofw_probe), - DEVMETHOD(device_attach, openpic_ofw_attach), - - /* PIC interface */ - DEVMETHOD(pic_allocate_intr, openpic_allocate_intr), - DEVMETHOD(pic_setup_intr, openpic_setup_intr), - DEVMETHOD(pic_teardown_intr, openpic_teardown_intr), - DEVMETHOD(pic_release_intr, openpic_release_intr), - - { 0, 0 } -}; - -static driver_t openpic_ofw_driver = { - "openpic", - openpic_ofw_methods, - sizeof(struct openpic_ofw_softc) -}; - -static devclass_t openpic_ofw_devclass; - -DRIVER_MODULE(openpic_ofw, nexus, openpic_ofw_driver, openpic_ofw_devclass, - 0, 0); - -static void -openpic_ofw_identify(driver_t *driver, device_t parent) -{ - device_t child; - phandle_t pic; - char type[40]; - - pic = OF_finddevice("mpic"); - if (pic == -1) - return; - - OF_getprop(pic, "device_type", type, sizeof(type)); - - if (strcmp(type, "open-pic") != 0) - return; - - child = BUS_ADD_CHILD(parent, 0, "openpic", 0); - if (child != NULL) - nexus_set_device_type(child, "macio"); -} - -static int -openpic_ofw_probe(device_t dev) -{ - char *name; - char *type; - name = nexus_get_name(dev); - type = nexus_get_device_type(dev); - - if (strcmp(name, "openpic") != 0 || - strcmp(type, "macio") != 0) - return (ENXIO); - - device_set_desc(dev, OPENPIC_DEVSTR); - return (0); -} - -static int -openpic_ofw_attach(device_t dev) -{ - KASSERT(ofwpicsoftc == NULL, ("ofw openpic: already probed")); - ofwpicsoftc = device_get_softc(dev); - ofwpicsoftc->sc_ndev = dev; - - nexus_install_intcntlr(dev); - openpic_early_attach(dev); - return (0); -} - -/* - * MacIO attachment - */ static device_method_t openpic_macio_methods[] = { /* Device interface */ DEVMETHOD(device_probe, openpic_macio_probe), - DEVMETHOD(device_attach, openpic_macio_attach), + DEVMETHOD(device_attach, openpic_attach), + + /* PIC interface */ + DEVMETHOD(pic_dispatch, openpic_dispatch), + DEVMETHOD(pic_enable, openpic_enable), + DEVMETHOD(pic_eoi, openpic_eoi), + DEVMETHOD(pic_mask, openpic_mask), + DEVMETHOD(pic_unmask, openpic_unmask), { 0, 0 }, }; static driver_t openpic_macio_driver = { - "openpicmacio", + "openpic", openpic_macio_methods, - 0 + sizeof(struct openpic_softc), }; -static devclass_t openpic_macio_devclass; - -DRIVER_MODULE(openpicmacio, macio, openpic_macio_driver, - openpic_macio_devclass, 0, 0); +DRIVER_MODULE(openpic, macio, openpic_macio_driver, openpic_devclass, 0, 0); static int openpic_macio_probe(device_t dev) @@ -191,39 +92,6 @@ openpic_macio_probe(device_t dev) if (strcmp(type, "open-pic") != 0) return (ENXIO); - /* - * The description was already printed out in the nexus - * probe, so don't do it again here - */ - device_set_desc(dev, "OpenPIC MacIO interrupt cell"); - if (!bootverbose) - device_quiet(dev); + device_set_desc(dev, OPENPIC_DEVSTR); return (0); } - -static int -openpic_macio_attach(device_t dev) -{ - struct openpic_ofw_softc *sc; - int rid; - - sc = ofwpicsoftc; - KASSERT(sc != NULL, ("pic not nexus-probed\n")); - - rid = 0; - sc->sc_memr = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, - RF_ACTIVE); - - if (sc->sc_memr == NULL) { - device_printf(dev, "Could not alloc mem resource!\n"); - return (ENXIO); - } - - sc->osc.sc_bt = rman_get_bustag(sc->sc_memr); - sc->osc.sc_bh = rman_get_bushandle(sc->sc_memr); - sc->osc.sc_altdev = dev; - - return (openpic_attach(sc->sc_ndev)); -} - - |