Lines Matching refs:vchan
128 /* vchan currently being serviced */
129 struct sun4i_dma_vchan *vchan;
212 struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
214 vchan_free_chan_resources(&vchan->vc);
218 struct sun4i_dma_vchan *vchan)
228 if (vchan->is_dedicated) {
239 pchan->vchan = vchan;
256 pchan->vchan = NULL;
311 * Execute pending operations on a vchan
313 * When given a vchan, this function will try to acquire a suitable
317 * This function must be called with &vchan->vc.lock held.
320 struct sun4i_dma_vchan *vchan)
328 lockdep_assert_held(&vchan->vc.lock);
331 pchan = find_and_use_pchan(priv, vchan);
336 * Channel endpoints must not be repeated, so if this vchan
339 if (vchan->processing) {
340 dev_dbg(chan2dev(&vchan->vc.chan),
348 vd = vchan_next_desc(&vchan->vc);
350 dev_dbg(chan2dev(&vchan->vc.chan),
361 dev_dbg(chan2dev(&vchan->vc.chan),
369 vchan->processing = promise;
373 vchan->contract = contract;
374 vchan->pchan = pchan;
614 struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
615 struct dma_slave_config *sconfig = &vchan->cfg;
633 if (vchan->is_dedicated)
645 if (vchan->is_dedicated) {
656 /* And add it to the vchan */
657 return vchan_tx_prep(&vchan->vc, &contract->vd, flags);
665 struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
666 struct dma_slave_config *sconfig = &vchan->cfg;
685 if (vchan->is_dedicated) {
698 endpoints = SUN4I_DMA_CFG_DST_DRQ_TYPE(vchan->endpoint) |
707 SUN4I_DMA_CFG_SRC_DRQ_TYPE(vchan->endpoint) |
750 if (vchan->is_dedicated)
767 /* And add it to the vchan */
768 return vchan_tx_prep(&vchan->vc, &contract->vd, flags);
776 struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
777 struct dma_slave_config *sconfig = &vchan->cfg;
798 if (vchan->is_dedicated) {
809 endpoints = SUN4I_DMA_CFG_DST_DRQ_TYPE(vchan->endpoint) |
816 SUN4I_DMA_CFG_SRC_DRQ_TYPE(vchan->endpoint) |
841 if (vchan->is_dedicated)
862 * to the pending list on the vchan
864 return vchan_tx_prep(&vchan->vc, &contract->vd, flags);
870 struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
871 struct sun4i_dma_pchan *pchan = vchan->pchan;
875 spin_lock_irqsave(&vchan->vc.lock, flags);
876 vchan_get_all_descriptors(&vchan->vc, &head);
877 spin_unlock_irqrestore(&vchan->vc.lock, flags);
892 spin_lock_irqsave(&vchan->vc.lock, flags);
893 /* Clear these so the vchan is usable again */
894 vchan->processing = NULL;
895 vchan->pchan = NULL;
896 spin_unlock_irqrestore(&vchan->vc.lock, flags);
898 vchan_dma_desc_free_list(&vchan->vc, &head);
906 struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
908 memcpy(&vchan->cfg, config, sizeof(*config));
917 struct sun4i_dma_vchan *vchan;
935 /* Assign the endpoint to the vchan */
936 vchan = to_sun4i_dma_vchan(chan);
937 vchan->is_dedicated = is_dedicated;
938 vchan->endpoint = endpoint;
947 struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
948 struct sun4i_dma_pchan *pchan = vchan->pchan;
960 spin_lock_irqsave(&vchan->vc.lock, flags);
961 vd = vchan_find_desc(&vchan->vc, cookie);
987 spin_unlock_irqrestore(&vchan->vc.lock, flags);
995 struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
998 spin_lock_irqsave(&vchan->vc.lock, flags);
1001 * If there are pending transactions for this vchan, push one of
1004 if (vchan_issue_pending(&vchan->vc))
1005 __execute_vchan_pending(priv, vchan);
1007 spin_unlock_irqrestore(&vchan->vc.lock, flags);
1014 struct sun4i_dma_vchan *vchan;
1029 vchan = pchan->vchan;
1030 if (!vchan) /* a terminated channel may still interrupt */
1032 contract = vchan->contract;
1039 spin_lock(&vchan->vc.lock);
1045 list_del(&vchan->processing->list);
1046 list_add_tail(&vchan->processing->list,
1064 vchan->processing = promise;
1068 vchan->processing = NULL;
1069 vchan->pchan = NULL;
1076 spin_unlock(&vchan->vc.lock);
1102 vchan = &priv->vchans[i];
1103 spin_lock(&vchan->vc.lock);
1104 __execute_vchan_pending(priv, vchan);
1105 spin_unlock(&vchan->vc.lock);
1204 struct sun4i_dma_vchan *vchan = &priv->vchans[i];
1206 spin_lock_init(&vchan->vc.lock);
1207 vchan->vc.desc_free = sun4i_dma_free_contract;
1208 vchan_init(&vchan->vc, &priv->slave);