Lines Matching refs:mchan

129 	void (*enable_chan)(struct mdc_chan *mchan);
130 void (*disable_chan)(struct mdc_chan *mchan);
159 static inline u32 mdc_chan_readl(struct mdc_chan *mchan, u32 reg) in mdc_chan_readl() argument
161 return mdc_readl(mchan->mdma, mchan->chan_nr * 0x040 + reg); in mdc_chan_readl()
164 static inline void mdc_chan_writel(struct mdc_chan *mchan, u32 val, u32 reg) in mdc_chan_writel() argument
166 mdc_writel(mchan->mdma, val, mchan->chan_nr * 0x040 + reg); in mdc_chan_writel()
205 static void mdc_list_desc_config(struct mdc_chan *mchan, in mdc_list_desc_config() argument
210 struct mdc_dma *mdma = mchan->mdma; in mdc_list_desc_config()
217 (mchan->thread << MDC_READ_PORT_CONFIG_STHREAD_SHIFT) | in mdc_list_desc_config()
218 (mchan->thread << MDC_READ_PORT_CONFIG_RTHREAD_SHIFT) | in mdc_list_desc_config()
219 (mchan->thread << MDC_READ_PORT_CONFIG_WTHREAD_SHIFT); in mdc_list_desc_config()
239 mdc_set_write_width(ldesc, mchan->config.dst_addr_width); in mdc_list_desc_config()
240 burst_size = min(max_burst, mchan->config.dst_maxburst * in mdc_list_desc_config()
241 mchan->config.dst_addr_width); in mdc_list_desc_config()
245 mdc_set_read_width(ldesc, mchan->config.src_addr_width); in mdc_list_desc_config()
247 burst_size = min(max_burst, mchan->config.src_maxburst * in mdc_list_desc_config()
248 mchan->config.src_addr_width); in mdc_list_desc_config()
289 struct mdc_chan *mchan = to_mdc_chan(chan); in mdc_prep_dma_memcpy() local
290 struct mdc_dma *mdma = mchan->mdma; in mdc_prep_dma_memcpy()
301 mdesc->chan = mchan; in mdc_prep_dma_memcpy()
321 mdc_list_desc_config(mchan, curr, DMA_MEM_TO_MEM, src, dest, in mdc_prep_dma_memcpy()
332 return vchan_tx_prep(&mchan->vc, &mdesc->vd, flags); in mdc_prep_dma_memcpy()
340 static int mdc_check_slave_width(struct mdc_chan *mchan, in mdc_check_slave_width() argument
346 width = mchan->config.dst_addr_width; in mdc_check_slave_width()
348 width = mchan->config.src_addr_width; in mdc_check_slave_width()
360 if (width > mchan->mdma->bus_width) in mdc_check_slave_width()
371 struct mdc_chan *mchan = to_mdc_chan(chan); in mdc_prep_dma_cyclic() local
372 struct mdc_dma *mdma = mchan->mdma; in mdc_prep_dma_cyclic()
383 if (mdc_check_slave_width(mchan, dir) < 0) in mdc_prep_dma_cyclic()
389 mdesc->chan = mchan; in mdc_prep_dma_cyclic()
418 mdc_list_desc_config(mchan, curr, dir, in mdc_prep_dma_cyclic()
420 mchan->config.dst_addr, in mdc_prep_dma_cyclic()
423 mdc_list_desc_config(mchan, curr, dir, in mdc_prep_dma_cyclic()
424 mchan->config.src_addr, in mdc_prep_dma_cyclic()
439 return vchan_tx_prep(&mchan->vc, &mdesc->vd, flags); in mdc_prep_dma_cyclic()
452 struct mdc_chan *mchan = to_mdc_chan(chan); in mdc_prep_slave_sg() local
453 struct mdc_dma *mdma = mchan->mdma; in mdc_prep_slave_sg()
466 if (mdc_check_slave_width(mchan, dir) < 0) in mdc_prep_slave_sg()
472 mdesc->chan = mchan; in mdc_prep_slave_sg()
498 mdc_list_desc_config(mchan, curr, dir, buf, in mdc_prep_slave_sg()
499 mchan->config.dst_addr, in mdc_prep_slave_sg()
502 mdc_list_desc_config(mchan, curr, dir, in mdc_prep_slave_sg()
503 mchan->config.src_addr, in mdc_prep_slave_sg()
516 return vchan_tx_prep(&mchan->vc, &mdesc->vd, flags); in mdc_prep_slave_sg()
524 static void mdc_issue_desc(struct mdc_chan *mchan) in mdc_issue_desc() argument
526 struct mdc_dma *mdma = mchan->mdma; in mdc_issue_desc()
531 vd = vchan_next_desc(&mchan->vc); in mdc_issue_desc()
538 mchan->desc = mdesc; in mdc_issue_desc()
541 mchan->chan_nr); in mdc_issue_desc()
543 mdma->soc->enable_chan(mchan); in mdc_issue_desc()
545 val = mdc_chan_readl(mchan, MDC_GENERAL_CONFIG); in mdc_issue_desc()
549 mdc_chan_writel(mchan, val, MDC_GENERAL_CONFIG); in mdc_issue_desc()
550 val = (mchan->thread << MDC_READ_PORT_CONFIG_STHREAD_SHIFT) | in mdc_issue_desc()
551 (mchan->thread << MDC_READ_PORT_CONFIG_RTHREAD_SHIFT) | in mdc_issue_desc()
552 (mchan->thread << MDC_READ_PORT_CONFIG_WTHREAD_SHIFT); in mdc_issue_desc()
553 mdc_chan_writel(mchan, val, MDC_READ_PORT_CONFIG); in mdc_issue_desc()
554 mdc_chan_writel(mchan, mdesc->list_phys, MDC_LIST_NODE_ADDRESS); in mdc_issue_desc()
555 val = mdc_chan_readl(mchan, MDC_CONTROL_AND_STATUS); in mdc_issue_desc()
557 mdc_chan_writel(mchan, val, MDC_CONTROL_AND_STATUS); in mdc_issue_desc()
562 struct mdc_chan *mchan = to_mdc_chan(chan); in mdc_issue_pending() local
565 spin_lock_irqsave(&mchan->vc.lock, flags); in mdc_issue_pending()
566 if (vchan_issue_pending(&mchan->vc) && !mchan->desc) in mdc_issue_pending()
567 mdc_issue_desc(mchan); in mdc_issue_pending()
568 spin_unlock_irqrestore(&mchan->vc.lock, flags); in mdc_issue_pending()
574 struct mdc_chan *mchan = to_mdc_chan(chan); in mdc_tx_status() local
588 spin_lock_irqsave(&mchan->vc.lock, flags); in mdc_tx_status()
589 vd = vchan_find_desc(&mchan->vc, cookie); in mdc_tx_status()
593 } else if (mchan->desc && mchan->desc->vd.tx.cookie == cookie) { in mdc_tx_status()
598 mdesc = mchan->desc; in mdc_tx_status()
605 val1 = mdc_chan_readl(mchan, MDC_CMDS_PROCESSED) & in mdc_tx_status()
607 residue = mdc_chan_readl(mchan, in mdc_tx_status()
609 val2 = mdc_chan_readl(mchan, MDC_CMDS_PROCESSED) & in mdc_tx_status()
642 spin_unlock_irqrestore(&mchan->vc.lock, flags); in mdc_tx_status()
649 static unsigned int mdc_get_new_events(struct mdc_chan *mchan) in mdc_get_new_events() argument
654 val = mdc_chan_readl(mchan, MDC_CMDS_PROCESSED); in mdc_get_new_events()
663 val = mdc_chan_readl(mchan, MDC_CMDS_PROCESSED); in mdc_get_new_events()
674 mdc_chan_writel(mchan, val, MDC_CMDS_PROCESSED); in mdc_get_new_events()
676 val = mdc_chan_readl(mchan, MDC_CMDS_PROCESSED); in mdc_get_new_events()
693 struct mdc_chan *mchan = to_mdc_chan(chan); in mdc_terminate_all() local
697 spin_lock_irqsave(&mchan->vc.lock, flags); in mdc_terminate_all()
699 mdc_chan_writel(mchan, MDC_CONTROL_AND_STATUS_CANCEL, in mdc_terminate_all()
702 if (mchan->desc) { in mdc_terminate_all()
703 vchan_terminate_vdesc(&mchan->desc->vd); in mdc_terminate_all()
704 mchan->desc = NULL; in mdc_terminate_all()
706 vchan_get_all_descriptors(&mchan->vc, &head); in mdc_terminate_all()
708 mdc_get_new_events(mchan); in mdc_terminate_all()
710 spin_unlock_irqrestore(&mchan->vc.lock, flags); in mdc_terminate_all()
712 vchan_dma_desc_free_list(&mchan->vc, &head); in mdc_terminate_all()
719 struct mdc_chan *mchan = to_mdc_chan(chan); in mdc_synchronize() local
721 vchan_synchronize(&mchan->vc); in mdc_synchronize()
727 struct mdc_chan *mchan = to_mdc_chan(chan); in mdc_slave_config() local
730 spin_lock_irqsave(&mchan->vc.lock, flags); in mdc_slave_config()
731 mchan->config = *config; in mdc_slave_config()
732 spin_unlock_irqrestore(&mchan->vc.lock, flags); in mdc_slave_config()
739 struct mdc_chan *mchan = to_mdc_chan(chan); in mdc_alloc_chan_resources() local
740 struct device *dev = mdma2dev(mchan->mdma); in mdc_alloc_chan_resources()
747 struct mdc_chan *mchan = to_mdc_chan(chan); in mdc_free_chan_resources() local
748 struct mdc_dma *mdma = mchan->mdma; in mdc_free_chan_resources()
752 mdma->soc->disable_chan(mchan); in mdc_free_chan_resources()
758 struct mdc_chan *mchan = (struct mdc_chan *)dev_id; in mdc_chan_irq() local
762 spin_lock(&mchan->vc.lock); in mdc_chan_irq()
764 dev_dbg(mdma2dev(mchan->mdma), "IRQ on channel %d\n", mchan->chan_nr); in mdc_chan_irq()
766 new_events = mdc_get_new_events(mchan); in mdc_chan_irq()
771 mdesc = mchan->desc; in mdc_chan_irq()
773 dev_warn(mdma2dev(mchan->mdma), in mdc_chan_irq()
775 mchan->chan_nr); in mdc_chan_irq()
796 mchan->desc = NULL; in mdc_chan_irq()
798 mdc_issue_desc(mchan); in mdc_chan_irq()
803 spin_unlock(&mchan->vc.lock); in mdc_chan_irq()
818 struct mdc_chan *mchan = to_mdc_chan(chan); in mdc_of_xlate() local
820 if (!(dma_spec->args[1] & BIT(mchan->chan_nr))) in mdc_of_xlate()
823 mchan->periph = dma_spec->args[0]; in mdc_of_xlate()
824 mchan->thread = dma_spec->args[2]; in mdc_of_xlate()
836 static void pistachio_mdc_enable_chan(struct mdc_chan *mchan) in pistachio_mdc_enable_chan() argument
838 struct mdc_dma *mdma = mchan->mdma; in pistachio_mdc_enable_chan()
841 PISTACHIO_CR_PERIPH_DMA_ROUTE(mchan->chan_nr), in pistachio_mdc_enable_chan()
843 PISTACHIO_CR_PERIPH_DMA_ROUTE_SHIFT(mchan->chan_nr), in pistachio_mdc_enable_chan()
844 mchan->periph << in pistachio_mdc_enable_chan()
845 PISTACHIO_CR_PERIPH_DMA_ROUTE_SHIFT(mchan->chan_nr)); in pistachio_mdc_enable_chan()
848 static void pistachio_mdc_disable_chan(struct mdc_chan *mchan) in pistachio_mdc_disable_chan() argument
850 struct mdc_dma *mdma = mchan->mdma; in pistachio_mdc_disable_chan()
853 PISTACHIO_CR_PERIPH_DMA_ROUTE(mchan->chan_nr), in pistachio_mdc_disable_chan()
855 PISTACHIO_CR_PERIPH_DMA_ROUTE_SHIFT(mchan->chan_nr), in pistachio_mdc_disable_chan()
970 struct mdc_chan *mchan = &mdma->channels[i]; in mdc_dma_probe() local
972 mchan->mdma = mdma; in mdc_dma_probe()
973 mchan->chan_nr = i; in mdc_dma_probe()
974 mchan->irq = platform_get_irq(pdev, i); in mdc_dma_probe()
975 if (mchan->irq < 0) in mdc_dma_probe()
976 return mchan->irq; in mdc_dma_probe()
978 ret = devm_request_irq(&pdev->dev, mchan->irq, mdc_chan_irq, in mdc_dma_probe()
980 dev_name(&pdev->dev), mchan); in mdc_dma_probe()
984 mchan->vc.desc_free = mdc_desc_free; in mdc_dma_probe()
985 vchan_init(&mchan->vc, &mdma->dma_dev); in mdc_dma_probe()
1026 struct mdc_chan *mchan, *next; in mdc_dma_remove() local
1031 list_for_each_entry_safe(mchan, next, &mdma->dma_dev.channels, in mdc_dma_remove()
1033 list_del(&mchan->vc.chan.device_node); in mdc_dma_remove()
1035 devm_free_irq(&pdev->dev, mchan->irq, mchan); in mdc_dma_remove()
1037 tasklet_kill(&mchan->vc.task); in mdc_dma_remove()
1055 struct mdc_chan *mchan = &mdma->channels[i]; in img_mdc_suspend_late() local
1057 if (unlikely(mchan->desc)) in img_mdc_suspend_late()