Lines Matching refs:vchan
180 struct sun6i_vchan *vchan;
395 static inline void sun6i_dma_dump_lli(struct sun6i_vchan *vchan,
399 dev_dbg(chan2dev(&vchan->vc.chan),
434 static int sun6i_dma_start_desc(struct sun6i_vchan *vchan)
436 struct sun6i_dma_dev *sdev = to_sun6i_dma_dev(vchan->vc.chan.device);
437 struct virt_dma_desc *desc = vchan_next_desc(&vchan->vc);
438 struct sun6i_pchan *pchan = vchan->phy;
455 sun6i_dma_dump_lli(vchan, pchan->desc->v_lli, pchan->desc->p_lli);
460 vchan->irq_type = vchan->cyclic ? DMA_IRQ_PKG : DMA_IRQ_QUEUE;
465 irq_val |= vchan->irq_type << (irq_offset * DMA_IRQ_CHAN_WIDTH);
480 struct sun6i_vchan *vchan;
485 list_for_each_entry(vchan, &sdev->slave.channels, vc.chan.device_node) {
486 spin_lock_irq(&vchan->vc.lock);
488 pchan = vchan->phy;
491 if (sun6i_dma_start_desc(vchan)) {
499 vchan->phy = NULL;
500 pchan->vchan = NULL;
503 spin_unlock_irq(&vchan->vc.lock);
510 if (pchan->vchan || list_empty(&sdev->pending))
513 vchan = list_first_entry(&sdev->pending,
517 list_del_init(&vchan->node);
521 pchan->vchan = vchan;
522 vchan->phy = pchan;
523 dev_dbg(sdev->slave.dev, "pchan %u: alloc vchan %p\n",
524 pchan->idx, &vchan->vc);
533 vchan = pchan->vchan;
534 if (vchan) {
535 spin_lock_irq(&vchan->vc.lock);
536 sun6i_dma_start_desc(vchan);
537 spin_unlock_irq(&vchan->vc.lock);
545 struct sun6i_vchan *vchan;
562 vchan = pchan->vchan;
563 if (vchan && (status & vchan->irq_type)) {
564 if (vchan->cyclic) {
567 spin_lock(&vchan->vc.lock);
570 spin_unlock(&vchan->vc.lock);
653 struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
661 __func__, vchan->vc.chan.chan_id, &dest, &src, len, flags);
691 sun6i_dma_dump_lli(vchan, v_lli, p_lli);
693 return vchan_tx_prep(&vchan->vc, &txd->vd, flags);
706 struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
707 struct dma_slave_config *sconfig = &vchan->cfg;
741 sdev->cfg->set_drq(&v_lli->cfg, DRQ_SDRAM, vchan->port);
746 __func__, vchan->vc.chan.chan_id,
755 sdev->cfg->set_drq(&v_lli->cfg, vchan->port, DRQ_SDRAM);
760 __func__, vchan->vc.chan.chan_id,
771 sun6i_dma_dump_lli(vchan, v_lli, p_lli);
773 return vchan_tx_prep(&vchan->vc, &txd->vd, flags);
792 struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
793 struct dma_slave_config *sconfig = &vchan->cfg;
826 sdev->cfg->set_drq(&v_lli->cfg, DRQ_SDRAM, vchan->port);
833 sdev->cfg->set_drq(&v_lli->cfg, vchan->port, DRQ_SDRAM);
842 vchan->cyclic = true;
844 return vchan_tx_prep(&vchan->vc, &txd->vd, flags);
857 struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
859 memcpy(&vchan->cfg, config, sizeof(*config));
867 struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
868 struct sun6i_pchan *pchan = vchan->phy;
870 dev_dbg(chan2dev(chan), "vchan %p: pause\n", &vchan->vc);
877 list_del_init(&vchan->node);
887 struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
888 struct sun6i_pchan *pchan = vchan->phy;
891 dev_dbg(chan2dev(chan), "vchan %p: resume\n", &vchan->vc);
893 spin_lock_irqsave(&vchan->vc.lock, flags);
898 } else if (!list_empty(&vchan->vc.desc_issued)) {
900 list_add_tail(&vchan->node, &sdev->pending);
904 spin_unlock_irqrestore(&vchan->vc.lock, flags);
912 struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
913 struct sun6i_pchan *pchan = vchan->phy;
918 list_del_init(&vchan->node);
921 spin_lock_irqsave(&vchan->vc.lock, flags);
923 if (vchan->cyclic) {
924 vchan->cyclic = false;
927 struct virt_dma_chan *vc = &vchan->vc;
933 vchan_get_all_descriptors(&vchan->vc, &head);
939 vchan->phy = NULL;
940 pchan->vchan = NULL;
945 spin_unlock_irqrestore(&vchan->vc.lock, flags);
947 vchan_dma_desc_free_list(&vchan->vc, &head);
956 struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
957 struct sun6i_pchan *pchan = vchan->phy;
969 spin_lock_irqsave(&vchan->vc.lock, flags);
971 vd = vchan_find_desc(&vchan->vc, cookie);
983 spin_unlock_irqrestore(&vchan->vc.lock, flags);
993 struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
996 spin_lock_irqsave(&vchan->vc.lock, flags);
998 if (vchan_issue_pending(&vchan->vc)) {
1001 if (!vchan->phy && list_empty(&vchan->node)) {
1002 list_add_tail(&vchan->node, &sdev->pending);
1004 dev_dbg(chan2dev(chan), "vchan %p: issued\n",
1005 &vchan->vc);
1010 dev_dbg(chan2dev(chan), "vchan %p: nothing to issue\n",
1011 &vchan->vc);
1014 spin_unlock_irqrestore(&vchan->vc.lock, flags);
1020 struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
1024 list_del_init(&vchan->node);
1027 vchan_free_chan_resources(&vchan->vc);
1034 struct sun6i_vchan *vchan;
1045 vchan = to_sun6i_vchan(chan);
1046 vchan->port = port;
1072 struct sun6i_vchan *vchan = &sdev->vchans[i];
1074 list_del(&vchan->vc.chan.device_node);
1075 tasklet_kill(&vchan->vc.task);
1406 struct sun6i_vchan *vchan = &sdc->vchans[i];
1408 INIT_LIST_HEAD(&vchan->node);
1409 vchan->vc.desc_free = sun6i_dma_free_desc;
1410 vchan_init(&vchan->vc, &sdc->slave);