Lines Matching refs:ch

128 static void bcm_dma_reg_dump(int ch);
133 int ch;
175 bcm_dma_reset(device_t dev, int ch)
182 if (ch < 0 || ch >= BCM_DMA_CH_MAX)
185 cs = bus_read_4(sc->sc_mem, BCM_DMA_CS(ch));
189 bus_write_4(sc->sc_mem, BCM_DMA_CS(ch), 0);
193 cs = bus_read_4(sc->sc_mem, BCM_DMA_CS(ch));
198 "Can't abort DMA transfer at channel %d\n", ch);
201 bus_write_4(sc->sc_mem, BCM_DMA_CBNEXT(ch), 0);
204 bus_write_4(sc->sc_mem, BCM_DMA_CS(ch),
209 bus_write_4(sc->sc_mem, BCM_DMA_CBADDR(ch), 0);
210 bus_write_4(sc->sc_mem, BCM_DMA_CBNEXT(ch), 0);
213 cb = sc->sc_dma_ch[ch].cb;
223 struct bcm_dma_ch *ch;
266 ch = &sc->sc_dma_ch[i];
268 bzero(ch, sizeof(struct bcm_dma_ch));
269 ch->ch = i;
270 ch->flags = BCM_DMA_CH_UNMAP;
277 &ch->dma_map);
295 err = bus_dmamap_load(sc->sc_dma_tag, ch->dma_map, cb_virt,
303 ch->cb = cb_virt;
304 ch->vc_cb = cb_phys;
305 ch->flags = BCM_DMA_CH_FREE;
306 ch->cb->info = INFO_WAIT_RESP;
323 int ch = BCM_DMA_CH_INVALID;
335 ch = i;
336 sc->sc_dma_ch[ch].flags &= ~BCM_DMA_CH_FREE;
337 sc->sc_dma_ch[ch].flags |= BCM_DMA_CH_USED;
344 ch = req_ch;
345 sc->sc_dma_ch[ch].flags &= ~BCM_DMA_CH_FREE;
346 sc->sc_dma_ch[ch].flags |= BCM_DMA_CH_USED;
351 return (ch);
358 bcm_dma_free(int ch)
362 if (ch < 0 || ch >= BCM_DMA_CH_MAX)
366 if (sc->sc_dma_ch[ch].flags & BCM_DMA_CH_USED) {
367 sc->sc_dma_ch[ch].flags |= BCM_DMA_CH_FREE;
368 sc->sc_dma_ch[ch].flags &= ~BCM_DMA_CH_USED;
369 sc->sc_dma_ch[ch].intr_func = NULL;
370 sc->sc_dma_ch[ch].intr_arg = NULL;
373 bcm_dma_reset(sc->sc_dev, ch);
385 bcm_dma_setup_intr(int ch, void (*func)(int, void *), void *arg)
390 if (ch < 0 || ch >= BCM_DMA_CH_MAX)
393 if (!(sc->sc_dma_ch[ch].flags & BCM_DMA_CH_USED))
396 sc->sc_dma_ch[ch].intr_func = func;
397 sc->sc_dma_ch[ch].intr_arg = arg;
398 cb = sc->sc_dma_ch[ch].cb;
406 * ch - channel number
419 bcm_dma_setup_src(int ch, int dreq, int inc_addr, int width)
424 if (ch < 0 || ch >= BCM_DMA_CH_MAX)
427 if (!(sc->sc_dma_ch[ch].flags & BCM_DMA_CH_USED))
430 info = sc->sc_dma_ch[ch].cb->info;
449 sc->sc_dma_ch[ch].cb->info = info;
456 * ch - channel number
469 bcm_dma_setup_dst(int ch, int dreq, int inc_addr, int width)
474 if (ch < 0 || ch >= BCM_DMA_CH_MAX)
477 if (!(sc->sc_dma_ch[ch].flags & BCM_DMA_CH_USED))
480 info = sc->sc_dma_ch[ch].cb->info;
499 sc->sc_dma_ch[ch].cb->info = info;
523 bcm_dma_reg_dump(int ch)
529 if (ch < 0 || ch >= BCM_DMA_CH_MAX)
532 printf("DMA%d: ", ch);
534 reg = bus_read_4(sc->sc_mem, BCM_DMA_CH(ch) + i*4);
543 * ch - channel number
551 bcm_dma_start(int ch, vm_paddr_t src, vm_paddr_t dst, int len)
556 if (ch < 0 || ch >= BCM_DMA_CH_MAX)
559 if (!(sc->sc_dma_ch[ch].flags & BCM_DMA_CH_USED))
562 cb = sc->sc_dma_ch[ch].cb;
574 sc->sc_dma_ch[ch].dma_map, BUS_DMASYNC_PREWRITE);
576 bus_write_4(sc->sc_mem, BCM_DMA_CBADDR(ch),
577 sc->sc_dma_ch[ch].vc_cb);
578 bus_write_4(sc->sc_mem, BCM_DMA_CS(ch), CS_ACTIVE);
581 bcm_dma_cb_dump(sc->sc_dma_ch[ch].cb);
582 bcm_dma_reg_dump(ch);
590 * ch - channel number
595 bcm_dma_length(int ch)
600 if (ch < 0 || ch >= BCM_DMA_CH_MAX)
603 if (!(sc->sc_dma_ch[ch].flags & BCM_DMA_CH_USED))
606 cb = sc->sc_dma_ch[ch].cb;
615 struct bcm_dma_ch *ch = (struct bcm_dma_ch *)arg;
619 cs = bus_read_4(sc->sc_mem, BCM_DMA_CS(ch->ch));
623 "unexpected DMA intr CH=%d, CS=%x\n", ch->ch, cs);
628 if (!(ch->flags & BCM_DMA_CH_USED)) {
630 "unused DMA intr CH=%d, CS=%x\n", ch->ch, cs);
635 debug = bus_read_4(sc->sc_mem, BCM_DMA_DEBUG(ch->ch));
637 debug & DEBUG_ERROR_MASK, ch->ch);
638 bus_write_4(sc->sc_mem, BCM_DMA_DEBUG(ch->ch),
640 bcm_dma_reset(sc->sc_dev, ch->ch);
645 bus_write_4(sc->sc_mem, BCM_DMA_CS(ch->ch),
649 bus_dmamap_sync(sc->sc_dma_tag, ch->dma_map,
653 if (ch->intr_func)
654 ch->intr_func(ch->ch, ch->intr_arg);