void fdcattach(struct fdc_softc *fdc) { mutex_init(&fdc->sc_mtx, MUTEX_DEFAULT, IPL_BIO); cv_init(&fdc->sc_cv, "fdcwakeup"); callout_init(&fdc->sc_timo_ch, 0); callout_init(&fdc->sc_intr_ch, 0); fdc->sc_state = DEVIDLE; TAILQ_INIT(&fdc->sc_drives); fdc->sc_maxiosize = isa_dmamaxsize(fdc->sc_ic, fdc->sc_drq); if (isa_drq_alloc(fdc->sc_ic, fdc->sc_drq) != 0) { aprint_normal_dev(fdc->sc_dev, "can't reserve drq %d\n", fdc->sc_drq); return; } if (isa_dmamap_create(fdc->sc_ic, fdc->sc_drq, fdc->sc_maxiosize, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW)) { aprint_normal_dev(fdc->sc_dev, "can't set up ISA DMA map\n"); return; } config_interrupts(fdc->sc_dev, fdcfinishattach); if (!pmf_device_register(fdc->sc_dev, fdcsuspend, fdcresume)) { aprint_error_dev(fdc->sc_dev, "cannot set power mgmt handler\n"); } }
void cecattach(struct device *parent, struct device *self, void *aux) { struct cec_softc *sc = (struct cec_softc *)self; struct isa_attach_args *ia = aux; struct gpibdev_attach_args ga; bus_size_t maxsize; printf("\n"); DPRINTF(DBG_CONFIG, ("cecattach: called\n")); sc->sc_iot = ia->ia_iot; sc->sc_ic = ia->ia_ic; if (bus_space_map(sc->sc_iot, ia->ia_io[0].ir_addr, CEC_IOSIZE, 0, &sc->sc_ioh) != 0) { printf("%s: unable to map I/O space\n", sc->sc_dev.dv_xname); return; } if (ia->ia_ndrq > 0) { sc->sc_flags |= CECF_USEDMA; sc->sc_drq = ia->ia_drq[0].ir_drq; (void) isa_drq_alloc(sc->sc_ic, sc->sc_drq); maxsize = isa_dmamaxsize(sc->sc_ic, sc->sc_drq); if (isa_dmamap_create(sc->sc_ic, sc->sc_drq, maxsize, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW)) { printf("%s: unable to create map for drq %d\n", sc->sc_dev.dv_xname, sc->sc_drq); sc->sc_flags &= ~CECF_USEDMA; } } sc->sc_myaddr = 15; /* XXX */ cecreset(sc); (void) nec7210_setaddress(sc, sc->sc_myaddr, -1); sc->sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq[0].ir_irq, IST_EDGE, IPL_BIO, cecintr, sc); if (sc->sc_ih == NULL) { printf("%s: couldn't establish interrupt\n", sc->sc_dev.dv_xname); return; } callout_init(&sc->sc_timeout_ch); /* attach MI GPIB bus */ cec_ic.cookie = (void *)sc; ga.ga_ic = &cec_ic; ga.ga_address = sc->sc_myaddr; sc->sc_gpib = (struct gpib_softc *)config_found(self, &ga, gpibdevprint); }
/* * Attach hardware to driver, attach hardware driver to audio * pseudo-device driver . */ void ad1848_isa_attach(struct ad1848_isa_softc *isc) { struct ad1848_softc *sc; int error; sc = &isc->sc_ad1848; sc->sc_readreg = ad1848_isa_read; sc->sc_writereg = ad1848_isa_write; if (isc->sc_playdrq != -1) { isc->sc_play_maxsize = isa_dmamaxsize(isc->sc_ic, isc->sc_playdrq); error = isa_dmamap_create(isc->sc_ic, isc->sc_playdrq, isc->sc_play_maxsize, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW); if (error) { aprint_error_dev(&sc->sc_dev, "can't create map for drq %d\n", isc->sc_playdrq); return; } } if (isc->sc_recdrq != -1 && isc->sc_recdrq != isc->sc_playdrq) { isc->sc_rec_maxsize = isa_dmamaxsize(isc->sc_ic, isc->sc_recdrq); error = isa_dmamap_create(isc->sc_ic, isc->sc_recdrq, isc->sc_rec_maxsize, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW); if (error) { aprint_error_dev(&sc->sc_dev, "can't create map for drq %d\n", isc->sc_recdrq); isa_dmamap_destroy(isc->sc_ic, isc->sc_playdrq); return; } } ad1848_attach(sc); }
/* Enable DMA */ int atppc_isadma_setup(struct atppc_softc * lsc, isa_chipset_tag_t ic, int drq) { int error = 1; /* Reserve DRQ */ if (isa_drq_alloc(ic, drq)) { ATPPC_DPRINTF(("%s(%s): cannot reserve DRQ line.\n", __func__, device_xname(lsc->sc_dev))); return error; } /* Get maximum DMA size for isa bus */ lsc->sc_dma_maxsize = isa_dmamaxsize(ic, drq); /* Create dma mapping */ error = isa_dmamap_create(ic, drq, lsc->sc_dma_maxsize, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW); return error; }
void satlinkattach(device_t parent, device_t self, void *aux) { struct satlink_softc *sc = device_private(self); struct isa_attach_args *ia = aux; bus_space_tag_t iot = ia->ia_iot; bus_space_handle_t ioh; bus_addr_t ringaddr; printf("\n"); /* Map the card. */ if (bus_space_map(iot, ia->ia_io[0].ir_addr, SATLINK_IOSIZE, 0, &ioh)) { aprint_error_dev(self, "can't map i/o space\n"); return; } sc->sc_iot = iot; sc->sc_ioh = ioh; sc->sc_ic = ia->ia_ic; sc->sc_drq = ia->ia_drq[0].ir_drq; /* Reset the card. */ bus_space_write_1(iot, ioh, SATLINK_COMMAND, SATLINK_CMD_RESET); /* Read ID from the card. */ sc->sc_id.sid_mfrid = bus_space_read_1(iot, ioh, SATLINK_MFRID_L) | (bus_space_read_1(iot, ioh, SATLINK_MFRID_H) << 8); sc->sc_id.sid_grpid = bus_space_read_1(iot, ioh, SATLINK_GRPID); sc->sc_id.sid_userid = bus_space_read_1(iot, ioh, SATLINK_USERID_L) | (bus_space_read_1(iot, ioh, SATLINK_USERID_H) << 8); sc->sc_id.sid_serial = bus_space_read_1(iot, ioh, SATLINK_SER_L) | (bus_space_read_1(iot, ioh, SATLINK_SER_M0) << 8) | (bus_space_read_1(iot, ioh, SATLINK_SER_M1) << 16) | (bus_space_read_1(iot, ioh, SATLINK_SER_H) << 24); printf("%s: mfrid 0x%x, grpid 0x%x, userid 0x%x, serial %d\n", device_xname(self), sc->sc_id.sid_mfrid, sc->sc_id.sid_grpid, sc->sc_id.sid_userid, sc->sc_id.sid_serial); callout_init(&sc->sc_ch, 0); selinit(&sc->sc_selq); sc->sc_bufsize = isa_dmamaxsize(sc->sc_ic, sc->sc_drq); /* Allocate and map the ring buffer. */ if (isa_dmamem_alloc(sc->sc_ic, sc->sc_drq, sc->sc_bufsize, &ringaddr, BUS_DMA_NOWAIT)) { aprint_error_dev(self, "can't allocate ring buffer\n"); return; } if (isa_dmamem_map(sc->sc_ic, sc->sc_drq, ringaddr, sc->sc_bufsize, &sc->sc_buf, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) { aprint_error_dev(self, "can't map ring buffer\n"); isa_dmamem_free(sc->sc_ic, sc->sc_drq, ringaddr, sc->sc_bufsize); return; } if (isa_drq_alloc(sc->sc_ic, sc->sc_drq) != 0) { aprint_error_dev(self, "can't reserve drq %d\n", sc->sc_drq); isa_dmamem_unmap(sc->sc_ic, sc->sc_drq, sc->sc_buf, sc->sc_bufsize); isa_dmamem_free(sc->sc_ic, sc->sc_drq, ringaddr, sc->sc_bufsize); return; } /* Create the DMA map. */ if (isa_dmamap_create(sc->sc_ic, sc->sc_drq, sc->sc_bufsize, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW)) { aprint_error_dev(self, "can't create DMA map\n"); isa_dmamem_unmap(sc->sc_ic, sc->sc_drq, sc->sc_buf, sc->sc_bufsize); isa_dmamem_free(sc->sc_ic, sc->sc_drq, ringaddr, sc->sc_bufsize); return; } }