Lines Matching refs:idma64c

63 static void idma64_chan_init(struct idma64 *idma64, struct idma64_chan *idma64c)  in idma64_chan_init()  argument
71 channel_writel(idma64c, CFG_LO, cfglo); in idma64_chan_init()
72 channel_writel(idma64c, CFG_HI, cfghi); in idma64_chan_init()
75 channel_set_bit(idma64, MASK(XFER), idma64c->mask); in idma64_chan_init()
76 channel_set_bit(idma64, MASK(ERROR), idma64c->mask); in idma64_chan_init()
88 static void idma64_chan_stop(struct idma64 *idma64, struct idma64_chan *idma64c) in idma64_chan_stop() argument
90 channel_clear_bit(idma64, CH_EN, idma64c->mask); in idma64_chan_stop()
93 static void idma64_chan_start(struct idma64 *idma64, struct idma64_chan *idma64c) in idma64_chan_start() argument
95 struct idma64_desc *desc = idma64c->desc; in idma64_chan_start()
98 channel_writeq(idma64c, SAR, 0); in idma64_chan_start()
99 channel_writeq(idma64c, DAR, 0); in idma64_chan_start()
101 channel_writel(idma64c, CTL_HI, IDMA64C_CTLH_BLOCK_TS(~0UL)); in idma64_chan_start()
102 channel_writel(idma64c, CTL_LO, IDMA64C_CTLL_LLP_S_EN | IDMA64C_CTLL_LLP_D_EN); in idma64_chan_start()
104 channel_writeq(idma64c, LLP, hw->llp); in idma64_chan_start()
106 channel_set_bit(idma64, CH_EN, idma64c->mask); in idma64_chan_start()
109 static void idma64_stop_transfer(struct idma64_chan *idma64c) in idma64_stop_transfer() argument
111 struct idma64 *idma64 = to_idma64(idma64c->vchan.chan.device); in idma64_stop_transfer()
113 idma64_chan_stop(idma64, idma64c); in idma64_stop_transfer()
116 static void idma64_start_transfer(struct idma64_chan *idma64c) in idma64_start_transfer() argument
118 struct idma64 *idma64 = to_idma64(idma64c->vchan.chan.device); in idma64_start_transfer()
122 vdesc = vchan_next_desc(&idma64c->vchan); in idma64_start_transfer()
124 idma64c->desc = NULL; in idma64_start_transfer()
129 idma64c->desc = to_idma64_desc(vdesc); in idma64_start_transfer()
132 idma64_chan_init(idma64, idma64c); in idma64_start_transfer()
135 idma64_chan_start(idma64, idma64c); in idma64_start_transfer()
143 struct idma64_chan *idma64c = &idma64->chan[c]; in idma64_chan_irq() local
147 spin_lock_irqsave(&idma64c->vchan.lock, flags); in idma64_chan_irq()
148 desc = idma64c->desc; in idma64_chan_irq()
151 dma_writel(idma64, CLEAR(ERROR), idma64c->mask); in idma64_chan_irq()
154 dma_writel(idma64, CLEAR(XFER), idma64c->mask); in idma64_chan_irq()
157 idma64_start_transfer(idma64c); in idma64_chan_irq()
161 if (idma64c->desc == NULL || desc->status == DMA_ERROR) in idma64_chan_irq()
162 idma64_stop_transfer(idma64c); in idma64_chan_irq()
164 spin_unlock_irqrestore(&idma64c->vchan.lock, flags); in idma64_chan_irq()
217 static void idma64_desc_free(struct idma64_chan *idma64c, in idma64_desc_free() argument
227 dma_pool_free(idma64c->pool, hw->lli, hw->llp); in idma64_desc_free()
237 struct idma64_chan *idma64c = to_idma64_chan(vdesc->tx.chan); in idma64_vdesc_free() local
239 idma64_desc_free(idma64c, to_idma64_desc(vdesc)); in idma64_vdesc_free()
282 static void idma64_desc_fill(struct idma64_chan *idma64c, in idma64_desc_fill() argument
285 struct dma_slave_config *config = &idma64c->config; in idma64_desc_fill()
307 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_prep_slave_sg() local
320 hw->lli = dma_pool_alloc(idma64c->pool, GFP_NOWAIT, &hw->llp); in idma64_prep_slave_sg()
323 idma64_desc_free(idma64c, desc); in idma64_prep_slave_sg()
335 idma64_desc_fill(idma64c, desc); in idma64_prep_slave_sg()
336 return vchan_tx_prep(&idma64c->vchan, &desc->vdesc, flags); in idma64_prep_slave_sg()
341 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_issue_pending() local
344 spin_lock_irqsave(&idma64c->vchan.lock, flags); in idma64_issue_pending()
345 if (vchan_issue_pending(&idma64c->vchan) && !idma64c->desc) in idma64_issue_pending()
346 idma64_start_transfer(idma64c); in idma64_issue_pending()
347 spin_unlock_irqrestore(&idma64c->vchan.lock, flags); in idma64_issue_pending()
350 static size_t idma64_active_desc_size(struct idma64_chan *idma64c) in idma64_active_desc_size() argument
352 struct idma64_desc *desc = idma64c->desc; in idma64_active_desc_size()
355 u64 llp = channel_readq(idma64c, LLP); in idma64_active_desc_size()
356 u32 ctlhi = channel_readl(idma64c, CTL_HI); in idma64_active_desc_size()
378 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_tx_status() local
388 spin_lock_irqsave(&idma64c->vchan.lock, flags); in idma64_tx_status()
389 vdesc = vchan_find_desc(&idma64c->vchan, cookie); in idma64_tx_status()
390 if (idma64c->desc && cookie == idma64c->desc->vdesc.tx.cookie) { in idma64_tx_status()
391 bytes = idma64_active_desc_size(idma64c); in idma64_tx_status()
393 status = idma64c->desc->status; in idma64_tx_status()
398 spin_unlock_irqrestore(&idma64c->vchan.lock, flags); in idma64_tx_status()
414 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_slave_config() local
420 memcpy(&idma64c->config, config, sizeof(idma64c->config)); in idma64_slave_config()
422 convert_burst(&idma64c->config.src_maxburst); in idma64_slave_config()
423 convert_burst(&idma64c->config.dst_maxburst); in idma64_slave_config()
428 static void idma64_chan_deactivate(struct idma64_chan *idma64c, bool drain) in idma64_chan_deactivate() argument
433 cfglo = channel_readl(idma64c, CFG_LO); in idma64_chan_deactivate()
439 channel_writel(idma64c, CFG_LO, cfglo | IDMA64C_CFGL_CH_SUSP); in idma64_chan_deactivate()
442 cfglo = channel_readl(idma64c, CFG_LO); in idma64_chan_deactivate()
446 static void idma64_chan_activate(struct idma64_chan *idma64c) in idma64_chan_activate() argument
450 cfglo = channel_readl(idma64c, CFG_LO); in idma64_chan_activate()
451 channel_writel(idma64c, CFG_LO, cfglo & ~IDMA64C_CFGL_CH_SUSP); in idma64_chan_activate()
456 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_pause() local
459 spin_lock_irqsave(&idma64c->vchan.lock, flags); in idma64_pause()
460 if (idma64c->desc && idma64c->desc->status == DMA_IN_PROGRESS) { in idma64_pause()
461 idma64_chan_deactivate(idma64c, false); in idma64_pause()
462 idma64c->desc->status = DMA_PAUSED; in idma64_pause()
464 spin_unlock_irqrestore(&idma64c->vchan.lock, flags); in idma64_pause()
471 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_resume() local
474 spin_lock_irqsave(&idma64c->vchan.lock, flags); in idma64_resume()
475 if (idma64c->desc && idma64c->desc->status == DMA_PAUSED) { in idma64_resume()
476 idma64c->desc->status = DMA_IN_PROGRESS; in idma64_resume()
477 idma64_chan_activate(idma64c); in idma64_resume()
479 spin_unlock_irqrestore(&idma64c->vchan.lock, flags); in idma64_resume()
486 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_terminate_all() local
490 spin_lock_irqsave(&idma64c->vchan.lock, flags); in idma64_terminate_all()
491 idma64_chan_deactivate(idma64c, true); in idma64_terminate_all()
492 idma64_stop_transfer(idma64c); in idma64_terminate_all()
493 if (idma64c->desc) { in idma64_terminate_all()
494 idma64_vdesc_free(&idma64c->desc->vdesc); in idma64_terminate_all()
495 idma64c->desc = NULL; in idma64_terminate_all()
497 vchan_get_all_descriptors(&idma64c->vchan, &head); in idma64_terminate_all()
498 spin_unlock_irqrestore(&idma64c->vchan.lock, flags); in idma64_terminate_all()
500 vchan_dma_desc_free_list(&idma64c->vchan, &head); in idma64_terminate_all()
506 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_alloc_chan_resources() local
509 idma64c->pool = dma_pool_create(dev_name(chan2dev(chan)), in idma64_alloc_chan_resources()
512 if (!idma64c->pool) { in idma64_alloc_chan_resources()
522 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_free_chan_resources() local
525 dma_pool_destroy(idma64c->pool); in idma64_free_chan_resources()
526 idma64c->pool = NULL; in idma64_free_chan_resources()
567 struct idma64_chan *idma64c = &idma64->chan[i]; in idma64_probe() local
569 idma64c->vchan.desc_free = idma64_vdesc_free; in idma64_probe()
570 vchan_init(&idma64c->vchan, &idma64->dma); in idma64_probe()
572 idma64c->regs = idma64->regs + i * IDMA64_CH_LENGTH; in idma64_probe()
573 idma64c->mask = BIT(i); in idma64_probe()
621 struct idma64_chan *idma64c = &idma64->chan[i]; in idma64_remove() local
623 tasklet_kill(&idma64c->vchan.task); in idma64_remove()