Lines Matching +full:data +full:- +full:channel
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
21 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
59 dbdma_channel_t *channel; /* DBDMA channel */ member
61 struct pcm_channel *pcm; /* PCM channel */
76 addr = (u_int32_t) sndbuf_getbufaddr(dma->buf); in aoa_dma_set_program()
77 KASSERT(dma->bufsz == sndbuf_getsize(dma->buf), ("bad size")); in aoa_dma_set_program()
79 dma->slots = dma->bufsz / dma->blksz; in aoa_dma_set_program()
81 for (i = 0; i < dma->slots; ++i) { in aoa_dma_set_program()
82 dbdma_insert_command(dma->channel, in aoa_dma_set_program()
86 addr, /* data */ in aoa_dma_set_program()
87 dma->blksz, /* count */ in aoa_dma_set_program()
91 dma->slots + 1 /* branch_slot */ in aoa_dma_set_program()
94 addr += dma->blksz; in aoa_dma_set_program()
98 dbdma_insert_branch(dma->channel, dma->slots, 0); in aoa_dma_set_program()
101 dbdma_insert_stop(dma->channel, dma->slots + 1); in aoa_dma_set_program()
104 dbdma_set_branch_selector(dma->channel, 1 << 0, 1 << 0); in aoa_dma_set_program()
105 dbdma_set_device_status(dma->channel, 1 << 0, 0); in aoa_dma_set_program()
107 dbdma_sync_commands(dma->channel, BUS_DMASYNC_PREWRITE); in aoa_dma_set_program()
120 self = sc->sc_dev; in aoa_dma_create()
128 dma->tag = tag; in aoa_dma_create()
129 dma->bufsz = AOA_BUFFER_SIZE; in aoa_dma_create()
130 dma->blksz = PAGE_SIZE; /* initial blocksize */ in aoa_dma_create()
132 mtx_init(&dma->mutex, "AOA", NULL, MTX_DEF); in aoa_dma_create()
134 sc->sc_intrp = dma; in aoa_dma_create()
142 bus_dma_tag_destroy(dma->tag); in aoa_dma_delete()
143 mtx_destroy(&dma->mutex); in aoa_dma_delete()
148 aoa_chan_setblocksize(kobj_t obj, void *data, u_int32_t blocksz) in aoa_chan_setblocksize() argument
150 struct aoa_dma *dma = data; in aoa_chan_setblocksize()
153 DPRINTF(("aoa_chan_setblocksize: blocksz = %u, dma->blksz = %u\n", in aoa_chan_setblocksize()
154 blocksz, dma->blksz)); in aoa_chan_setblocksize()
155 KASSERT(!dma->running, ("dma is running")); in aoa_chan_setblocksize()
160 blocksz = 1 << (31 - lz); in aoa_chan_setblocksize()
164 if (blocksz > dma->bufsz) in aoa_chan_setblocksize()
165 blocksz = dma->bufsz; in aoa_chan_setblocksize()
167 err = sndbuf_resize(dma->buf, dma->bufsz / blocksz, blocksz); in aoa_chan_setblocksize()
173 if (blocksz == dma->blksz) in aoa_chan_setblocksize()
174 return (dma->blksz); in aoa_chan_setblocksize()
177 err = dbdma_resize_channel(dma->channel, 2 + dma->bufsz / blocksz); in aoa_chan_setblocksize()
184 dma->blksz = blocksz; in aoa_chan_setblocksize()
187 return (dma->blksz); in aoa_chan_setblocksize()
191 aoa_chan_setformat(kobj_t obj, void *data, u_int32_t format) in aoa_chan_setformat() argument
202 aoa_chan_setspeed(kobj_t obj, void *data, u_int32_t speed) in aoa_chan_setspeed() argument
210 aoa_chan_getptr(kobj_t obj, void *data) in aoa_chan_getptr() argument
212 struct aoa_dma *dma = data; in aoa_chan_getptr()
214 if (!dma->running) in aoa_chan_getptr()
217 return (dma->slot * dma->blksz); in aoa_chan_getptr()
233 dma->pcm = c; in aoa_chan_init()
234 dma->buf = b; in aoa_chan_init()
235 dma->reg = sc->sc_odma; in aoa_chan_init()
238 max_slots = 2 + dma->bufsz / dma->blksz; in aoa_chan_init()
239 err = dbdma_allocate_channel(dma->reg, 0, bus_get_dma_tag(sc->sc_dev), in aoa_chan_init()
240 max_slots, &dma->channel ); in aoa_chan_init()
246 if (sndbuf_alloc(dma->buf, dma->tag, 0, dma->bufsz) != 0) { in aoa_chan_init()
247 dbdma_free_channel(dma->channel); in aoa_chan_init()
258 aoa_chan_trigger(kobj_t obj, void *data, int go) in aoa_chan_trigger() argument
260 struct aoa_dma *dma = data; in aoa_chan_trigger()
267 dma->running = 1; in aoa_chan_trigger()
269 dma->slot = 0; in aoa_chan_trigger()
270 dbdma_set_current_cmd(dma->channel, dma->slot); in aoa_chan_trigger()
272 dbdma_run(dma->channel); in aoa_chan_trigger()
279 mtx_lock(&dma->mutex); in aoa_chan_trigger()
281 dma->running = 0; in aoa_chan_trigger()
284 dbdma_set_device_status(dma->channel, 1 << 0, 1 << 0); in aoa_chan_trigger()
290 dbdma_stop(dma->channel); in aoa_chan_trigger()
291 dbdma_set_device_status(dma->channel, 1 << 0, 0); in aoa_chan_trigger()
293 for (i = 0; i < dma->slots; ++i) in aoa_chan_trigger()
294 dbdma_clear_cmd_status(dma->channel, i); in aoa_chan_trigger()
296 mtx_unlock(&dma->mutex); in aoa_chan_trigger()
305 aoa_chan_free(kobj_t obj, void *data) in aoa_chan_free() argument
307 struct aoa_dma *dma = data; in aoa_chan_free()
309 sndbuf_free(dma->buf); in aoa_chan_free()
310 dbdma_free_channel(dma->channel); in aoa_chan_free()
322 if (!(dma = sc->sc_intrp) || !dma->running) in aoa_interrupt()
325 mtx_lock(&dma->mutex); in aoa_interrupt()
327 while (dbdma_get_cmd_status(dma->channel, dma->slot)) { in aoa_interrupt()
328 dbdma_clear_cmd_status(dma->channel, dma->slot); in aoa_interrupt()
329 dma->slot = (dma->slot + 1) % dma->slots; in aoa_interrupt()
331 mtx_unlock(&dma->mutex); in aoa_interrupt()
332 chn_intr(dma->pcm); in aoa_interrupt()
333 mtx_lock(&dma->mutex); in aoa_interrupt()
336 mtx_unlock(&dma->mutex); in aoa_interrupt()
346 aoa_chan_getcaps(kobj_t obj, void *data) in aoa_chan_getcaps() argument
373 self = sc->sc_dev; in aoa_attach()