Lines Matching refs:idma64
35 static void idma64_off(struct idma64 *idma64) in idma64_off() argument
39 dma_writel(idma64, CFG, 0); in idma64_off()
41 channel_clear_bit(idma64, MASK(XFER), idma64->all_chan_mask); in idma64_off()
42 channel_clear_bit(idma64, MASK(BLOCK), idma64->all_chan_mask); in idma64_off()
43 channel_clear_bit(idma64, MASK(SRC_TRAN), idma64->all_chan_mask); in idma64_off()
44 channel_clear_bit(idma64, MASK(DST_TRAN), idma64->all_chan_mask); in idma64_off()
45 channel_clear_bit(idma64, MASK(ERROR), idma64->all_chan_mask); in idma64_off()
49 } while (dma_readl(idma64, CFG) & IDMA64_CFG_DMA_EN && --count); in idma64_off()
52 static void idma64_on(struct idma64 *idma64) in idma64_on() argument
54 dma_writel(idma64, CFG, IDMA64_CFG_DMA_EN); in idma64_on()
59 static void idma64_chan_init(struct idma64 *idma64, struct idma64_chan *idma64c) in idma64_chan_init() argument
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()
81 idma64_on(idma64); 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
102 channel_set_bit(idma64, CH_EN, idma64c->mask); in idma64_chan_start()
107 struct idma64 *idma64 = to_idma64(idma64c->vchan.chan.device); in idma64_stop_transfer() local
109 idma64_chan_stop(idma64, idma64c); in idma64_stop_transfer()
114 struct idma64 *idma64 = to_idma64(idma64c->vchan.chan.device); in idma64_start_transfer() local
128 idma64_chan_init(idma64, idma64c); in idma64_start_transfer()
131 idma64_chan_start(idma64, idma64c); in idma64_start_transfer()
136 static void idma64_chan_irq(struct idma64 *idma64, unsigned short c, in idma64_chan_irq() argument
139 struct idma64_chan *idma64c = &idma64->chan[c]; in idma64_chan_irq()
149 dma_writel(idma64, CLEAR(ERROR), idma64c->mask); in idma64_chan_irq()
152 dma_writel(idma64, CLEAR(XFER), idma64c->mask); in idma64_chan_irq()
168 struct idma64 *idma64 = dev; in idma64_irq() local
169 u32 status = dma_readl(idma64, STATUS_INT); in idma64_irq()
174 dev_vdbg(idma64->dma.dev, "%s: status=%#x\n", __func__, status); in idma64_irq()
180 status_xfer = dma_readl(idma64, RAW(XFER)); in idma64_irq()
181 status_err = dma_readl(idma64, RAW(ERROR)); in idma64_irq()
183 for (i = 0; i < idma64->dma.chancnt; i++) in idma64_irq()
184 idma64_chan_irq(idma64, i, status_err, status_xfer); in idma64_irq()
535 struct idma64 *idma64; in idma64_probe() local
540 idma64 = devm_kzalloc(chip->dev, sizeof(*idma64), GFP_KERNEL); in idma64_probe()
541 if (!idma64) in idma64_probe()
544 idma64->regs = chip->regs; in idma64_probe()
545 chip->idma64 = idma64; in idma64_probe()
547 idma64->chan = devm_kcalloc(chip->dev, nr_chan, sizeof(*idma64->chan), in idma64_probe()
549 if (!idma64->chan) in idma64_probe()
552 idma64->all_chan_mask = (1 << nr_chan) - 1; in idma64_probe()
555 idma64_off(idma64); in idma64_probe()
558 dev_name(chip->dev), idma64); in idma64_probe()
562 INIT_LIST_HEAD(&idma64->dma.channels); in idma64_probe()
564 struct idma64_chan *idma64c = &idma64->chan[i]; in idma64_probe()
567 vchan_init(&idma64c->vchan, &idma64->dma); in idma64_probe()
569 idma64c->regs = idma64->regs + i * IDMA64_CH_LENGTH; in idma64_probe()
573 dma_cap_set(DMA_SLAVE, idma64->dma.cap_mask); in idma64_probe()
574 dma_cap_set(DMA_PRIVATE, idma64->dma.cap_mask); in idma64_probe()
576 idma64->dma.device_alloc_chan_resources = idma64_alloc_chan_resources; in idma64_probe()
577 idma64->dma.device_free_chan_resources = idma64_free_chan_resources; in idma64_probe()
579 idma64->dma.device_prep_slave_sg = idma64_prep_slave_sg; in idma64_probe()
581 idma64->dma.device_issue_pending = idma64_issue_pending; in idma64_probe()
582 idma64->dma.device_tx_status = idma64_tx_status; in idma64_probe()
584 idma64->dma.device_config = idma64_slave_config; in idma64_probe()
585 idma64->dma.device_pause = idma64_pause; in idma64_probe()
586 idma64->dma.device_resume = idma64_resume; in idma64_probe()
587 idma64->dma.device_terminate_all = idma64_terminate_all; in idma64_probe()
588 idma64->dma.device_synchronize = idma64_synchronize; in idma64_probe()
590 idma64->dma.src_addr_widths = IDMA64_BUSWIDTHS; in idma64_probe()
591 idma64->dma.dst_addr_widths = IDMA64_BUSWIDTHS; in idma64_probe()
592 idma64->dma.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV); in idma64_probe()
593 idma64->dma.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST; in idma64_probe()
595 idma64->dma.dev = chip->sysdev; in idma64_probe()
597 dma_set_max_seg_size(idma64->dma.dev, IDMA64C_CTLH_BLOCK_TS_MASK); in idma64_probe()
599 ret = dma_async_device_register(&idma64->dma); in idma64_probe()
609 struct idma64 *idma64 = chip->idma64; in idma64_remove() local
612 dma_async_device_unregister(&idma64->dma); in idma64_remove()
618 devm_free_irq(chip->dev, chip->irq, idma64); in idma64_remove()
620 for (i = 0; i < idma64->dma.chancnt; i++) { in idma64_remove()
621 struct idma64_chan *idma64c = &idma64->chan[i]; in idma64_remove()
676 idma64_off(chip->idma64); in idma64_pm_suspend()
684 idma64_on(chip->idma64); in idma64_pm_resume()