void exmct_attach(struct device *parent, struct device *self, void *args) { struct armv7_attach_args *aa = args; struct exmct_softc *sc = (struct exmct_softc *) self; struct armv7mem mem; uint32_t i, mask, reg; sc->sc_iot = aa->aa_iot; #if NFDT > 0 if (aa->aa_node) { struct fdt_memory fdtmem; if (fdt_get_memory_address(aa->aa_node, 0, &fdtmem)) panic("%s: could not extract memory data from FDT", __func__); mem.addr = fdtmem.addr; mem.size = fdtmem.size; } else #endif { mem.addr = aa->aa_dev->mem[0].addr; mem.size = aa->aa_dev->mem[0].size; } if (bus_space_map(sc->sc_iot, mem.addr, mem.size, 0, &sc->sc_ioh)) panic("%s: bus_space_map failed!", __func__); printf("\n"); exmct_sc = sc; bus_space_write_4(sc->sc_iot, sc->sc_ioh, MCT_CTRL, bus_space_read_4(sc->sc_iot, sc->sc_ioh, MCT_CTRL) | MCT_CTRL_START); mask = (1 << 16); /* Wait 10 times until written value is applied */ for (i = 0; i < 10; i++) { reg = bus_space_read_4(sc->sc_iot, sc->sc_ioh, MCT_WRITE_STAT); if (reg & mask) { bus_space_write_4(sc->sc_iot, sc->sc_ioh, MCT_WRITE_STAT, mask); return; } cpufunc_nullop(); } /* NOTREACHED */ panic("%s: Can't enable timer!", __func__); }
static int ccm_attach(device_t dev) { struct ccm_softc *sc; int reg; int i; sc = device_get_softc(dev); sc->dev = dev; if (bus_alloc_resources(dev, ccm_spec, sc->res)) { device_printf(dev, "could not allocate resources\n"); return (ENXIO); } /* Memory interface */ sc->bst = rman_get_bustag(sc->res[0]); sc->bsh = rman_get_bushandle(sc->res[0]); /* Enable oscillator */ reg = READ4(sc, CCM_CCR); reg |= (FIRC_EN | FXOSC_EN); WRITE4(sc, CCM_CCR, reg); /* Wait 10 times */ for (i = 0; i < 10; i++) { if (READ4(sc, CCM_CSR) & FXOSC_RDY) { device_printf(sc->dev, "On board oscillator is ready.\n"); break; } cpufunc_nullop(); } /* Clock is on during all modes, except stop mode. */ for (i = 0; i < CCM_CCGRN; i++) { WRITE4(sc, CCM_CCGR(i), 0xffffffff); } /* Enable ENET clocks */ reg = READ4(sc, CCM_CSCDR1); reg |= (ENET_TS_EN | RMII_CLK_EN); WRITE4(sc, CCM_CSCDR1, reg); return (0); }
static int arm_tmr_attach(device_t dev) { struct arm_tmr_softc *sc; int reg, i; int mask; sc = device_get_softc(dev); if (bus_alloc_resources(dev, arm_tmr_spec, sc->tmr_res)) { device_printf(dev, "could not allocate resources\n"); return (ENXIO); } /* Timer interface */ sc->bst = rman_get_bustag(sc->tmr_res[0]); sc->bsh = rman_get_bushandle(sc->tmr_res[0]); reg = bus_space_read_4(sc->bst, sc->bsh, MCT_CTRL); reg |= MCT_CTRL_START; bus_space_write_4(sc->bst, sc->bsh, MCT_CTRL, reg); mask = (1 << 16); /* Wait 10 times until written value is applied */ for (i = 0; i < 10; i++) { reg = bus_space_read_4(sc->bst, sc->bsh, MCT_WRITE_STAT); if (reg & mask) { bus_space_write_4(sc->bst, sc->bsh, MCT_WRITE_STAT, mask); return (0); } cpufunc_nullop(); } /* NOTREACHED */ panic("Can't enable timer\n"); }