diff mbox series

[4/4] dmaengine: axi-dmac: add regmap support

Message ID 20190606104550.32336-4-alexandru.ardelean@analog.com (mailing list archive)
State Accepted
Headers show
Series [1/4] dmaengine: virt-dma: store result on dma descriptor | expand

Commit Message

Alexandru Ardelean June 6, 2019, 10:45 a.m. UTC
The registers for AXI DMAC are detailed at:
  https://wiki.analog.com/resources/fpga/docs/axi_dmac#register_map

This change adds regmap support for these registers, in case some wants to
have a more direct access to them via this interface.

Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
---
 drivers/dma/Kconfig        |  1 +
 drivers/dma/dma-axi-dmac.c | 41 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+)

Comments

Vinod Koul June 14, 2019, 5:52 a.m. UTC | #1
On 06-06-19, 13:45, Alexandru Ardelean wrote:
 
> +static bool axi_dmac_regmap_rdwr(struct device *dev, unsigned int reg)
> +{
> +	switch (reg) {
> +	case AXI_DMAC_REG_IRQ_MASK:
> +	case AXI_DMAC_REG_IRQ_SOURCE:
> +	case AXI_DMAC_REG_IRQ_PENDING:
> +	case AXI_DMAC_REG_CTRL:
> +	case AXI_DMAC_REG_TRANSFER_ID:
> +	case AXI_DMAC_REG_START_TRANSFER:
> +	case AXI_DMAC_REG_FLAGS:
> +	case AXI_DMAC_REG_DEST_ADDRESS:
> +	case AXI_DMAC_REG_SRC_ADDRESS:
> +	case AXI_DMAC_REG_X_LENGTH:
> +	case AXI_DMAC_REG_Y_LENGTH:
> +	case AXI_DMAC_REG_DEST_STRIDE:
> +	case AXI_DMAC_REG_SRC_STRIDE:
> +	case AXI_DMAC_REG_TRANSFER_DONE:
> +	case AXI_DMAC_REG_ACTIVE_TRANSFER_ID :

Space before : ...?
Alexandru Ardelean June 14, 2019, 8:14 a.m. UTC | #2
On Fri, 2019-06-14 at 11:22 +0530, Vinod Koul wrote:
> [External]
> 
> 
> On 06-06-19, 13:45, Alexandru Ardelean wrote:
> 
> > +static bool axi_dmac_regmap_rdwr(struct device *dev, unsigned int reg)
> > +{
> > +     switch (reg) {
> > +     case AXI_DMAC_REG_IRQ_MASK:
> > +     case AXI_DMAC_REG_IRQ_SOURCE:
> > +     case AXI_DMAC_REG_IRQ_PENDING:
> > +     case AXI_DMAC_REG_CTRL:
> > +     case AXI_DMAC_REG_TRANSFER_ID:
> > +     case AXI_DMAC_REG_START_TRANSFER:
> > +     case AXI_DMAC_REG_FLAGS:
> > +     case AXI_DMAC_REG_DEST_ADDRESS:
> > +     case AXI_DMAC_REG_SRC_ADDRESS:
> > +     case AXI_DMAC_REG_X_LENGTH:
> > +     case AXI_DMAC_REG_Y_LENGTH:
> > +     case AXI_DMAC_REG_DEST_STRIDE:
> > +     case AXI_DMAC_REG_SRC_STRIDE:
> > +     case AXI_DMAC_REG_TRANSFER_DONE:
> > +     case AXI_DMAC_REG_ACTIVE_TRANSFER_ID :
> 
> Space before : ...?

oops
sorry about that

thanks for fixing

Alex

> 
> --
> ~Vinod
diff mbox series

Patch

diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index eaf78f4e07ce..ae631c6e8bc5 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -102,6 +102,7 @@  config AXI_DMAC
 	depends on MICROBLAZE || NIOS2 || ARCH_ZYNQ || ARCH_ZYNQMP || ARCH_SOCFPGA || COMPILE_TEST
 	select DMA_ENGINE
 	select DMA_VIRTUAL_CHANNELS
+	select REGMAP_MMIO
 	help
 	  Enable support for the Analog Devices AXI-DMAC peripheral. This DMA
 	  controller is often used in Analog Device's reference designs for FPGA
diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c
index 3b418d545c7a..a35b76f08dfa 100644
--- a/drivers/dma/dma-axi-dmac.c
+++ b/drivers/dma/dma-axi-dmac.c
@@ -19,6 +19,7 @@ 
 #include <linux/of.h>
 #include <linux/of_dma.h>
 #include <linux/platform_device.h>
+#include <linux/regmap.h>
 #include <linux/slab.h>
 #include <linux/fpga/adi-axi-common.h>
 
@@ -679,6 +680,44 @@  static void axi_dmac_desc_free(struct virt_dma_desc *vdesc)
 	kfree(container_of(vdesc, struct axi_dmac_desc, vdesc));
 }
 
+static bool axi_dmac_regmap_rdwr(struct device *dev, unsigned int reg)
+{
+	switch (reg) {
+	case AXI_DMAC_REG_IRQ_MASK:
+	case AXI_DMAC_REG_IRQ_SOURCE:
+	case AXI_DMAC_REG_IRQ_PENDING:
+	case AXI_DMAC_REG_CTRL:
+	case AXI_DMAC_REG_TRANSFER_ID:
+	case AXI_DMAC_REG_START_TRANSFER:
+	case AXI_DMAC_REG_FLAGS:
+	case AXI_DMAC_REG_DEST_ADDRESS:
+	case AXI_DMAC_REG_SRC_ADDRESS:
+	case AXI_DMAC_REG_X_LENGTH:
+	case AXI_DMAC_REG_Y_LENGTH:
+	case AXI_DMAC_REG_DEST_STRIDE:
+	case AXI_DMAC_REG_SRC_STRIDE:
+	case AXI_DMAC_REG_TRANSFER_DONE:
+	case AXI_DMAC_REG_ACTIVE_TRANSFER_ID :
+	case AXI_DMAC_REG_STATUS:
+	case AXI_DMAC_REG_CURRENT_SRC_ADDR:
+	case AXI_DMAC_REG_CURRENT_DEST_ADDR:
+	case AXI_DMAC_REG_PARTIAL_XFER_LEN:
+	case AXI_DMAC_REG_PARTIAL_XFER_ID:
+		return true;
+	default:
+		return false;
+	}
+}
+
+static const struct regmap_config axi_dmac_regmap_config = {
+	.reg_bits = 32,
+	.val_bits = 32,
+	.reg_stride = 4,
+	.max_register = AXI_DMAC_REG_PARTIAL_XFER_ID,
+	.readable_reg = axi_dmac_regmap_rdwr,
+	.writeable_reg = axi_dmac_regmap_rdwr,
+};
+
 /*
  * The configuration stored in the devicetree matches the configuration
  * parameters of the peripheral instance and allows the driver to know which
@@ -883,6 +922,8 @@  static int axi_dmac_probe(struct platform_device *pdev)
 
 	platform_set_drvdata(pdev, dmac);
 
+	devm_regmap_init_mmio(&pdev->dev, dmac->base, &axi_dmac_regmap_config);
+
 	return 0;
 
 err_unregister_of: