Lines Matching refs:vchan
170 struct sun6i_vchan *vchan; member
387 static inline void sun6i_dma_dump_lli(struct sun6i_vchan *vchan, in sun6i_dma_dump_lli() argument
392 dev_dbg(chan2dev(&vchan->vc.chan), in sun6i_dma_dump_lli()
427 static int sun6i_dma_start_desc(struct sun6i_vchan *vchan) in sun6i_dma_start_desc() argument
429 struct sun6i_dma_dev *sdev = to_sun6i_dma_dev(vchan->vc.chan.device); in sun6i_dma_start_desc()
430 struct virt_dma_desc *desc = vchan_next_desc(&vchan->vc); in sun6i_dma_start_desc()
431 struct sun6i_pchan *pchan = vchan->phy; in sun6i_dma_start_desc()
448 sun6i_dma_dump_lli(vchan, pchan->desc->v_lli); in sun6i_dma_start_desc()
453 vchan->irq_type = vchan->cyclic ? DMA_IRQ_PKG : DMA_IRQ_QUEUE; in sun6i_dma_start_desc()
458 irq_val |= vchan->irq_type << (irq_offset * DMA_IRQ_CHAN_WIDTH); in sun6i_dma_start_desc()
473 struct sun6i_vchan *vchan; in sun6i_dma_tasklet() local
478 list_for_each_entry(vchan, &sdev->slave.channels, vc.chan.device_node) { in sun6i_dma_tasklet()
479 spin_lock_irq(&vchan->vc.lock); in sun6i_dma_tasklet()
481 pchan = vchan->phy; in sun6i_dma_tasklet()
484 if (sun6i_dma_start_desc(vchan)) { in sun6i_dma_tasklet()
492 vchan->phy = NULL; in sun6i_dma_tasklet()
493 pchan->vchan = NULL; in sun6i_dma_tasklet()
496 spin_unlock_irq(&vchan->vc.lock); in sun6i_dma_tasklet()
503 if (pchan->vchan || list_empty(&sdev->pending)) in sun6i_dma_tasklet()
506 vchan = list_first_entry(&sdev->pending, in sun6i_dma_tasklet()
510 list_del_init(&vchan->node); in sun6i_dma_tasklet()
514 pchan->vchan = vchan; in sun6i_dma_tasklet()
515 vchan->phy = pchan; in sun6i_dma_tasklet()
517 pchan->idx, &vchan->vc); in sun6i_dma_tasklet()
526 vchan = pchan->vchan; in sun6i_dma_tasklet()
527 if (vchan) { in sun6i_dma_tasklet()
528 spin_lock_irq(&vchan->vc.lock); in sun6i_dma_tasklet()
529 sun6i_dma_start_desc(vchan); in sun6i_dma_tasklet()
530 spin_unlock_irq(&vchan->vc.lock); in sun6i_dma_tasklet()
538 struct sun6i_vchan *vchan; in sun6i_dma_interrupt() local
555 vchan = pchan->vchan; in sun6i_dma_interrupt()
556 if (vchan && (status & vchan->irq_type)) { in sun6i_dma_interrupt()
557 if (vchan->cyclic) { in sun6i_dma_interrupt()
560 spin_lock(&vchan->vc.lock); in sun6i_dma_interrupt()
563 spin_unlock(&vchan->vc.lock); in sun6i_dma_interrupt()
634 struct sun6i_vchan *vchan = to_sun6i_vchan(chan); in sun6i_dma_prep_dma_memcpy() local
642 __func__, vchan->vc.chan.chan_id, &dest, &src, len, flags); in sun6i_dma_prep_dma_memcpy()
673 sun6i_dma_dump_lli(vchan, v_lli); in sun6i_dma_prep_dma_memcpy()
675 return vchan_tx_prep(&vchan->vc, &txd->vd, flags); in sun6i_dma_prep_dma_memcpy()
688 struct sun6i_vchan *vchan = to_sun6i_vchan(chan); in sun6i_dma_prep_slave_sg() local
689 struct dma_slave_config *sconfig = &vchan->cfg; in sun6i_dma_prep_slave_sg()
722 sdev->cfg->set_drq(&v_lli->cfg, DRQ_SDRAM, vchan->port); in sun6i_dma_prep_slave_sg()
727 __func__, vchan->vc.chan.chan_id, in sun6i_dma_prep_slave_sg()
735 sdev->cfg->set_drq(&v_lli->cfg, vchan->port, DRQ_SDRAM); in sun6i_dma_prep_slave_sg()
740 __func__, vchan->vc.chan.chan_id, in sun6i_dma_prep_slave_sg()
750 sun6i_dma_dump_lli(vchan, prev); in sun6i_dma_prep_slave_sg()
752 return vchan_tx_prep(&vchan->vc, &txd->vd, flags); in sun6i_dma_prep_slave_sg()
770 struct sun6i_vchan *vchan = to_sun6i_vchan(chan); in sun6i_dma_prep_dma_cyclic() local
771 struct dma_slave_config *sconfig = &vchan->cfg; in sun6i_dma_prep_dma_cyclic()
803 sdev->cfg->set_drq(&v_lli->cfg, DRQ_SDRAM, vchan->port); in sun6i_dma_prep_dma_cyclic()
809 sdev->cfg->set_drq(&v_lli->cfg, vchan->port, DRQ_SDRAM); in sun6i_dma_prep_dma_cyclic()
818 vchan->cyclic = true; in sun6i_dma_prep_dma_cyclic()
820 return vchan_tx_prep(&vchan->vc, &txd->vd, flags); in sun6i_dma_prep_dma_cyclic()
832 struct sun6i_vchan *vchan = to_sun6i_vchan(chan); in sun6i_dma_config() local
834 memcpy(&vchan->cfg, config, sizeof(*config)); in sun6i_dma_config()
842 struct sun6i_vchan *vchan = to_sun6i_vchan(chan); in sun6i_dma_pause() local
843 struct sun6i_pchan *pchan = vchan->phy; in sun6i_dma_pause()
845 dev_dbg(chan2dev(chan), "vchan %p: pause\n", &vchan->vc); in sun6i_dma_pause()
852 list_del_init(&vchan->node); in sun6i_dma_pause()
862 struct sun6i_vchan *vchan = to_sun6i_vchan(chan); in sun6i_dma_resume() local
863 struct sun6i_pchan *pchan = vchan->phy; in sun6i_dma_resume()
866 dev_dbg(chan2dev(chan), "vchan %p: resume\n", &vchan->vc); in sun6i_dma_resume()
868 spin_lock_irqsave(&vchan->vc.lock, flags); in sun6i_dma_resume()
873 } else if (!list_empty(&vchan->vc.desc_issued)) { in sun6i_dma_resume()
875 list_add_tail(&vchan->node, &sdev->pending); in sun6i_dma_resume()
879 spin_unlock_irqrestore(&vchan->vc.lock, flags); in sun6i_dma_resume()
887 struct sun6i_vchan *vchan = to_sun6i_vchan(chan); in sun6i_dma_terminate_all() local
888 struct sun6i_pchan *pchan = vchan->phy; in sun6i_dma_terminate_all()
893 list_del_init(&vchan->node); in sun6i_dma_terminate_all()
896 spin_lock_irqsave(&vchan->vc.lock, flags); in sun6i_dma_terminate_all()
898 if (vchan->cyclic) { in sun6i_dma_terminate_all()
899 vchan->cyclic = false; in sun6i_dma_terminate_all()
902 struct virt_dma_chan *vc = &vchan->vc; in sun6i_dma_terminate_all()
908 vchan_get_all_descriptors(&vchan->vc, &head); in sun6i_dma_terminate_all()
914 vchan->phy = NULL; in sun6i_dma_terminate_all()
915 pchan->vchan = NULL; in sun6i_dma_terminate_all()
920 spin_unlock_irqrestore(&vchan->vc.lock, flags); in sun6i_dma_terminate_all()
922 vchan_dma_desc_free_list(&vchan->vc, &head); in sun6i_dma_terminate_all()
931 struct sun6i_vchan *vchan = to_sun6i_vchan(chan); in sun6i_dma_tx_status() local
932 struct sun6i_pchan *pchan = vchan->phy; in sun6i_dma_tx_status()
944 spin_lock_irqsave(&vchan->vc.lock, flags); in sun6i_dma_tx_status()
946 vd = vchan_find_desc(&vchan->vc, cookie); in sun6i_dma_tx_status()
958 spin_unlock_irqrestore(&vchan->vc.lock, flags); in sun6i_dma_tx_status()
968 struct sun6i_vchan *vchan = to_sun6i_vchan(chan); in sun6i_dma_issue_pending() local
971 spin_lock_irqsave(&vchan->vc.lock, flags); in sun6i_dma_issue_pending()
973 if (vchan_issue_pending(&vchan->vc)) { in sun6i_dma_issue_pending()
976 if (!vchan->phy && list_empty(&vchan->node)) { in sun6i_dma_issue_pending()
977 list_add_tail(&vchan->node, &sdev->pending); in sun6i_dma_issue_pending()
980 &vchan->vc); in sun6i_dma_issue_pending()
986 &vchan->vc); in sun6i_dma_issue_pending()
989 spin_unlock_irqrestore(&vchan->vc.lock, flags); in sun6i_dma_issue_pending()
995 struct sun6i_vchan *vchan = to_sun6i_vchan(chan); in sun6i_dma_free_chan_resources() local
999 list_del_init(&vchan->node); in sun6i_dma_free_chan_resources()
1002 vchan_free_chan_resources(&vchan->vc); in sun6i_dma_free_chan_resources()
1009 struct sun6i_vchan *vchan; in sun6i_dma_of_xlate() local
1020 vchan = to_sun6i_vchan(chan); in sun6i_dma_of_xlate()
1021 vchan->port = port; in sun6i_dma_of_xlate()
1047 struct sun6i_vchan *vchan = &sdev->vchans[i]; in sun6i_dma_free() local
1049 list_del(&vchan->vc.chan.device_node); in sun6i_dma_free()
1050 tasklet_kill(&vchan->vc.task); in sun6i_dma_free()
1381 struct sun6i_vchan *vchan = &sdc->vchans[i]; in sun6i_dma_probe() local
1383 INIT_LIST_HEAD(&vchan->node); in sun6i_dma_probe()
1384 vchan->vc.desc_free = sun6i_dma_free_desc; in sun6i_dma_probe()
1385 vchan_init(&vchan->vc, &sdc->slave); in sun6i_dma_probe()