Lines Matching refs:chan
131 struct jz4740_dmaengine_chan chan[JZ_DMA_NR_CHANS]; member
135 struct jz4740_dmaengine_chan *chan) in jz4740_dma_chan_get_dev() argument
137 return container_of(chan->vchan.chan.device, struct jz4740_dma_dev, in jz4740_dma_chan_get_dev()
143 return container_of(c, struct jz4740_dmaengine_chan, vchan.chan); in to_jz4740_dma_chan()
211 struct jz4740_dmaengine_chan *chan = to_jz4740_dma_chan(c); in jz4740_dma_slave_config() local
212 struct jz4740_dma_dev *dmadev = jz4740_dma_chan_get_dev(chan); in jz4740_dma_slave_config()
223 chan->fifo_addr = config->dst_addr; in jz4740_dma_slave_config()
228 chan->fifo_addr = config->src_addr; in jz4740_dma_slave_config()
239 chan->transfer_shift = 1; in jz4740_dma_slave_config()
242 chan->transfer_shift = 2; in jz4740_dma_slave_config()
245 chan->transfer_shift = 4; in jz4740_dma_slave_config()
248 chan->transfer_shift = 5; in jz4740_dma_slave_config()
251 chan->transfer_shift = 0; in jz4740_dma_slave_config()
262 jz4740_dma_write(dmadev, JZ_REG_DMA_CMD(chan->id), cmd); in jz4740_dma_slave_config()
263 jz4740_dma_write(dmadev, JZ_REG_DMA_STATUS_CTRL(chan->id), 0); in jz4740_dma_slave_config()
264 jz4740_dma_write(dmadev, JZ_REG_DMA_REQ_TYPE(chan->id), in jz4740_dma_slave_config()
272 struct jz4740_dmaengine_chan *chan = to_jz4740_dma_chan(c); in jz4740_dma_terminate_all() local
273 struct jz4740_dma_dev *dmadev = jz4740_dma_chan_get_dev(chan); in jz4740_dma_terminate_all()
277 spin_lock_irqsave(&chan->vchan.lock, flags); in jz4740_dma_terminate_all()
278 jz4740_dma_write_mask(dmadev, JZ_REG_DMA_STATUS_CTRL(chan->id), 0, in jz4740_dma_terminate_all()
280 chan->desc = NULL; in jz4740_dma_terminate_all()
281 vchan_get_all_descriptors(&chan->vchan, &head); in jz4740_dma_terminate_all()
282 spin_unlock_irqrestore(&chan->vchan.lock, flags); in jz4740_dma_terminate_all()
284 vchan_dma_desc_free_list(&chan->vchan, &head); in jz4740_dma_terminate_all()
289 static int jz4740_dma_start_transfer(struct jz4740_dmaengine_chan *chan) in jz4740_dma_start_transfer() argument
291 struct jz4740_dma_dev *dmadev = jz4740_dma_chan_get_dev(chan); in jz4740_dma_start_transfer()
296 jz4740_dma_write_mask(dmadev, JZ_REG_DMA_STATUS_CTRL(chan->id), 0, in jz4740_dma_start_transfer()
299 if (!chan->desc) { in jz4740_dma_start_transfer()
300 vdesc = vchan_next_desc(&chan->vchan); in jz4740_dma_start_transfer()
303 chan->desc = to_jz4740_dma_desc(vdesc); in jz4740_dma_start_transfer()
304 chan->next_sg = 0; in jz4740_dma_start_transfer()
307 if (chan->next_sg == chan->desc->num_sgs) in jz4740_dma_start_transfer()
308 chan->next_sg = 0; in jz4740_dma_start_transfer()
310 sg = &chan->desc->sg[chan->next_sg]; in jz4740_dma_start_transfer()
312 if (chan->desc->direction == DMA_MEM_TO_DEV) { in jz4740_dma_start_transfer()
314 dst_addr = chan->fifo_addr; in jz4740_dma_start_transfer()
316 src_addr = chan->fifo_addr; in jz4740_dma_start_transfer()
319 jz4740_dma_write(dmadev, JZ_REG_DMA_SRC_ADDR(chan->id), src_addr); in jz4740_dma_start_transfer()
320 jz4740_dma_write(dmadev, JZ_REG_DMA_DST_ADDR(chan->id), dst_addr); in jz4740_dma_start_transfer()
321 jz4740_dma_write(dmadev, JZ_REG_DMA_TRANSFER_COUNT(chan->id), in jz4740_dma_start_transfer()
322 sg->len >> chan->transfer_shift); in jz4740_dma_start_transfer()
324 chan->next_sg++; in jz4740_dma_start_transfer()
326 jz4740_dma_write_mask(dmadev, JZ_REG_DMA_STATUS_CTRL(chan->id), in jz4740_dma_start_transfer()
338 static void jz4740_dma_chan_irq(struct jz4740_dmaengine_chan *chan) in jz4740_dma_chan_irq() argument
340 spin_lock(&chan->vchan.lock); in jz4740_dma_chan_irq()
341 if (chan->desc) { in jz4740_dma_chan_irq()
342 if (chan->desc->cyclic) { in jz4740_dma_chan_irq()
343 vchan_cyclic_callback(&chan->desc->vdesc); in jz4740_dma_chan_irq()
345 if (chan->next_sg == chan->desc->num_sgs) { in jz4740_dma_chan_irq()
346 list_del(&chan->desc->vdesc.node); in jz4740_dma_chan_irq()
347 vchan_cookie_complete(&chan->desc->vdesc); in jz4740_dma_chan_irq()
348 chan->desc = NULL; in jz4740_dma_chan_irq()
352 jz4740_dma_start_transfer(chan); in jz4740_dma_chan_irq()
353 spin_unlock(&chan->vchan.lock); in jz4740_dma_chan_irq()
371 jz4740_dma_chan_irq(&dmadev->chan[i]); in jz4740_dma_irq()
380 struct jz4740_dmaengine_chan *chan = to_jz4740_dma_chan(c); in jz4740_dma_issue_pending() local
383 spin_lock_irqsave(&chan->vchan.lock, flags); in jz4740_dma_issue_pending()
384 if (vchan_issue_pending(&chan->vchan) && !chan->desc) in jz4740_dma_issue_pending()
385 jz4740_dma_start_transfer(chan); in jz4740_dma_issue_pending()
386 spin_unlock_irqrestore(&chan->vchan.lock, flags); in jz4740_dma_issue_pending()
394 struct jz4740_dmaengine_chan *chan = to_jz4740_dma_chan(c); in jz4740_dma_prep_slave_sg() local
412 return vchan_tx_prep(&chan->vchan, &desc->vdesc, flags); in jz4740_dma_prep_slave_sg()
420 struct jz4740_dmaengine_chan *chan = to_jz4740_dma_chan(c); in jz4740_dma_prep_dma_cyclic() local
443 return vchan_tx_prep(&chan->vchan, &desc->vdesc, flags); in jz4740_dma_prep_dma_cyclic()
446 static size_t jz4740_dma_desc_residue(struct jz4740_dmaengine_chan *chan, in jz4740_dma_desc_residue() argument
449 struct jz4740_dma_dev *dmadev = jz4740_dma_chan_get_dev(chan); in jz4740_dma_desc_residue()
460 JZ_REG_DMA_TRANSFER_COUNT(chan->id)); in jz4740_dma_desc_residue()
461 residue += count << chan->transfer_shift; in jz4740_dma_desc_residue()
470 struct jz4740_dmaengine_chan *chan = to_jz4740_dma_chan(c); in jz4740_dma_tx_status() local
479 spin_lock_irqsave(&chan->vchan.lock, flags); in jz4740_dma_tx_status()
480 vdesc = vchan_find_desc(&chan->vchan, cookie); in jz4740_dma_tx_status()
481 if (cookie == chan->desc->vdesc.tx.cookie) { in jz4740_dma_tx_status()
482 state->residue = jz4740_dma_desc_residue(chan, chan->desc, in jz4740_dma_tx_status()
483 chan->next_sg); in jz4740_dma_tx_status()
485 state->residue = jz4740_dma_desc_residue(chan, in jz4740_dma_tx_status()
490 spin_unlock_irqrestore(&chan->vchan.lock, flags); in jz4740_dma_tx_status()
510 struct jz4740_dmaengine_chan *chan; in jz4740_dma_probe() local
552 chan = &dmadev->chan[i]; in jz4740_dma_probe()
553 chan->id = i; in jz4740_dma_probe()
554 chan->vchan.desc_free = jz4740_dma_desc_free; in jz4740_dma_probe()
555 vchan_init(&chan->vchan, dd); in jz4740_dma_probe()