Lines Matching full:pchan
198 * @pchan: the physical channel utilized by this channel
205 struct owl_dma_pchan *pchan; member
241 static void pchan_update(struct owl_dma_pchan *pchan, u32 reg, in pchan_update() argument
246 regval = readl(pchan->base + reg); in pchan_update()
253 writel(regval, pchan->base + reg); in pchan_update()
256 static void pchan_writel(struct owl_dma_pchan *pchan, u32 reg, u32 data) in pchan_writel() argument
258 writel(data, pchan->base + reg); in pchan_writel()
261 static u32 pchan_readl(struct owl_dma_pchan *pchan, u32 reg) in pchan_readl() argument
263 return readl(pchan->base + reg); in pchan_readl()
471 struct owl_dma_pchan *pchan = NULL; in owl_dma_get_pchan() local
476 pchan = &od->pchans[i]; in owl_dma_get_pchan()
479 if (!pchan->vchan) { in owl_dma_get_pchan()
480 pchan->vchan = vchan; in owl_dma_get_pchan()
488 return pchan; in owl_dma_get_pchan()
491 static int owl_dma_pchan_busy(struct owl_dma *od, struct owl_dma_pchan *pchan) in owl_dma_pchan_busy() argument
497 return !(val & (1 << pchan->id)); in owl_dma_pchan_busy()
501 struct owl_dma_pchan *pchan) in owl_dma_terminate_pchan() argument
506 pchan_writel(pchan, OWL_DMAX_START, 0); in owl_dma_terminate_pchan()
507 pchan_update(pchan, OWL_DMAX_INT_STATUS, 0xff, false); in owl_dma_terminate_pchan()
510 dma_update(od, OWL_DMA_IRQ_EN0, (1 << pchan->id), false); in owl_dma_terminate_pchan()
513 if (irq_pd & (1 << pchan->id)) { in owl_dma_terminate_pchan()
515 "terminating pchan %d that still has pending irq\n", in owl_dma_terminate_pchan()
516 pchan->id); in owl_dma_terminate_pchan()
517 dma_writel(od, OWL_DMA_IRQ_PD0, (1 << pchan->id)); in owl_dma_terminate_pchan()
520 pchan->vchan = NULL; in owl_dma_terminate_pchan()
525 static void owl_dma_pause_pchan(struct owl_dma_pchan *pchan) in owl_dma_pause_pchan() argument
527 pchan_writel(pchan, 1, OWL_DMAX_PAUSE); in owl_dma_pause_pchan()
530 static void owl_dma_resume_pchan(struct owl_dma_pchan *pchan) in owl_dma_resume_pchan() argument
532 pchan_writel(pchan, 0, OWL_DMAX_PAUSE); in owl_dma_resume_pchan()
539 struct owl_dma_pchan *pchan = vchan->pchan; in owl_dma_start_next_txd() local
550 while (owl_dma_pchan_busy(od, pchan)) in owl_dma_start_next_txd()
561 pchan_writel(pchan, OWL_DMAX_MODE, OWL_DMA_MODE_LME); in owl_dma_start_next_txd()
562 pchan_writel(pchan, OWL_DMAX_LINKLIST_CTL, in owl_dma_start_next_txd()
564 pchan_writel(pchan, OWL_DMAX_NEXT_DESCRIPTOR, lli->phys); in owl_dma_start_next_txd()
565 pchan_writel(pchan, OWL_DMAX_INT_CTL, int_ctl); in owl_dma_start_next_txd()
567 /* Clear IRQ status for this pchan */ in owl_dma_start_next_txd()
568 pchan_update(pchan, OWL_DMAX_INT_STATUS, 0xff, false); in owl_dma_start_next_txd()
572 dma_update(od, OWL_DMA_IRQ_EN0, (1 << pchan->id), true); in owl_dma_start_next_txd()
576 dev_dbg(chan2dev(&vchan->vc.chan), "starting pchan %d\n", pchan->id); in owl_dma_start_next_txd()
578 /* Start DMA transfer for this pchan */ in owl_dma_start_next_txd()
579 pchan_writel(pchan, OWL_DMAX_START, 0x1); in owl_dma_start_next_txd()
587 owl_dma_terminate_pchan(od, vchan->pchan); in owl_dma_phy_free()
589 vchan->pchan = NULL; in owl_dma_phy_free()
596 struct owl_dma_pchan *pchan; in owl_dma_interrupt() local
605 /* Clear IRQ status for each pchan */ in owl_dma_interrupt()
607 pchan = &od->pchans[i]; in owl_dma_interrupt()
608 pchan_update(pchan, OWL_DMAX_INT_STATUS, 0xff, false); in owl_dma_interrupt()
616 pchan = &od->pchans[i]; in owl_dma_interrupt()
617 chan_irq_pending = pchan_readl(pchan, OWL_DMAX_INT_CTL) & in owl_dma_interrupt()
618 pchan_readl(pchan, OWL_DMAX_INT_STATUS); in owl_dma_interrupt()
629 /* Clear IRQ status for this pchan */ in owl_dma_interrupt()
630 pchan_update(pchan, OWL_DMAX_INT_STATUS, in owl_dma_interrupt()
643 pchan = &od->pchans[i]; in owl_dma_interrupt()
645 vchan = pchan->vchan; in owl_dma_interrupt()
647 dev_warn(od->dma.dev, "no vchan attached on pchan %d\n", in owl_dma_interrupt()
648 pchan->id); in owl_dma_interrupt()
706 if (vchan->pchan) in owl_dma_terminate_all()
745 owl_dma_pause_pchan(vchan->pchan); in owl_dma_pause()
757 if (!vchan->pchan && !vchan->txd) in owl_dma_resume()
764 owl_dma_resume_pchan(vchan->pchan); in owl_dma_resume()
773 struct owl_dma_pchan *pchan; in owl_dma_getbytes_chan() local
779 pchan = vchan->pchan; in owl_dma_getbytes_chan()
782 if (!pchan || !txd) in owl_dma_getbytes_chan()
786 bytes = pchan_readl(pchan, OWL_DMAX_REMAIN_CNT); in owl_dma_getbytes_chan()
789 if (pchan_readl(pchan, OWL_DMAX_MODE) & OWL_DMA_MODE_LME) { in owl_dma_getbytes_chan()
790 next_lli_phy = pchan_readl(pchan, OWL_DMAX_NEXT_DESCRIPTOR); in owl_dma_getbytes_chan()
841 struct owl_dma_pchan *pchan; in owl_dma_phy_alloc_and_start() local
843 pchan = owl_dma_get_pchan(od, vchan); in owl_dma_phy_alloc_and_start()
844 if (!pchan) in owl_dma_phy_alloc_and_start()
847 dev_dbg(od->dma.dev, "allocated pchan %d\n", pchan->id); in owl_dma_phy_alloc_and_start()
849 vchan->pchan = pchan; in owl_dma_phy_alloc_and_start()
860 if (!vchan->pchan) in owl_dma_issue_pending()
1178 struct owl_dma_pchan *pchan = &od->pchans[i]; in owl_dma_probe() local
1180 pchan->id = i; in owl_dma_probe()
1181 pchan->base = od->base + OWL_DMA_CHAN_BASE(i); in owl_dma_probe()