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()
178 dev_vdbg(idma64->dma.dev, "%s: status=%#x\n", __func__, status); in idma64_irq()
184 status_xfer = dma_readl(idma64, RAW(XFER)); in idma64_irq()
185 status_err = dma_readl(idma64, RAW(ERROR)); in idma64_irq()
187 for (i = 0; i < idma64->dma.chancnt; i++) in idma64_irq()
188 idma64_chan_irq(idma64, i, status_err, status_xfer); in idma64_irq()
539 struct idma64 *idma64; in idma64_probe() local
544 idma64 = devm_kzalloc(chip->dev, sizeof(*idma64), GFP_KERNEL); in idma64_probe()
545 if (!idma64) in idma64_probe()
548 idma64->regs = chip->regs; in idma64_probe()
549 chip->idma64 = idma64; in idma64_probe()
551 idma64->chan = devm_kcalloc(chip->dev, nr_chan, sizeof(*idma64->chan), in idma64_probe()
553 if (!idma64->chan) in idma64_probe()
556 idma64->all_chan_mask = (1 << nr_chan) - 1; in idma64_probe()
559 idma64_off(idma64); in idma64_probe()
562 dev_name(chip->dev), idma64); in idma64_probe()
566 INIT_LIST_HEAD(&idma64->dma.channels); in idma64_probe()
568 struct idma64_chan *idma64c = &idma64->chan[i]; in idma64_probe()
571 vchan_init(&idma64c->vchan, &idma64->dma); in idma64_probe()
573 idma64c->regs = idma64->regs + i * IDMA64_CH_LENGTH; in idma64_probe()
577 dma_cap_set(DMA_SLAVE, idma64->dma.cap_mask); in idma64_probe()
578 dma_cap_set(DMA_PRIVATE, idma64->dma.cap_mask); in idma64_probe()
580 idma64->dma.device_alloc_chan_resources = idma64_alloc_chan_resources; in idma64_probe()
581 idma64->dma.device_free_chan_resources = idma64_free_chan_resources; in idma64_probe()
583 idma64->dma.device_prep_slave_sg = idma64_prep_slave_sg; in idma64_probe()
585 idma64->dma.device_issue_pending = idma64_issue_pending; in idma64_probe()
586 idma64->dma.device_tx_status = idma64_tx_status; in idma64_probe()
588 idma64->dma.device_config = idma64_slave_config; in idma64_probe()
589 idma64->dma.device_pause = idma64_pause; in idma64_probe()
590 idma64->dma.device_resume = idma64_resume; in idma64_probe()
591 idma64->dma.device_terminate_all = idma64_terminate_all; in idma64_probe()
592 idma64->dma.device_synchronize = idma64_synchronize; in idma64_probe()
594 idma64->dma.src_addr_widths = IDMA64_BUSWIDTHS; in idma64_probe()
595 idma64->dma.dst_addr_widths = IDMA64_BUSWIDTHS; in idma64_probe()
596 idma64->dma.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV); in idma64_probe()
597 idma64->dma.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST; in idma64_probe()
599 idma64->dma.dev = chip->sysdev; in idma64_probe()
601 ret = dma_set_max_seg_size(idma64->dma.dev, IDMA64C_CTLH_BLOCK_TS_MASK); in idma64_probe()
605 ret = dma_async_device_register(&idma64->dma); in idma64_probe()
615 struct idma64 *idma64 = chip->idma64; in idma64_remove() local
618 dma_async_device_unregister(&idma64->dma); in idma64_remove()
624 devm_free_irq(chip->dev, chip->irq, idma64); in idma64_remove()
626 for (i = 0; i < idma64->dma.chancnt; i++) { in idma64_remove()
627 struct idma64_chan *idma64c = &idma64->chan[i]; in idma64_remove()
682 idma64_off(chip->idma64); in idma64_pm_suspend()
690 idma64_on(chip->idma64); in idma64_pm_resume()