omap3: Add DMA driver
Subsystems (2)
cover omap3: Add DMA driver
This adds functions to use the DMA controller of OMAP3 devices. It also adds a dma library to the SPL.
based on:
- u-boot-ti/next
- SPL direct linux boot patch:
http://article.gmane.org/gmane.comp.boot-loaders.u-boot/108814
Simon Schwarz (4):
omap3: Add Base register for DMA
omap3: Add DMA register accessors
omap3: Add interface for omap3 DMA
SPL: Add DMA library
arch/arm/include/asm/arch-omap3/cpu.h | 45 ++++++++ arch/arm/include/asm/arch-omap3/dma.h | 77 +++++++++++++ arch/arm/include/asm/arch-omap3/omap3.h | 3 + doc/README.SPL | 1 + doc/README.omap3 | 18 +++ drivers/dma/Makefile | 1 + drivers/dma/omap3_dma.c | 180 +++++++++++++++++++++++++++++++ spl/Makefile | 1 + 8 files changed, 326 insertions(+), 0 deletions(-) create mode 100644 arch/arm/include/asm/arch-omap3/dma.h create mode 100644 drivers/dma/omap3_dma.c
Signature · 1 line
1.7.4.1
PATCH 1/4 omap3: Add Base register for DMA
Adding the base register address of OMAP3 DMA controller.
--- arch/arm/include/asm/arch-omap3/omap3.h | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-)
arch/arm/include/asm/arch-omap3/omap3.h +3 -0
@@ -47,6 +47,9 @@#define OMAP34XX_L4_PER 0x49000000#define OMAP34XX_L4_IO_BASE OMAP34XX_CORE_L4_IO_BASE +/* DMA4/SDMA */ +#define OMAP34XX_DMA4_BASE 0x48056000 +/* CONTROL */ #define OMAP34XX_CTRL_BASE (OMAP34XX_L4_IO_BASE + 0x2000)
Signature · 1 line
1.7.4.1
PATCH 2/4 omap3: Add DMA register accessors
In reply to Simon SchwarzAdding the register definitions for omap3 DMA controller to cpu.h
--- arch/arm/include/asm/arch-omap3/cpu.h | 45 +++++++++++++++++++++++++++++++++ 1 files changed, 45 insertions(+), 0 deletions(-)
arch/arm/include/asm/arch-omap3/cpu.h +45 -0
@@ -282,6 +282,51 @@ typedef struct emif4 {#define SMART_IDLE (0x2 << 3)#define REF_ON_IDLE (0x1 << 6) +/* DMA */ +#ifndef __KERNEL_STRICT_NAMES +#ifndef __ASSEMBLY__ +struct dma4_chan { +u32 ccr; +u32 clnk_ctrl; +u32 cicr; +u32 csr; +u32 csdp; +u32 cen; +u32 cfn; +u32 cssa; +u32 cdsa; +u32 csel; +u32 csfl; +u32 cdel; +u32 cdfl; +u32 csac; +u32 cdac; +u32 ccen; +u32 ccfn; +u32 color; +}; + +struct dma4 { +u32 revision; +u8 res1[0x4 ]; +u32 irqstatus_l[0x4 ]; +u32 irqenable_l[0x4 ]; +u32 sysstatus; +u32 ocp_sysconfig; +u8 res2[0x34 ]; +u32 caps_0; +u8 res3[0x4 ]; +u32 caps_2; +u32 caps_3; +u32 caps_4; +u32 gcr; +u8 res4[0x4 ]; +struct dma4_chan chan[32 ]; +}; + +#endif /*__ASSEMBLY__ */ +#endif /* __KERNEL_STRICT_NAMES */ +/* timer regs offsets (32 bit regs) */ #ifndef __KERNEL_STRICT_NAMES
Signature · 1 line
1.7.4.1
PATCH 3/4 omap3: Add interface for omap3 DMA
In reply to Simon SchwarzAdds an interface to use the OMAP3 DMA.
--- arch/arm/include/asm/arch-omap3/dma.h | 77 ++++++++++++++ doc/README.omap3 | 18 ++++ drivers/dma/Makefile | 1 + drivers/dma/omap3_dma.c | 180 +++++++++++++++++++++++++++++++++ 4 files changed, 276 insertions(+), 0 deletions(-) create mode 100644 arch/arm/include/asm/arch-omap3/dma.h create mode 100644 drivers/dma/omap3_dma.c
arch/arm/include/asm/arch-omap3/dma.h new file +77 -0
@@ -0,0 +1,77 @@ +#ifndef __SDMA_H +#define __SDMA_H + +/* Copyright (C) 2011 +* Corscience GmbH & Co. KG - Simon Schwarz <[email protected]> +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, +* MA 02111-1307 USA +*/ + +/* Functions */ +void omap3_dma_init (void ); +int omap3_dma_conf_transfer (uint32_t chan,uint32_t *src,uint32_t *dst, +uint32_t sze); +int omap3_dma_start_transfer (uint32_t chan); +int omap3_dma_wait_for_transfer (uint32_t chan); +int omap3_dma_conf_chan (uint32_t chan,struct dma4_chan *config); +int omap3_dma_get_conf_chan (uint32_t chan,struct dma4_chan *config); + +/* Register settings */ +#define CSDP_DATA_TYPE_8BIT 0x0 +#define CSDP_DATA_TYPE_16BIT 0x1 +#define CSDP_DATA_TYPE_32BIT 0x2 +#define CSDP_SRC_BURST_SINGLE (0x0 << 7) +#define CSDP_SRC_BURST_EN_16BYTES (0x1 << 7) +#define CSDP_SRC_BURST_EN_32BYTES (0x2 << 7) +#define CSDP_SRC_BURST_EN_64BYTES (0x3 << 7) +#define CSDP_DST_BURST_SINGLE (0x0 << 14) +#define CSDP_DST_BURST_EN_16BYTES (0x1 << 14) +#define CSDP_DST_BURST_EN_32BYTES (0x2 << 14) +#define CSDP_DST_BURST_EN_64BYTES (0x3 << 14) +#define CSDP_DST_ENDIAN_LOCK_ADAPT (0x0 << 18) +#define CSDP_DST_ENDIAN_LOCK_LOCK (0x1 << 18) +#define CSDP_DST_ENDIAN_LITTLE (0x0 << 19) +#define CSDP_DST_ENDIAN_BIG (0x1 << 19) +#define CSDP_SRC_ENDIAN_LOCK_ADAPT (0x0 << 20) +#define CSDP_SRC_ENDIAN_LOCK_LOCK (0x1 << 20) +#define CSDP_SRC_ENDIAN_LITTLE (0x0 << 21) +#define CSDP_SRC_ENDIAN_BIG (0x1 << 21) + +#define CCR_READ_PRIORITY_LOW (0x0 << 6) +#define CCR_READ_PRIORITY_HIGH (0x1 << 6) +#define CCR_ENABLE_DISABLED (0x0 << 7) +#define CCR_ENABLE_ENABLE (0x1 << 7) +#define CCR_SRC_AMODE_CONSTANT (0x0 << 12) +#define CCR_SRC_AMODE_POST_INC (0x1 << 12) +#define CCR_SRC_AMODE_SINGLE_IDX (0x2 << 12) +#define CCR_SRC_AMODE_DOUBLE_IDX (0x3 << 12) +#define CCR_DST_AMODE_CONSTANT (0x0 << 14) +#define CCR_DST_AMODE_POST_INC (0x1 << 14) +#define CCR_DST_AMODE_SINGLE_IDX (0x2 << 14) +#define CCR_DST_AMODE_SOUBLE_IDX (0x3 << 14) + +#define CCR_RD_ACTIVE_MASK (1 << 9) +#define CCR_WR_ACTIVE_MASK (1 << 10) + +#define CSR_TRANS_ERR (1 << 8) +#define CSR_SUPERVISOR_ERR (1 << 10) +#define CSR_MISALIGNED_ADRS_ERR (1 << 11) + +/* others */ +#define CHAN_NR_MIN 0 +#define CHAN_NR_MAX 31 + +#endif /* __SDMA_H */
doc/README.omap3 +18 -0
@@ -95,6 +95,7 @@ Interfaces ========== gpio +---- To set a bit :
@@ -122,6 +123,23 @@ To read a bit : else printf("GPIO N is clear\n"); +dma +--- +void omap3_dma_init(void) + Init the DMA module +int omap3_dma_get_conf_chan(uint32_t chan, struct dma4_chan *config); + Read config of the channel +int omap3_dma_conf_chan(uint32_t chan, struct dma4_chan *config); + Write config to the channel +int omap3_dma_conf_transfer(uint32_t chan, uint32_t *src, uint32_t *dst, + uint32_t sze) + Config source, destination and size of a transfer +int omap3_dma_wait_for_transfer(uint32_t chan) + Wait for a transfer to end - this hast to be called before a channel + or the data the channel transferd are used. +int omap3_dma_get_revision(uint32_t *minor, uint32_t *major) + Read silicon Revision of the DMA module + Acknowledgements ================
drivers/dma/Makefile +1 -0
@@ -27,6 +27,7 @@ LIB := $(obj)libdma.o COBJS-$(CONFIG_FSLDMAFEC) += MCD_tasksInit.o MCD_dmaApi.o MCD_tasks.o COBJS-$(CONFIG_FSL_DMA) += fsl_dma.o +COBJS-$(CONFIG_OMAP3_DMA) += omap3_dma.o COBJS := $(COBJS-y) SRCS := $(COBJS:.o=.c)
drivers/dma/omap3_dma.c new file +180 -0
180 lines not on this page · raw message
Signature · 1 line
1.7.4.1
PATCH 4/4 SPL: Add DMA library
In reply to Simon SchwarzAdding a DMA library to the SPL. It is used if CONFIG_SPL_DMA_SUPPORT is defined.
--- doc/README.SPL | 1 + spl/Makefile | 1 + 2 files changed, 2 insertions(+), 0 deletions(-)
doc/README.SPL +1 -0
@@ -62,3 +62,4 @@ CONFIG_SPL_FAT_SUPPORT (fs/fat/libfat.o) CONFIG_SPL_LIBGENERIC_SUPPORT (lib/libgeneric.o) CONFIG_SPL_POWER_SUPPORT (drivers/power/libpower.o) CONFIG_SPL_NAND_SUPPORT (drivers/mtd/nand/libnand.o) +CONFIG_SPL_DMA_SUPPORT (drivers/dma/libdma.o)
spl/Makefile +1 -0
@@ -48,6 +48,7 @@ LIBS-$(CONFIG_SPL_FAT_SUPPORT) += fs/fat/libfat.o LIBS-$(CONFIG_SPL_LIBGENERIC_SUPPORT) += lib/libgeneric.o LIBS-$(CONFIG_SPL_POWER_SUPPORT) += drivers/power/libpower.o LIBS-$(CONFIG_SPL_NAND_SUPPORT) += drivers/mtd/nand/libnand.o +LIBS-$(CONFIG_SPL_DMA_SUPPORT) += drivers/dma/libdma.o ifeq ($(SOC),omap3) LIBS-y += $(CPUDIR)/omap-common/libomap-common.o
Signature · 1 line
1.7.4.1