mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
dmaengine: axi-dmac: add regmap support
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> [vkoul: fixed code style issue] Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
e28d915528
commit
fc15be39a8
2 changed files with 42 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -18,6 +18,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>
|
||||
|
||||
|
@ -678,6 +679,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
|
||||
|
@ -882,6 +921,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:
|
||||
|
|
Loading…
Reference in a new issue