Lines Matching refs:atchan

230 	struct				at_dma_chan *atchan;  member
289 #define channel_readl(atchan, name) \ argument
290 __raw_readl((atchan)->ch_regs + ATC_##name##_OFFSET)
292 #define channel_writel(atchan, name, val) \ argument
293 __raw_writel((val), (atchan)->ch_regs + ATC_##name##_OFFSET)
382 static void vdbg_dump_regs(struct at_dma_chan *atchan) in vdbg_dump_regs() argument
384 struct at_dma *atdma = to_at_dma(atchan->vc.chan.device); in vdbg_dump_regs()
386 dev_err(chan2dev(&atchan->vc.chan), in vdbg_dump_regs()
388 atchan->vc.chan.chan_id, in vdbg_dump_regs()
392 dev_err(chan2dev(&atchan->vc.chan), in vdbg_dump_regs()
394 channel_readl(atchan, SADDR), in vdbg_dump_regs()
395 channel_readl(atchan, DADDR), in vdbg_dump_regs()
396 channel_readl(atchan, CTRLA), in vdbg_dump_regs()
397 channel_readl(atchan, CTRLB), in vdbg_dump_regs()
398 channel_readl(atchan, CFG), in vdbg_dump_regs()
399 channel_readl(atchan, DSCR)); in vdbg_dump_regs()
402 static void vdbg_dump_regs(struct at_dma_chan *atchan) {} in vdbg_dump_regs() argument
405 static void atc_dump_lli(struct at_dma_chan *atchan, struct at_lli *lli) in atc_dump_lli() argument
407 dev_crit(chan2dev(&atchan->vc.chan), in atc_dump_lli()
442 static inline int atc_chan_is_enabled(struct at_dma_chan *atchan) in atc_chan_is_enabled() argument
444 struct at_dma *atdma = to_at_dma(atchan->vc.chan.device); in atc_chan_is_enabled()
446 return !!(dma_readl(atdma, CHSR) & atchan->mask); in atc_chan_is_enabled()
453 static inline int atc_chan_is_paused(struct at_dma_chan *atchan) in atc_chan_is_paused() argument
455 return test_bit(ATC_IS_PAUSED, &atchan->status); in atc_chan_is_paused()
462 static inline int atc_chan_is_cyclic(struct at_dma_chan *atchan) in atc_chan_is_cyclic() argument
464 return test_bit(ATC_IS_CYCLIC, &atchan->status); in atc_chan_is_cyclic()
550 static void atc_dostart(struct at_dma_chan *atchan) in atc_dostart() argument
552 struct virt_dma_desc *vd = vchan_next_desc(&atchan->vc); in atc_dostart()
556 atchan->desc = NULL; in atc_dostart()
560 vdbg_dump_regs(atchan); in atc_dostart()
563 atchan->desc = desc = to_atdma_desc(&vd->tx); in atc_dostart()
565 channel_writel(atchan, SADDR, 0); in atc_dostart()
566 channel_writel(atchan, DADDR, 0); in atc_dostart()
567 channel_writel(atchan, CTRLA, 0); in atc_dostart()
568 channel_writel(atchan, CTRLB, 0); in atc_dostart()
569 channel_writel(atchan, DSCR, desc->sg[0].lli_phys); in atc_dostart()
570 channel_writel(atchan, SPIP, in atc_dostart()
573 channel_writel(atchan, DPIP, in atc_dostart()
579 dma_writel(atchan->atdma, CHER, atchan->mask); in atc_dostart()
581 vdbg_dump_regs(atchan); in atc_dostart()
669 static int atc_get_llis_residue(struct at_dma_chan *atchan, in atc_get_llis_residue() argument
676 dscr = channel_readl(atchan, DSCR); in atc_get_llis_residue()
678 ctrla = channel_readl(atchan, CTRLA); in atc_get_llis_residue()
683 new_dscr = channel_readl(atchan, DSCR); in atc_get_llis_residue()
701 ctrla = channel_readl(atchan, CTRLA); in atc_get_llis_residue()
739 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_get_residue() local
744 vd = vchan_find_desc(&atchan->vc, cookie); in atc_get_residue()
747 else if (atchan->desc && atchan->desc->vd.tx.cookie == cookie) in atc_get_residue()
748 desc = atchan->desc; in atc_get_residue()
755 return atc_get_llis_residue(atchan, desc, residue); in atc_get_residue()
759 ctrla = channel_readl(atchan, CTRLA); in atc_get_residue()
769 static void atc_handle_error(struct at_dma_chan *atchan, unsigned int i) in atc_handle_error() argument
771 struct at_desc *desc = atchan->desc; in atc_handle_error()
774 dma_writel(atchan->atdma, CHDR, AT_DMA_RES(i) | atchan->mask); in atc_handle_error()
783 dev_crit(chan2dev(&atchan->vc.chan), "Bad descriptor submitted for DMA!\n"); in atc_handle_error()
784 dev_crit(chan2dev(&atchan->vc.chan), "cookie: %d\n", in atc_handle_error()
787 atc_dump_lli(atchan, desc->sg[i].lli); in atc_handle_error()
790 static void atdma_handle_chan_done(struct at_dma_chan *atchan, u32 pending, in atdma_handle_chan_done() argument
795 spin_lock(&atchan->vc.lock); in atdma_handle_chan_done()
796 desc = atchan->desc; in atdma_handle_chan_done()
800 atc_handle_error(atchan, i); in atdma_handle_chan_done()
804 if (atc_chan_is_cyclic(atchan)) { in atdma_handle_chan_done()
808 atchan->desc = NULL; in atdma_handle_chan_done()
809 if (!(atc_chan_is_enabled(atchan))) in atdma_handle_chan_done()
810 atc_dostart(atchan); in atdma_handle_chan_done()
813 spin_unlock(&atchan->vc.lock); in atdma_handle_chan_done()
819 struct at_dma_chan *atchan; in at_dma_interrupt() local
837 atchan = &atdma->chan[i]; in at_dma_interrupt()
840 atdma_handle_chan_done(atchan, pending, i); in at_dma_interrupt()
862 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_prep_dma_interleaved() local
949 return vchan_tx_prep(&atchan->vc, &desc->vd, flags); in atc_prep_dma_interleaved()
965 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_prep_dma_memcpy() local
1033 return vchan_tx_prep(&atchan->vc, &desc->vd, flags); in atc_prep_dma_memcpy()
1087 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_prep_dma_memset() local
1142 return vchan_tx_prep(&atchan->vc, &desc->vd, flags); in atc_prep_dma_memset()
1157 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_prep_dma_memset_sg() local
1220 return vchan_tx_prep(&atchan->vc, &desc->vd, flags); in atc_prep_dma_memset_sg()
1244 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_prep_slave_sg() local
1246 struct dma_slave_config *sconfig = &atchan->dma_sconfig; in atc_prep_slave_sg()
1284 FIELD_PREP(ATC_SIF, atchan->mem_if) | in atc_prep_slave_sg()
1285 FIELD_PREP(ATC_DIF, atchan->per_if); in atc_prep_slave_sg()
1332 FIELD_PREP(ATC_SIF, atchan->per_if) | in atc_prep_slave_sg()
1333 FIELD_PREP(ATC_DIF, atchan->mem_if); in atc_prep_slave_sg()
1382 return vchan_tx_prep(&atchan->vc, &desc->vd, flags); in atc_prep_slave_sg()
1422 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_dma_cyclic_fill_desc() local
1423 struct dma_slave_config *sconfig = &atchan->dma_sconfig; in atc_dma_cyclic_fill_desc()
1442 FIELD_PREP(ATC_SIF, atchan->mem_if) | in atc_dma_cyclic_fill_desc()
1443 FIELD_PREP(ATC_DIF, atchan->per_if); in atc_dma_cyclic_fill_desc()
1455 FIELD_PREP(ATC_SIF, atchan->per_if) | in atc_dma_cyclic_fill_desc()
1456 FIELD_PREP(ATC_DIF, atchan->mem_if); in atc_dma_cyclic_fill_desc()
1487 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_prep_dma_cyclic() local
1489 struct dma_slave_config *sconfig = &atchan->dma_sconfig; in atc_prep_dma_cyclic()
1506 was_cyclic = test_and_set_bit(ATC_IS_CYCLIC, &atchan->status); in atc_prep_dma_cyclic()
1540 return vchan_tx_prep(&atchan->vc, &desc->vd, flags); in atc_prep_dma_cyclic()
1545 clear_bit(ATC_IS_CYCLIC, &atchan->status); in atc_prep_dma_cyclic()
1552 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_config() local
1560 memcpy(&atchan->dma_sconfig, sconfig, sizeof(*sconfig)); in atc_config()
1562 convert_burst(&atchan->dma_sconfig.src_maxburst); in atc_config()
1563 convert_burst(&atchan->dma_sconfig.dst_maxburst); in atc_config()
1570 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_pause() local
1572 int chan_id = atchan->vc.chan.chan_id; in atc_pause()
1577 spin_lock_irqsave(&atchan->vc.lock, flags); in atc_pause()
1580 set_bit(ATC_IS_PAUSED, &atchan->status); in atc_pause()
1582 spin_unlock_irqrestore(&atchan->vc.lock, flags); in atc_pause()
1589 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_resume() local
1591 int chan_id = atchan->vc.chan.chan_id; in atc_resume()
1596 if (!atc_chan_is_paused(atchan)) in atc_resume()
1599 spin_lock_irqsave(&atchan->vc.lock, flags); in atc_resume()
1602 clear_bit(ATC_IS_PAUSED, &atchan->status); in atc_resume()
1604 spin_unlock_irqrestore(&atchan->vc.lock, flags); in atc_resume()
1611 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_terminate_all() local
1613 int chan_id = atchan->vc.chan.chan_id; in atc_terminate_all()
1626 spin_lock_irqsave(&atchan->vc.lock, flags); in atc_terminate_all()
1629 dma_writel(atdma, CHDR, AT_DMA_RES(chan_id) | atchan->mask); in atc_terminate_all()
1632 while (dma_readl(atdma, CHSR) & atchan->mask) in atc_terminate_all()
1635 if (atchan->desc) { in atc_terminate_all()
1636 vchan_terminate_vdesc(&atchan->desc->vd); in atc_terminate_all()
1637 atchan->desc = NULL; in atc_terminate_all()
1640 vchan_get_all_descriptors(&atchan->vc, &list); in atc_terminate_all()
1642 clear_bit(ATC_IS_PAUSED, &atchan->status); in atc_terminate_all()
1644 clear_bit(ATC_IS_CYCLIC, &atchan->status); in atc_terminate_all()
1646 spin_unlock_irqrestore(&atchan->vc.lock, flags); in atc_terminate_all()
1648 vchan_dma_desc_free_list(&atchan->vc, &list); in atc_terminate_all()
1668 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_tx_status() local
1678 spin_lock_irqsave(&atchan->vc.lock, flags); in atc_tx_status()
1681 spin_unlock_irqrestore(&atchan->vc.lock, flags); in atc_tx_status()
1698 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_issue_pending() local
1701 spin_lock_irqsave(&atchan->vc.lock, flags); in atc_issue_pending()
1702 if (vchan_issue_pending(&atchan->vc) && !atchan->desc) { in atc_issue_pending()
1703 if (!(atc_chan_is_enabled(atchan))) in atc_issue_pending()
1704 atc_dostart(atchan); in atc_issue_pending()
1706 spin_unlock_irqrestore(&atchan->vc.lock, flags); in atc_issue_pending()
1717 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_alloc_chan_resources() local
1725 if (atc_chan_is_enabled(atchan)) { in atc_alloc_chan_resources()
1746 channel_writel(atchan, CFG, cfg); in atc_alloc_chan_resources()
1757 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_free_chan_resources() local
1759 BUG_ON(atc_chan_is_enabled(atchan)); in atc_free_chan_resources()
1762 atchan->status = 0; in atc_free_chan_resources()
1790 struct at_dma_chan *atchan; in at_dma_xlate() local
1846 atchan = to_at_dma_chan(chan); in at_dma_xlate()
1847 atchan->per_if = dma_spec->args[0] & 0xff; in at_dma_xlate()
1848 atchan->mem_if = (dma_spec->args[0] >> 16) & 0xff; in at_dma_xlate()
2011 struct at_dma_chan *atchan = &atdma->chan[i]; in at_dma_probe() local
2013 atchan->mem_if = AT_DMA_MEM_IF; in at_dma_probe()
2014 atchan->per_if = AT_DMA_PER_IF; in at_dma_probe()
2016 atchan->ch_regs = atdma->regs + ch_regs(i); in at_dma_probe()
2017 atchan->mask = 1 << i; in at_dma_probe()
2019 atchan->atdma = atdma; in at_dma_probe()
2020 atchan->vc.desc_free = atdma_desc_free; in at_dma_probe()
2021 vchan_init(&atchan->vc, &atdma->dma_device); in at_dma_probe()
2144 struct at_dma_chan *atchan = to_at_dma_chan(chan); in at_dma_prepare() local
2146 if (atc_chan_is_enabled(atchan) && !atc_chan_is_cyclic(atchan)) in at_dma_prepare()
2152 static void atc_suspend_cyclic(struct at_dma_chan *atchan) in atc_suspend_cyclic() argument
2154 struct dma_chan *chan = &atchan->vc.chan; in atc_suspend_cyclic()
2158 if (!atc_chan_is_paused(atchan)) { in atc_suspend_cyclic()
2166 atchan->save_dscr = channel_readl(atchan, DSCR); in atc_suspend_cyclic()
2168 vdbg_dump_regs(atchan); in atc_suspend_cyclic()
2179 struct at_dma_chan *atchan = to_at_dma_chan(chan); in at_dma_suspend_noirq() local
2181 if (atc_chan_is_cyclic(atchan)) in at_dma_suspend_noirq()
2182 atc_suspend_cyclic(atchan); in at_dma_suspend_noirq()
2183 atchan->save_cfg = channel_readl(atchan, CFG); in at_dma_suspend_noirq()
2193 static void atc_resume_cyclic(struct at_dma_chan *atchan) in atc_resume_cyclic() argument
2195 struct at_dma *atdma = to_at_dma(atchan->vc.chan.device); in atc_resume_cyclic()
2199 channel_writel(atchan, SADDR, 0); in atc_resume_cyclic()
2200 channel_writel(atchan, DADDR, 0); in atc_resume_cyclic()
2201 channel_writel(atchan, CTRLA, 0); in atc_resume_cyclic()
2202 channel_writel(atchan, CTRLB, 0); in atc_resume_cyclic()
2203 channel_writel(atchan, DSCR, atchan->save_dscr); in atc_resume_cyclic()
2204 dma_writel(atdma, CHER, atchan->mask); in atc_resume_cyclic()
2209 vdbg_dump_regs(atchan); in atc_resume_cyclic()
2229 struct at_dma_chan *atchan = to_at_dma_chan(chan); in at_dma_resume_noirq() local
2231 channel_writel(atchan, CFG, atchan->save_cfg); in at_dma_resume_noirq()
2232 if (atc_chan_is_cyclic(atchan)) in at_dma_resume_noirq()
2233 atc_resume_cyclic(atchan); in at_dma_resume_noirq()