Lines Matching refs:jzchan
166 struct jz4780_dma_chan *jzchan) in jz4780_dma_chan_parent() argument
168 return container_of(jzchan->vchan.chan.device, struct jz4780_dma_dev, in jz4780_dma_chan_parent()
185 struct jz4780_dma_chan *jzchan, unsigned int count, in jz4780_dma_desc_alloc() argument
197 desc->desc = dma_pool_alloc(jzchan->desc_pool, GFP_NOWAIT, in jz4780_dma_desc_alloc()
212 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(vdesc->tx.chan); in jz4780_dma_desc_free() local
214 dma_pool_free(jzchan->desc_pool, desc->desc, desc->desc_phys); in jz4780_dma_desc_free()
254 static int jz4780_dma_setup_hwdesc(struct jz4780_dma_chan *jzchan, in jz4780_dma_setup_hwdesc() argument
258 struct dma_slave_config *config = &jzchan->config; in jz4780_dma_setup_hwdesc()
265 desc->drt = jzchan->transfer_type; in jz4780_dma_setup_hwdesc()
273 desc->drt = jzchan->transfer_type; in jz4780_dma_setup_hwdesc()
287 &jzchan->transfer_shift); in jz4780_dma_setup_hwdesc()
304 desc->dtc = len >> jzchan->transfer_shift; in jz4780_dma_setup_hwdesc()
313 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); in jz4780_dma_prep_slave_sg() local
318 desc = jz4780_dma_desc_alloc(jzchan, sg_len, DMA_SLAVE); in jz4780_dma_prep_slave_sg()
323 err = jz4780_dma_setup_hwdesc(jzchan, &desc->desc[i], in jz4780_dma_prep_slave_sg()
346 return vchan_tx_prep(&jzchan->vchan, &desc->vdesc, flags); in jz4780_dma_prep_slave_sg()
354 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); in jz4780_dma_prep_dma_cyclic() local
364 desc = jz4780_dma_desc_alloc(jzchan, periods, DMA_CYCLIC); in jz4780_dma_prep_dma_cyclic()
369 err = jz4780_dma_setup_hwdesc(jzchan, &desc->desc[i], buf_addr, in jz4780_dma_prep_dma_cyclic()
396 return vchan_tx_prep(&jzchan->vchan, &desc->vdesc, flags); in jz4780_dma_prep_dma_cyclic()
403 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); in jz4780_dma_prep_dma_memcpy() local
407 desc = jz4780_dma_desc_alloc(jzchan, 1, DMA_MEMCPY); in jz4780_dma_prep_dma_memcpy()
412 &jzchan->transfer_shift); in jz4780_dma_prep_dma_memcpy()
421 desc->desc[0].dtc = len >> jzchan->transfer_shift; in jz4780_dma_prep_dma_memcpy()
423 return vchan_tx_prep(&jzchan->vchan, &desc->vdesc, flags); in jz4780_dma_prep_dma_memcpy()
426 static void jz4780_dma_begin(struct jz4780_dma_chan *jzchan) in jz4780_dma_begin() argument
428 struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan); in jz4780_dma_begin()
433 if (!jzchan->desc) { in jz4780_dma_begin()
434 vdesc = vchan_next_desc(&jzchan->vchan); in jz4780_dma_begin()
440 jzchan->desc = to_jz4780_dma_desc(vdesc); in jz4780_dma_begin()
441 jzchan->curr_hwdesc = 0; in jz4780_dma_begin()
443 if (jzchan->desc->type == DMA_CYCLIC && vdesc->tx.callback) { in jz4780_dma_begin()
458 for (i = 0; i < jzchan->desc->count; i++) in jz4780_dma_begin()
459 jzchan->desc->desc[i].dcm &= ~JZ_DMA_DCM_LINK; in jz4780_dma_begin()
467 jzchan->curr_hwdesc = in jz4780_dma_begin()
468 (jzchan->curr_hwdesc + 1) % jzchan->desc->count; in jz4780_dma_begin()
472 jz4780_dma_writel(jzdma, JZ_DMA_REG_DCS(jzchan->id), JZ_DMA_DCS_DES8); in jz4780_dma_begin()
475 desc_phys = jzchan->desc->desc_phys + in jz4780_dma_begin()
476 (jzchan->curr_hwdesc * sizeof(*jzchan->desc->desc)); in jz4780_dma_begin()
477 jz4780_dma_writel(jzdma, JZ_DMA_REG_DDA(jzchan->id), desc_phys); in jz4780_dma_begin()
478 jz4780_dma_writel(jzdma, JZ_DMA_REG_DDRS, BIT(jzchan->id)); in jz4780_dma_begin()
481 jz4780_dma_writel(jzdma, JZ_DMA_REG_DCS(jzchan->id), in jz4780_dma_begin()
487 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); in jz4780_dma_issue_pending() local
490 spin_lock_irqsave(&jzchan->vchan.lock, flags); in jz4780_dma_issue_pending()
492 if (vchan_issue_pending(&jzchan->vchan) && !jzchan->desc) in jz4780_dma_issue_pending()
493 jz4780_dma_begin(jzchan); in jz4780_dma_issue_pending()
495 spin_unlock_irqrestore(&jzchan->vchan.lock, flags); in jz4780_dma_issue_pending()
500 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); in jz4780_dma_terminate_all() local
501 struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan); in jz4780_dma_terminate_all()
505 spin_lock_irqsave(&jzchan->vchan.lock, flags); in jz4780_dma_terminate_all()
508 jz4780_dma_writel(jzdma, JZ_DMA_REG_DCS(jzchan->id), 0); in jz4780_dma_terminate_all()
509 if (jzchan->desc) { in jz4780_dma_terminate_all()
510 jz4780_dma_desc_free(&jzchan->desc->vdesc); in jz4780_dma_terminate_all()
511 jzchan->desc = NULL; in jz4780_dma_terminate_all()
514 vchan_get_all_descriptors(&jzchan->vchan, &head); in jz4780_dma_terminate_all()
516 spin_unlock_irqrestore(&jzchan->vchan.lock, flags); in jz4780_dma_terminate_all()
518 vchan_dma_desc_free_list(&jzchan->vchan, &head); in jz4780_dma_terminate_all()
525 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); in jz4780_dma_config() local
532 memcpy(&jzchan->config, config, sizeof(jzchan->config)); in jz4780_dma_config()
537 static size_t jz4780_dma_desc_residue(struct jz4780_dma_chan *jzchan, in jz4780_dma_desc_residue() argument
540 struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan); in jz4780_dma_desc_residue()
547 residue += desc->desc[i].dtc << jzchan->transfer_shift; in jz4780_dma_desc_residue()
551 JZ_DMA_REG_DTC(jzchan->id)); in jz4780_dma_desc_residue()
552 residue += count << jzchan->transfer_shift; in jz4780_dma_desc_residue()
561 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); in jz4780_dma_tx_status() local
570 spin_lock_irqsave(&jzchan->vchan.lock, flags); in jz4780_dma_tx_status()
572 vdesc = vchan_find_desc(&jzchan->vchan, cookie); in jz4780_dma_tx_status()
575 txstate->residue = jz4780_dma_desc_residue(jzchan, in jz4780_dma_tx_status()
577 } else if (cookie == jzchan->desc->vdesc.tx.cookie) { in jz4780_dma_tx_status()
578 txstate->residue = jz4780_dma_desc_residue(jzchan, jzchan->desc, in jz4780_dma_tx_status()
579 (jzchan->curr_hwdesc + 1) % jzchan->desc->count); in jz4780_dma_tx_status()
583 if (vdesc && jzchan->desc && vdesc == &jzchan->desc->vdesc in jz4780_dma_tx_status()
584 && jzchan->desc->status & (JZ_DMA_DCS_AR | JZ_DMA_DCS_HLT)) in jz4780_dma_tx_status()
587 spin_unlock_irqrestore(&jzchan->vchan.lock, flags); in jz4780_dma_tx_status()
592 struct jz4780_dma_chan *jzchan) in jz4780_dma_chan_irq() argument
596 spin_lock(&jzchan->vchan.lock); in jz4780_dma_chan_irq()
598 dcs = jz4780_dma_readl(jzdma, JZ_DMA_REG_DCS(jzchan->id)); in jz4780_dma_chan_irq()
599 jz4780_dma_writel(jzdma, JZ_DMA_REG_DCS(jzchan->id), 0); in jz4780_dma_chan_irq()
602 dev_warn(&jzchan->vchan.chan.dev->device, in jz4780_dma_chan_irq()
607 dev_warn(&jzchan->vchan.chan.dev->device, in jz4780_dma_chan_irq()
611 if (jzchan->desc) { in jz4780_dma_chan_irq()
612 jzchan->desc->status = dcs; in jz4780_dma_chan_irq()
615 if (jzchan->desc->type == DMA_CYCLIC) { in jz4780_dma_chan_irq()
616 vchan_cyclic_callback(&jzchan->desc->vdesc); in jz4780_dma_chan_irq()
618 vchan_cookie_complete(&jzchan->desc->vdesc); in jz4780_dma_chan_irq()
619 jzchan->desc = NULL; in jz4780_dma_chan_irq()
622 jz4780_dma_begin(jzchan); in jz4780_dma_chan_irq()
625 dev_err(&jzchan->vchan.chan.dev->device, in jz4780_dma_chan_irq()
629 spin_unlock(&jzchan->vchan.lock); in jz4780_dma_chan_irq()
660 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); in jz4780_dma_alloc_chan_resources() local
662 jzchan->desc_pool = dma_pool_create(dev_name(&chan->dev->device), in jz4780_dma_alloc_chan_resources()
666 if (!jzchan->desc_pool) { in jz4780_dma_alloc_chan_resources()
677 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); in jz4780_dma_free_chan_resources() local
679 vchan_free_chan_resources(&jzchan->vchan); in jz4780_dma_free_chan_resources()
680 dma_pool_destroy(jzchan->desc_pool); in jz4780_dma_free_chan_resources()
681 jzchan->desc_pool = NULL; in jz4780_dma_free_chan_resources()
686 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); in jz4780_dma_filter_fn() local
687 struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan); in jz4780_dma_filter_fn()
694 if (data->channel != jzchan->id) in jz4780_dma_filter_fn()
696 } else if (jzdma->chan_reserved & BIT(jzchan->id)) { in jz4780_dma_filter_fn()
700 jzchan->transfer_type = data->transfer_type; in jz4780_dma_filter_fn()
748 struct jz4780_dma_chan *jzchan; in jz4780_dma_probe() local
831 jzchan = &jzdma->chan[i]; in jz4780_dma_probe()
832 jzchan->id = i; in jz4780_dma_probe()
834 vchan_init(&jzchan->vchan, dd); in jz4780_dma_probe()
835 jzchan->vchan.desc_free = jz4780_dma_desc_free; in jz4780_dma_probe()