Lines Matching refs:dmac
26 #include <dt-bindings/dma/axi-dmac.h>
205 struct axi_dmac *dmac = chan_to_axi_dmac(chan);
212 val = axi_dmac_read(dmac, AXI_DMAC_REG_START_TRANSFER);
245 sg->id = axi_dmac_read(dmac, AXI_DMAC_REG_TRANSFER_ID);
248 axi_dmac_write(dmac, AXI_DMAC_REG_DEST_ADDRESS, sg->dest_addr);
249 axi_dmac_write(dmac, AXI_DMAC_REG_DEST_STRIDE, sg->dest_stride);
253 axi_dmac_write(dmac, AXI_DMAC_REG_SRC_ADDRESS, sg->src_addr);
254 axi_dmac_write(dmac, AXI_DMAC_REG_SRC_STRIDE, sg->src_stride);
269 axi_dmac_write(dmac, AXI_DMAC_REG_X_LENGTH, sg->x_len - 1);
270 axi_dmac_write(dmac, AXI_DMAC_REG_Y_LENGTH, sg->y_len - 1);
271 axi_dmac_write(dmac, AXI_DMAC_REG_FLAGS, flags);
272 axi_dmac_write(dmac, AXI_DMAC_REG_START_TRANSFER, 1);
292 struct axi_dmac *dmac = chan_to_axi_dmac(chan);
299 len = axi_dmac_read(dmac, AXI_DMAC_REG_PARTIAL_XFER_LEN);
300 id = axi_dmac_read(dmac, AXI_DMAC_REG_PARTIAL_XFER_ID);
320 dev_dbg(dmac->dma_dev.dev,
324 dev_warn(dmac->dma_dev.dev,
330 xfer_done = axi_dmac_read(dmac, AXI_DMAC_REG_TRANSFER_DONE);
409 struct axi_dmac *dmac = devid;
413 pending = axi_dmac_read(dmac, AXI_DMAC_REG_IRQ_PENDING);
417 axi_dmac_write(dmac, AXI_DMAC_REG_IRQ_PENDING, pending);
419 spin_lock(&dmac->chan.vchan.lock);
424 completed = axi_dmac_read(dmac, AXI_DMAC_REG_TRANSFER_DONE);
425 start_next = axi_dmac_transfer_done(&dmac->chan, completed);
429 axi_dmac_start_transfer(&dmac->chan);
430 spin_unlock(&dmac->chan.vchan.lock);
438 struct axi_dmac *dmac = chan_to_axi_dmac(chan);
443 axi_dmac_write(dmac, AXI_DMAC_REG_CTRL, 0);
464 struct axi_dmac *dmac = chan_to_axi_dmac(chan);
467 axi_dmac_write(dmac, AXI_DMAC_REG_CTRL, AXI_DMAC_CTRL_ENABLE);
791 static int axi_dmac_parse_dt(struct device *dev, struct axi_dmac *dmac)
801 ret = axi_dmac_parse_chan_dt(of_chan, &dmac->chan);
813 static int axi_dmac_read_chan_config(struct device *dev, struct axi_dmac *dmac)
815 struct axi_dmac_chan *chan = &dmac->chan;
818 desc = axi_dmac_read(dmac, AXI_DMAC_REG_INTERFACE_DESC);
858 static int axi_dmac_detect_caps(struct axi_dmac *dmac, unsigned int version)
860 struct axi_dmac_chan *chan = &dmac->chan;
862 axi_dmac_write(dmac, AXI_DMAC_REG_FLAGS, AXI_DMAC_FLAG_CYCLIC);
863 if (axi_dmac_read(dmac, AXI_DMAC_REG_FLAGS) == AXI_DMAC_FLAG_CYCLIC)
866 axi_dmac_write(dmac, AXI_DMAC_REG_Y_LENGTH, 1);
867 if (axi_dmac_read(dmac, AXI_DMAC_REG_Y_LENGTH) == 1)
870 axi_dmac_write(dmac, AXI_DMAC_REG_X_LENGTH, 0xffffffff);
871 chan->max_length = axi_dmac_read(dmac, AXI_DMAC_REG_X_LENGTH);
875 axi_dmac_write(dmac, AXI_DMAC_REG_DEST_ADDRESS, 0xffffffff);
876 if (axi_dmac_read(dmac, AXI_DMAC_REG_DEST_ADDRESS) == 0 &&
878 dev_err(dmac->dma_dev.dev,
883 axi_dmac_write(dmac, AXI_DMAC_REG_SRC_ADDRESS, 0xffffffff);
884 if (axi_dmac_read(dmac, AXI_DMAC_REG_SRC_ADDRESS) == 0 &&
886 dev_err(dmac->dma_dev.dev,
895 axi_dmac_write(dmac, AXI_DMAC_REG_X_LENGTH, 0x00);
897 axi_dmac_read(dmac, AXI_DMAC_REG_X_LENGTH);
908 struct axi_dmac *dmac;
914 dmac = devm_kzalloc(&pdev->dev, sizeof(*dmac), GFP_KERNEL);
915 if (!dmac)
918 dmac->irq = platform_get_irq(pdev, 0);
919 if (dmac->irq < 0)
920 return dmac->irq;
921 if (dmac->irq == 0)
925 dmac->base = devm_ioremap_resource(&pdev->dev, res);
926 if (IS_ERR(dmac->base))
927 return PTR_ERR(dmac->base);
929 dmac->clk = devm_clk_get(&pdev->dev, NULL);
930 if (IS_ERR(dmac->clk))
931 return PTR_ERR(dmac->clk);
933 ret = clk_prepare_enable(dmac->clk);
937 version = axi_dmac_read(dmac, ADI_AXI_REG_VERSION);
940 ret = axi_dmac_read_chan_config(&pdev->dev, dmac);
942 ret = axi_dmac_parse_dt(&pdev->dev, dmac);
947 INIT_LIST_HEAD(&dmac->chan.active_descs);
951 dma_dev = &dmac->dma_dev;
965 dma_dev->src_addr_widths = BIT(dmac->chan.src_width);
966 dma_dev->dst_addr_widths = BIT(dmac->chan.dest_width);
967 dma_dev->directions = BIT(dmac->chan.direction);
971 dmac->chan.vchan.desc_free = axi_dmac_desc_free;
972 vchan_init(&dmac->chan.vchan, dma_dev);
974 ret = axi_dmac_detect_caps(dmac, version);
978 dma_dev->copy_align = (dmac->chan.address_align_mask + 1);
980 axi_dmac_write(dmac, AXI_DMAC_REG_IRQ_MASK, 0x00);
991 ret = request_irq(dmac->irq, axi_dmac_interrupt_handler, IRQF_SHARED,
992 dev_name(&pdev->dev), dmac);
996 platform_set_drvdata(pdev, dmac);
998 regmap = devm_regmap_init_mmio(&pdev->dev, dmac->base,
1008 free_irq(dmac->irq, dmac);
1012 dma_async_device_unregister(&dmac->dma_dev);
1014 clk_disable_unprepare(dmac->clk);
1021 struct axi_dmac *dmac = platform_get_drvdata(pdev);
1024 free_irq(dmac->irq, dmac);
1025 tasklet_kill(&dmac->chan.vchan.task);
1026 dma_async_device_unregister(&dmac->dma_dev);
1027 clk_disable_unprepare(dmac->clk);
1033 { .compatible = "adi,axi-dmac-1.00.a" },
1040 .name = "dma-axi-dmac",