Lines Matching refs:atchan

236 	struct				at_dma_chan *atchan;  member
297 #define channel_readl(atchan, name) \ argument
298 __raw_readl((atchan)->ch_regs + ATC_##name##_OFFSET)
300 #define channel_writel(atchan, name, val) \ argument
301 __raw_writel((val), (atchan)->ch_regs + ATC_##name##_OFFSET)
390 static void vdbg_dump_regs(struct at_dma_chan *atchan) in vdbg_dump_regs() argument
392 struct at_dma *atdma = to_at_dma(atchan->vc.chan.device); in vdbg_dump_regs()
394 dev_err(chan2dev(&atchan->vc.chan), in vdbg_dump_regs()
396 atchan->vc.chan.chan_id, in vdbg_dump_regs()
400 dev_err(chan2dev(&atchan->vc.chan), in vdbg_dump_regs()
402 channel_readl(atchan, SADDR), in vdbg_dump_regs()
403 channel_readl(atchan, DADDR), in vdbg_dump_regs()
404 channel_readl(atchan, CTRLA), in vdbg_dump_regs()
405 channel_readl(atchan, CTRLB), in vdbg_dump_regs()
406 channel_readl(atchan, CFG), in vdbg_dump_regs()
407 channel_readl(atchan, DSCR)); in vdbg_dump_regs()
410 static void vdbg_dump_regs(struct at_dma_chan *atchan) {} in vdbg_dump_regs() argument
413 static void atc_dump_lli(struct at_dma_chan *atchan, struct at_lli *lli) in atc_dump_lli() argument
415 dev_crit(chan2dev(&atchan->vc.chan), in atc_dump_lli()
450 static inline int atc_chan_is_enabled(struct at_dma_chan *atchan) in atc_chan_is_enabled() argument
452 struct at_dma *atdma = to_at_dma(atchan->vc.chan.device); in atc_chan_is_enabled()
454 return !!(dma_readl(atdma, CHSR) & atchan->mask); in atc_chan_is_enabled()
461 static inline int atc_chan_is_paused(struct at_dma_chan *atchan) in atc_chan_is_paused() argument
463 return test_bit(ATC_IS_PAUSED, &atchan->status); in atc_chan_is_paused()
470 static inline int atc_chan_is_cyclic(struct at_dma_chan *atchan) in atc_chan_is_cyclic() argument
472 return test_bit(ATC_IS_CYCLIC, &atchan->status); in atc_chan_is_cyclic()
558 static void atc_dostart(struct at_dma_chan *atchan) in atc_dostart() argument
560 struct virt_dma_desc *vd = vchan_next_desc(&atchan->vc); in atc_dostart()
564 atchan->desc = NULL; in atc_dostart()
568 vdbg_dump_regs(atchan); in atc_dostart()
571 atchan->desc = desc = to_atdma_desc(&vd->tx); in atc_dostart()
573 channel_writel(atchan, SADDR, 0); in atc_dostart()
574 channel_writel(atchan, DADDR, 0); in atc_dostart()
575 channel_writel(atchan, CTRLA, 0); in atc_dostart()
576 channel_writel(atchan, CTRLB, 0); in atc_dostart()
577 channel_writel(atchan, DSCR, desc->sg[0].lli_phys); in atc_dostart()
578 channel_writel(atchan, SPIP, in atc_dostart()
581 channel_writel(atchan, DPIP, in atc_dostart()
587 dma_writel(atchan->atdma, CHER, atchan->mask); in atc_dostart()
589 vdbg_dump_regs(atchan); in atc_dostart()
678 static int atc_get_llis_residue(struct at_dma_chan *atchan, in atc_get_llis_residue() argument
685 dscr = channel_readl(atchan, DSCR); in atc_get_llis_residue()
687 ctrla = channel_readl(atchan, CTRLA); in atc_get_llis_residue()
692 new_dscr = channel_readl(atchan, DSCR); in atc_get_llis_residue()
710 ctrla = channel_readl(atchan, CTRLA); in atc_get_llis_residue()
749 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_get_residue() local
754 vd = vchan_find_desc(&atchan->vc, cookie); in atc_get_residue()
757 else if (atchan->desc && atchan->desc->vd.tx.cookie == cookie) in atc_get_residue()
758 desc = atchan->desc; in atc_get_residue()
765 return atc_get_llis_residue(atchan, desc, residue); in atc_get_residue()
769 ctrla = channel_readl(atchan, CTRLA); in atc_get_residue()
779 static void atc_handle_error(struct at_dma_chan *atchan, unsigned int i) in atc_handle_error() argument
781 struct at_desc *desc = atchan->desc; in atc_handle_error()
784 dma_writel(atchan->atdma, CHDR, AT_DMA_RES(i) | atchan->mask); in atc_handle_error()
793 dev_crit(chan2dev(&atchan->vc.chan), "Bad descriptor submitted for DMA!\n"); in atc_handle_error()
794 dev_crit(chan2dev(&atchan->vc.chan), "cookie: %d\n", in atc_handle_error()
797 atc_dump_lli(atchan, desc->sg[i].lli); in atc_handle_error()
800 static void atdma_handle_chan_done(struct at_dma_chan *atchan, u32 pending, in atdma_handle_chan_done() argument
805 spin_lock(&atchan->vc.lock); in atdma_handle_chan_done()
806 desc = atchan->desc; in atdma_handle_chan_done()
810 atc_handle_error(atchan, i); in atdma_handle_chan_done()
814 if (atc_chan_is_cyclic(atchan)) { in atdma_handle_chan_done()
818 atchan->desc = NULL; in atdma_handle_chan_done()
819 if (!(atc_chan_is_enabled(atchan))) in atdma_handle_chan_done()
820 atc_dostart(atchan); in atdma_handle_chan_done()
823 spin_unlock(&atchan->vc.lock); in atdma_handle_chan_done()
829 struct at_dma_chan *atchan; in at_dma_interrupt() local
847 atchan = &atdma->chan[i]; in at_dma_interrupt()
850 atdma_handle_chan_done(atchan, pending, i); in at_dma_interrupt()
872 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_prep_dma_interleaved() local
959 return vchan_tx_prep(&atchan->vc, &desc->vd, flags); in atc_prep_dma_interleaved()
975 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_prep_dma_memcpy() local
1043 return vchan_tx_prep(&atchan->vc, &desc->vd, flags); in atc_prep_dma_memcpy()
1097 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_prep_dma_memset() local
1152 return vchan_tx_prep(&atchan->vc, &desc->vd, flags); in atc_prep_dma_memset()
1167 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_prep_dma_memset_sg() local
1230 return vchan_tx_prep(&atchan->vc, &desc->vd, flags); in atc_prep_dma_memset_sg()
1254 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_prep_slave_sg() local
1256 struct dma_slave_config *sconfig = &atchan->dma_sconfig; in atc_prep_slave_sg()
1294 FIELD_PREP(ATC_SIF, atchan->mem_if) | in atc_prep_slave_sg()
1295 FIELD_PREP(ATC_DIF, atchan->per_if); in atc_prep_slave_sg()
1342 FIELD_PREP(ATC_SIF, atchan->per_if) | in atc_prep_slave_sg()
1343 FIELD_PREP(ATC_DIF, atchan->mem_if); in atc_prep_slave_sg()
1392 return vchan_tx_prep(&atchan->vc, &desc->vd, flags); in atc_prep_slave_sg()
1432 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_dma_cyclic_fill_desc() local
1433 struct dma_slave_config *sconfig = &atchan->dma_sconfig; in atc_dma_cyclic_fill_desc()
1452 FIELD_PREP(ATC_SIF, atchan->mem_if) | in atc_dma_cyclic_fill_desc()
1453 FIELD_PREP(ATC_DIF, atchan->per_if); in atc_dma_cyclic_fill_desc()
1465 FIELD_PREP(ATC_SIF, atchan->per_if) | in atc_dma_cyclic_fill_desc()
1466 FIELD_PREP(ATC_DIF, atchan->mem_if); in atc_dma_cyclic_fill_desc()
1497 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_prep_dma_cyclic() local
1499 struct dma_slave_config *sconfig = &atchan->dma_sconfig; in atc_prep_dma_cyclic()
1516 was_cyclic = test_and_set_bit(ATC_IS_CYCLIC, &atchan->status); in atc_prep_dma_cyclic()
1550 return vchan_tx_prep(&atchan->vc, &desc->vd, flags); in atc_prep_dma_cyclic()
1555 clear_bit(ATC_IS_CYCLIC, &atchan->status); in atc_prep_dma_cyclic()
1562 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_config() local
1570 memcpy(&atchan->dma_sconfig, sconfig, sizeof(*sconfig)); in atc_config()
1572 convert_burst(&atchan->dma_sconfig.src_maxburst); in atc_config()
1573 convert_burst(&atchan->dma_sconfig.dst_maxburst); in atc_config()
1580 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_pause() local
1582 int chan_id = atchan->vc.chan.chan_id; in atc_pause()
1587 spin_lock_irqsave(&atchan->vc.lock, flags); in atc_pause()
1590 set_bit(ATC_IS_PAUSED, &atchan->status); in atc_pause()
1592 spin_unlock_irqrestore(&atchan->vc.lock, flags); in atc_pause()
1599 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_resume() local
1601 int chan_id = atchan->vc.chan.chan_id; in atc_resume()
1606 if (!atc_chan_is_paused(atchan)) in atc_resume()
1609 spin_lock_irqsave(&atchan->vc.lock, flags); in atc_resume()
1612 clear_bit(ATC_IS_PAUSED, &atchan->status); in atc_resume()
1614 spin_unlock_irqrestore(&atchan->vc.lock, flags); in atc_resume()
1621 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_terminate_all() local
1623 int chan_id = atchan->vc.chan.chan_id; in atc_terminate_all()
1636 spin_lock_irqsave(&atchan->vc.lock, flags); in atc_terminate_all()
1639 dma_writel(atdma, CHDR, AT_DMA_RES(chan_id) | atchan->mask); in atc_terminate_all()
1642 while (dma_readl(atdma, CHSR) & atchan->mask) in atc_terminate_all()
1645 if (atchan->desc) { in atc_terminate_all()
1646 vchan_terminate_vdesc(&atchan->desc->vd); in atc_terminate_all()
1647 atchan->desc = NULL; in atc_terminate_all()
1650 vchan_get_all_descriptors(&atchan->vc, &list); in atc_terminate_all()
1652 clear_bit(ATC_IS_PAUSED, &atchan->status); in atc_terminate_all()
1654 clear_bit(ATC_IS_CYCLIC, &atchan->status); in atc_terminate_all()
1656 spin_unlock_irqrestore(&atchan->vc.lock, flags); in atc_terminate_all()
1658 vchan_dma_desc_free_list(&atchan->vc, &list); in atc_terminate_all()
1678 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_tx_status() local
1688 spin_lock_irqsave(&atchan->vc.lock, flags); in atc_tx_status()
1691 spin_unlock_irqrestore(&atchan->vc.lock, flags); in atc_tx_status()
1708 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_issue_pending() local
1711 spin_lock_irqsave(&atchan->vc.lock, flags); in atc_issue_pending()
1712 if (vchan_issue_pending(&atchan->vc) && !atchan->desc) { in atc_issue_pending()
1713 if (!(atc_chan_is_enabled(atchan))) in atc_issue_pending()
1714 atc_dostart(atchan); in atc_issue_pending()
1716 spin_unlock_irqrestore(&atchan->vc.lock, flags); in atc_issue_pending()
1727 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_alloc_chan_resources() local
1735 if (atc_chan_is_enabled(atchan)) { in atc_alloc_chan_resources()
1756 channel_writel(atchan, CFG, cfg); in atc_alloc_chan_resources()
1767 struct at_dma_chan *atchan = to_at_dma_chan(chan); in atc_free_chan_resources() local
1770 BUG_ON(atc_chan_is_enabled(atchan)); in atc_free_chan_resources()
1773 atchan->status = 0; in atc_free_chan_resources()
1805 struct at_dma_chan *atchan; in at_dma_xlate() local
1861 atchan = to_at_dma_chan(chan); in at_dma_xlate()
1862 atchan->per_if = dma_spec->args[0] & 0xff; in at_dma_xlate()
1863 atchan->mem_if = (dma_spec->args[0] >> 16) & 0xff; in at_dma_xlate()
2026 struct at_dma_chan *atchan = &atdma->chan[i]; in at_dma_probe() local
2028 atchan->mem_if = AT_DMA_MEM_IF; in at_dma_probe()
2029 atchan->per_if = AT_DMA_PER_IF; in at_dma_probe()
2031 atchan->ch_regs = atdma->regs + ch_regs(i); in at_dma_probe()
2032 atchan->mask = 1 << i; in at_dma_probe()
2034 atchan->atdma = atdma; in at_dma_probe()
2035 atchan->vc.desc_free = atdma_desc_free; in at_dma_probe()
2036 vchan_init(&atchan->vc, &atdma->dma_device); in at_dma_probe()
2157 struct at_dma_chan *atchan = to_at_dma_chan(chan); in at_dma_prepare() local
2159 if (atc_chan_is_enabled(atchan) && !atc_chan_is_cyclic(atchan)) in at_dma_prepare()
2165 static void atc_suspend_cyclic(struct at_dma_chan *atchan) in atc_suspend_cyclic() argument
2167 struct dma_chan *chan = &atchan->vc.chan; in atc_suspend_cyclic()
2171 if (!atc_chan_is_paused(atchan)) { in atc_suspend_cyclic()
2179 atchan->save_dscr = channel_readl(atchan, DSCR); in atc_suspend_cyclic()
2181 vdbg_dump_regs(atchan); in atc_suspend_cyclic()
2192 struct at_dma_chan *atchan = to_at_dma_chan(chan); in at_dma_suspend_noirq() local
2194 if (atc_chan_is_cyclic(atchan)) in at_dma_suspend_noirq()
2195 atc_suspend_cyclic(atchan); in at_dma_suspend_noirq()
2196 atchan->save_cfg = channel_readl(atchan, CFG); in at_dma_suspend_noirq()
2206 static void atc_resume_cyclic(struct at_dma_chan *atchan) in atc_resume_cyclic() argument
2208 struct at_dma *atdma = to_at_dma(atchan->vc.chan.device); in atc_resume_cyclic()
2212 channel_writel(atchan, SADDR, 0); in atc_resume_cyclic()
2213 channel_writel(atchan, DADDR, 0); in atc_resume_cyclic()
2214 channel_writel(atchan, CTRLA, 0); in atc_resume_cyclic()
2215 channel_writel(atchan, CTRLB, 0); in atc_resume_cyclic()
2216 channel_writel(atchan, DSCR, atchan->save_dscr); in atc_resume_cyclic()
2217 dma_writel(atdma, CHER, atchan->mask); in atc_resume_cyclic()
2222 vdbg_dump_regs(atchan); in atc_resume_cyclic()
2242 struct at_dma_chan *atchan = to_at_dma_chan(chan); in at_dma_resume_noirq() local
2244 channel_writel(atchan, CFG, atchan->save_cfg); in at_dma_resume_noirq()
2245 if (atc_chan_is_cyclic(atchan)) in at_dma_resume_noirq()
2246 atc_resume_cyclic(atchan); in at_dma_resume_noirq()