Lines Matching refs:dmac
196 struct axi_dmac *dmac = chan_to_axi_dmac(chan); in axi_dmac_start_transfer() local
203 val = axi_dmac_read(dmac, AXI_DMAC_REG_START_TRANSFER); in axi_dmac_start_transfer()
236 sg->id = axi_dmac_read(dmac, AXI_DMAC_REG_TRANSFER_ID); in axi_dmac_start_transfer()
239 axi_dmac_write(dmac, AXI_DMAC_REG_DEST_ADDRESS, sg->dest_addr); in axi_dmac_start_transfer()
240 axi_dmac_write(dmac, AXI_DMAC_REG_DEST_STRIDE, sg->dest_stride); in axi_dmac_start_transfer()
244 axi_dmac_write(dmac, AXI_DMAC_REG_SRC_ADDRESS, sg->src_addr); in axi_dmac_start_transfer()
245 axi_dmac_write(dmac, AXI_DMAC_REG_SRC_STRIDE, sg->src_stride); in axi_dmac_start_transfer()
260 axi_dmac_write(dmac, AXI_DMAC_REG_X_LENGTH, sg->x_len - 1); in axi_dmac_start_transfer()
261 axi_dmac_write(dmac, AXI_DMAC_REG_Y_LENGTH, sg->y_len - 1); in axi_dmac_start_transfer()
262 axi_dmac_write(dmac, AXI_DMAC_REG_FLAGS, flags); in axi_dmac_start_transfer()
263 axi_dmac_write(dmac, AXI_DMAC_REG_START_TRANSFER, 1); in axi_dmac_start_transfer()
283 struct axi_dmac *dmac = chan_to_axi_dmac(chan); in axi_dmac_dequeue_partial_xfers() local
290 len = axi_dmac_read(dmac, AXI_DMAC_REG_PARTIAL_XFER_LEN); in axi_dmac_dequeue_partial_xfers()
291 id = axi_dmac_read(dmac, AXI_DMAC_REG_PARTIAL_XFER_ID); in axi_dmac_dequeue_partial_xfers()
311 dev_dbg(dmac->dma_dev.dev, in axi_dmac_dequeue_partial_xfers()
315 dev_warn(dmac->dma_dev.dev, in axi_dmac_dequeue_partial_xfers()
321 xfer_done = axi_dmac_read(dmac, AXI_DMAC_REG_TRANSFER_DONE); in axi_dmac_dequeue_partial_xfers()
400 struct axi_dmac *dmac = devid; in axi_dmac_interrupt_handler() local
404 pending = axi_dmac_read(dmac, AXI_DMAC_REG_IRQ_PENDING); in axi_dmac_interrupt_handler()
408 axi_dmac_write(dmac, AXI_DMAC_REG_IRQ_PENDING, pending); in axi_dmac_interrupt_handler()
410 spin_lock(&dmac->chan.vchan.lock); in axi_dmac_interrupt_handler()
415 completed = axi_dmac_read(dmac, AXI_DMAC_REG_TRANSFER_DONE); in axi_dmac_interrupt_handler()
416 start_next = axi_dmac_transfer_done(&dmac->chan, completed); in axi_dmac_interrupt_handler()
420 axi_dmac_start_transfer(&dmac->chan); in axi_dmac_interrupt_handler()
421 spin_unlock(&dmac->chan.vchan.lock); in axi_dmac_interrupt_handler()
429 struct axi_dmac *dmac = chan_to_axi_dmac(chan); in axi_dmac_terminate_all() local
434 axi_dmac_write(dmac, AXI_DMAC_REG_CTRL, 0); in axi_dmac_terminate_all()
455 struct axi_dmac *dmac = chan_to_axi_dmac(chan); in axi_dmac_issue_pending() local
458 axi_dmac_write(dmac, AXI_DMAC_REG_CTRL, AXI_DMAC_CTRL_ENABLE); in axi_dmac_issue_pending()
777 static int axi_dmac_detect_caps(struct axi_dmac *dmac) in axi_dmac_detect_caps() argument
779 struct axi_dmac_chan *chan = &dmac->chan; in axi_dmac_detect_caps()
782 version = axi_dmac_read(dmac, ADI_AXI_REG_VERSION); in axi_dmac_detect_caps()
784 axi_dmac_write(dmac, AXI_DMAC_REG_FLAGS, AXI_DMAC_FLAG_CYCLIC); in axi_dmac_detect_caps()
785 if (axi_dmac_read(dmac, AXI_DMAC_REG_FLAGS) == AXI_DMAC_FLAG_CYCLIC) in axi_dmac_detect_caps()
788 axi_dmac_write(dmac, AXI_DMAC_REG_Y_LENGTH, 1); in axi_dmac_detect_caps()
789 if (axi_dmac_read(dmac, AXI_DMAC_REG_Y_LENGTH) == 1) in axi_dmac_detect_caps()
792 axi_dmac_write(dmac, AXI_DMAC_REG_X_LENGTH, 0xffffffff); in axi_dmac_detect_caps()
793 chan->max_length = axi_dmac_read(dmac, AXI_DMAC_REG_X_LENGTH); in axi_dmac_detect_caps()
797 axi_dmac_write(dmac, AXI_DMAC_REG_DEST_ADDRESS, 0xffffffff); in axi_dmac_detect_caps()
798 if (axi_dmac_read(dmac, AXI_DMAC_REG_DEST_ADDRESS) == 0 && in axi_dmac_detect_caps()
800 dev_err(dmac->dma_dev.dev, in axi_dmac_detect_caps()
805 axi_dmac_write(dmac, AXI_DMAC_REG_SRC_ADDRESS, 0xffffffff); in axi_dmac_detect_caps()
806 if (axi_dmac_read(dmac, AXI_DMAC_REG_SRC_ADDRESS) == 0 && in axi_dmac_detect_caps()
808 dev_err(dmac->dma_dev.dev, in axi_dmac_detect_caps()
817 axi_dmac_write(dmac, AXI_DMAC_REG_X_LENGTH, 0x00); in axi_dmac_detect_caps()
819 axi_dmac_read(dmac, AXI_DMAC_REG_X_LENGTH); in axi_dmac_detect_caps()
831 struct axi_dmac *dmac; in axi_dmac_probe() local
835 dmac = devm_kzalloc(&pdev->dev, sizeof(*dmac), GFP_KERNEL); in axi_dmac_probe()
836 if (!dmac) in axi_dmac_probe()
839 dmac->irq = platform_get_irq(pdev, 0); in axi_dmac_probe()
840 if (dmac->irq < 0) in axi_dmac_probe()
841 return dmac->irq; in axi_dmac_probe()
842 if (dmac->irq == 0) in axi_dmac_probe()
846 dmac->base = devm_ioremap_resource(&pdev->dev, res); in axi_dmac_probe()
847 if (IS_ERR(dmac->base)) in axi_dmac_probe()
848 return PTR_ERR(dmac->base); in axi_dmac_probe()
850 dmac->clk = devm_clk_get(&pdev->dev, NULL); in axi_dmac_probe()
851 if (IS_ERR(dmac->clk)) in axi_dmac_probe()
852 return PTR_ERR(dmac->clk); in axi_dmac_probe()
854 INIT_LIST_HEAD(&dmac->chan.active_descs); in axi_dmac_probe()
861 ret = axi_dmac_parse_chan_dt(of_chan, &dmac->chan); in axi_dmac_probe()
870 pdev->dev.dma_parms = &dmac->dma_parms; in axi_dmac_probe()
873 dma_dev = &dmac->dma_dev; in axi_dmac_probe()
887 dma_dev->src_addr_widths = BIT(dmac->chan.src_width); in axi_dmac_probe()
888 dma_dev->dst_addr_widths = BIT(dmac->chan.dest_width); in axi_dmac_probe()
889 dma_dev->directions = BIT(dmac->chan.direction); in axi_dmac_probe()
893 dmac->chan.vchan.desc_free = axi_dmac_desc_free; in axi_dmac_probe()
894 vchan_init(&dmac->chan.vchan, dma_dev); in axi_dmac_probe()
896 ret = clk_prepare_enable(dmac->clk); in axi_dmac_probe()
900 ret = axi_dmac_detect_caps(dmac); in axi_dmac_probe()
904 dma_dev->copy_align = (dmac->chan.address_align_mask + 1); in axi_dmac_probe()
906 axi_dmac_write(dmac, AXI_DMAC_REG_IRQ_MASK, 0x00); in axi_dmac_probe()
917 ret = request_irq(dmac->irq, axi_dmac_interrupt_handler, IRQF_SHARED, in axi_dmac_probe()
918 dev_name(&pdev->dev), dmac); in axi_dmac_probe()
922 platform_set_drvdata(pdev, dmac); in axi_dmac_probe()
924 devm_regmap_init_mmio(&pdev->dev, dmac->base, &axi_dmac_regmap_config); in axi_dmac_probe()
931 dma_async_device_unregister(&dmac->dma_dev); in axi_dmac_probe()
933 clk_disable_unprepare(dmac->clk); in axi_dmac_probe()
940 struct axi_dmac *dmac = platform_get_drvdata(pdev); in axi_dmac_remove() local
943 free_irq(dmac->irq, dmac); in axi_dmac_remove()
944 tasklet_kill(&dmac->chan.vchan.task); in axi_dmac_remove()
945 dma_async_device_unregister(&dmac->dma_dev); in axi_dmac_remove()
946 clk_disable_unprepare(dmac->clk); in axi_dmac_remove()