map DMA & queue controllers into amusbss' space and write _detach
authorkremlin <ian@kremlin.cc>
Sun, 12 Feb 2017 02:56:35 +0000 (20:56 -0600)
committerkremlin <ian@kremlin.cc>
Sun, 12 Feb 2017 02:56:35 +0000 (20:56 -0600)
src/sys/arch/armv7/omap/amusbss.c

index d18796710edd9e213a71fdf992acdb2c1c1562ce..67fade6ee6d8dc064a1cca2fb70416f2e32ac64b 100644 (file)
@@ -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 */
+}