Lines Matching refs:dmac

27 #include <dt-bindings/dma/axi-dmac.h>
209 struct axi_dmac *dmac = chan_to_axi_dmac(chan);
216 val = axi_dmac_read(dmac, AXI_DMAC_REG_START_TRANSFER);
249 sg->id = axi_dmac_read(dmac, AXI_DMAC_REG_TRANSFER_ID);
252 axi_dmac_write(dmac, AXI_DMAC_REG_DEST_ADDRESS, sg->dest_addr);
253 axi_dmac_write(dmac, AXI_DMAC_REG_DEST_STRIDE, sg->dest_stride);
257 axi_dmac_write(dmac, AXI_DMAC_REG_SRC_ADDRESS, sg->src_addr);
258 axi_dmac_write(dmac, AXI_DMAC_REG_SRC_STRIDE, sg->src_stride);
273 axi_dmac_write(dmac, AXI_DMAC_REG_X_LENGTH, sg->x_len - 1);
274 axi_dmac_write(dmac, AXI_DMAC_REG_Y_LENGTH, sg->y_len - 1);
275 axi_dmac_write(dmac, AXI_DMAC_REG_FLAGS, flags);
276 axi_dmac_write(dmac, AXI_DMAC_REG_START_TRANSFER, 1);
296 struct axi_dmac *dmac = chan_to_axi_dmac(chan);
303 len = axi_dmac_read(dmac, AXI_DMAC_REG_PARTIAL_XFER_LEN);
304 id = axi_dmac_read(dmac, AXI_DMAC_REG_PARTIAL_XFER_ID);
324 dev_dbg(dmac->dma_dev.dev,
328 dev_warn(dmac->dma_dev.dev,
334 xfer_done = axi_dmac_read(dmac, AXI_DMAC_REG_TRANSFER_DONE);
413 struct axi_dmac *dmac = devid;
417 pending = axi_dmac_read(dmac, AXI_DMAC_REG_IRQ_PENDING);
421 axi_dmac_write(dmac, AXI_DMAC_REG_IRQ_PENDING, pending);
423 spin_lock(&dmac->chan.vchan.lock);
428 completed = axi_dmac_read(dmac, AXI_DMAC_REG_TRANSFER_DONE);
429 start_next = axi_dmac_transfer_done(&dmac->chan, completed);
433 axi_dmac_start_transfer(&dmac->chan);
434 spin_unlock(&dmac->chan.vchan.lock);
442 struct axi_dmac *dmac = chan_to_axi_dmac(chan);
447 axi_dmac_write(dmac, AXI_DMAC_REG_CTRL, 0);
468 struct axi_dmac *dmac = chan_to_axi_dmac(chan);
471 axi_dmac_write(dmac, AXI_DMAC_REG_CTRL, AXI_DMAC_CTRL_ENABLE);
795 static int axi_dmac_parse_dt(struct device *dev, struct axi_dmac *dmac)
805 ret = axi_dmac_parse_chan_dt(of_chan, &dmac->chan);
817 static int axi_dmac_read_chan_config(struct device *dev, struct axi_dmac *dmac)
819 struct axi_dmac_chan *chan = &dmac->chan;
822 desc = axi_dmac_read(dmac, AXI_DMAC_REG_INTERFACE_DESC);
862 static int axi_dmac_detect_caps(struct axi_dmac *dmac, unsigned int version)
864 struct axi_dmac_chan *chan = &dmac->chan;
866 axi_dmac_write(dmac, AXI_DMAC_REG_FLAGS, AXI_DMAC_FLAG_CYCLIC);
867 if (axi_dmac_read(dmac, AXI_DMAC_REG_FLAGS) == AXI_DMAC_FLAG_CYCLIC)
870 axi_dmac_write(dmac, AXI_DMAC_REG_Y_LENGTH, 1);
871 if (axi_dmac_read(dmac, AXI_DMAC_REG_Y_LENGTH) == 1)
874 axi_dmac_write(dmac, AXI_DMAC_REG_X_LENGTH, 0xffffffff);
875 chan->max_length = axi_dmac_read(dmac, AXI_DMAC_REG_X_LENGTH);
879 axi_dmac_write(dmac, AXI_DMAC_REG_DEST_ADDRESS, 0xffffffff);
880 if (axi_dmac_read(dmac, AXI_DMAC_REG_DEST_ADDRESS) == 0 &&
882 dev_err(dmac->dma_dev.dev,
887 axi_dmac_write(dmac, AXI_DMAC_REG_SRC_ADDRESS, 0xffffffff);
888 if (axi_dmac_read(dmac, AXI_DMAC_REG_SRC_ADDRESS) == 0 &&
890 dev_err(dmac->dma_dev.dev,
899 axi_dmac_write(dmac, AXI_DMAC_REG_X_LENGTH, 0x00);
901 axi_dmac_read(dmac, AXI_DMAC_REG_X_LENGTH);
912 struct axi_dmac *dmac;
917 dmac = devm_kzalloc(&pdev->dev, sizeof(*dmac), GFP_KERNEL);
918 if (!dmac)
921 dmac->irq = platform_get_irq(pdev, 0);
922 if (dmac->irq < 0)
923 return dmac->irq;
924 if (dmac->irq == 0)
927 dmac->base = devm_platform_ioremap_resource(pdev, 0);
928 if (IS_ERR(dmac->base))
929 return PTR_ERR(dmac->base);
931 dmac->clk = devm_clk_get(&pdev->dev, NULL);
932 if (IS_ERR(dmac->clk))
933 return PTR_ERR(dmac->clk);
935 ret = clk_prepare_enable(dmac->clk);
939 version = axi_dmac_read(dmac, ADI_AXI_REG_VERSION);
942 ret = axi_dmac_read_chan_config(&pdev->dev, dmac);
944 ret = axi_dmac_parse_dt(&pdev->dev, dmac);
949 INIT_LIST_HEAD(&dmac->chan.active_descs);
953 dma_dev = &dmac->dma_dev;
966 dma_dev->src_addr_widths = BIT(dmac->chan.src_width);
967 dma_dev->dst_addr_widths = BIT(dmac->chan.dest_width);
968 dma_dev->directions = BIT(dmac->chan.direction);
972 dmac->chan.vchan.desc_free = axi_dmac_desc_free;
973 vchan_init(&dmac->chan.vchan, dma_dev);
975 ret = axi_dmac_detect_caps(dmac, version);
979 dma_dev->copy_align = (dmac->chan.address_align_mask + 1);
981 axi_dmac_write(dmac, AXI_DMAC_REG_IRQ_MASK, 0x00);
984 ret = axi_dmac_read(dmac, AXI_DMAC_REG_COHERENCY_DESC);
988 dev_err(dmac->dma_dev.dev,
1004 ret = request_irq(dmac->irq, axi_dmac_interrupt_handler, IRQF_SHARED,
1005 dev_name(&pdev->dev), dmac);
1009 platform_set_drvdata(pdev, dmac);
1011 regmap = devm_regmap_init_mmio(&pdev->dev, dmac->base,
1021 free_irq(dmac->irq, dmac);
1025 dma_async_device_unregister(&dmac->dma_dev);
1027 clk_disable_unprepare(dmac->clk);
1034 struct axi_dmac *dmac = platform_get_drvdata(pdev);
1037 free_irq(dmac->irq, dmac);
1038 tasklet_kill(&dmac->chan.vchan.task);
1039 dma_async_device_unregister(&dmac->dma_dev);
1040 clk_disable_unprepare(dmac->clk);
1046 { .compatible = "adi,axi-dmac-1.00.a" },
1053 .name = "dma-axi-dmac",