Lines Matching defs:jzchan
176 struct jz4780_dma_chan *jzchan)
178 return container_of(jzchan->vchan.chan.device, struct jz4780_dma_dev,
230 struct jz4780_dma_chan *jzchan, unsigned int count,
242 desc->desc = dma_pool_alloc(jzchan->desc_pool, GFP_NOWAIT,
257 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(vdesc->tx.chan);
259 dma_pool_free(jzchan->desc_pool, desc->desc, desc->desc_phys);
263 static uint32_t jz4780_dma_transfer_size(struct jz4780_dma_chan *jzchan,
266 struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan);
301 static int jz4780_dma_setup_hwdesc(struct jz4780_dma_chan *jzchan,
305 struct dma_slave_config *config = &jzchan->config;
331 tsz = jz4780_dma_transfer_size(jzchan, addr | len | (width * maxburst),
332 &jzchan->transfer_shift);
349 desc->dtc = len >> jzchan->transfer_shift;
358 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan);
359 struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan);
364 desc = jz4780_dma_desc_alloc(jzchan, sg_len, DMA_SLAVE);
369 err = jz4780_dma_setup_hwdesc(jzchan, &desc->desc[i],
374 jz4780_dma_desc_free(&jzchan->desc->vdesc);
395 return vchan_tx_prep(&jzchan->vchan, &desc->vdesc, flags);
403 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan);
413 desc = jz4780_dma_desc_alloc(jzchan, periods, DMA_CYCLIC);
418 err = jz4780_dma_setup_hwdesc(jzchan, &desc->desc[i], buf_addr,
421 jz4780_dma_desc_free(&jzchan->desc->vdesc);
447 return vchan_tx_prep(&jzchan->vchan, &desc->vdesc, flags);
454 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan);
458 desc = jz4780_dma_desc_alloc(jzchan, 1, DMA_MEMCPY);
462 tsz = jz4780_dma_transfer_size(jzchan, dest | src | len,
463 &jzchan->transfer_shift);
465 jzchan->transfer_type = JZ_DMA_DRT_AUTO;
473 desc->desc[0].dtc = len >> jzchan->transfer_shift;
475 return vchan_tx_prep(&jzchan->vchan, &desc->vdesc, flags);
478 static void jz4780_dma_begin(struct jz4780_dma_chan *jzchan)
480 struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan);
485 if (!jzchan->desc) {
486 vdesc = vchan_next_desc(&jzchan->vchan);
492 jzchan->desc = to_jz4780_dma_desc(vdesc);
493 jzchan->curr_hwdesc = 0;
495 if (jzchan->desc->type == DMA_CYCLIC && vdesc->tx.callback) {
510 for (i = 0; i < jzchan->desc->count; i++)
511 jzchan->desc->desc[i].dcm &= ~JZ_DMA_DCM_LINK;
519 jzchan->curr_hwdesc =
520 (jzchan->curr_hwdesc + 1) % jzchan->desc->count;
524 jz4780_dma_chan_enable(jzdma, jzchan->id);
527 jz4780_dma_chn_writel(jzdma, jzchan->id, JZ_DMA_REG_DCS, 0);
530 jz4780_dma_chn_writel(jzdma, jzchan->id, JZ_DMA_REG_DRT,
531 jzchan->transfer_type);
539 jz4780_dma_chn_writel(jzdma, jzchan->id, JZ_DMA_REG_DTC,
540 jzchan->desc->desc[jzchan->curr_hwdesc].dtc);
543 desc_phys = jzchan->desc->desc_phys +
544 (jzchan->curr_hwdesc * sizeof(*jzchan->desc->desc));
545 jz4780_dma_chn_writel(jzdma, jzchan->id, JZ_DMA_REG_DDA, desc_phys);
546 jz4780_dma_ctrl_writel(jzdma, JZ_DMA_REG_DDRS, BIT(jzchan->id));
549 jz4780_dma_chn_writel(jzdma, jzchan->id, JZ_DMA_REG_DCS,
555 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan);
558 spin_lock_irqsave(&jzchan->vchan.lock, flags);
560 if (vchan_issue_pending(&jzchan->vchan) && !jzchan->desc)
561 jz4780_dma_begin(jzchan);
563 spin_unlock_irqrestore(&jzchan->vchan.lock, flags);
568 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan);
569 struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan);
573 spin_lock_irqsave(&jzchan->vchan.lock, flags);
576 jz4780_dma_chn_writel(jzdma, jzchan->id, JZ_DMA_REG_DCS, 0);
577 if (jzchan->desc) {
578 vchan_terminate_vdesc(&jzchan->desc->vdesc);
579 jzchan->desc = NULL;
582 jz4780_dma_chan_disable(jzdma, jzchan->id);
584 vchan_get_all_descriptors(&jzchan->vchan, &head);
586 spin_unlock_irqrestore(&jzchan->vchan.lock, flags);
588 vchan_dma_desc_free_list(&jzchan->vchan, &head);
594 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan);
595 struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan);
597 vchan_synchronize(&jzchan->vchan);
598 jz4780_dma_chan_disable(jzdma, jzchan->id);
604 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan);
611 memcpy(&jzchan->config, config, sizeof(jzchan->config));
616 static size_t jz4780_dma_desc_residue(struct jz4780_dma_chan *jzchan,
619 struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan);
627 count += jz4780_dma_chn_readl(jzdma, jzchan->id,
630 return count << jzchan->transfer_shift;
636 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan);
642 spin_lock_irqsave(&jzchan->vchan.lock, flags);
648 vdesc = vchan_find_desc(&jzchan->vchan, cookie);
651 residue = jz4780_dma_desc_residue(jzchan,
653 } else if (cookie == jzchan->desc->vdesc.tx.cookie) {
654 residue = jz4780_dma_desc_residue(jzchan, jzchan->desc,
655 jzchan->curr_hwdesc + 1);
659 if (vdesc && jzchan->desc && vdesc == &jzchan->desc->vdesc
660 && jzchan->desc->status & (JZ_DMA_DCS_AR | JZ_DMA_DCS_HLT))
664 spin_unlock_irqrestore(&jzchan->vchan.lock, flags);
669 struct jz4780_dma_chan *jzchan)
672 struct jz4780_dma_desc *desc = jzchan->desc;
676 spin_lock(&jzchan->vchan.lock);
678 dcs = jz4780_dma_chn_readl(jzdma, jzchan->id, JZ_DMA_REG_DCS);
679 jz4780_dma_chn_writel(jzdma, jzchan->id, JZ_DMA_REG_DCS, 0);
682 dev_warn(&jzchan->vchan.chan.dev->device,
687 dev_warn(&jzchan->vchan.chan.dev->device,
691 if (jzchan->desc) {
692 jzchan->desc->status = dcs;
695 if (jzchan->desc->type == DMA_CYCLIC) {
696 vchan_cyclic_callback(&jzchan->desc->vdesc);
698 jz4780_dma_begin(jzchan);
701 (jzchan->curr_hwdesc + 1 == desc->count)) {
703 jzchan->desc = NULL;
706 jz4780_dma_begin(jzchan);
710 jz4780_dma_chn_writel(jzdma, jzchan->id,
716 dev_err(&jzchan->vchan.chan.dev->device,
720 spin_unlock(&jzchan->vchan.lock);
753 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan);
755 jzchan->desc_pool = dma_pool_create(dev_name(&chan->dev->device),
759 if (!jzchan->desc_pool) {
770 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan);
772 vchan_free_chan_resources(&jzchan->vchan);
773 dma_pool_destroy(jzchan->desc_pool);
774 jzchan->desc_pool = NULL;
779 struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan);
780 struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan);
785 if (data->channel != jzchan->id)
787 } else if (jzdma->chan_reserved & BIT(jzchan->id)) {
791 jzchan->transfer_type = data->transfer_type;
840 struct jz4780_dma_chan *jzchan;
933 jzchan = &jzdma->chan[i];
934 jzchan->id = i;
936 vchan_init(&jzchan->vchan, dd);
937 jzchan->vchan.desc_free = jz4780_dma_desc_free;