Lines Matching refs:idma64c

59 static void idma64_chan_init(struct idma64 *idma64, struct idma64_chan *idma64c)  in idma64_chan_init()  argument
67 channel_writel(idma64c, CFG_LO, cfglo); in idma64_chan_init()
68 channel_writel(idma64c, CFG_HI, cfghi); in idma64_chan_init()
71 channel_set_bit(idma64, MASK(XFER), idma64c->mask); in idma64_chan_init()
72 channel_set_bit(idma64, MASK(ERROR), idma64c->mask); in idma64_chan_init()
84 static void idma64_chan_stop(struct idma64 *idma64, struct idma64_chan *idma64c) in idma64_chan_stop() argument
86 channel_clear_bit(idma64, CH_EN, idma64c->mask); in idma64_chan_stop()
89 static void idma64_chan_start(struct idma64 *idma64, struct idma64_chan *idma64c) in idma64_chan_start() argument
91 struct idma64_desc *desc = idma64c->desc; in idma64_chan_start()
94 channel_writeq(idma64c, SAR, 0); in idma64_chan_start()
95 channel_writeq(idma64c, DAR, 0); in idma64_chan_start()
97 channel_writel(idma64c, CTL_HI, IDMA64C_CTLH_BLOCK_TS(~0UL)); in idma64_chan_start()
98 channel_writel(idma64c, CTL_LO, IDMA64C_CTLL_LLP_S_EN | IDMA64C_CTLL_LLP_D_EN); in idma64_chan_start()
100 channel_writeq(idma64c, LLP, hw->llp); in idma64_chan_start()
102 channel_set_bit(idma64, CH_EN, idma64c->mask); in idma64_chan_start()
105 static void idma64_stop_transfer(struct idma64_chan *idma64c) in idma64_stop_transfer() argument
107 struct idma64 *idma64 = to_idma64(idma64c->vchan.chan.device); in idma64_stop_transfer()
109 idma64_chan_stop(idma64, idma64c); in idma64_stop_transfer()
112 static void idma64_start_transfer(struct idma64_chan *idma64c) in idma64_start_transfer() argument
114 struct idma64 *idma64 = to_idma64(idma64c->vchan.chan.device); in idma64_start_transfer()
118 vdesc = vchan_next_desc(&idma64c->vchan); in idma64_start_transfer()
120 idma64c->desc = NULL; in idma64_start_transfer()
125 idma64c->desc = to_idma64_desc(vdesc); in idma64_start_transfer()
128 idma64_chan_init(idma64, idma64c); in idma64_start_transfer()
131 idma64_chan_start(idma64, idma64c); in idma64_start_transfer()
139 struct idma64_chan *idma64c = &idma64->chan[c]; in idma64_chan_irq() local
142 spin_lock(&idma64c->vchan.lock); in idma64_chan_irq()
143 desc = idma64c->desc; in idma64_chan_irq()
146 dma_writel(idma64, CLEAR(ERROR), idma64c->mask); in idma64_chan_irq()
149 dma_writel(idma64, CLEAR(XFER), idma64c->mask); in idma64_chan_irq()
152 idma64_start_transfer(idma64c); in idma64_chan_irq()
156 if (idma64c->desc == NULL || desc->status == DMA_ERROR) in idma64_chan_irq()
157 idma64_stop_transfer(idma64c); in idma64_chan_irq()
159 spin_unlock(&idma64c->vchan.lock); in idma64_chan_irq()
204 static void idma64_desc_free(struct idma64_chan *idma64c, in idma64_desc_free() argument
214 dma_pool_free(idma64c->pool, hw->lli, hw->llp); in idma64_desc_free()
224 struct idma64_chan *idma64c = to_idma64_chan(vdesc->tx.chan); in idma64_vdesc_free() local
226 idma64_desc_free(idma64c, to_idma64_desc(vdesc)); in idma64_vdesc_free()
268 static void idma64_desc_fill(struct idma64_chan *idma64c, in idma64_desc_fill() argument
271 struct dma_slave_config *config = &idma64c->config; in idma64_desc_fill()
297 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_prep_slave_sg() local
310 hw->lli = dma_pool_alloc(idma64c->pool, GFP_NOWAIT, &hw->llp); in idma64_prep_slave_sg()
313 idma64_desc_free(idma64c, desc); in idma64_prep_slave_sg()
325 idma64_desc_fill(idma64c, desc); in idma64_prep_slave_sg()
326 return vchan_tx_prep(&idma64c->vchan, &desc->vdesc, flags); in idma64_prep_slave_sg()
331 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_issue_pending() local
334 spin_lock_irqsave(&idma64c->vchan.lock, flags); in idma64_issue_pending()
335 if (vchan_issue_pending(&idma64c->vchan) && !idma64c->desc) in idma64_issue_pending()
336 idma64_start_transfer(idma64c); in idma64_issue_pending()
337 spin_unlock_irqrestore(&idma64c->vchan.lock, flags); in idma64_issue_pending()
340 static size_t idma64_active_desc_size(struct idma64_chan *idma64c) in idma64_active_desc_size() argument
342 struct idma64_desc *desc = idma64c->desc; in idma64_active_desc_size()
345 u64 llp = channel_readq(idma64c, LLP); in idma64_active_desc_size()
346 u32 ctlhi = channel_readl(idma64c, CTL_HI); in idma64_active_desc_size()
368 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_tx_status() local
378 spin_lock_irqsave(&idma64c->vchan.lock, flags); in idma64_tx_status()
379 vdesc = vchan_find_desc(&idma64c->vchan, cookie); in idma64_tx_status()
380 if (idma64c->desc && cookie == idma64c->desc->vdesc.tx.cookie) { in idma64_tx_status()
381 bytes = idma64_active_desc_size(idma64c); in idma64_tx_status()
383 status = idma64c->desc->status; in idma64_tx_status()
388 spin_unlock_irqrestore(&idma64c->vchan.lock, flags); in idma64_tx_status()
404 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_slave_config() local
406 memcpy(&idma64c->config, config, sizeof(idma64c->config)); in idma64_slave_config()
408 convert_burst(&idma64c->config.src_maxburst); in idma64_slave_config()
409 convert_burst(&idma64c->config.dst_maxburst); in idma64_slave_config()
414 static void idma64_chan_deactivate(struct idma64_chan *idma64c, bool drain) in idma64_chan_deactivate() argument
419 cfglo = channel_readl(idma64c, CFG_LO); in idma64_chan_deactivate()
425 channel_writel(idma64c, CFG_LO, cfglo | IDMA64C_CFGL_CH_SUSP); in idma64_chan_deactivate()
428 cfglo = channel_readl(idma64c, CFG_LO); in idma64_chan_deactivate()
432 static void idma64_chan_activate(struct idma64_chan *idma64c) in idma64_chan_activate() argument
436 cfglo = channel_readl(idma64c, CFG_LO); in idma64_chan_activate()
437 channel_writel(idma64c, CFG_LO, cfglo & ~IDMA64C_CFGL_CH_SUSP); in idma64_chan_activate()
442 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_pause() local
445 spin_lock_irqsave(&idma64c->vchan.lock, flags); in idma64_pause()
446 if (idma64c->desc && idma64c->desc->status == DMA_IN_PROGRESS) { in idma64_pause()
447 idma64_chan_deactivate(idma64c, false); in idma64_pause()
448 idma64c->desc->status = DMA_PAUSED; in idma64_pause()
450 spin_unlock_irqrestore(&idma64c->vchan.lock, flags); in idma64_pause()
457 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_resume() local
460 spin_lock_irqsave(&idma64c->vchan.lock, flags); in idma64_resume()
461 if (idma64c->desc && idma64c->desc->status == DMA_PAUSED) { in idma64_resume()
462 idma64c->desc->status = DMA_IN_PROGRESS; in idma64_resume()
463 idma64_chan_activate(idma64c); in idma64_resume()
465 spin_unlock_irqrestore(&idma64c->vchan.lock, flags); in idma64_resume()
472 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_terminate_all() local
476 spin_lock_irqsave(&idma64c->vchan.lock, flags); in idma64_terminate_all()
477 idma64_chan_deactivate(idma64c, true); in idma64_terminate_all()
478 idma64_stop_transfer(idma64c); in idma64_terminate_all()
479 if (idma64c->desc) { in idma64_terminate_all()
480 idma64_vdesc_free(&idma64c->desc->vdesc); in idma64_terminate_all()
481 idma64c->desc = NULL; in idma64_terminate_all()
483 vchan_get_all_descriptors(&idma64c->vchan, &head); in idma64_terminate_all()
484 spin_unlock_irqrestore(&idma64c->vchan.lock, flags); in idma64_terminate_all()
486 vchan_dma_desc_free_list(&idma64c->vchan, &head); in idma64_terminate_all()
492 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_synchronize() local
494 vchan_synchronize(&idma64c->vchan); in idma64_synchronize()
499 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_alloc_chan_resources() local
502 idma64c->pool = dma_pool_create(dev_name(chan2dev(chan)), in idma64_alloc_chan_resources()
505 if (!idma64c->pool) { in idma64_alloc_chan_resources()
515 struct idma64_chan *idma64c = to_idma64_chan(chan); in idma64_free_chan_resources() local
518 dma_pool_destroy(idma64c->pool); in idma64_free_chan_resources()
519 idma64c->pool = NULL; in idma64_free_chan_resources()
560 struct idma64_chan *idma64c = &idma64->chan[i]; in idma64_probe() local
562 idma64c->vchan.desc_free = idma64_vdesc_free; in idma64_probe()
563 vchan_init(&idma64c->vchan, &idma64->dma); in idma64_probe()
565 idma64c->regs = idma64->regs + i * IDMA64_CH_LENGTH; in idma64_probe()
566 idma64c->mask = BIT(i); in idma64_probe()
617 struct idma64_chan *idma64c = &idma64->chan[i]; in idma64_remove() local
619 tasklet_kill(&idma64c->vchan.task); in idma64_remove()