From dceeb2f41b452a1c95f51ccd43429275639ed735 Mon Sep 17 00:00:00 2001 From: kremlin Date: Sat, 11 Feb 2017 20:56:35 -0600 Subject: [PATCH] map DMA & queue controllers into amusbss' space and write _detach --- src/sys/arch/armv7/omap/amusbss.c | 46 +++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/src/sys/arch/armv7/omap/amusbss.c b/src/sys/arch/armv7/omap/amusbss.c index d187967..67fade6 100644 --- a/src/sys/arch/armv7/omap/amusbss.c +++ b/src/sys/arch/armv7/omap/amusbss.c @@ -87,19 +87,26 @@ int amusbss_debug = 20; struct amusbss_softc { struct device sc_dev; bus_space_tag_t sc_iot; + void *sc_ih; + bus_dma_tag_t sc_dmat; bus_space_handle_t sc_ioh; + bus_size_t sc_ios; + bus_space_handle_t sc_ioh_dma_ctl; + bus_size_t sc_ios_dma_ctl; + bus_space_handle_t sc_ioh_dma_sched; + bus_size_t sc_ios_dma_sched; + bus_space_handle_t sc_ioh_queue; + bus_size_t sc_ios_queue; }; -/* Needed in attaching ammusb devices via config_search(9) */ -extern struct cfattach ammusb_ca; -//extern void simplebus_attach_node(struct device *, int); - /* core decl */ int amusbss_match(struct device *, void *, void *); void amusbss_attach(struct device *, struct device *, void *); int amusbss_detach(struct device *, int); void amusbss_reset(struct amusbss_softc *); +void amusbss_map_dma(int); + /* debug decl */ void amusbss_preg(uint32_t, char *, struct amusbss_softc *); void amusbss_dumpregs(struct amusbss_softc *); @@ -133,6 +140,8 @@ amusbss_attach(struct device *parent, struct device *self, void *args) &sc->sc_ioh)) panic("%s: bus_space_map failed!", __func__); + sc->sc_ios = faa->fa_reg[0].size; + /* Enable device clocks */ prcm_enablemodule(PRCM_USB); @@ -151,14 +160,35 @@ amusbss_attach(struct device *parent, struct device *self, void *args) rev = HREAD4(sc, USBSS_REVREG); printf(": rev %d.%d\n", rev >> 4 &0xf, rev & 0xf); - /* Walk the OFW tree and attach top-level devices */ - for (node = OF_child(faa->fa_node); node > 0; node = OF_peer(node)) - simplebus_attach_node(parent, node); + /* Walk FDT child nodes to attach ammusb devices, map DMA controllers */ + for (node = OF_child(faa->fa_node); node > 0; node = OF_peer(node)) { + if (OF_is_compatible(node, "ti,am3359-cppi41")) { + amusbss_map_dma(node); + } else { + simplebus_attach_node(parent, node); + } + } } int amusbss_detach(struct device *self, int flags) { - return 0; /* XXX */ + struct amusbss_softc *sc = (struct amusbss_softc *) self; + + bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios); + + if (sc->sc_ioh_dma_ctl) + bus_space_unmap(sc->sc_iot, sc->sc_ioh_dma_ctl, sc->sc_ios_dma_ctl); + if (sc->sc_ioh_dma_sched) + bus_space_unmap(sc->sc_iot, sc->sc_ioh_dma_sched, sc->sc_ios_dma_sched); + if (sc->sc_ioh_queue) + bus_space_unmap(sc->sc_iot, sc->sc_ioh_queue, sc->sc_ios_queue); + + return 0; } +void +amusbss_map_dma(int node) +{ + /* XXX TODO */ +} -- 2.41.0