diff options
Diffstat (limited to 'target/linux/s3c24xx/patches-2.6.30/010-s3c-dma.patch')
-rw-r--r-- | target/linux/s3c24xx/patches-2.6.30/010-s3c-dma.patch | 1324 |
1 files changed, 0 insertions, 1324 deletions
diff --git a/target/linux/s3c24xx/patches-2.6.30/010-s3c-dma.patch b/target/linux/s3c24xx/patches-2.6.30/010-s3c-dma.patch deleted file mode 100644 index e0ff7c442c..0000000000 --- a/target/linux/s3c24xx/patches-2.6.30/010-s3c-dma.patch +++ /dev/null @@ -1,1324 +0,0 @@ ---- a/arch/arm/mach-s3c2410/include/mach/dma.h -+++ b/arch/arm/mach-s3c2410/include/mach/dma.h -@@ -3,7 +3,7 @@ - * Copyright (C) 2003,2004,2006 Simtec Electronics - * Ben Dooks <ben@simtec.co.uk> - * -- * Samsung S3C241XX DMA support -+ * Samsung S3C24XX DMA support - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as -@@ -13,8 +13,8 @@ - #ifndef __ASM_ARCH_DMA_H - #define __ASM_ARCH_DMA_H __FILE__ - -+#include <plat/dma.h> - #include <linux/sysdev.h> --#include <mach/hardware.h> - - #define MAX_DMA_TRANSFER_SIZE 0x100000 /* Data Unit is half word */ - -@@ -55,9 +55,9 @@ enum dma_ch { - - /* we have 4 dma channels */ - #ifndef CONFIG_CPU_S3C2443 --#define S3C2410_DMA_CHANNELS (4) -+#define S3C_DMA_CHANNELS (4) - #else --#define S3C2410_DMA_CHANNELS (6) -+#define S3C_DMA_CHANNELS (6) - #endif - - /* types */ -@@ -68,7 +68,6 @@ enum s3c2410_dma_state { - S3C2410_DMA_PAUSED - }; - -- - /* enum s3c2410_dma_loadst - * - * This represents the state of the DMA engine, wrt to the loaded / running -@@ -104,32 +103,6 @@ enum s3c2410_dma_loadst { - S3C2410_DMALOAD_1LOADED_1RUNNING, - }; - --enum s3c2410_dma_buffresult { -- S3C2410_RES_OK, -- S3C2410_RES_ERR, -- S3C2410_RES_ABORT --}; -- --enum s3c2410_dmasrc { -- S3C2410_DMASRC_HW, /* source is memory */ -- S3C2410_DMASRC_MEM /* source is hardware */ --}; -- --/* enum s3c2410_chan_op -- * -- * operation codes passed to the DMA code by the user, and also used -- * to inform the current channel owner of any changes to the system state --*/ -- --enum s3c2410_chan_op { -- S3C2410_DMAOP_START, -- S3C2410_DMAOP_STOP, -- S3C2410_DMAOP_PAUSE, -- S3C2410_DMAOP_RESUME, -- S3C2410_DMAOP_FLUSH, -- S3C2410_DMAOP_TIMEOUT, /* internal signal to handler */ -- S3C2410_DMAOP_STARTED, /* indicate channel started */ --}; - - /* flags */ - -@@ -137,19 +110,18 @@ enum s3c2410_chan_op { - * waiting for reloads */ - #define S3C2410_DMAF_AUTOSTART (1<<1) /* auto-start if buffer queued */ - -+#define S3C2410_DMAF_CIRCULAR (0x00) /* circular enqueue not supp. */ -+ - /* dma buffer */ - --struct s3c2410_dma_client { -- char *name; --}; -+struct s3c2410_dma_buf; - --/* s3c2410_dma_buf_s -+/* s3c2410_dma_buf - * - * internally used buffer structure to describe a queued or running - * buffer. - */ - --struct s3c2410_dma_buf; - struct s3c2410_dma_buf { - struct s3c2410_dma_buf *next; - int magic; /* magic */ -@@ -161,20 +133,6 @@ struct s3c2410_dma_buf { - - /* [1] is this updated for both recv/send modes? */ - --struct s3c2410_dma_chan; -- --/* s3c2410_dma_cbfn_t -- * -- * buffer callback routine type --*/ -- --typedef void (*s3c2410_dma_cbfn_t)(struct s3c2410_dma_chan *, -- void *buf, int size, -- enum s3c2410_dma_buffresult result); -- --typedef int (*s3c2410_dma_opfn_t)(struct s3c2410_dma_chan *, -- enum s3c2410_chan_op ); -- - struct s3c2410_dma_stats { - unsigned long loads; - unsigned long timeout_longest; -@@ -206,10 +164,10 @@ struct s3c2410_dma_chan { - - /* channel configuration */ - enum s3c2410_dmasrc source; -+ enum dma_ch req_ch; - unsigned long dev_addr; - unsigned long load_timeout; - unsigned int flags; /* channel flags */ -- unsigned int hw_cfg; /* last hw config */ - - struct s3c24xx_dma_map *map; /* channel hw maps */ - -@@ -236,213 +194,12 @@ struct s3c2410_dma_chan { - struct sys_device dev; - }; - --/* the currently allocated channel information */ --extern struct s3c2410_dma_chan s3c2410_chans[]; -- --/* note, we don't really use dma_device_t at the moment */ - typedef unsigned long dma_device_t; - --/* functions --------------------------------------------------------------- */ -- --/* s3c2410_dma_request -- * -- * request a dma channel exclusivley --*/ -- --extern int s3c2410_dma_request(unsigned int channel, -- struct s3c2410_dma_client *, void *dev); -- -- --/* s3c2410_dma_ctrl -- * -- * change the state of the dma channel --*/ -- --extern int s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op); -- --/* s3c2410_dma_setflags -- * -- * set the channel's flags to a given state --*/ -- --extern int s3c2410_dma_setflags(unsigned int channel, -- unsigned int flags); -- --/* s3c2410_dma_free -- * -- * free the dma channel (will also abort any outstanding operations) --*/ -- --extern int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *); -- --/* s3c2410_dma_enqueue -- * -- * place the given buffer onto the queue of operations for the channel. -- * The buffer must be allocated from dma coherent memory, or the Dcache/WB -- * drained before the buffer is given to the DMA system. --*/ -- --extern int s3c2410_dma_enqueue(unsigned int channel, void *id, -- dma_addr_t data, int size); -- --/* s3c2410_dma_config -- * -- * configure the dma channel --*/ -- --extern int s3c2410_dma_config(unsigned int channel, int xferunit, int dcon); -- --/* s3c2410_dma_devconfig -- * -- * configure the device we're talking to --*/ -- --extern int s3c2410_dma_devconfig(int channel, enum s3c2410_dmasrc source, -- int hwcfg, unsigned long devaddr); -- --/* s3c2410_dma_getposition -- * -- * get the position that the dma transfer is currently at --*/ -- --extern int s3c2410_dma_getposition(unsigned int channel, -- dma_addr_t *src, dma_addr_t *dest); -- --extern int s3c2410_dma_set_opfn(unsigned int, s3c2410_dma_opfn_t rtn); --extern int s3c2410_dma_set_buffdone_fn(unsigned int, s3c2410_dma_cbfn_t rtn); -- --/* DMA Register definitions */ -- --#define S3C2410_DMA_DISRC (0x00) --#define S3C2410_DMA_DISRCC (0x04) --#define S3C2410_DMA_DIDST (0x08) --#define S3C2410_DMA_DIDSTC (0x0C) --#define S3C2410_DMA_DCON (0x10) --#define S3C2410_DMA_DSTAT (0x14) --#define S3C2410_DMA_DCSRC (0x18) --#define S3C2410_DMA_DCDST (0x1C) --#define S3C2410_DMA_DMASKTRIG (0x20) --#define S3C2412_DMA_DMAREQSEL (0x24) --#define S3C2443_DMA_DMAREQSEL (0x24) -- --#define S3C2410_DISRCC_INC (1<<0) --#define S3C2410_DISRCC_APB (1<<1) -- --#define S3C2410_DMASKTRIG_STOP (1<<2) --#define S3C2410_DMASKTRIG_ON (1<<1) --#define S3C2410_DMASKTRIG_SWTRIG (1<<0) -- --#define S3C2410_DCON_DEMAND (0<<31) --#define S3C2410_DCON_HANDSHAKE (1<<31) --#define S3C2410_DCON_SYNC_PCLK (0<<30) --#define S3C2410_DCON_SYNC_HCLK (1<<30) -- --#define S3C2410_DCON_INTREQ (1<<29) -- --#define S3C2410_DCON_CH0_XDREQ0 (0<<24) --#define S3C2410_DCON_CH0_UART0 (1<<24) --#define S3C2410_DCON_CH0_SDI (2<<24) --#define S3C2410_DCON_CH0_TIMER (3<<24) --#define S3C2410_DCON_CH0_USBEP1 (4<<24) -- --#define S3C2410_DCON_CH1_XDREQ1 (0<<24) --#define S3C2410_DCON_CH1_UART1 (1<<24) --#define S3C2410_DCON_CH1_I2SSDI (2<<24) --#define S3C2410_DCON_CH1_SPI (3<<24) --#define S3C2410_DCON_CH1_USBEP2 (4<<24) -- --#define S3C2410_DCON_CH2_I2SSDO (0<<24) --#define S3C2410_DCON_CH2_I2SSDI (1<<24) --#define S3C2410_DCON_CH2_SDI (2<<24) --#define S3C2410_DCON_CH2_TIMER (3<<24) --#define S3C2410_DCON_CH2_USBEP3 (4<<24) -- --#define S3C2410_DCON_CH3_UART2 (0<<24) --#define S3C2410_DCON_CH3_SDI (1<<24) --#define S3C2410_DCON_CH3_SPI (2<<24) --#define S3C2410_DCON_CH3_TIMER (3<<24) --#define S3C2410_DCON_CH3_USBEP4 (4<<24) -- --#define S3C2410_DCON_SRCSHIFT (24) --#define S3C2410_DCON_SRCMASK (7<<24) -- --#define S3C2410_DCON_BYTE (0<<20) --#define S3C2410_DCON_HALFWORD (1<<20) --#define S3C2410_DCON_WORD (2<<20) -- --#define S3C2410_DCON_AUTORELOAD (0<<22) --#define S3C2410_DCON_NORELOAD (1<<22) --#define S3C2410_DCON_HWTRIG (1<<23) -- --#ifdef CONFIG_CPU_S3C2440 --#define S3C2440_DIDSTC_CHKINT (1<<2) -- --#define S3C2440_DCON_CH0_I2SSDO (5<<24) --#define S3C2440_DCON_CH0_PCMIN (6<<24) -- --#define S3C2440_DCON_CH1_PCMOUT (5<<24) --#define S3C2440_DCON_CH1_SDI (6<<24) -- --#define S3C2440_DCON_CH2_PCMIN (5<<24) --#define S3C2440_DCON_CH2_MICIN (6<<24) -- --#define S3C2440_DCON_CH3_MICIN (5<<24) --#define S3C2440_DCON_CH3_PCMOUT (6<<24) --#endif -- --#ifdef CONFIG_CPU_S3C2412 -- --#define S3C2412_DMAREQSEL_SRC(x) ((x)<<1) -- --#define S3C2412_DMAREQSEL_HW (1) -- --#define S3C2412_DMAREQSEL_SPI0TX S3C2412_DMAREQSEL_SRC(0) --#define S3C2412_DMAREQSEL_SPI0RX S3C2412_DMAREQSEL_SRC(1) --#define S3C2412_DMAREQSEL_SPI1TX S3C2412_DMAREQSEL_SRC(2) --#define S3C2412_DMAREQSEL_SPI1RX S3C2412_DMAREQSEL_SRC(3) --#define S3C2412_DMAREQSEL_I2STX S3C2412_DMAREQSEL_SRC(4) --#define S3C2412_DMAREQSEL_I2SRX S3C2412_DMAREQSEL_SRC(5) --#define S3C2412_DMAREQSEL_TIMER S3C2412_DMAREQSEL_SRC(9) --#define S3C2412_DMAREQSEL_SDI S3C2412_DMAREQSEL_SRC(10) --#define S3C2412_DMAREQSEL_USBEP1 S3C2412_DMAREQSEL_SRC(13) --#define S3C2412_DMAREQSEL_USBEP2 S3C2412_DMAREQSEL_SRC(14) --#define S3C2412_DMAREQSEL_USBEP3 S3C2412_DMAREQSEL_SRC(15) --#define S3C2412_DMAREQSEL_USBEP4 S3C2412_DMAREQSEL_SRC(16) --#define S3C2412_DMAREQSEL_XDREQ0 S3C2412_DMAREQSEL_SRC(17) --#define S3C2412_DMAREQSEL_XDREQ1 S3C2412_DMAREQSEL_SRC(18) --#define S3C2412_DMAREQSEL_UART0_0 S3C2412_DMAREQSEL_SRC(19) --#define S3C2412_DMAREQSEL_UART0_1 S3C2412_DMAREQSEL_SRC(20) --#define S3C2412_DMAREQSEL_UART1_0 S3C2412_DMAREQSEL_SRC(21) --#define S3C2412_DMAREQSEL_UART1_1 S3C2412_DMAREQSEL_SRC(22) --#define S3C2412_DMAREQSEL_UART2_0 S3C2412_DMAREQSEL_SRC(23) --#define S3C2412_DMAREQSEL_UART2_1 S3C2412_DMAREQSEL_SRC(24) -- --#endif -- --#define S3C2443_DMAREQSEL_SRC(x) ((x)<<1) -- --#define S3C2443_DMAREQSEL_HW (1) - --#define S3C2443_DMAREQSEL_SPI0TX S3C2443_DMAREQSEL_SRC(0) --#define S3C2443_DMAREQSEL_SPI0RX S3C2443_DMAREQSEL_SRC(1) --#define S3C2443_DMAREQSEL_SPI1TX S3C2443_DMAREQSEL_SRC(2) --#define S3C2443_DMAREQSEL_SPI1RX S3C2443_DMAREQSEL_SRC(3) --#define S3C2443_DMAREQSEL_I2STX S3C2443_DMAREQSEL_SRC(4) --#define S3C2443_DMAREQSEL_I2SRX S3C2443_DMAREQSEL_SRC(5) --#define S3C2443_DMAREQSEL_TIMER S3C2443_DMAREQSEL_SRC(9) --#define S3C2443_DMAREQSEL_SDI S3C2443_DMAREQSEL_SRC(10) --#define S3C2443_DMAREQSEL_XDREQ0 S3C2443_DMAREQSEL_SRC(17) --#define S3C2443_DMAREQSEL_XDREQ1 S3C2443_DMAREQSEL_SRC(18) --#define S3C2443_DMAREQSEL_UART0_0 S3C2443_DMAREQSEL_SRC(19) --#define S3C2443_DMAREQSEL_UART0_1 S3C2443_DMAREQSEL_SRC(20) --#define S3C2443_DMAREQSEL_UART1_0 S3C2443_DMAREQSEL_SRC(21) --#define S3C2443_DMAREQSEL_UART1_1 S3C2443_DMAREQSEL_SRC(22) --#define S3C2443_DMAREQSEL_UART2_0 S3C2443_DMAREQSEL_SRC(23) --#define S3C2443_DMAREQSEL_UART2_1 S3C2443_DMAREQSEL_SRC(24) --#define S3C2443_DMAREQSEL_UART3_0 S3C2443_DMAREQSEL_SRC(25) --#define S3C2443_DMAREQSEL_UART3_1 S3C2443_DMAREQSEL_SRC(26) --#define S3C2443_DMAREQSEL_PCMOUT S3C2443_DMAREQSEL_SRC(27) --#define S3C2443_DMAREQSEL_PCMIN S3C2443_DMAREQSEL_SRC(28) --#define S3C2443_DMAREQSEL_MICIN S3C2443_DMAREQSEL_SRC(29) -+static int s3c_dma_has_circular(void) -+{ -+ return 0; -+} - - #endif /* __ASM_ARCH_DMA_H */ ---- a/arch/arm/mach-s3c2442/Kconfig -+++ b/arch/arm/mach-s3c2442/Kconfig -@@ -11,6 +11,7 @@ config CPU_S3C2442 - select S3C2410_CLOCK - select S3C2410_GPIO - select S3C2410_PM if PM -+ select S3C2440_DMA if S3C2410_DMA - select CPU_S3C244X - select CPU_LLSERIAL_S3C2440 - help ---- /dev/null -+++ b/arch/arm/plat-s3c/dma.c -@@ -0,0 +1,86 @@ -+/* linux/arch/arm/plat-s3c/dma.c -+ * -+ * Copyright (c) 2003-2005,2006,2009 Simtec Electronics -+ * Ben Dooks <ben@simtec.co.uk> -+ * http://armlinux.simtec.co.uk/ -+ * -+ * S3C DMA core -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+*/ -+ -+struct s3c2410_dma_buf; -+ -+#include <linux/kernel.h> -+#include <linux/module.h> -+#include <linux/errno.h> -+ -+#include <mach/dma.h> -+#include <mach/irqs.h> -+ -+#include <plat/dma-plat.h> -+ -+/* dma channel state information */ -+struct s3c2410_dma_chan s3c2410_chans[S3C_DMA_CHANNELS]; -+struct s3c2410_dma_chan *s3c_dma_chan_map[DMACH_MAX]; -+ -+/* s3c_dma_lookup_channel -+ * -+ * change the dma channel number given into a real dma channel id -+*/ -+ -+struct s3c2410_dma_chan *s3c_dma_lookup_channel(unsigned int channel) -+{ -+ if (channel & DMACH_LOW_LEVEL) -+ return &s3c2410_chans[channel & ~DMACH_LOW_LEVEL]; -+ else -+ return s3c_dma_chan_map[channel]; -+} -+ -+/* do we need to protect the settings of the fields from -+ * irq? -+*/ -+ -+int s3c2410_dma_set_opfn(unsigned int channel, s3c2410_dma_opfn_t rtn) -+{ -+ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); -+ -+ if (chan == NULL) -+ return -EINVAL; -+ -+ pr_debug("%s: chan=%p, op rtn=%p\n", __func__, chan, rtn); -+ -+ chan->op_fn = rtn; -+ -+ return 0; -+} -+EXPORT_SYMBOL(s3c2410_dma_set_opfn); -+ -+int s3c2410_dma_set_buffdone_fn(unsigned int channel, s3c2410_dma_cbfn_t rtn) -+{ -+ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); -+ -+ if (chan == NULL) -+ return -EINVAL; -+ -+ pr_debug("%s: chan=%p, callback rtn=%p\n", __func__, chan, rtn); -+ -+ chan->callback_fn = rtn; -+ -+ return 0; -+} -+EXPORT_SYMBOL(s3c2410_dma_set_buffdone_fn); -+ -+int s3c2410_dma_setflags(unsigned int channel, unsigned int flags) -+{ -+ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); -+ -+ if (chan == NULL) -+ return -EINVAL; -+ -+ chan->flags = flags; -+ return 0; -+} -+EXPORT_SYMBOL(s3c2410_dma_setflags); ---- /dev/null -+++ b/arch/arm/plat-s3c/include/plat/dma-core.h -@@ -0,0 +1,22 @@ -+/* arch/arm/plat-s3c/include/plat/dma.h -+ * -+ * Copyright 2008 Openmoko, Inc. -+ * Copyright 2008 Simtec Electronics -+ * Ben Dooks <ben@simtec.co.uk> -+ * http://armlinux.simtec.co.uk/ -+ * -+ * Samsung S3C DMA core support -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+*/ -+ -+extern struct s3c2410_dma_chan *s3c_dma_lookup_channel(unsigned int channel); -+ -+extern struct s3c2410_dma_chan *s3c_dma_chan_map[]; -+ -+/* the currently allocated channel information */ -+extern struct s3c2410_dma_chan s3c2410_chans[]; -+ -+ ---- /dev/null -+++ b/arch/arm/plat-s3c/include/plat/dma.h -@@ -0,0 +1,128 @@ -+/* arch/arm/plat-s3c/include/plat/dma.h -+ * -+ * Copyright (C) 2003,2004,2006 Simtec Electronics -+ * Ben Dooks <ben@simtec.co.uk> -+ * -+ * Samsung S3C DMA support -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+*/ -+ -+enum s3c2410_dma_buffresult { -+ S3C2410_RES_OK, -+ S3C2410_RES_ERR, -+ S3C2410_RES_ABORT -+}; -+ -+enum s3c2410_dmasrc { -+ S3C2410_DMASRC_HW, /* source is memory */ -+ S3C2410_DMASRC_MEM /* source is hardware */ -+}; -+ -+/* enum s3c2410_chan_op -+ * -+ * operation codes passed to the DMA code by the user, and also used -+ * to inform the current channel owner of any changes to the system state -+*/ -+ -+enum s3c2410_chan_op { -+ S3C2410_DMAOP_START, -+ S3C2410_DMAOP_STOP, -+ S3C2410_DMAOP_PAUSE, -+ S3C2410_DMAOP_RESUME, -+ S3C2410_DMAOP_FLUSH, -+ S3C2410_DMAOP_TIMEOUT, /* internal signal to handler */ -+ S3C2410_DMAOP_STARTED, /* indicate channel started */ -+}; -+ -+struct s3c2410_dma_client { -+ char *name; -+}; -+ -+struct s3c2410_dma_chan; -+ -+/* s3c2410_dma_cbfn_t -+ * -+ * buffer callback routine type -+*/ -+ -+typedef void (*s3c2410_dma_cbfn_t)(struct s3c2410_dma_chan *, -+ void *buf, int size, -+ enum s3c2410_dma_buffresult result); -+ -+typedef int (*s3c2410_dma_opfn_t)(struct s3c2410_dma_chan *, -+ enum s3c2410_chan_op ); -+ -+ -+ -+/* s3c2410_dma_request -+ * -+ * request a dma channel exclusivley -+*/ -+ -+extern int s3c2410_dma_request(unsigned int channel, -+ struct s3c2410_dma_client *, void *dev); -+ -+ -+/* s3c2410_dma_ctrl -+ * -+ * change the state of the dma channel -+*/ -+ -+extern int s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op); -+ -+/* s3c2410_dma_setflags -+ * -+ * set the channel's flags to a given state -+*/ -+ -+extern int s3c2410_dma_setflags(unsigned int channel, -+ unsigned int flags); -+ -+/* s3c2410_dma_free -+ * -+ * free the dma channel (will also abort any outstanding operations) -+*/ -+ -+extern int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *); -+ -+/* s3c2410_dma_enqueue -+ * -+ * place the given buffer onto the queue of operations for the channel. -+ * The buffer must be allocated from dma coherent memory, or the Dcache/WB -+ * drained before the buffer is given to the DMA system. -+*/ -+ -+extern int s3c2410_dma_enqueue(unsigned int channel, void *id, -+ dma_addr_t data, int size); -+ -+ -+/* s3c2410_dma_config -+ * -+ * configure the dma channel -+*/ -+ -+extern int s3c2410_dma_config(unsigned int channel, int xferunit); -+ -+/* s3c2410_dma_devconfig -+ * -+ * configure the device we're talking to -+*/ -+ -+extern int s3c2410_dma_devconfig(int channel, enum s3c2410_dmasrc source, -+ unsigned long devaddr); -+ -+/* s3c2410_dma_getposition -+ * -+ * get the position that the dma transfer is currently at -+*/ -+ -+extern int s3c2410_dma_getposition(unsigned int channel, -+ dma_addr_t *src, dma_addr_t *dest); -+ -+extern int s3c2410_dma_set_opfn(unsigned int, s3c2410_dma_opfn_t rtn); -+extern int s3c2410_dma_set_buffdone_fn(unsigned int, s3c2410_dma_cbfn_t rtn); -+ -+ ---- a/arch/arm/plat-s3c/Kconfig -+++ b/arch/arm/plat-s3c/Kconfig -@@ -150,6 +150,13 @@ config S3C_GPIO_CFG_S3C64XX - Internal configuration to enable S3C64XX style GPIO configuration - functions. - -+# DMA -+ -+config S3C_DMA -+ bool -+ help -+ Internal configuration for S3C DMA core -+ - # device definitions to compile in - - config S3C_DEV_HSMMC ---- a/arch/arm/plat-s3c/Makefile -+++ b/arch/arm/plat-s3c/Makefile -@@ -18,6 +18,10 @@ obj-y += pwm-clock.o - obj-y += gpio.o - obj-y += gpio-config.o - -+# DMA support -+ -+obj-$(CONFIG_S3C_DMA) += dma.o -+ - # PM support - - obj-$(CONFIG_PM) += pm.o -@@ -31,3 +35,5 @@ obj-$(CONFIG_S3C_DEV_HSMMC1) += dev-hsmm - obj-y += dev-i2c0.o - obj-$(CONFIG_S3C_DEV_I2C1) += dev-i2c1.o - obj-$(CONFIG_S3C_DEV_FB) += dev-fb.o -+obj-$(CONFIG_S3C_DMA) += dma.o -+ ---- a/arch/arm/plat-s3c24xx/dma.c -+++ b/arch/arm/plat-s3c24xx/dma.c -@@ -31,10 +31,11 @@ - #include <asm/irq.h> - #include <mach/hardware.h> - #include <mach/dma.h> -- - #include <mach/map.h> - --#include <plat/dma.h> -+#include <plat/dma-core.h> -+#include <plat/regs-dma.h> -+#include <plat/dma-plat.h> - - /* io map for dma */ - static void __iomem *dma_base; -@@ -44,8 +45,6 @@ static int dma_channels; - - static struct s3c24xx_dma_selection dma_sel; - --/* dma channel state information */ --struct s3c2410_dma_chan s3c2410_chans[S3C2410_DMA_CHANNELS]; - - /* debugging functions */ - -@@ -135,21 +134,6 @@ dmadbg_showregs(const char *fname, int l - #define dbg_showchan(chan) do { } while(0) - #endif /* CONFIG_S3C2410_DMA_DEBUG */ - --static struct s3c2410_dma_chan *dma_chan_map[DMACH_MAX]; -- --/* lookup_dma_channel -- * -- * change the dma channel number given into a real dma channel id --*/ -- --static struct s3c2410_dma_chan *lookup_dma_channel(unsigned int channel) --{ -- if (channel & DMACH_LOW_LEVEL) -- return &s3c2410_chans[channel & ~DMACH_LOW_LEVEL]; -- else -- return dma_chan_map[channel]; --} -- - /* s3c2410_dma_stats_timeout - * - * Update DMA stats from timeout info -@@ -214,8 +198,6 @@ s3c2410_dma_waitforload(struct s3c2410_d - return 0; - } - -- -- - /* s3c2410_dma_loadbuffer - * - * load a buffer, and update the channel state -@@ -453,7 +435,7 @@ s3c2410_dma_canload(struct s3c2410_dma_c - int s3c2410_dma_enqueue(unsigned int channel, void *id, - dma_addr_t data, int size) - { -- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel); -+ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); - struct s3c2410_dma_buf *buf; - unsigned long flags; - -@@ -804,7 +786,7 @@ EXPORT_SYMBOL(s3c2410_dma_request); - - int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *client) - { -- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel); -+ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); - unsigned long flags; - - if (chan == NULL) -@@ -836,7 +818,7 @@ int s3c2410_dma_free(unsigned int channe - chan->irq_claimed = 0; - - if (!(channel & DMACH_LOW_LEVEL)) -- dma_chan_map[channel] = NULL; -+ s3c_dma_chan_map[channel] = NULL; - - local_irq_restore(flags); - -@@ -995,7 +977,7 @@ static int s3c2410_dma_started(struct s3 - int - s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op) - { -- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel); -+ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); - - if (chan == NULL) - return -EINVAL; -@@ -1038,14 +1020,13 @@ EXPORT_SYMBOL(s3c2410_dma_ctrl); - /* s3c2410_dma_config - * - * xfersize: size of unit in bytes (1,2,4) -- * dcon: base value of the DCONx register - */ - - int s3c2410_dma_config(unsigned int channel, -- int xferunit, -- int dcon) -+ int xferunit) - { -- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel); -+ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); -+ unsigned int dcon; - - pr_debug("%s: chan=%d, xfer_unit=%d, dcon=%08x\n", - __func__, channel, xferunit, dcon); -@@ -1055,10 +1036,33 @@ int s3c2410_dma_config(unsigned int chan - - pr_debug("%s: Initial dcon is %08x\n", __func__, dcon); - -- dcon |= chan->dcon & dma_sel.dcon_mask; -+ dcon = chan->dcon & dma_sel.dcon_mask; - - pr_debug("%s: New dcon is %08x\n", __func__, dcon); - -+ switch (chan->req_ch) { -+ case DMACH_I2S_IN: -+ case DMACH_I2S_OUT: -+ case DMACH_PCM_IN: -+ case DMACH_PCM_OUT: -+ case DMACH_MIC_IN: -+ default: -+ dcon |= S3C2410_DCON_HANDSHAKE; -+ dcon |= S3C2410_DCON_SYNC_PCLK; -+ break; -+ -+ case DMACH_SDI: -+ /* note, ensure if need HANDSHAKE or not */ -+ dcon |= S3C2410_DCON_SYNC_PCLK; -+ break; -+ -+ case DMACH_XD0: -+ case DMACH_XD1: -+ dcon |= S3C2410_DCON_HANDSHAKE; -+ dcon |= S3C2410_DCON_SYNC_HCLK; -+ break; -+ } -+ - switch (xferunit) { - case 1: - dcon |= S3C2410_DCON_BYTE; -@@ -1089,10 +1093,10 @@ int s3c2410_dma_config(unsigned int chan - } - - EXPORT_SYMBOL(s3c2410_dma_config); -- -+#if 0 /* moved to plat-s3c? */ - int s3c2410_dma_setflags(unsigned int channel, unsigned int flags) - { -- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel); -+ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); - - if (chan == NULL) - return -EINVAL; -@@ -1105,43 +1109,7 @@ int s3c2410_dma_setflags(unsigned int ch - } - - EXPORT_SYMBOL(s3c2410_dma_setflags); -- -- --/* do we need to protect the settings of the fields from -- * irq? --*/ -- --int s3c2410_dma_set_opfn(unsigned int channel, s3c2410_dma_opfn_t rtn) --{ -- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel); -- -- if (chan == NULL) -- return -EINVAL; -- -- pr_debug("%s: chan=%p, op rtn=%p\n", __func__, chan, rtn); -- -- chan->op_fn = rtn; -- -- return 0; --} -- --EXPORT_SYMBOL(s3c2410_dma_set_opfn); -- --int s3c2410_dma_set_buffdone_fn(unsigned int channel, s3c2410_dma_cbfn_t rtn) --{ -- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel); -- -- if (chan == NULL) -- return -EINVAL; -- -- pr_debug("%s: chan=%p, callback rtn=%p\n", __func__, chan, rtn); -- -- chan->callback_fn = rtn; -- -- return 0; --} -- --EXPORT_SYMBOL(s3c2410_dma_set_buffdone_fn); -+#endif - - /* s3c2410_dma_devconfig - * -@@ -1150,29 +1118,38 @@ EXPORT_SYMBOL(s3c2410_dma_set_buffdone_f - * source: S3C2410_DMASRC_HW: source is hardware - * S3C2410_DMASRC_MEM: source is memory - * -- * hwcfg: the value for xxxSTCn register, -- * bit 0: 0=increment pointer, 1=leave pointer -- * bit 1: 0=source is AHB, 1=source is APB -- * - * devaddr: physical address of the source - */ - - int s3c2410_dma_devconfig(int channel, - enum s3c2410_dmasrc source, -- int hwcfg, - unsigned long devaddr) - { -- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel); -+ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); -+ unsigned int hwcfg; - - if (chan == NULL) - return -EINVAL; - -- pr_debug("%s: source=%d, hwcfg=%08x, devaddr=%08lx\n", -- __func__, (int)source, hwcfg, devaddr); -+ pr_debug("%s: source=%d, devaddr=%08lx\n", -+ __func__, (int)source, devaddr); - - chan->source = source; - chan->dev_addr = devaddr; -- chan->hw_cfg = hwcfg; -+ -+ switch (chan->req_ch) { -+ case DMACH_XD0: -+ case DMACH_XD1: -+ hwcfg = 0; /* AHB */ -+ break; -+ -+ default: -+ hwcfg = S3C2410_DISRCC_APB; -+ } -+ -+ /* always assume our peripheral desintation is a fixed -+ * address in memory. */ -+ hwcfg |= S3C2410_DISRCC_INC; - - switch (source) { - case S3C2410_DMASRC_HW: -@@ -1219,7 +1196,7 @@ EXPORT_SYMBOL(s3c2410_dma_devconfig); - - int s3c2410_dma_getposition(unsigned int channel, dma_addr_t *src, dma_addr_t *dst) - { -- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel); -+ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); - - if (chan == NULL) - return -EINVAL; -@@ -1278,8 +1255,8 @@ static int s3c2410_dma_resume(struct sys - - printk(KERN_INFO "dma%d: restoring configuration\n", cp->number); - -- s3c2410_dma_config(no, cp->xfer_unit, cp->dcon); -- s3c2410_dma_devconfig(no, cp->source, cp->hw_cfg, cp->dev_addr); -+ s3c2410_dma_config(no, cp->xfer_unit); -+ s3c2410_dma_devconfig(no, cp->source, cp->dev_addr); - - /* re-select the dma source for this channel */ - -@@ -1476,7 +1453,8 @@ static struct s3c2410_dma_chan *s3c2410_ - found: - dmach = &s3c2410_chans[ch]; - dmach->map = ch_map; -- dma_chan_map[channel] = dmach; -+ dmach->req_ch = channel; -+ s3c_dma_chan_map[channel] = dmach; - - /* select the channel */ - ---- a/arch/arm/plat-s3c24xx/include/plat/dma.h -+++ /dev/null -@@ -1,82 +0,0 @@ --/* linux/include/asm-arm/plat-s3c24xx/dma.h -- * -- * Copyright (C) 2006 Simtec Electronics -- * Ben Dooks <ben@simtec.co.uk> -- * -- * Samsung S3C24XX DMA support -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License version 2 as -- * published by the Free Software Foundation. --*/ -- --extern struct sysdev_class dma_sysclass; --extern struct s3c2410_dma_chan s3c2410_chans[S3C2410_DMA_CHANNELS]; -- --#define DMA_CH_VALID (1<<31) --#define DMA_CH_NEVER (1<<30) -- --struct s3c24xx_dma_addr { -- unsigned long from; -- unsigned long to; --}; -- --/* struct s3c24xx_dma_map -- * -- * this holds the mapping information for the channel selected -- * to be connected to the specified device --*/ -- --struct s3c24xx_dma_map { -- const char *name; -- struct s3c24xx_dma_addr hw_addr; -- -- unsigned long channels[S3C2410_DMA_CHANNELS]; -- unsigned long channels_rx[S3C2410_DMA_CHANNELS]; --}; -- --struct s3c24xx_dma_selection { -- struct s3c24xx_dma_map *map; -- unsigned long map_size; -- unsigned long dcon_mask; -- -- void (*select)(struct s3c2410_dma_chan *chan, -- struct s3c24xx_dma_map *map); -- -- void (*direction)(struct s3c2410_dma_chan *chan, -- struct s3c24xx_dma_map *map, -- enum s3c2410_dmasrc dir); --}; -- --extern int s3c24xx_dma_init_map(struct s3c24xx_dma_selection *sel); -- --/* struct s3c24xx_dma_order_ch -- * -- * channel map for one of the `enum dma_ch` dma channels. the list -- * entry contains a set of low-level channel numbers, orred with -- * DMA_CH_VALID, which are checked in the order in the array. --*/ -- --struct s3c24xx_dma_order_ch { -- unsigned int list[S3C2410_DMA_CHANNELS]; /* list of channels */ -- unsigned int flags; /* flags */ --}; -- --/* struct s3c24xx_dma_order -- * -- * information provided by either the core or the board to give the -- * dma system a hint on how to allocate channels --*/ -- --struct s3c24xx_dma_order { -- struct s3c24xx_dma_order_ch channels[DMACH_MAX]; --}; -- --extern int s3c24xx_dma_order_set(struct s3c24xx_dma_order *map); -- --/* DMA init code, called from the cpu support code */ -- --extern int s3c2410_dma_init(void); -- --extern int s3c24xx_dma_init(unsigned int channels, unsigned int irq, -- unsigned int stride); ---- /dev/null -+++ b/arch/arm/plat-s3c24xx/include/plat/dma-plat.h -@@ -0,0 +1,84 @@ -+/* linux/arch/arm/plat-s3c24xx/include/plat/dma-plat.h -+ * -+ * Copyright (C) 2006 Simtec Electronics -+ * Ben Dooks <ben@simtec.co.uk> -+ * -+ * Samsung S3C24XX DMA support -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+*/ -+ -+#include <plat/dma-core.h> -+ -+extern struct sysdev_class dma_sysclass; -+extern struct s3c2410_dma_chan s3c2410_chans[S3C_DMA_CHANNELS]; -+ -+#define DMA_CH_VALID (1<<31) -+#define DMA_CH_NEVER (1<<30) -+ -+struct s3c24xx_dma_addr { -+ unsigned long from; -+ unsigned long to; -+}; -+ -+/* struct s3c24xx_dma_map -+ * -+ * this holds the mapping information for the channel selected -+ * to be connected to the specified device -+*/ -+ -+struct s3c24xx_dma_map { -+ const char *name; -+ struct s3c24xx_dma_addr hw_addr; -+ -+ unsigned long channels[S3C_DMA_CHANNELS]; -+ unsigned long channels_rx[S3C_DMA_CHANNELS]; -+}; -+ -+struct s3c24xx_dma_selection { -+ struct s3c24xx_dma_map *map; -+ unsigned long map_size; -+ unsigned long dcon_mask; -+ -+ void (*select)(struct s3c2410_dma_chan *chan, -+ struct s3c24xx_dma_map *map); -+ -+ void (*direction)(struct s3c2410_dma_chan *chan, -+ struct s3c24xx_dma_map *map, -+ enum s3c2410_dmasrc dir); -+}; -+ -+extern int s3c24xx_dma_init_map(struct s3c24xx_dma_selection *sel); -+ -+/* struct s3c24xx_dma_order_ch -+ * -+ * channel map for one of the `enum dma_ch` dma channels. the list -+ * entry contains a set of low-level channel numbers, orred with -+ * DMA_CH_VALID, which are checked in the order in the array. -+*/ -+ -+struct s3c24xx_dma_order_ch { -+ unsigned int list[S3C_DMA_CHANNELS]; /* list of channels */ -+ unsigned int flags; /* flags */ -+}; -+ -+/* struct s3c24xx_dma_order -+ * -+ * information provided by either the core or the board to give the -+ * dma system a hint on how to allocate channels -+*/ -+ -+struct s3c24xx_dma_order { -+ struct s3c24xx_dma_order_ch channels[DMACH_MAX]; -+}; -+ -+extern int s3c24xx_dma_order_set(struct s3c24xx_dma_order *map); -+ -+/* DMA init code, called from the cpu support code */ -+ -+extern int s3c2410_dma_init(void); -+ -+extern int s3c24xx_dma_init(unsigned int channels, unsigned int irq, -+ unsigned int stride); ---- /dev/null -+++ b/arch/arm/plat-s3c24xx/include/plat/regs-dma.h -@@ -0,0 +1,145 @@ -+/* arch/arm/mach-s3c2410/include/mach/dma.h -+ * -+ * Copyright (C) 2003,2004,2006 Simtec Electronics -+ * Ben Dooks <ben@simtec.co.uk> -+ * -+ * Samsung S3C24XX DMA support -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+*/ -+ -+/* DMA Register definitions */ -+ -+#define S3C2410_DMA_DISRC (0x00) -+#define S3C2410_DMA_DISRCC (0x04) -+#define S3C2410_DMA_DIDST (0x08) -+#define S3C2410_DMA_DIDSTC (0x0C) -+#define S3C2410_DMA_DCON (0x10) -+#define S3C2410_DMA_DSTAT (0x14) -+#define S3C2410_DMA_DCSRC (0x18) -+#define S3C2410_DMA_DCDST (0x1C) -+#define S3C2410_DMA_DMASKTRIG (0x20) -+#define S3C2412_DMA_DMAREQSEL (0x24) -+#define S3C2443_DMA_DMAREQSEL (0x24) -+ -+#define S3C2410_DISRCC_INC (1<<0) -+#define S3C2410_DISRCC_APB (1<<1) -+ -+#define S3C2410_DMASKTRIG_STOP (1<<2) -+#define S3C2410_DMASKTRIG_ON (1<<1) -+#define S3C2410_DMASKTRIG_SWTRIG (1<<0) -+ -+#define S3C2410_DCON_DEMAND (0<<31) -+#define S3C2410_DCON_HANDSHAKE (1<<31) -+#define S3C2410_DCON_SYNC_PCLK (0<<30) -+#define S3C2410_DCON_SYNC_HCLK (1<<30) -+ -+#define S3C2410_DCON_INTREQ (1<<29) -+ -+#define S3C2410_DCON_CH0_XDREQ0 (0<<24) -+#define S3C2410_DCON_CH0_UART0 (1<<24) -+#define S3C2410_DCON_CH0_SDI (2<<24) -+#define S3C2410_DCON_CH0_TIMER (3<<24) -+#define S3C2410_DCON_CH0_USBEP1 (4<<24) -+ -+#define S3C2410_DCON_CH1_XDREQ1 (0<<24) -+#define S3C2410_DCON_CH1_UART1 (1<<24) -+#define S3C2410_DCON_CH1_I2SSDI (2<<24) -+#define S3C2410_DCON_CH1_SPI (3<<24) -+#define S3C2410_DCON_CH1_USBEP2 (4<<24) -+ -+#define S3C2410_DCON_CH2_I2SSDO (0<<24) -+#define S3C2410_DCON_CH2_I2SSDI (1<<24) -+#define S3C2410_DCON_CH2_SDI (2<<24) -+#define S3C2410_DCON_CH2_TIMER (3<<24) -+#define S3C2410_DCON_CH2_USBEP3 (4<<24) -+ -+#define S3C2410_DCON_CH3_UART2 (0<<24) -+#define S3C2410_DCON_CH3_SDI (1<<24) -+#define S3C2410_DCON_CH3_SPI (2<<24) -+#define S3C2410_DCON_CH3_TIMER (3<<24) -+#define S3C2410_DCON_CH3_USBEP4 (4<<24) -+ -+#define S3C2410_DCON_SRCSHIFT (24) -+#define S3C2410_DCON_SRCMASK (7<<24) -+ -+#define S3C2410_DCON_BYTE (0<<20) -+#define S3C2410_DCON_HALFWORD (1<<20) -+#define S3C2410_DCON_WORD (2<<20) -+ -+#define S3C2410_DCON_AUTORELOAD (0<<22) -+#define S3C2410_DCON_NORELOAD (1<<22) -+#define S3C2410_DCON_HWTRIG (1<<23) -+ -+#if defined(CONFIG_CPU_S3C2440) || defined(CONFIG_CPU_S3C2442) -+#define S3C2440_DIDSTC_CHKINT (1<<2) -+ -+#define S3C2440_DCON_CH0_I2SSDO (5<<24) -+#define S3C2440_DCON_CH0_PCMIN (6<<24) -+ -+#define S3C2440_DCON_CH1_PCMOUT (5<<24) -+#define S3C2440_DCON_CH1_SDI (6<<24) -+ -+#define S3C2440_DCON_CH2_PCMIN (5<<24) -+#define S3C2440_DCON_CH2_MICIN (6<<24) -+ -+#define S3C2440_DCON_CH3_MICIN (5<<24) -+#define S3C2440_DCON_CH3_PCMOUT (6<<24) -+#endif -+ -+#ifdef CONFIG_CPU_S3C2412 -+ -+#define S3C2412_DMAREQSEL_SRC(x) ((x)<<1) -+ -+#define S3C2412_DMAREQSEL_HW (1) -+ -+#define S3C2412_DMAREQSEL_SPI0TX S3C2412_DMAREQSEL_SRC(0) -+#define S3C2412_DMAREQSEL_SPI0RX S3C2412_DMAREQSEL_SRC(1) -+#define S3C2412_DMAREQSEL_SPI1TX S3C2412_DMAREQSEL_SRC(2) -+#define S3C2412_DMAREQSEL_SPI1RX S3C2412_DMAREQSEL_SRC(3) -+#define S3C2412_DMAREQSEL_I2STX S3C2412_DMAREQSEL_SRC(4) -+#define S3C2412_DMAREQSEL_I2SRX S3C2412_DMAREQSEL_SRC(5) -+#define S3C2412_DMAREQSEL_TIMER S3C2412_DMAREQSEL_SRC(9) -+#define S3C2412_DMAREQSEL_SDI S3C2412_DMAREQSEL_SRC(10) -+#define S3C2412_DMAREQSEL_USBEP1 S3C2412_DMAREQSEL_SRC(13) -+#define S3C2412_DMAREQSEL_USBEP2 S3C2412_DMAREQSEL_SRC(14) -+#define S3C2412_DMAREQSEL_USBEP3 S3C2412_DMAREQSEL_SRC(15) -+#define S3C2412_DMAREQSEL_USBEP4 S3C2412_DMAREQSEL_SRC(16) -+#define S3C2412_DMAREQSEL_XDREQ0 S3C2412_DMAREQSEL_SRC(17) -+#define S3C2412_DMAREQSEL_XDREQ1 S3C2412_DMAREQSEL_SRC(18) -+#define S3C2412_DMAREQSEL_UART0_0 S3C2412_DMAREQSEL_SRC(19) -+#define S3C2412_DMAREQSEL_UART0_1 S3C2412_DMAREQSEL_SRC(20) -+#define S3C2412_DMAREQSEL_UART1_0 S3C2412_DMAREQSEL_SRC(21) -+#define S3C2412_DMAREQSEL_UART1_1 S3C2412_DMAREQSEL_SRC(22) -+#define S3C2412_DMAREQSEL_UART2_0 S3C2412_DMAREQSEL_SRC(23) -+#define S3C2412_DMAREQSEL_UART2_1 S3C2412_DMAREQSEL_SRC(24) -+ -+#endif -+ -+#define S3C2443_DMAREQSEL_SRC(x) ((x)<<1) -+ -+#define S3C2443_DMAREQSEL_HW (1) -+ -+#define S3C2443_DMAREQSEL_SPI0TX S3C2443_DMAREQSEL_SRC(0) -+#define S3C2443_DMAREQSEL_SPI0RX S3C2443_DMAREQSEL_SRC(1) -+#define S3C2443_DMAREQSEL_SPI1TX S3C2443_DMAREQSEL_SRC(2) -+#define S3C2443_DMAREQSEL_SPI1RX S3C2443_DMAREQSEL_SRC(3) -+#define S3C2443_DMAREQSEL_I2STX S3C2443_DMAREQSEL_SRC(4) -+#define S3C2443_DMAREQSEL_I2SRX S3C2443_DMAREQSEL_SRC(5) -+#define S3C2443_DMAREQSEL_TIMER S3C2443_DMAREQSEL_SRC(9) -+#define S3C2443_DMAREQSEL_SDI S3C2443_DMAREQSEL_SRC(10) -+#define S3C2443_DMAREQSEL_XDREQ0 S3C2443_DMAREQSEL_SRC(17) -+#define S3C2443_DMAREQSEL_XDREQ1 S3C2443_DMAREQSEL_SRC(18) -+#define S3C2443_DMAREQSEL_UART0_0 S3C2443_DMAREQSEL_SRC(19) -+#define S3C2443_DMAREQSEL_UART0_1 S3C2443_DMAREQSEL_SRC(20) -+#define S3C2443_DMAREQSEL_UART1_0 S3C2443_DMAREQSEL_SRC(21) -+#define S3C2443_DMAREQSEL_UART1_1 S3C2443_DMAREQSEL_SRC(22) -+#define S3C2443_DMAREQSEL_UART2_0 S3C2443_DMAREQSEL_SRC(23) -+#define S3C2443_DMAREQSEL_UART2_1 S3C2443_DMAREQSEL_SRC(24) -+#define S3C2443_DMAREQSEL_UART3_0 S3C2443_DMAREQSEL_SRC(25) -+#define S3C2443_DMAREQSEL_UART3_1 S3C2443_DMAREQSEL_SRC(26) -+#define S3C2443_DMAREQSEL_PCMOUT S3C2443_DMAREQSEL_SRC(27) -+#define S3C2443_DMAREQSEL_PCMIN S3C2443_DMAREQSEL_SRC(28) -+#define S3C2443_DMAREQSEL_MICIN S3C2443_DMAREQSEL_SRC(29) ---- a/arch/arm/plat-s3c24xx/Kconfig -+++ b/arch/arm/plat-s3c24xx/Kconfig -@@ -71,6 +71,7 @@ config PM_SIMTEC - config S3C2410_DMA - bool "S3C2410 DMA support" - depends on ARCH_S3C2410 -+ select S3C_DMA - help - S3C2410 DMA support. This is needed for drivers like sound which - use the S3C2410's DMA system to move data to and from the ---- a/arch/arm/mach-s3c2410/dma.c -+++ b/arch/arm/mach-s3c2410/dma.c -@@ -17,14 +17,16 @@ - #include <linux/sysdev.h> - #include <linux/serial_core.h> - -+#include <mach/map.h> - #include <mach/dma.h> - - #include <plat/cpu.h> --#include <plat/dma.h> -+#include <plat/dma-plat.h> - - #include <plat/regs-serial.h> - #include <mach/regs-gpio.h> - #include <plat/regs-ac97.h> -+#include <plat/regs-dma.h> - #include <mach/regs-mem.h> - #include <mach/regs-lcd.h> - #include <mach/regs-sdi.h> ---- a/arch/arm/mach-s3c2440/dma.c -+++ b/arch/arm/mach-s3c2440/dma.c -@@ -17,14 +17,16 @@ - #include <linux/sysdev.h> - #include <linux/serial_core.h> - -+#include <mach/map.h> - #include <mach/dma.h> - --#include <plat/dma.h> -+#include <plat/dma-plat.h> - #include <plat/cpu.h> - - #include <plat/regs-serial.h> - #include <mach/regs-gpio.h> - #include <plat/regs-ac97.h> -+#include <plat/regs-dma.h> - #include <mach/regs-mem.h> - #include <mach/regs-lcd.h> - #include <mach/regs-sdi.h> ---- a/sound/soc/s3c24xx/s3c24xx-pcm.c -+++ b/sound/soc/s3c24xx/s3c24xx-pcm.c -@@ -218,24 +218,17 @@ static int s3c24xx_pcm_prepare(struct sn - * sync to pclk, half-word transfers to the IIS-FIFO. */ - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - s3c2410_dma_devconfig(prtd->params->channel, -- S3C2410_DMASRC_MEM, S3C2410_DISRCC_INC | -- S3C2410_DISRCC_APB, prtd->params->dma_addr); -- -- s3c2410_dma_config(prtd->params->channel, -- prtd->params->dma_size, -- S3C2410_DCON_SYNC_PCLK | -- S3C2410_DCON_HANDSHAKE); -+ S3C2410_DMASRC_MEM, -+ prtd->params->dma_addr); - } else { -- s3c2410_dma_config(prtd->params->channel, -- prtd->params->dma_size, -- S3C2410_DCON_HANDSHAKE | -- S3C2410_DCON_SYNC_PCLK); -- - s3c2410_dma_devconfig(prtd->params->channel, -- S3C2410_DMASRC_HW, 0x3, -- prtd->params->dma_addr); -+ S3C2410_DMASRC_HW, -+ prtd->params->dma_addr); - } - -+ s3c2410_dma_config(prtd->params->channel, -+ prtd->params->dma_size); -+ - /* flush the DMA channel */ - s3c2410_dma_ctrl(prtd->params->channel, S3C2410_DMAOP_FLUSH); - prtd->dma_loaded = 0; |