Lines Matching defs:mchan
128 void (*enable_chan)(struct mdc_chan *mchan);
129 void (*disable_chan)(struct mdc_chan *mchan);
158 static inline u32 mdc_chan_readl(struct mdc_chan *mchan, u32 reg)
160 return mdc_readl(mchan->mdma, mchan->chan_nr * 0x040 + reg);
163 static inline void mdc_chan_writel(struct mdc_chan *mchan, u32 val, u32 reg)
165 mdc_writel(mchan->mdma, val, mchan->chan_nr * 0x040 + reg);
204 static void mdc_list_desc_config(struct mdc_chan *mchan,
209 struct mdc_dma *mdma = mchan->mdma;
216 (mchan->thread << MDC_READ_PORT_CONFIG_STHREAD_SHIFT) |
217 (mchan->thread << MDC_READ_PORT_CONFIG_RTHREAD_SHIFT) |
218 (mchan->thread << MDC_READ_PORT_CONFIG_WTHREAD_SHIFT);
238 mdc_set_write_width(ldesc, mchan->config.dst_addr_width);
239 burst_size = min(max_burst, mchan->config.dst_maxburst *
240 mchan->config.dst_addr_width);
244 mdc_set_read_width(ldesc, mchan->config.src_addr_width);
246 burst_size = min(max_burst, mchan->config.src_maxburst *
247 mchan->config.src_addr_width);
288 struct mdc_chan *mchan = to_mdc_chan(chan);
289 struct mdc_dma *mdma = mchan->mdma;
300 mdesc->chan = mchan;
320 mdc_list_desc_config(mchan, curr, DMA_MEM_TO_MEM, src, dest,
331 return vchan_tx_prep(&mchan->vc, &mdesc->vd, flags);
339 static int mdc_check_slave_width(struct mdc_chan *mchan,
345 width = mchan->config.dst_addr_width;
347 width = mchan->config.src_addr_width;
359 if (width > mchan->mdma->bus_width)
370 struct mdc_chan *mchan = to_mdc_chan(chan);
371 struct mdc_dma *mdma = mchan->mdma;
382 if (mdc_check_slave_width(mchan, dir) < 0)
388 mdesc->chan = mchan;
417 mdc_list_desc_config(mchan, curr, dir,
419 mchan->config.dst_addr,
422 mdc_list_desc_config(mchan, curr, dir,
423 mchan->config.src_addr,
438 return vchan_tx_prep(&mchan->vc, &mdesc->vd, flags);
451 struct mdc_chan *mchan = to_mdc_chan(chan);
452 struct mdc_dma *mdma = mchan->mdma;
465 if (mdc_check_slave_width(mchan, dir) < 0)
471 mdesc->chan = mchan;
497 mdc_list_desc_config(mchan, curr, dir, buf,
498 mchan->config.dst_addr,
501 mdc_list_desc_config(mchan, curr, dir,
502 mchan->config.src_addr,
515 return vchan_tx_prep(&mchan->vc, &mdesc->vd, flags);
523 static void mdc_issue_desc(struct mdc_chan *mchan)
525 struct mdc_dma *mdma = mchan->mdma;
530 vd = vchan_next_desc(&mchan->vc);
537 mchan->desc = mdesc;
540 mchan->chan_nr);
542 mdma->soc->enable_chan(mchan);
544 val = mdc_chan_readl(mchan, MDC_GENERAL_CONFIG);
548 mdc_chan_writel(mchan, val, MDC_GENERAL_CONFIG);
549 val = (mchan->thread << MDC_READ_PORT_CONFIG_STHREAD_SHIFT) |
550 (mchan->thread << MDC_READ_PORT_CONFIG_RTHREAD_SHIFT) |
551 (mchan->thread << MDC_READ_PORT_CONFIG_WTHREAD_SHIFT);
552 mdc_chan_writel(mchan, val, MDC_READ_PORT_CONFIG);
553 mdc_chan_writel(mchan, mdesc->list_phys, MDC_LIST_NODE_ADDRESS);
554 val = mdc_chan_readl(mchan, MDC_CONTROL_AND_STATUS);
556 mdc_chan_writel(mchan, val, MDC_CONTROL_AND_STATUS);
561 struct mdc_chan *mchan = to_mdc_chan(chan);
564 spin_lock_irqsave(&mchan->vc.lock, flags);
565 if (vchan_issue_pending(&mchan->vc) && !mchan->desc)
566 mdc_issue_desc(mchan);
567 spin_unlock_irqrestore(&mchan->vc.lock, flags);
573 struct mdc_chan *mchan = to_mdc_chan(chan);
587 spin_lock_irqsave(&mchan->vc.lock, flags);
588 vd = vchan_find_desc(&mchan->vc, cookie);
592 } else if (mchan->desc && mchan->desc->vd.tx.cookie == cookie) {
597 mdesc = mchan->desc;
604 val1 = mdc_chan_readl(mchan, MDC_CMDS_PROCESSED) &
606 residue = mdc_chan_readl(mchan,
608 val2 = mdc_chan_readl(mchan, MDC_CMDS_PROCESSED) &
641 spin_unlock_irqrestore(&mchan->vc.lock, flags);
648 static unsigned int mdc_get_new_events(struct mdc_chan *mchan)
653 val = mdc_chan_readl(mchan, MDC_CMDS_PROCESSED);
662 val = mdc_chan_readl(mchan, MDC_CMDS_PROCESSED);
673 mdc_chan_writel(mchan, val, MDC_CMDS_PROCESSED);
675 val = mdc_chan_readl(mchan, MDC_CMDS_PROCESSED);
692 struct mdc_chan *mchan = to_mdc_chan(chan);
696 spin_lock_irqsave(&mchan->vc.lock, flags);
698 mdc_chan_writel(mchan, MDC_CONTROL_AND_STATUS_CANCEL,
701 if (mchan->desc) {
702 vchan_terminate_vdesc(&mchan->desc->vd);
703 mchan->desc = NULL;
705 vchan_get_all_descriptors(&mchan->vc, &head);
707 mdc_get_new_events(mchan);
709 spin_unlock_irqrestore(&mchan->vc.lock, flags);
711 vchan_dma_desc_free_list(&mchan->vc, &head);
718 struct mdc_chan *mchan = to_mdc_chan(chan);
720 vchan_synchronize(&mchan->vc);
726 struct mdc_chan *mchan = to_mdc_chan(chan);
729 spin_lock_irqsave(&mchan->vc.lock, flags);
730 mchan->config = *config;
731 spin_unlock_irqrestore(&mchan->vc.lock, flags);
738 struct mdc_chan *mchan = to_mdc_chan(chan);
739 struct device *dev = mdma2dev(mchan->mdma);
746 struct mdc_chan *mchan = to_mdc_chan(chan);
747 struct mdc_dma *mdma = mchan->mdma;
751 mdma->soc->disable_chan(mchan);
757 struct mdc_chan *mchan = (struct mdc_chan *)dev_id;
761 spin_lock(&mchan->vc.lock);
763 dev_dbg(mdma2dev(mchan->mdma), "IRQ on channel %d\n", mchan->chan_nr);
765 new_events = mdc_get_new_events(mchan);
770 mdesc = mchan->desc;
772 dev_warn(mdma2dev(mchan->mdma),
774 mchan->chan_nr);
795 mchan->desc = NULL;
797 mdc_issue_desc(mchan);
802 spin_unlock(&mchan->vc.lock);
817 struct mdc_chan *mchan = to_mdc_chan(chan);
819 if (!(dma_spec->args[1] & BIT(mchan->chan_nr)))
822 mchan->periph = dma_spec->args[0];
823 mchan->thread = dma_spec->args[2];
835 static void pistachio_mdc_enable_chan(struct mdc_chan *mchan)
837 struct mdc_dma *mdma = mchan->mdma;
840 PISTACHIO_CR_PERIPH_DMA_ROUTE(mchan->chan_nr),
842 PISTACHIO_CR_PERIPH_DMA_ROUTE_SHIFT(mchan->chan_nr),
843 mchan->periph <<
844 PISTACHIO_CR_PERIPH_DMA_ROUTE_SHIFT(mchan->chan_nr));
847 static void pistachio_mdc_disable_chan(struct mdc_chan *mchan)
849 struct mdc_dma *mdma = mchan->mdma;
852 PISTACHIO_CR_PERIPH_DMA_ROUTE(mchan->chan_nr),
854 PISTACHIO_CR_PERIPH_DMA_ROUTE_SHIFT(mchan->chan_nr),
967 struct mdc_chan *mchan = &mdma->channels[i];
969 mchan->mdma = mdma;
970 mchan->chan_nr = i;
971 mchan->irq = platform_get_irq(pdev, i);
972 if (mchan->irq < 0)
973 return mchan->irq;
975 ret = devm_request_irq(&pdev->dev, mchan->irq, mdc_chan_irq,
977 dev_name(&pdev->dev), mchan);
981 mchan->vc.desc_free = mdc_desc_free;
982 vchan_init(&mchan->vc, &mdma->dma_dev);
1023 struct mdc_chan *mchan, *next;
1028 list_for_each_entry_safe(mchan, next, &mdma->dma_dev.channels,
1030 list_del(&mchan->vc.chan.device_node);
1032 devm_free_irq(&pdev->dev, mchan->irq, mchan);
1034 tasklet_kill(&mchan->vc.task);
1052 struct mdc_chan *mchan = &mdma->channels[i];
1054 if (unlikely(mchan->desc))