Lines Matching refs:imxdma
144 struct imxdma_engine *imxdma; member
190 struct imxdma_engine *imxdma; member
226 static inline int is_imx1_dma(struct imxdma_engine *imxdma) in is_imx1_dma() argument
228 return imxdma->devtype == IMX1_DMA; in is_imx1_dma()
231 static inline int is_imx27_dma(struct imxdma_engine *imxdma) in is_imx27_dma() argument
233 return imxdma->devtype == IMX27_DMA; in is_imx27_dma()
256 static void imx_dmav1_writel(struct imxdma_engine *imxdma, unsigned val, in imx_dmav1_writel() argument
259 __raw_writel(val, imxdma->base + offset); in imx_dmav1_writel()
262 static unsigned imx_dmav1_readl(struct imxdma_engine *imxdma, unsigned offset) in imx_dmav1_readl() argument
264 return __raw_readl(imxdma->base + offset); in imx_dmav1_readl()
269 struct imxdma_engine *imxdma = imxdmac->imxdma; in imxdma_hw_chain() local
271 if (is_imx27_dma(imxdma)) in imxdma_hw_chain()
283 struct imxdma_engine *imxdma = imxdmac->imxdma; in imxdma_sg_next() local
292 imx_dmav1_writel(imxdma, sg->dma_address, in imxdma_sg_next()
295 imx_dmav1_writel(imxdma, sg->dma_address, in imxdma_sg_next()
298 imx_dmav1_writel(imxdma, now, DMA_CNTR(imxdmac->channel)); in imxdma_sg_next()
300 dev_dbg(imxdma->dev, " %s channel: %d dst 0x%08x, src 0x%08x, " in imxdma_sg_next()
302 imx_dmav1_readl(imxdma, DMA_DAR(imxdmac->channel)), in imxdma_sg_next()
303 imx_dmav1_readl(imxdma, DMA_SAR(imxdmac->channel)), in imxdma_sg_next()
304 imx_dmav1_readl(imxdma, DMA_CNTR(imxdmac->channel))); in imxdma_sg_next()
310 struct imxdma_engine *imxdma = imxdmac->imxdma; in imxdma_enable_hw() local
314 dev_dbg(imxdma->dev, "%s channel %d\n", __func__, channel); in imxdma_enable_hw()
318 imx_dmav1_writel(imxdma, 1 << channel, DMA_DISR); in imxdma_enable_hw()
319 imx_dmav1_writel(imxdma, imx_dmav1_readl(imxdma, DMA_DIMR) & in imxdma_enable_hw()
321 imx_dmav1_writel(imxdma, imx_dmav1_readl(imxdma, DMA_CCR(channel)) | in imxdma_enable_hw()
324 if (!is_imx1_dma(imxdma) && in imxdma_enable_hw()
330 tmp = imx_dmav1_readl(imxdma, DMA_CCR(channel)); in imxdma_enable_hw()
331 imx_dmav1_writel(imxdma, tmp | CCR_RPT | CCR_ACRPT, in imxdma_enable_hw()
341 struct imxdma_engine *imxdma = imxdmac->imxdma; in imxdma_disable_hw() local
345 dev_dbg(imxdma->dev, "%s channel %d\n", __func__, channel); in imxdma_disable_hw()
351 imx_dmav1_writel(imxdma, imx_dmav1_readl(imxdma, DMA_DIMR) | in imxdma_disable_hw()
353 imx_dmav1_writel(imxdma, imx_dmav1_readl(imxdma, DMA_CCR(channel)) & in imxdma_disable_hw()
355 imx_dmav1_writel(imxdma, 1 << channel, DMA_DISR); in imxdma_disable_hw()
362 struct imxdma_engine *imxdma = imxdmac->imxdma; in imxdma_watchdog() local
365 imx_dmav1_writel(imxdma, 0, DMA_CCR(channel)); in imxdma_watchdog()
369 dev_dbg(imxdma->dev, "channel %d: watchdog timeout!\n", in imxdma_watchdog()
375 struct imxdma_engine *imxdma = dev_id; in imxdma_err_handler() local
380 disr = imx_dmav1_readl(imxdma, DMA_DISR); in imxdma_err_handler()
382 err_mask = imx_dmav1_readl(imxdma, DMA_DBTOSR) | in imxdma_err_handler()
383 imx_dmav1_readl(imxdma, DMA_DRTOSR) | in imxdma_err_handler()
384 imx_dmav1_readl(imxdma, DMA_DSESR) | in imxdma_err_handler()
385 imx_dmav1_readl(imxdma, DMA_DBOSR); in imxdma_err_handler()
390 imx_dmav1_writel(imxdma, disr & err_mask, DMA_DISR); in imxdma_err_handler()
397 if (imx_dmav1_readl(imxdma, DMA_DBTOSR) & (1 << i)) { in imxdma_err_handler()
398 imx_dmav1_writel(imxdma, 1 << i, DMA_DBTOSR); in imxdma_err_handler()
401 if (imx_dmav1_readl(imxdma, DMA_DRTOSR) & (1 << i)) { in imxdma_err_handler()
402 imx_dmav1_writel(imxdma, 1 << i, DMA_DRTOSR); in imxdma_err_handler()
405 if (imx_dmav1_readl(imxdma, DMA_DSESR) & (1 << i)) { in imxdma_err_handler()
406 imx_dmav1_writel(imxdma, 1 << i, DMA_DSESR); in imxdma_err_handler()
409 if (imx_dmav1_readl(imxdma, DMA_DBOSR) & (1 << i)) { in imxdma_err_handler()
410 imx_dmav1_writel(imxdma, 1 << i, DMA_DBOSR); in imxdma_err_handler()
414 tasklet_schedule(&imxdma->channel[i].dma_tasklet); in imxdma_err_handler()
416 dev_warn(imxdma->dev, in imxdma_err_handler()
428 struct imxdma_engine *imxdma = imxdmac->imxdma; in dma_irq_handle_channel() local
433 spin_lock_irqsave(&imxdma->lock, flags); in dma_irq_handle_channel()
435 spin_unlock_irqrestore(&imxdma->lock, flags); in dma_irq_handle_channel()
442 spin_unlock_irqrestore(&imxdma->lock, flags); in dma_irq_handle_channel()
451 tmp = imx_dmav1_readl(imxdma, DMA_CCR(chno)); in dma_irq_handle_channel()
461 imx_dmav1_writel(imxdma, tmp, DMA_CCR(chno)); in dma_irq_handle_channel()
463 imx_dmav1_writel(imxdma, tmp & ~CCR_CEN, in dma_irq_handle_channel()
468 imx_dmav1_writel(imxdma, tmp, DMA_CCR(chno)); in dma_irq_handle_channel()
484 imx_dmav1_writel(imxdma, 0, DMA_CCR(chno)); in dma_irq_handle_channel()
491 struct imxdma_engine *imxdma = dev_id; in dma_irq_handler() local
494 if (!is_imx1_dma(imxdma)) in dma_irq_handler()
497 disr = imx_dmav1_readl(imxdma, DMA_DISR); in dma_irq_handler()
499 dev_dbg(imxdma->dev, "%s called, disr=0x%08x\n", __func__, disr); in dma_irq_handler()
501 imx_dmav1_writel(imxdma, disr, DMA_DISR); in dma_irq_handler()
504 dma_irq_handle_channel(&imxdma->channel[i]); in dma_irq_handler()
513 struct imxdma_engine *imxdma = imxdmac->imxdma; in imxdma_xfer_desc() local
522 if ((imxdma->slots_2d[i].count > 0) && in imxdma_xfer_desc()
523 ((imxdma->slots_2d[i].xsr != d->x) || in imxdma_xfer_desc()
524 (imxdma->slots_2d[i].ysr != d->y) || in imxdma_xfer_desc()
525 (imxdma->slots_2d[i].wsr != d->w))) in imxdma_xfer_desc()
533 imxdma->slots_2d[slot].xsr = d->x; in imxdma_xfer_desc()
534 imxdma->slots_2d[slot].ysr = d->y; in imxdma_xfer_desc()
535 imxdma->slots_2d[slot].wsr = d->w; in imxdma_xfer_desc()
536 imxdma->slots_2d[slot].count++; in imxdma_xfer_desc()
544 imx_dmav1_writel(imxdma, d->x, DMA_XSRA); in imxdma_xfer_desc()
545 imx_dmav1_writel(imxdma, d->y, DMA_YSRA); in imxdma_xfer_desc()
546 imx_dmav1_writel(imxdma, d->w, DMA_WSRA); in imxdma_xfer_desc()
550 imx_dmav1_writel(imxdma, d->x, DMA_XSRB); in imxdma_xfer_desc()
551 imx_dmav1_writel(imxdma, d->y, DMA_YSRB); in imxdma_xfer_desc()
552 imx_dmav1_writel(imxdma, d->w, DMA_WSRB); in imxdma_xfer_desc()
560 imx_dmav1_writel(imxdma, d->src, DMA_SAR(imxdmac->channel)); in imxdma_xfer_desc()
561 imx_dmav1_writel(imxdma, d->dest, DMA_DAR(imxdmac->channel)); in imxdma_xfer_desc()
562 imx_dmav1_writel(imxdma, d->config_mem | (d->config_port << 2), in imxdma_xfer_desc()
565 imx_dmav1_writel(imxdma, d->len, DMA_CNTR(imxdmac->channel)); in imxdma_xfer_desc()
567 dev_dbg(imxdma->dev, in imxdma_xfer_desc()
578 imx_dmav1_writel(imxdma, imxdmac->per_address, in imxdma_xfer_desc()
580 imx_dmav1_writel(imxdma, imxdmac->ccr_from_device, in imxdma_xfer_desc()
583 dev_dbg(imxdma->dev, in imxdma_xfer_desc()
589 imx_dmav1_writel(imxdma, imxdmac->per_address, in imxdma_xfer_desc()
591 imx_dmav1_writel(imxdma, imxdmac->ccr_to_device, in imxdma_xfer_desc()
594 dev_dbg(imxdma->dev, in imxdma_xfer_desc()
600 dev_err(imxdma->dev, "%s channel: %d bad dma mode\n", in imxdma_xfer_desc()
618 struct imxdma_engine *imxdma = imxdmac->imxdma; in imxdma_tasklet() local
622 spin_lock_irqsave(&imxdma->lock, flags); in imxdma_tasklet()
626 spin_unlock_irqrestore(&imxdma->lock, flags); in imxdma_tasklet()
642 imxdma->slots_2d[imxdmac->slot_2d].count--; in imxdma_tasklet()
653 dev_warn(imxdma->dev, "%s: channel: %d couldn't xfer desc\n", in imxdma_tasklet()
657 spin_unlock_irqrestore(&imxdma->lock, flags); in imxdma_tasklet()
665 struct imxdma_engine *imxdma = imxdmac->imxdma; in imxdma_terminate_all() local
670 spin_lock_irqsave(&imxdma->lock, flags); in imxdma_terminate_all()
673 spin_unlock_irqrestore(&imxdma->lock, flags); in imxdma_terminate_all()
682 struct imxdma_engine *imxdma = imxdmac->imxdma; in imxdma_config_write() local
716 imx_dmav1_writel(imxdma, imxdmac->dma_request, in imxdma_config_write()
720 imx_dmav1_writel(imxdma, imxdmac->watermark_level * in imxdma_config_write()
746 struct imxdma_engine *imxdma = imxdmac->imxdma; in imxdma_tx_submit() local
750 spin_lock_irqsave(&imxdma->lock, flags); in imxdma_tx_submit()
753 spin_unlock_irqrestore(&imxdma->lock, flags); in imxdma_tx_submit()
792 struct imxdma_engine *imxdma = imxdmac->imxdma; in imxdma_free_chan_resources() local
796 spin_lock_irqsave(&imxdma->lock, flags); in imxdma_free_chan_resources()
802 spin_unlock_irqrestore(&imxdma->lock, flags); in imxdma_free_chan_resources()
873 struct imxdma_engine *imxdma = imxdmac->imxdma; in imxdma_prep_dma_cyclic() local
878 dev_dbg(imxdma->dev, "%s channel: %d buf_len=%zu period_len=%zu\n", in imxdma_prep_dma_cyclic()
930 struct imxdma_engine *imxdma = imxdmac->imxdma; in imxdma_prep_dma_memcpy() local
933 dev_dbg(imxdma->dev, "%s channel: %d src=0x%llx dst=0x%llx len=%zu\n", in imxdma_prep_dma_memcpy()
961 struct imxdma_engine *imxdma = imxdmac->imxdma; in imxdma_prep_dma_interleaved() local
964 dev_dbg(imxdma->dev, "%s channel: %d src_start=0x%llx dst_start=0x%llx\n" in imxdma_prep_dma_interleaved()
1003 struct imxdma_engine *imxdma = imxdmac->imxdma; in imxdma_issue_pending() local
1007 spin_lock_irqsave(&imxdma->lock, flags); in imxdma_issue_pending()
1014 dev_warn(imxdma->dev, in imxdma_issue_pending()
1022 spin_unlock_irqrestore(&imxdma->lock, flags); in imxdma_issue_pending()
1030 if (chan->device->dev != fdata->imxdma->dev) in imxdma_filter_fn()
1043 struct imxdma_engine *imxdma = ofdma->of_dma_data; in imxdma_xlate() local
1045 .imxdma = imxdma, in imxdma_xlate()
1053 return dma_request_channel(imxdma->dma_device.cap_mask, in imxdma_xlate()
1059 struct imxdma_engine *imxdma; in imxdma_probe() local
1069 imxdma = devm_kzalloc(&pdev->dev, sizeof(*imxdma), GFP_KERNEL); in imxdma_probe()
1070 if (!imxdma) in imxdma_probe()
1073 imxdma->dev = &pdev->dev; in imxdma_probe()
1074 imxdma->devtype = pdev->id_entry->driver_data; in imxdma_probe()
1077 imxdma->base = devm_ioremap_resource(&pdev->dev, res); in imxdma_probe()
1078 if (IS_ERR(imxdma->base)) in imxdma_probe()
1079 return PTR_ERR(imxdma->base); in imxdma_probe()
1085 imxdma->dma_ipg = devm_clk_get(&pdev->dev, "ipg"); in imxdma_probe()
1086 if (IS_ERR(imxdma->dma_ipg)) in imxdma_probe()
1087 return PTR_ERR(imxdma->dma_ipg); in imxdma_probe()
1089 imxdma->dma_ahb = devm_clk_get(&pdev->dev, "ahb"); in imxdma_probe()
1090 if (IS_ERR(imxdma->dma_ahb)) in imxdma_probe()
1091 return PTR_ERR(imxdma->dma_ahb); in imxdma_probe()
1093 ret = clk_prepare_enable(imxdma->dma_ipg); in imxdma_probe()
1096 ret = clk_prepare_enable(imxdma->dma_ahb); in imxdma_probe()
1101 imx_dmav1_writel(imxdma, DCR_DRST, DMA_DCR); in imxdma_probe()
1103 if (is_imx1_dma(imxdma)) { in imxdma_probe()
1105 dma_irq_handler, 0, "DMA", imxdma); in imxdma_probe()
1107 dev_warn(imxdma->dev, "Can't register IRQ for DMA\n"); in imxdma_probe()
1110 imxdma->irq = irq; in imxdma_probe()
1119 imxdma_err_handler, 0, "DMA", imxdma); in imxdma_probe()
1121 dev_warn(imxdma->dev, "Can't register ERRIRQ for DMA\n"); in imxdma_probe()
1124 imxdma->irq_err = irq_err; in imxdma_probe()
1128 imx_dmav1_writel(imxdma, DCR_DEN, DMA_DCR); in imxdma_probe()
1131 imx_dmav1_writel(imxdma, (1 << IMX_DMA_CHANNELS) - 1, DMA_DISR); in imxdma_probe()
1134 imx_dmav1_writel(imxdma, (1 << IMX_DMA_CHANNELS) - 1, DMA_DIMR); in imxdma_probe()
1136 INIT_LIST_HEAD(&imxdma->dma_device.channels); in imxdma_probe()
1138 dma_cap_set(DMA_SLAVE, imxdma->dma_device.cap_mask); in imxdma_probe()
1139 dma_cap_set(DMA_CYCLIC, imxdma->dma_device.cap_mask); in imxdma_probe()
1140 dma_cap_set(DMA_MEMCPY, imxdma->dma_device.cap_mask); in imxdma_probe()
1141 dma_cap_set(DMA_INTERLEAVE, imxdma->dma_device.cap_mask); in imxdma_probe()
1145 imxdma->slots_2d[i].count = 0; in imxdma_probe()
1147 spin_lock_init(&imxdma->lock); in imxdma_probe()
1151 struct imxdma_channel *imxdmac = &imxdma->channel[i]; in imxdma_probe()
1153 if (!is_imx1_dma(imxdma)) { in imxdma_probe()
1155 dma_irq_handler, 0, "DMA", imxdma); in imxdma_probe()
1157 dev_warn(imxdma->dev, "Can't register IRQ %d " in imxdma_probe()
1167 imxdmac->imxdma = imxdma; in imxdma_probe()
1174 imxdmac->chan.device = &imxdma->dma_device; in imxdma_probe()
1180 &imxdma->dma_device.channels); in imxdma_probe()
1183 imxdma->dma_device.dev = &pdev->dev; in imxdma_probe()
1185 imxdma->dma_device.device_alloc_chan_resources = imxdma_alloc_chan_resources; in imxdma_probe()
1186 imxdma->dma_device.device_free_chan_resources = imxdma_free_chan_resources; in imxdma_probe()
1187 imxdma->dma_device.device_tx_status = imxdma_tx_status; in imxdma_probe()
1188 imxdma->dma_device.device_prep_slave_sg = imxdma_prep_slave_sg; in imxdma_probe()
1189 imxdma->dma_device.device_prep_dma_cyclic = imxdma_prep_dma_cyclic; in imxdma_probe()
1190 imxdma->dma_device.device_prep_dma_memcpy = imxdma_prep_dma_memcpy; in imxdma_probe()
1191 imxdma->dma_device.device_prep_interleaved_dma = imxdma_prep_dma_interleaved; in imxdma_probe()
1192 imxdma->dma_device.device_config = imxdma_config; in imxdma_probe()
1193 imxdma->dma_device.device_terminate_all = imxdma_terminate_all; in imxdma_probe()
1194 imxdma->dma_device.device_issue_pending = imxdma_issue_pending; in imxdma_probe()
1196 platform_set_drvdata(pdev, imxdma); in imxdma_probe()
1198 imxdma->dma_device.copy_align = DMAENGINE_ALIGN_4_BYTES; in imxdma_probe()
1199 dma_set_max_seg_size(imxdma->dma_device.dev, 0xffffff); in imxdma_probe()
1201 ret = dma_async_device_register(&imxdma->dma_device); in imxdma_probe()
1209 imxdma_xlate, imxdma); in imxdma_probe()
1219 dma_async_device_unregister(&imxdma->dma_device); in imxdma_probe()
1221 clk_disable_unprepare(imxdma->dma_ahb); in imxdma_probe()
1223 clk_disable_unprepare(imxdma->dma_ipg); in imxdma_probe()
1227 static void imxdma_free_irq(struct platform_device *pdev, struct imxdma_engine *imxdma) in imxdma_free_irq() argument
1231 if (is_imx1_dma(imxdma)) { in imxdma_free_irq()
1232 disable_irq(imxdma->irq); in imxdma_free_irq()
1233 disable_irq(imxdma->irq_err); in imxdma_free_irq()
1237 struct imxdma_channel *imxdmac = &imxdma->channel[i]; in imxdma_free_irq()
1239 if (!is_imx1_dma(imxdma)) in imxdma_free_irq()
1248 struct imxdma_engine *imxdma = platform_get_drvdata(pdev); in imxdma_remove() local
1250 imxdma_free_irq(pdev, imxdma); in imxdma_remove()
1252 dma_async_device_unregister(&imxdma->dma_device); in imxdma_remove()
1257 clk_disable_unprepare(imxdma->dma_ipg); in imxdma_remove()
1258 clk_disable_unprepare(imxdma->dma_ahb); in imxdma_remove()