Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1db0287a authored by Tomasz Figa's avatar Tomasz Figa Committed by Mark Brown
Browse files

ARM: s3c64xx: Add support for DMA using generic amba-pl08x driver



This patch adds all required platform-specific data and initialization
code to support the generic amba-pl08x driver on S3C64xx SoCs.

Also some compatibility definitions are added to make the transition
from legacy API to DMA engine easier. The biggest hack here is passing
const char * pointers through DMA resource, casted to unsigned long,
but this is how Samsung DMA wrappers (used to support both s3c-dma and
DMA engine in drivers) are designed.

Signed-off-by: default avatarTomasz Figa <tomasz.figa@gmail.com>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent 1b49f10c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -723,6 +723,7 @@ config ARCH_S3C64XX
	bool "Samsung S3C64XX"
	select ARCH_HAS_CPUFREQ
	select ARCH_REQUIRE_GPIOLIB
	select ARM_AMBA
	select ARM_VIC
	select CLKDEV_LOOKUP
	select CLKSRC_SAMSUNG_PWM
+7 −1
Original line number Diff line number Diff line
@@ -17,9 +17,15 @@ config CPU_S3C6410
	help
	  Enable S3C6410 CPU support

config S3C64XX_PL080
	bool "S3C64XX DMA using generic PL08x driver"
	select AMBA_PL08X
	select SAMSUNG_DMADEV

config S3C64XX_DMA
	bool "S3C64XX DMA"
	bool "S3C64XX DMA using legacy S3C DMA API"
	select S3C_DMA
	depends on !S3C64XX_PL080

config S3C64XX_SETUP_SDHCI
	bool
+1 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ obj-$(CONFIG_CPU_IDLE) += cpuidle.o
# DMA support

obj-$(CONFIG_S3C64XX_DMA)	+= dma.o
obj-$(CONFIG_S3C64XX_PL080)	+= pl080.o

# Device support

+5 −0
Original line number Diff line number Diff line
@@ -58,4 +58,9 @@ int __init s3c64xx_pm_late_initcall(void);
static inline int s3c64xx_pm_late_initcall(void) { return 0; }
#endif

#ifdef CONFIG_S3C64XX_PL080
extern struct pl08x_platform_data s3c64xx_dma0_plat_data;
extern struct pl08x_platform_data s3c64xx_dma1_plat_data;
#endif

#endif /* __ARCH_ARM_MACH_S3C64XX_COMMON_H */
+63 −0
Original line number Diff line number Diff line
@@ -11,6 +11,8 @@
#ifndef __ASM_ARCH_DMA_H
#define __ASM_ARCH_DMA_H __FILE__

#ifdef CONFIG_S3C64XX_DMA

#define S3C_DMA_CHANNELS	(16)

/* see mach-s3c2410/dma.h for notes on dma channel numbers */
@@ -128,4 +130,65 @@ struct s3c2410_dma_chan {

#include <plat/dma-core.h>

#else

#define S3C64XX_DMA_CHAN(name)		((unsigned long)(name))

/* DMA0/SDMA0 */
#define DMACH_UART0		S3C64XX_DMA_CHAN("uart0_tx")
#define DMACH_UART0_SRC2	S3C64XX_DMA_CHAN("uart0_rx")
#define DMACH_UART1		S3C64XX_DMA_CHAN("uart1_tx")
#define DMACH_UART1_SRC2	S3C64XX_DMA_CHAN("uart1_rx")
#define DMACH_UART2		S3C64XX_DMA_CHAN("uart2_tx")
#define DMACH_UART2_SRC2	S3C64XX_DMA_CHAN("uart2_rx")
#define DMACH_UART3		S3C64XX_DMA_CHAN("uart3_tx")
#define DMACH_UART3_SRC2	S3C64XX_DMA_CHAN("uart3_rx")
#define DMACH_PCM0_TX		S3C64XX_DMA_CHAN("pcm0_tx")
#define DMACH_PCM0_RX		S3C64XX_DMA_CHAN("pcm0_rx")
#define DMACH_I2S0_OUT		S3C64XX_DMA_CHAN("i2s0_tx")
#define DMACH_I2S0_IN		S3C64XX_DMA_CHAN("i2s0_rx")
#define DMACH_SPI0_TX		S3C64XX_DMA_CHAN("spi0_tx")
#define DMACH_SPI0_RX		S3C64XX_DMA_CHAN("spi0_rx")
#define DMACH_HSI_I2SV40_TX	S3C64XX_DMA_CHAN("i2s2_tx")
#define DMACH_HSI_I2SV40_RX	S3C64XX_DMA_CHAN("i2s2_rx")

/* DMA1/SDMA1 */
#define DMACH_PCM1_TX		S3C64XX_DMA_CHAN("pcm1_tx")
#define DMACH_PCM1_RX		S3C64XX_DMA_CHAN("pcm1_rx")
#define DMACH_I2S1_OUT		S3C64XX_DMA_CHAN("i2s1_tx")
#define DMACH_I2S1_IN		S3C64XX_DMA_CHAN("i2s1_rx")
#define DMACH_SPI1_TX		S3C64XX_DMA_CHAN("spi1_tx")
#define DMACH_SPI1_RX		S3C64XX_DMA_CHAN("spi1_rx")
#define DMACH_AC97_PCMOUT	S3C64XX_DMA_CHAN("ac97_out")
#define DMACH_AC97_PCMIN	S3C64XX_DMA_CHAN("ac97_in")
#define DMACH_AC97_MICIN	S3C64XX_DMA_CHAN("ac97_mic")
#define DMACH_PWM		S3C64XX_DMA_CHAN("pwm")
#define DMACH_IRDA		S3C64XX_DMA_CHAN("irda")
#define DMACH_EXTERNAL		S3C64XX_DMA_CHAN("external")
#define DMACH_SECURITY_RX	S3C64XX_DMA_CHAN("sec_rx")
#define DMACH_SECURITY_TX	S3C64XX_DMA_CHAN("sec_tx")

enum dma_ch {
	DMACH_MAX = 32
};

struct s3c2410_dma_client {
	char	*name;
};

static inline bool samsung_dma_has_circular(void)
{
	return true;
}

static inline bool samsung_dma_is_dmadev(void)
{
	return true;
}

#include <linux/amba/pl08x.h>
#include <plat/dma-ops.h>

#endif

#endif /* __ASM_ARCH_IRQ_H */
Loading