Lines Matching refs:vchan
138 /* vchan currently being serviced */
139 struct sun4i_dma_vchan *vchan;
223 struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
225 vchan_free_chan_resources(&vchan->vc);
229 struct sun4i_dma_vchan *vchan)
239 if (vchan->is_dedicated) {
250 pchan->vchan = vchan;
267 pchan->vchan = NULL;
322 * Execute pending operations on a vchan
324 * When given a vchan, this function will try to acquire a suitable
328 * This function must be called with &vchan->vc.lock held.
331 struct sun4i_dma_vchan *vchan)
339 lockdep_assert_held(&vchan->vc.lock);
342 pchan = find_and_use_pchan(priv, vchan);
347 * Channel endpoints must not be repeated, so if this vchan
350 if (vchan->processing) {
351 dev_dbg(chan2dev(&vchan->vc.chan),
359 vd = vchan_next_desc(&vchan->vc);
361 dev_dbg(chan2dev(&vchan->vc.chan),
372 dev_dbg(chan2dev(&vchan->vc.chan),
380 vchan->processing = promise;
384 vchan->contract = contract;
385 vchan->pchan = pchan;
625 struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
626 struct dma_slave_config *sconfig = &vchan->cfg;
644 if (vchan->is_dedicated)
656 if (vchan->is_dedicated) {
667 /* And add it to the vchan */
668 return vchan_tx_prep(&vchan->vc, &contract->vd, flags);
676 struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
677 struct dma_slave_config *sconfig = &vchan->cfg;
696 if (vchan->is_dedicated) {
709 endpoints = SUN4I_DMA_CFG_DST_DRQ_TYPE(vchan->endpoint) |
718 SUN4I_DMA_CFG_SRC_DRQ_TYPE(vchan->endpoint) |
754 if (vchan->is_dedicated || period_len <= SUN4I_NDMA_MAX_SEG_SIZE / 2) {
770 if (vchan->is_dedicated)
787 /* And add it to the vchan */
788 return vchan_tx_prep(&vchan->vc, &contract->vd, flags);
796 struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
797 struct dma_slave_config *sconfig = &vchan->cfg;
818 if (vchan->is_dedicated) {
829 endpoints = SUN4I_DMA_CFG_DST_DRQ_TYPE(vchan->endpoint) |
836 SUN4I_DMA_CFG_SRC_DRQ_TYPE(vchan->endpoint) |
861 if (vchan->is_dedicated)
882 * to the pending list on the vchan
884 return vchan_tx_prep(&vchan->vc, &contract->vd, flags);
890 struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
891 struct sun4i_dma_pchan *pchan = vchan->pchan;
895 spin_lock_irqsave(&vchan->vc.lock, flags);
896 vchan_get_all_descriptors(&vchan->vc, &head);
897 spin_unlock_irqrestore(&vchan->vc.lock, flags);
912 spin_lock_irqsave(&vchan->vc.lock, flags);
913 /* Clear these so the vchan is usable again */
914 vchan->processing = NULL;
915 vchan->pchan = NULL;
916 spin_unlock_irqrestore(&vchan->vc.lock, flags);
918 vchan_dma_desc_free_list(&vchan->vc, &head);
926 struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
928 memcpy(&vchan->cfg, config, sizeof(*config));
937 struct sun4i_dma_vchan *vchan;
955 /* Assign the endpoint to the vchan */
956 vchan = to_sun4i_dma_vchan(chan);
957 vchan->is_dedicated = is_dedicated;
958 vchan->endpoint = endpoint;
967 struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
968 struct sun4i_dma_pchan *pchan = vchan->pchan;
980 spin_lock_irqsave(&vchan->vc.lock, flags);
981 vd = vchan_find_desc(&vchan->vc, cookie);
1007 spin_unlock_irqrestore(&vchan->vc.lock, flags);
1015 struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
1018 spin_lock_irqsave(&vchan->vc.lock, flags);
1021 * If there are pending transactions for this vchan, push one of
1024 if (vchan_issue_pending(&vchan->vc))
1025 __execute_vchan_pending(priv, vchan);
1027 spin_unlock_irqrestore(&vchan->vc.lock, flags);
1034 struct sun4i_dma_vchan *vchan;
1049 vchan = pchan->vchan;
1050 if (!vchan) /* a terminated channel may still interrupt */
1052 contract = vchan->contract;
1059 spin_lock(&vchan->vc.lock);
1065 list_move_tail(&vchan->processing->list,
1083 vchan->processing = promise;
1087 vchan->processing = NULL;
1088 vchan->pchan = NULL;
1095 spin_unlock(&vchan->vc.lock);
1121 vchan = &priv->vchans[i];
1122 spin_lock(&vchan->vc.lock);
1123 __execute_vchan_pending(priv, vchan);
1124 spin_unlock(&vchan->vc.lock);
1223 struct sun4i_dma_vchan *vchan = &priv->vchans[i];
1225 spin_lock_init(&vchan->vc.lock);
1226 vchan->vc.desc_free = sun4i_dma_free_contract;
1227 vchan_init(&vchan->vc, &priv->slave);