1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun //
3*4882a593Smuzhiyun // Copyright (c) 2004-2005 Simtec Electronics
4*4882a593Smuzhiyun // http://www.simtec.co.uk/products/SWLINUX/
5*4882a593Smuzhiyun // Ben Dooks <ben@simtec.co.uk>
6*4882a593Smuzhiyun //
7*4882a593Smuzhiyun // Common code for S3C24XX machines
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <linux/dma-mapping.h>
10*4882a593Smuzhiyun #include <linux/init.h>
11*4882a593Smuzhiyun #include <linux/module.h>
12*4882a593Smuzhiyun #include <linux/interrupt.h>
13*4882a593Smuzhiyun #include <linux/ioport.h>
14*4882a593Smuzhiyun #include <linux/serial_core.h>
15*4882a593Smuzhiyun #include <linux/serial_s3c.h>
16*4882a593Smuzhiyun #include <clocksource/samsung_pwm.h>
17*4882a593Smuzhiyun #include <linux/platform_device.h>
18*4882a593Smuzhiyun #include <linux/delay.h>
19*4882a593Smuzhiyun #include <linux/io.h>
20*4882a593Smuzhiyun #include <linux/platform_data/clk-s3c2410.h>
21*4882a593Smuzhiyun #include <linux/platform_data/dma-s3c24xx.h>
22*4882a593Smuzhiyun #include <linux/dmaengine.h>
23*4882a593Smuzhiyun #include <linux/clk/samsung.h>
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun #include "hardware-s3c24xx.h"
26*4882a593Smuzhiyun #include "map.h"
27*4882a593Smuzhiyun #include "regs-clock.h"
28*4882a593Smuzhiyun #include <asm/irq.h>
29*4882a593Smuzhiyun #include <asm/cacheflush.h>
30*4882a593Smuzhiyun #include <asm/system_info.h>
31*4882a593Smuzhiyun #include <asm/system_misc.h>
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun #include <asm/mach/arch.h>
34*4882a593Smuzhiyun #include <asm/mach/map.h>
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun #include "regs-gpio.h"
37*4882a593Smuzhiyun #include "dma-s3c24xx.h"
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun #include "cpu.h"
40*4882a593Smuzhiyun #include "devs.h"
41*4882a593Smuzhiyun #include "pwm-core.h"
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun #include "s3c24xx.h"
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun /* table of supported CPUs */
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun static const char name_s3c2410[] = "S3C2410";
48*4882a593Smuzhiyun static const char name_s3c2412[] = "S3C2412";
49*4882a593Smuzhiyun static const char name_s3c2416[] = "S3C2416/S3C2450";
50*4882a593Smuzhiyun static const char name_s3c2440[] = "S3C2440";
51*4882a593Smuzhiyun static const char name_s3c2442[] = "S3C2442";
52*4882a593Smuzhiyun static const char name_s3c2442b[] = "S3C2442B";
53*4882a593Smuzhiyun static const char name_s3c2443[] = "S3C2443";
54*4882a593Smuzhiyun static const char name_s3c2410a[] = "S3C2410A";
55*4882a593Smuzhiyun static const char name_s3c2440a[] = "S3C2440A";
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun static struct cpu_table cpu_ids[] __initdata = {
58*4882a593Smuzhiyun {
59*4882a593Smuzhiyun .idcode = 0x32410000,
60*4882a593Smuzhiyun .idmask = 0xffffffff,
61*4882a593Smuzhiyun .map_io = s3c2410_map_io,
62*4882a593Smuzhiyun .init_uarts = s3c2410_init_uarts,
63*4882a593Smuzhiyun .init = s3c2410_init,
64*4882a593Smuzhiyun .name = name_s3c2410
65*4882a593Smuzhiyun },
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun .idcode = 0x32410002,
68*4882a593Smuzhiyun .idmask = 0xffffffff,
69*4882a593Smuzhiyun .map_io = s3c2410_map_io,
70*4882a593Smuzhiyun .init_uarts = s3c2410_init_uarts,
71*4882a593Smuzhiyun .init = s3c2410a_init,
72*4882a593Smuzhiyun .name = name_s3c2410a
73*4882a593Smuzhiyun },
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun .idcode = 0x32440000,
76*4882a593Smuzhiyun .idmask = 0xffffffff,
77*4882a593Smuzhiyun .map_io = s3c2440_map_io,
78*4882a593Smuzhiyun .init_uarts = s3c244x_init_uarts,
79*4882a593Smuzhiyun .init = s3c2440_init,
80*4882a593Smuzhiyun .name = name_s3c2440
81*4882a593Smuzhiyun },
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun .idcode = 0x32440001,
84*4882a593Smuzhiyun .idmask = 0xffffffff,
85*4882a593Smuzhiyun .map_io = s3c2440_map_io,
86*4882a593Smuzhiyun .init_uarts = s3c244x_init_uarts,
87*4882a593Smuzhiyun .init = s3c2440_init,
88*4882a593Smuzhiyun .name = name_s3c2440a
89*4882a593Smuzhiyun },
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun .idcode = 0x32440aaa,
92*4882a593Smuzhiyun .idmask = 0xffffffff,
93*4882a593Smuzhiyun .map_io = s3c2442_map_io,
94*4882a593Smuzhiyun .init_uarts = s3c244x_init_uarts,
95*4882a593Smuzhiyun .init = s3c2442_init,
96*4882a593Smuzhiyun .name = name_s3c2442
97*4882a593Smuzhiyun },
98*4882a593Smuzhiyun {
99*4882a593Smuzhiyun .idcode = 0x32440aab,
100*4882a593Smuzhiyun .idmask = 0xffffffff,
101*4882a593Smuzhiyun .map_io = s3c2442_map_io,
102*4882a593Smuzhiyun .init_uarts = s3c244x_init_uarts,
103*4882a593Smuzhiyun .init = s3c2442_init,
104*4882a593Smuzhiyun .name = name_s3c2442b
105*4882a593Smuzhiyun },
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun .idcode = 0x32412001,
108*4882a593Smuzhiyun .idmask = 0xffffffff,
109*4882a593Smuzhiyun .map_io = s3c2412_map_io,
110*4882a593Smuzhiyun .init_uarts = s3c2412_init_uarts,
111*4882a593Smuzhiyun .init = s3c2412_init,
112*4882a593Smuzhiyun .name = name_s3c2412,
113*4882a593Smuzhiyun },
114*4882a593Smuzhiyun { /* a newer version of the s3c2412 */
115*4882a593Smuzhiyun .idcode = 0x32412003,
116*4882a593Smuzhiyun .idmask = 0xffffffff,
117*4882a593Smuzhiyun .map_io = s3c2412_map_io,
118*4882a593Smuzhiyun .init_uarts = s3c2412_init_uarts,
119*4882a593Smuzhiyun .init = s3c2412_init,
120*4882a593Smuzhiyun .name = name_s3c2412,
121*4882a593Smuzhiyun },
122*4882a593Smuzhiyun { /* a strange version of the s3c2416 */
123*4882a593Smuzhiyun .idcode = 0x32450003,
124*4882a593Smuzhiyun .idmask = 0xffffffff,
125*4882a593Smuzhiyun .map_io = s3c2416_map_io,
126*4882a593Smuzhiyun .init_uarts = s3c2416_init_uarts,
127*4882a593Smuzhiyun .init = s3c2416_init,
128*4882a593Smuzhiyun .name = name_s3c2416,
129*4882a593Smuzhiyun },
130*4882a593Smuzhiyun {
131*4882a593Smuzhiyun .idcode = 0x32443001,
132*4882a593Smuzhiyun .idmask = 0xffffffff,
133*4882a593Smuzhiyun .map_io = s3c2443_map_io,
134*4882a593Smuzhiyun .init_uarts = s3c2443_init_uarts,
135*4882a593Smuzhiyun .init = s3c2443_init,
136*4882a593Smuzhiyun .name = name_s3c2443,
137*4882a593Smuzhiyun },
138*4882a593Smuzhiyun };
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun /* minimal IO mapping */
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun static struct map_desc s3c_iodesc[] __initdata __maybe_unused = {
143*4882a593Smuzhiyun IODESC_ENT(GPIO),
144*4882a593Smuzhiyun IODESC_ENT(IRQ),
145*4882a593Smuzhiyun IODESC_ENT(MEMCTRL),
146*4882a593Smuzhiyun IODESC_ENT(UART)
147*4882a593Smuzhiyun };
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun /* read cpu identificaiton code */
150*4882a593Smuzhiyun
s3c24xx_read_idcode_v5(void)151*4882a593Smuzhiyun static unsigned long s3c24xx_read_idcode_v5(void)
152*4882a593Smuzhiyun {
153*4882a593Smuzhiyun #if defined(CONFIG_CPU_S3C2416)
154*4882a593Smuzhiyun /* s3c2416 is v5, with S3C24XX_GSTATUS1 instead of S3C2412_GSTATUS1 */
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun u32 gs = __raw_readl(S3C24XX_GSTATUS1);
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun /* test for s3c2416 or similar device */
159*4882a593Smuzhiyun if ((gs >> 16) == 0x3245)
160*4882a593Smuzhiyun return gs;
161*4882a593Smuzhiyun #endif
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun #if defined(CONFIG_CPU_S3C2412)
164*4882a593Smuzhiyun return __raw_readl(S3C2412_GSTATUS1);
165*4882a593Smuzhiyun #else
166*4882a593Smuzhiyun return 1UL; /* don't look like an 2400 */
167*4882a593Smuzhiyun #endif
168*4882a593Smuzhiyun }
169*4882a593Smuzhiyun
s3c24xx_read_idcode_v4(void)170*4882a593Smuzhiyun static unsigned long s3c24xx_read_idcode_v4(void)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun return __raw_readl(S3C2410_GSTATUS1);
173*4882a593Smuzhiyun }
174*4882a593Smuzhiyun
s3c24xx_default_idle(void)175*4882a593Smuzhiyun static void s3c24xx_default_idle(void)
176*4882a593Smuzhiyun {
177*4882a593Smuzhiyun unsigned long tmp = 0;
178*4882a593Smuzhiyun int i;
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun /* idle the system by using the idle mode which will wait for an
181*4882a593Smuzhiyun * interrupt to happen before restarting the system.
182*4882a593Smuzhiyun */
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun /* Warning: going into idle state upsets jtag scanning */
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun __raw_writel(__raw_readl(S3C2410_CLKCON) | S3C2410_CLKCON_IDLE,
187*4882a593Smuzhiyun S3C2410_CLKCON);
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun /* the samsung port seems to do a loop and then unset idle.. */
190*4882a593Smuzhiyun for (i = 0; i < 50; i++)
191*4882a593Smuzhiyun tmp += __raw_readl(S3C2410_CLKCON); /* ensure loop not optimised out */
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun /* this bit is not cleared on re-start... */
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun __raw_writel(__raw_readl(S3C2410_CLKCON) & ~S3C2410_CLKCON_IDLE,
196*4882a593Smuzhiyun S3C2410_CLKCON);
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun static struct samsung_pwm_variant s3c24xx_pwm_variant = {
200*4882a593Smuzhiyun .bits = 16,
201*4882a593Smuzhiyun .div_base = 1,
202*4882a593Smuzhiyun .has_tint_cstat = false,
203*4882a593Smuzhiyun .tclk_mask = (1 << 4),
204*4882a593Smuzhiyun };
205*4882a593Smuzhiyun
s3c24xx_init_io(struct map_desc * mach_desc,int size)206*4882a593Smuzhiyun void __init s3c24xx_init_io(struct map_desc *mach_desc, int size)
207*4882a593Smuzhiyun {
208*4882a593Smuzhiyun arm_pm_idle = s3c24xx_default_idle;
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun /* initialise the io descriptors we need for initialisation */
211*4882a593Smuzhiyun iotable_init(mach_desc, size);
212*4882a593Smuzhiyun iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc));
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun if (cpu_architecture() >= CPU_ARCH_ARMv5) {
215*4882a593Smuzhiyun samsung_cpu_id = s3c24xx_read_idcode_v5();
216*4882a593Smuzhiyun } else {
217*4882a593Smuzhiyun samsung_cpu_id = s3c24xx_read_idcode_v4();
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun samsung_pwm_set_platdata(&s3c24xx_pwm_variant);
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun
s3c24xx_set_timer_source(unsigned int event,unsigned int source)225*4882a593Smuzhiyun void __init s3c24xx_set_timer_source(unsigned int event, unsigned int source)
226*4882a593Smuzhiyun {
227*4882a593Smuzhiyun s3c24xx_pwm_variant.output_mask = BIT(SAMSUNG_PWM_NUM) - 1;
228*4882a593Smuzhiyun s3c24xx_pwm_variant.output_mask &= ~(BIT(event) | BIT(source));
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun
s3c24xx_timer_init(void)231*4882a593Smuzhiyun void __init s3c24xx_timer_init(void)
232*4882a593Smuzhiyun {
233*4882a593Smuzhiyun unsigned int timer_irqs[SAMSUNG_PWM_NUM] = {
234*4882a593Smuzhiyun IRQ_TIMER0, IRQ_TIMER1, IRQ_TIMER2, IRQ_TIMER3, IRQ_TIMER4,
235*4882a593Smuzhiyun };
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun samsung_pwm_clocksource_init(S3C_VA_TIMER,
238*4882a593Smuzhiyun timer_irqs, &s3c24xx_pwm_variant);
239*4882a593Smuzhiyun }
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun /* Serial port registrations */
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun #define S3C2410_PA_UART0 (S3C24XX_PA_UART)
244*4882a593Smuzhiyun #define S3C2410_PA_UART1 (S3C24XX_PA_UART + 0x4000 )
245*4882a593Smuzhiyun #define S3C2410_PA_UART2 (S3C24XX_PA_UART + 0x8000 )
246*4882a593Smuzhiyun #define S3C2443_PA_UART3 (S3C24XX_PA_UART + 0xC000 )
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun static struct resource s3c2410_uart0_resource[] = {
249*4882a593Smuzhiyun [0] = DEFINE_RES_MEM(S3C2410_PA_UART0, SZ_16K),
250*4882a593Smuzhiyun [1] = DEFINE_RES_NAMED(IRQ_S3CUART_RX0, \
251*4882a593Smuzhiyun IRQ_S3CUART_ERR0 - IRQ_S3CUART_RX0 + 1, \
252*4882a593Smuzhiyun NULL, IORESOURCE_IRQ)
253*4882a593Smuzhiyun };
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun static struct resource s3c2410_uart1_resource[] = {
256*4882a593Smuzhiyun [0] = DEFINE_RES_MEM(S3C2410_PA_UART1, SZ_16K),
257*4882a593Smuzhiyun [1] = DEFINE_RES_NAMED(IRQ_S3CUART_RX1, \
258*4882a593Smuzhiyun IRQ_S3CUART_ERR1 - IRQ_S3CUART_RX1 + 1, \
259*4882a593Smuzhiyun NULL, IORESOURCE_IRQ)
260*4882a593Smuzhiyun };
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun static struct resource s3c2410_uart2_resource[] = {
263*4882a593Smuzhiyun [0] = DEFINE_RES_MEM(S3C2410_PA_UART2, SZ_16K),
264*4882a593Smuzhiyun [1] = DEFINE_RES_NAMED(IRQ_S3CUART_RX2, \
265*4882a593Smuzhiyun IRQ_S3CUART_ERR2 - IRQ_S3CUART_RX2 + 1, \
266*4882a593Smuzhiyun NULL, IORESOURCE_IRQ)
267*4882a593Smuzhiyun };
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun static struct resource s3c2410_uart3_resource[] = {
270*4882a593Smuzhiyun [0] = DEFINE_RES_MEM(S3C2443_PA_UART3, SZ_16K),
271*4882a593Smuzhiyun [1] = DEFINE_RES_NAMED(IRQ_S3CUART_RX3, \
272*4882a593Smuzhiyun IRQ_S3CUART_ERR3 - IRQ_S3CUART_RX3 + 1, \
273*4882a593Smuzhiyun NULL, IORESOURCE_IRQ)
274*4882a593Smuzhiyun };
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun struct s3c24xx_uart_resources s3c2410_uart_resources[] __initdata = {
277*4882a593Smuzhiyun [0] = {
278*4882a593Smuzhiyun .resources = s3c2410_uart0_resource,
279*4882a593Smuzhiyun .nr_resources = ARRAY_SIZE(s3c2410_uart0_resource),
280*4882a593Smuzhiyun },
281*4882a593Smuzhiyun [1] = {
282*4882a593Smuzhiyun .resources = s3c2410_uart1_resource,
283*4882a593Smuzhiyun .nr_resources = ARRAY_SIZE(s3c2410_uart1_resource),
284*4882a593Smuzhiyun },
285*4882a593Smuzhiyun [2] = {
286*4882a593Smuzhiyun .resources = s3c2410_uart2_resource,
287*4882a593Smuzhiyun .nr_resources = ARRAY_SIZE(s3c2410_uart2_resource),
288*4882a593Smuzhiyun },
289*4882a593Smuzhiyun [3] = {
290*4882a593Smuzhiyun .resources = s3c2410_uart3_resource,
291*4882a593Smuzhiyun .nr_resources = ARRAY_SIZE(s3c2410_uart3_resource),
292*4882a593Smuzhiyun },
293*4882a593Smuzhiyun };
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun #define s3c24xx_device_dma_mask (*((u64[]) { DMA_BIT_MASK(32) }))
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun #if defined(CONFIG_CPU_S3C2410) || defined(CONFIG_CPU_S3C2412) || \
298*4882a593Smuzhiyun defined(CONFIG_CPU_S3C2440) || defined(CONFIG_CPU_S3C2442)
299*4882a593Smuzhiyun static struct resource s3c2410_dma_resource[] = {
300*4882a593Smuzhiyun [0] = DEFINE_RES_MEM(S3C24XX_PA_DMA, S3C24XX_SZ_DMA),
301*4882a593Smuzhiyun [1] = DEFINE_RES_IRQ(IRQ_DMA0),
302*4882a593Smuzhiyun [2] = DEFINE_RES_IRQ(IRQ_DMA1),
303*4882a593Smuzhiyun [3] = DEFINE_RES_IRQ(IRQ_DMA2),
304*4882a593Smuzhiyun [4] = DEFINE_RES_IRQ(IRQ_DMA3),
305*4882a593Smuzhiyun };
306*4882a593Smuzhiyun #endif
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun #if defined(CONFIG_CPU_S3C2410) || defined(CONFIG_CPU_S3C2442)
309*4882a593Smuzhiyun static struct s3c24xx_dma_channel s3c2410_dma_channels[DMACH_MAX] = {
310*4882a593Smuzhiyun [DMACH_XD0] = { S3C24XX_DMA_AHB, true, S3C24XX_DMA_CHANREQ(0, 0), },
311*4882a593Smuzhiyun [DMACH_XD1] = { S3C24XX_DMA_AHB, true, S3C24XX_DMA_CHANREQ(0, 1), },
312*4882a593Smuzhiyun [DMACH_SDI] = { S3C24XX_DMA_APB, false, S3C24XX_DMA_CHANREQ(2, 0) |
313*4882a593Smuzhiyun S3C24XX_DMA_CHANREQ(2, 2) |
314*4882a593Smuzhiyun S3C24XX_DMA_CHANREQ(1, 3),
315*4882a593Smuzhiyun },
316*4882a593Smuzhiyun [DMACH_SPI0] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(3, 1), },
317*4882a593Smuzhiyun [DMACH_SPI1] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(2, 3), },
318*4882a593Smuzhiyun [DMACH_UART0] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(1, 0), },
319*4882a593Smuzhiyun [DMACH_UART1] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(1, 1), },
320*4882a593Smuzhiyun [DMACH_UART2] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(0, 3), },
321*4882a593Smuzhiyun [DMACH_TIMER] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(3, 0) |
322*4882a593Smuzhiyun S3C24XX_DMA_CHANREQ(3, 2) |
323*4882a593Smuzhiyun S3C24XX_DMA_CHANREQ(3, 3),
324*4882a593Smuzhiyun },
325*4882a593Smuzhiyun [DMACH_I2S_IN] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(2, 1) |
326*4882a593Smuzhiyun S3C24XX_DMA_CHANREQ(1, 2),
327*4882a593Smuzhiyun },
328*4882a593Smuzhiyun [DMACH_I2S_OUT] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(0, 2), },
329*4882a593Smuzhiyun [DMACH_USB_EP1] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(4, 0), },
330*4882a593Smuzhiyun [DMACH_USB_EP2] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(4, 1), },
331*4882a593Smuzhiyun [DMACH_USB_EP3] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(4, 2), },
332*4882a593Smuzhiyun [DMACH_USB_EP4] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(4, 3), },
333*4882a593Smuzhiyun };
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun static const struct dma_slave_map s3c2410_dma_slave_map[] = {
336*4882a593Smuzhiyun { "s3c2410-sdi", "rx-tx", (void *)DMACH_SDI },
337*4882a593Smuzhiyun { "s3c2410-spi.0", "rx", (void *)DMACH_SPI0_RX },
338*4882a593Smuzhiyun { "s3c2410-spi.0", "tx", (void *)DMACH_SPI0_TX },
339*4882a593Smuzhiyun { "s3c2410-spi.1", "rx", (void *)DMACH_SPI1_RX },
340*4882a593Smuzhiyun { "s3c2410-spi.1", "tx", (void *)DMACH_SPI1_TX },
341*4882a593Smuzhiyun /*
342*4882a593Smuzhiyun * The DMA request source[1] (DMACH_UARTx_SRC2) are
343*4882a593Smuzhiyun * not used in the UART driver.
344*4882a593Smuzhiyun */
345*4882a593Smuzhiyun { "s3c2410-uart.0", "rx", (void *)DMACH_UART0 },
346*4882a593Smuzhiyun { "s3c2410-uart.0", "tx", (void *)DMACH_UART0 },
347*4882a593Smuzhiyun { "s3c2410-uart.1", "rx", (void *)DMACH_UART1 },
348*4882a593Smuzhiyun { "s3c2410-uart.1", "tx", (void *)DMACH_UART1 },
349*4882a593Smuzhiyun { "s3c2410-uart.2", "rx", (void *)DMACH_UART2 },
350*4882a593Smuzhiyun { "s3c2410-uart.2", "tx", (void *)DMACH_UART2 },
351*4882a593Smuzhiyun { "s3c24xx-iis", "rx", (void *)DMACH_I2S_IN },
352*4882a593Smuzhiyun { "s3c24xx-iis", "tx", (void *)DMACH_I2S_OUT },
353*4882a593Smuzhiyun { "s3c-hsudc", "rx0", (void *)DMACH_USB_EP1 },
354*4882a593Smuzhiyun { "s3c-hsudc", "tx0", (void *)DMACH_USB_EP1 },
355*4882a593Smuzhiyun { "s3c-hsudc", "rx1", (void *)DMACH_USB_EP2 },
356*4882a593Smuzhiyun { "s3c-hsudc", "tx1", (void *)DMACH_USB_EP2 },
357*4882a593Smuzhiyun { "s3c-hsudc", "rx2", (void *)DMACH_USB_EP3 },
358*4882a593Smuzhiyun { "s3c-hsudc", "tx2", (void *)DMACH_USB_EP3 },
359*4882a593Smuzhiyun { "s3c-hsudc", "rx3", (void *)DMACH_USB_EP4 },
360*4882a593Smuzhiyun { "s3c-hsudc", "tx3", (void *)DMACH_USB_EP4 }
361*4882a593Smuzhiyun };
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun static struct s3c24xx_dma_platdata s3c2410_dma_platdata = {
364*4882a593Smuzhiyun .num_phy_channels = 4,
365*4882a593Smuzhiyun .channels = s3c2410_dma_channels,
366*4882a593Smuzhiyun .num_channels = DMACH_MAX,
367*4882a593Smuzhiyun .slave_map = s3c2410_dma_slave_map,
368*4882a593Smuzhiyun .slavecnt = ARRAY_SIZE(s3c2410_dma_slave_map),
369*4882a593Smuzhiyun };
370*4882a593Smuzhiyun
371*4882a593Smuzhiyun struct platform_device s3c2410_device_dma = {
372*4882a593Smuzhiyun .name = "s3c2410-dma",
373*4882a593Smuzhiyun .id = 0,
374*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(s3c2410_dma_resource),
375*4882a593Smuzhiyun .resource = s3c2410_dma_resource,
376*4882a593Smuzhiyun .dev = {
377*4882a593Smuzhiyun .dma_mask = &s3c24xx_device_dma_mask,
378*4882a593Smuzhiyun .coherent_dma_mask = DMA_BIT_MASK(32),
379*4882a593Smuzhiyun .platform_data = &s3c2410_dma_platdata,
380*4882a593Smuzhiyun },
381*4882a593Smuzhiyun };
382*4882a593Smuzhiyun #endif
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun #ifdef CONFIG_CPU_S3C2412
385*4882a593Smuzhiyun static struct s3c24xx_dma_channel s3c2412_dma_channels[DMACH_MAX] = {
386*4882a593Smuzhiyun [DMACH_XD0] = { S3C24XX_DMA_AHB, true, 17 },
387*4882a593Smuzhiyun [DMACH_XD1] = { S3C24XX_DMA_AHB, true, 18 },
388*4882a593Smuzhiyun [DMACH_SDI] = { S3C24XX_DMA_APB, false, 10 },
389*4882a593Smuzhiyun [DMACH_SPI0_RX] = { S3C24XX_DMA_APB, true, 1 },
390*4882a593Smuzhiyun [DMACH_SPI0_TX] = { S3C24XX_DMA_APB, true, 0 },
391*4882a593Smuzhiyun [DMACH_SPI1_RX] = { S3C24XX_DMA_APB, true, 3 },
392*4882a593Smuzhiyun [DMACH_SPI1_TX] = { S3C24XX_DMA_APB, true, 2 },
393*4882a593Smuzhiyun [DMACH_UART0] = { S3C24XX_DMA_APB, true, 19 },
394*4882a593Smuzhiyun [DMACH_UART1] = { S3C24XX_DMA_APB, true, 21 },
395*4882a593Smuzhiyun [DMACH_UART2] = { S3C24XX_DMA_APB, true, 23 },
396*4882a593Smuzhiyun [DMACH_UART0_SRC2] = { S3C24XX_DMA_APB, true, 20 },
397*4882a593Smuzhiyun [DMACH_UART1_SRC2] = { S3C24XX_DMA_APB, true, 22 },
398*4882a593Smuzhiyun [DMACH_UART2_SRC2] = { S3C24XX_DMA_APB, true, 24 },
399*4882a593Smuzhiyun [DMACH_TIMER] = { S3C24XX_DMA_APB, true, 9 },
400*4882a593Smuzhiyun [DMACH_I2S_IN] = { S3C24XX_DMA_APB, true, 5 },
401*4882a593Smuzhiyun [DMACH_I2S_OUT] = { S3C24XX_DMA_APB, true, 4 },
402*4882a593Smuzhiyun [DMACH_USB_EP1] = { S3C24XX_DMA_APB, true, 13 },
403*4882a593Smuzhiyun [DMACH_USB_EP2] = { S3C24XX_DMA_APB, true, 14 },
404*4882a593Smuzhiyun [DMACH_USB_EP3] = { S3C24XX_DMA_APB, true, 15 },
405*4882a593Smuzhiyun [DMACH_USB_EP4] = { S3C24XX_DMA_APB, true, 16 },
406*4882a593Smuzhiyun };
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun static const struct dma_slave_map s3c2412_dma_slave_map[] = {
409*4882a593Smuzhiyun { "s3c2412-sdi", "rx-tx", (void *)DMACH_SDI },
410*4882a593Smuzhiyun { "s3c2412-spi.0", "rx", (void *)DMACH_SPI0_RX },
411*4882a593Smuzhiyun { "s3c2412-spi.0", "tx", (void *)DMACH_SPI0_TX },
412*4882a593Smuzhiyun { "s3c2412-spi.1", "rx", (void *)DMACH_SPI1_RX },
413*4882a593Smuzhiyun { "s3c2412-spi.1", "tx", (void *)DMACH_SPI1_TX },
414*4882a593Smuzhiyun { "s3c2440-uart.0", "rx", (void *)DMACH_UART0 },
415*4882a593Smuzhiyun { "s3c2440-uart.0", "tx", (void *)DMACH_UART0 },
416*4882a593Smuzhiyun { "s3c2440-uart.1", "rx", (void *)DMACH_UART1 },
417*4882a593Smuzhiyun { "s3c2440-uart.1", "tx", (void *)DMACH_UART1 },
418*4882a593Smuzhiyun { "s3c2440-uart.2", "rx", (void *)DMACH_UART2 },
419*4882a593Smuzhiyun { "s3c2440-uart.2", "tx", (void *)DMACH_UART2 },
420*4882a593Smuzhiyun { "s3c2412-iis", "rx", (void *)DMACH_I2S_IN },
421*4882a593Smuzhiyun { "s3c2412-iis", "tx", (void *)DMACH_I2S_OUT },
422*4882a593Smuzhiyun { "s3c-hsudc", "rx0", (void *)DMACH_USB_EP1 },
423*4882a593Smuzhiyun { "s3c-hsudc", "tx0", (void *)DMACH_USB_EP1 },
424*4882a593Smuzhiyun { "s3c-hsudc", "rx1", (void *)DMACH_USB_EP2 },
425*4882a593Smuzhiyun { "s3c-hsudc", "tx1", (void *)DMACH_USB_EP2 },
426*4882a593Smuzhiyun { "s3c-hsudc", "rx2", (void *)DMACH_USB_EP3 },
427*4882a593Smuzhiyun { "s3c-hsudc", "tx2", (void *)DMACH_USB_EP3 },
428*4882a593Smuzhiyun { "s3c-hsudc", "rx3", (void *)DMACH_USB_EP4 },
429*4882a593Smuzhiyun { "s3c-hsudc", "tx3", (void *)DMACH_USB_EP4 }
430*4882a593Smuzhiyun };
431*4882a593Smuzhiyun
432*4882a593Smuzhiyun static struct s3c24xx_dma_platdata s3c2412_dma_platdata = {
433*4882a593Smuzhiyun .num_phy_channels = 4,
434*4882a593Smuzhiyun .channels = s3c2412_dma_channels,
435*4882a593Smuzhiyun .num_channels = DMACH_MAX,
436*4882a593Smuzhiyun .slave_map = s3c2412_dma_slave_map,
437*4882a593Smuzhiyun .slavecnt = ARRAY_SIZE(s3c2412_dma_slave_map),
438*4882a593Smuzhiyun };
439*4882a593Smuzhiyun
440*4882a593Smuzhiyun struct platform_device s3c2412_device_dma = {
441*4882a593Smuzhiyun .name = "s3c2412-dma",
442*4882a593Smuzhiyun .id = 0,
443*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(s3c2410_dma_resource),
444*4882a593Smuzhiyun .resource = s3c2410_dma_resource,
445*4882a593Smuzhiyun .dev = {
446*4882a593Smuzhiyun .dma_mask = &s3c24xx_device_dma_mask,
447*4882a593Smuzhiyun .coherent_dma_mask = DMA_BIT_MASK(32),
448*4882a593Smuzhiyun .platform_data = &s3c2412_dma_platdata,
449*4882a593Smuzhiyun },
450*4882a593Smuzhiyun };
451*4882a593Smuzhiyun #endif
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun #if defined(CONFIG_CPU_S3C2440)
454*4882a593Smuzhiyun static struct s3c24xx_dma_channel s3c2440_dma_channels[DMACH_MAX] = {
455*4882a593Smuzhiyun [DMACH_XD0] = { S3C24XX_DMA_AHB, true, S3C24XX_DMA_CHANREQ(0, 0), },
456*4882a593Smuzhiyun [DMACH_XD1] = { S3C24XX_DMA_AHB, true, S3C24XX_DMA_CHANREQ(0, 1), },
457*4882a593Smuzhiyun [DMACH_SDI] = { S3C24XX_DMA_APB, false, S3C24XX_DMA_CHANREQ(2, 0) |
458*4882a593Smuzhiyun S3C24XX_DMA_CHANREQ(6, 1) |
459*4882a593Smuzhiyun S3C24XX_DMA_CHANREQ(2, 2) |
460*4882a593Smuzhiyun S3C24XX_DMA_CHANREQ(1, 3),
461*4882a593Smuzhiyun },
462*4882a593Smuzhiyun [DMACH_SPI0] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(3, 1), },
463*4882a593Smuzhiyun [DMACH_SPI1] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(2, 3), },
464*4882a593Smuzhiyun [DMACH_UART0] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(1, 0), },
465*4882a593Smuzhiyun [DMACH_UART1] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(1, 1), },
466*4882a593Smuzhiyun [DMACH_UART2] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(0, 3), },
467*4882a593Smuzhiyun [DMACH_TIMER] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(3, 0) |
468*4882a593Smuzhiyun S3C24XX_DMA_CHANREQ(3, 2) |
469*4882a593Smuzhiyun S3C24XX_DMA_CHANREQ(3, 3),
470*4882a593Smuzhiyun },
471*4882a593Smuzhiyun [DMACH_I2S_IN] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(2, 1) |
472*4882a593Smuzhiyun S3C24XX_DMA_CHANREQ(1, 2),
473*4882a593Smuzhiyun },
474*4882a593Smuzhiyun [DMACH_I2S_OUT] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(5, 0) |
475*4882a593Smuzhiyun S3C24XX_DMA_CHANREQ(0, 2),
476*4882a593Smuzhiyun },
477*4882a593Smuzhiyun [DMACH_PCM_IN] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(6, 0) |
478*4882a593Smuzhiyun S3C24XX_DMA_CHANREQ(5, 2),
479*4882a593Smuzhiyun },
480*4882a593Smuzhiyun [DMACH_PCM_OUT] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(5, 1) |
481*4882a593Smuzhiyun S3C24XX_DMA_CHANREQ(6, 3),
482*4882a593Smuzhiyun },
483*4882a593Smuzhiyun [DMACH_MIC_IN] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(6, 2) |
484*4882a593Smuzhiyun S3C24XX_DMA_CHANREQ(5, 3),
485*4882a593Smuzhiyun },
486*4882a593Smuzhiyun [DMACH_USB_EP1] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(4, 0), },
487*4882a593Smuzhiyun [DMACH_USB_EP2] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(4, 1), },
488*4882a593Smuzhiyun [DMACH_USB_EP3] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(4, 2), },
489*4882a593Smuzhiyun [DMACH_USB_EP4] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(4, 3), },
490*4882a593Smuzhiyun };
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun static const struct dma_slave_map s3c2440_dma_slave_map[] = {
493*4882a593Smuzhiyun /* TODO: DMACH_XD0 */
494*4882a593Smuzhiyun /* TODO: DMACH_XD1 */
495*4882a593Smuzhiyun { "s3c2440-sdi", "rx-tx", (void *)DMACH_SDI },
496*4882a593Smuzhiyun { "s3c2410-spi.0", "rx", (void *)DMACH_SPI0 },
497*4882a593Smuzhiyun { "s3c2410-spi.0", "tx", (void *)DMACH_SPI0 },
498*4882a593Smuzhiyun { "s3c2410-spi.1", "rx", (void *)DMACH_SPI1 },
499*4882a593Smuzhiyun { "s3c2410-spi.1", "tx", (void *)DMACH_SPI1 },
500*4882a593Smuzhiyun { "s3c2440-uart.0", "rx", (void *)DMACH_UART0 },
501*4882a593Smuzhiyun { "s3c2440-uart.0", "tx", (void *)DMACH_UART0 },
502*4882a593Smuzhiyun { "s3c2440-uart.1", "rx", (void *)DMACH_UART1 },
503*4882a593Smuzhiyun { "s3c2440-uart.1", "tx", (void *)DMACH_UART1 },
504*4882a593Smuzhiyun { "s3c2440-uart.2", "rx", (void *)DMACH_UART2 },
505*4882a593Smuzhiyun { "s3c2440-uart.2", "tx", (void *)DMACH_UART2 },
506*4882a593Smuzhiyun { "s3c2440-uart.3", "rx", (void *)DMACH_UART3 },
507*4882a593Smuzhiyun { "s3c2440-uart.3", "tx", (void *)DMACH_UART3 },
508*4882a593Smuzhiyun /* TODO: DMACH_TIMER */
509*4882a593Smuzhiyun { "s3c24xx-iis", "rx", (void *)DMACH_I2S_IN },
510*4882a593Smuzhiyun { "s3c24xx-iis", "tx", (void *)DMACH_I2S_OUT },
511*4882a593Smuzhiyun { "samsung-ac97", "rx", (void *)DMACH_PCM_IN },
512*4882a593Smuzhiyun { "samsung-ac97", "tx", (void *)DMACH_PCM_OUT },
513*4882a593Smuzhiyun { "samsung-ac97", "rx", (void *)DMACH_MIC_IN },
514*4882a593Smuzhiyun { "s3c-hsudc", "rx0", (void *)DMACH_USB_EP1 },
515*4882a593Smuzhiyun { "s3c-hsudc", "rx1", (void *)DMACH_USB_EP2 },
516*4882a593Smuzhiyun { "s3c-hsudc", "rx2", (void *)DMACH_USB_EP3 },
517*4882a593Smuzhiyun { "s3c-hsudc", "rx3", (void *)DMACH_USB_EP4 },
518*4882a593Smuzhiyun { "s3c-hsudc", "tx0", (void *)DMACH_USB_EP1 },
519*4882a593Smuzhiyun { "s3c-hsudc", "tx1", (void *)DMACH_USB_EP2 },
520*4882a593Smuzhiyun { "s3c-hsudc", "tx2", (void *)DMACH_USB_EP3 },
521*4882a593Smuzhiyun { "s3c-hsudc", "tx3", (void *)DMACH_USB_EP4 }
522*4882a593Smuzhiyun };
523*4882a593Smuzhiyun
524*4882a593Smuzhiyun static struct s3c24xx_dma_platdata s3c2440_dma_platdata = {
525*4882a593Smuzhiyun .num_phy_channels = 4,
526*4882a593Smuzhiyun .channels = s3c2440_dma_channels,
527*4882a593Smuzhiyun .num_channels = DMACH_MAX,
528*4882a593Smuzhiyun .slave_map = s3c2440_dma_slave_map,
529*4882a593Smuzhiyun .slavecnt = ARRAY_SIZE(s3c2440_dma_slave_map),
530*4882a593Smuzhiyun };
531*4882a593Smuzhiyun
532*4882a593Smuzhiyun struct platform_device s3c2440_device_dma = {
533*4882a593Smuzhiyun .name = "s3c2410-dma",
534*4882a593Smuzhiyun .id = 0,
535*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(s3c2410_dma_resource),
536*4882a593Smuzhiyun .resource = s3c2410_dma_resource,
537*4882a593Smuzhiyun .dev = {
538*4882a593Smuzhiyun .dma_mask = &s3c24xx_device_dma_mask,
539*4882a593Smuzhiyun .coherent_dma_mask = DMA_BIT_MASK(32),
540*4882a593Smuzhiyun .platform_data = &s3c2440_dma_platdata,
541*4882a593Smuzhiyun },
542*4882a593Smuzhiyun };
543*4882a593Smuzhiyun #endif
544*4882a593Smuzhiyun
545*4882a593Smuzhiyun #if defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2416)
546*4882a593Smuzhiyun static struct resource s3c2443_dma_resource[] = {
547*4882a593Smuzhiyun [0] = DEFINE_RES_MEM(S3C24XX_PA_DMA, S3C24XX_SZ_DMA),
548*4882a593Smuzhiyun [1] = DEFINE_RES_IRQ(IRQ_S3C2443_DMA0),
549*4882a593Smuzhiyun [2] = DEFINE_RES_IRQ(IRQ_S3C2443_DMA1),
550*4882a593Smuzhiyun [3] = DEFINE_RES_IRQ(IRQ_S3C2443_DMA2),
551*4882a593Smuzhiyun [4] = DEFINE_RES_IRQ(IRQ_S3C2443_DMA3),
552*4882a593Smuzhiyun [5] = DEFINE_RES_IRQ(IRQ_S3C2443_DMA4),
553*4882a593Smuzhiyun [6] = DEFINE_RES_IRQ(IRQ_S3C2443_DMA5),
554*4882a593Smuzhiyun };
555*4882a593Smuzhiyun
556*4882a593Smuzhiyun static struct s3c24xx_dma_channel s3c2443_dma_channels[DMACH_MAX] = {
557*4882a593Smuzhiyun [DMACH_XD0] = { S3C24XX_DMA_AHB, true, 17 },
558*4882a593Smuzhiyun [DMACH_XD1] = { S3C24XX_DMA_AHB, true, 18 },
559*4882a593Smuzhiyun [DMACH_SDI] = { S3C24XX_DMA_APB, false, 10 },
560*4882a593Smuzhiyun [DMACH_SPI0_RX] = { S3C24XX_DMA_APB, true, 1 },
561*4882a593Smuzhiyun [DMACH_SPI0_TX] = { S3C24XX_DMA_APB, true, 0 },
562*4882a593Smuzhiyun [DMACH_SPI1_RX] = { S3C24XX_DMA_APB, true, 3 },
563*4882a593Smuzhiyun [DMACH_SPI1_TX] = { S3C24XX_DMA_APB, true, 2 },
564*4882a593Smuzhiyun [DMACH_UART0] = { S3C24XX_DMA_APB, true, 19 },
565*4882a593Smuzhiyun [DMACH_UART1] = { S3C24XX_DMA_APB, true, 21 },
566*4882a593Smuzhiyun [DMACH_UART2] = { S3C24XX_DMA_APB, true, 23 },
567*4882a593Smuzhiyun [DMACH_UART3] = { S3C24XX_DMA_APB, true, 25 },
568*4882a593Smuzhiyun [DMACH_UART0_SRC2] = { S3C24XX_DMA_APB, true, 20 },
569*4882a593Smuzhiyun [DMACH_UART1_SRC2] = { S3C24XX_DMA_APB, true, 22 },
570*4882a593Smuzhiyun [DMACH_UART2_SRC2] = { S3C24XX_DMA_APB, true, 24 },
571*4882a593Smuzhiyun [DMACH_UART3_SRC2] = { S3C24XX_DMA_APB, true, 26 },
572*4882a593Smuzhiyun [DMACH_TIMER] = { S3C24XX_DMA_APB, true, 9 },
573*4882a593Smuzhiyun [DMACH_I2S_IN] = { S3C24XX_DMA_APB, true, 5 },
574*4882a593Smuzhiyun [DMACH_I2S_OUT] = { S3C24XX_DMA_APB, true, 4 },
575*4882a593Smuzhiyun [DMACH_PCM_IN] = { S3C24XX_DMA_APB, true, 28 },
576*4882a593Smuzhiyun [DMACH_PCM_OUT] = { S3C24XX_DMA_APB, true, 27 },
577*4882a593Smuzhiyun [DMACH_MIC_IN] = { S3C24XX_DMA_APB, true, 29 },
578*4882a593Smuzhiyun };
579*4882a593Smuzhiyun
580*4882a593Smuzhiyun static const struct dma_slave_map s3c2443_dma_slave_map[] = {
581*4882a593Smuzhiyun { "s3c2440-sdi", "rx-tx", (void *)DMACH_SDI },
582*4882a593Smuzhiyun { "s3c2443-spi.0", "rx", (void *)DMACH_SPI0_RX },
583*4882a593Smuzhiyun { "s3c2443-spi.0", "tx", (void *)DMACH_SPI0_TX },
584*4882a593Smuzhiyun { "s3c2443-spi.1", "rx", (void *)DMACH_SPI1_RX },
585*4882a593Smuzhiyun { "s3c2443-spi.1", "tx", (void *)DMACH_SPI1_TX },
586*4882a593Smuzhiyun { "s3c2440-uart.0", "rx", (void *)DMACH_UART0 },
587*4882a593Smuzhiyun { "s3c2440-uart.0", "tx", (void *)DMACH_UART0 },
588*4882a593Smuzhiyun { "s3c2440-uart.1", "rx", (void *)DMACH_UART1 },
589*4882a593Smuzhiyun { "s3c2440-uart.1", "tx", (void *)DMACH_UART1 },
590*4882a593Smuzhiyun { "s3c2440-uart.2", "rx", (void *)DMACH_UART2 },
591*4882a593Smuzhiyun { "s3c2440-uart.2", "tx", (void *)DMACH_UART2 },
592*4882a593Smuzhiyun { "s3c2440-uart.3", "rx", (void *)DMACH_UART3 },
593*4882a593Smuzhiyun { "s3c2440-uart.3", "tx", (void *)DMACH_UART3 },
594*4882a593Smuzhiyun { "s3c24xx-iis", "rx", (void *)DMACH_I2S_IN },
595*4882a593Smuzhiyun { "s3c24xx-iis", "tx", (void *)DMACH_I2S_OUT },
596*4882a593Smuzhiyun };
597*4882a593Smuzhiyun
598*4882a593Smuzhiyun static struct s3c24xx_dma_platdata s3c2443_dma_platdata = {
599*4882a593Smuzhiyun .num_phy_channels = 6,
600*4882a593Smuzhiyun .channels = s3c2443_dma_channels,
601*4882a593Smuzhiyun .num_channels = DMACH_MAX,
602*4882a593Smuzhiyun .slave_map = s3c2443_dma_slave_map,
603*4882a593Smuzhiyun .slavecnt = ARRAY_SIZE(s3c2443_dma_slave_map),
604*4882a593Smuzhiyun };
605*4882a593Smuzhiyun
606*4882a593Smuzhiyun struct platform_device s3c2443_device_dma = {
607*4882a593Smuzhiyun .name = "s3c2443-dma",
608*4882a593Smuzhiyun .id = 0,
609*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(s3c2443_dma_resource),
610*4882a593Smuzhiyun .resource = s3c2443_dma_resource,
611*4882a593Smuzhiyun .dev = {
612*4882a593Smuzhiyun .dma_mask = &s3c24xx_device_dma_mask,
613*4882a593Smuzhiyun .coherent_dma_mask = DMA_BIT_MASK(32),
614*4882a593Smuzhiyun .platform_data = &s3c2443_dma_platdata,
615*4882a593Smuzhiyun },
616*4882a593Smuzhiyun };
617*4882a593Smuzhiyun #endif
618*4882a593Smuzhiyun
619*4882a593Smuzhiyun #if defined(CONFIG_COMMON_CLK) && defined(CONFIG_CPU_S3C2410)
s3c2410_init_clocks(int xtal)620*4882a593Smuzhiyun void __init s3c2410_init_clocks(int xtal)
621*4882a593Smuzhiyun {
622*4882a593Smuzhiyun s3c2410_common_clk_init(NULL, xtal, 0, S3C24XX_VA_CLKPWR);
623*4882a593Smuzhiyun }
624*4882a593Smuzhiyun #endif
625*4882a593Smuzhiyun
626*4882a593Smuzhiyun #ifdef CONFIG_CPU_S3C2412
s3c2412_init_clocks(int xtal)627*4882a593Smuzhiyun void __init s3c2412_init_clocks(int xtal)
628*4882a593Smuzhiyun {
629*4882a593Smuzhiyun s3c2412_common_clk_init(NULL, xtal, 0, S3C24XX_VA_CLKPWR);
630*4882a593Smuzhiyun }
631*4882a593Smuzhiyun #endif
632*4882a593Smuzhiyun
633*4882a593Smuzhiyun #ifdef CONFIG_CPU_S3C2416
s3c2416_init_clocks(int xtal)634*4882a593Smuzhiyun void __init s3c2416_init_clocks(int xtal)
635*4882a593Smuzhiyun {
636*4882a593Smuzhiyun s3c2443_common_clk_init(NULL, xtal, 0, S3C24XX_VA_CLKPWR);
637*4882a593Smuzhiyun }
638*4882a593Smuzhiyun #endif
639*4882a593Smuzhiyun
640*4882a593Smuzhiyun #if defined(CONFIG_COMMON_CLK) && defined(CONFIG_CPU_S3C2440)
s3c2440_init_clocks(int xtal)641*4882a593Smuzhiyun void __init s3c2440_init_clocks(int xtal)
642*4882a593Smuzhiyun {
643*4882a593Smuzhiyun s3c2410_common_clk_init(NULL, xtal, 1, S3C24XX_VA_CLKPWR);
644*4882a593Smuzhiyun }
645*4882a593Smuzhiyun #endif
646*4882a593Smuzhiyun
647*4882a593Smuzhiyun #if defined(CONFIG_COMMON_CLK) && defined(CONFIG_CPU_S3C2442)
s3c2442_init_clocks(int xtal)648*4882a593Smuzhiyun void __init s3c2442_init_clocks(int xtal)
649*4882a593Smuzhiyun {
650*4882a593Smuzhiyun s3c2410_common_clk_init(NULL, xtal, 2, S3C24XX_VA_CLKPWR);
651*4882a593Smuzhiyun }
652*4882a593Smuzhiyun #endif
653*4882a593Smuzhiyun
654*4882a593Smuzhiyun #ifdef CONFIG_CPU_S3C2443
s3c2443_init_clocks(int xtal)655*4882a593Smuzhiyun void __init s3c2443_init_clocks(int xtal)
656*4882a593Smuzhiyun {
657*4882a593Smuzhiyun s3c2443_common_clk_init(NULL, xtal, 1, S3C24XX_VA_CLKPWR);
658*4882a593Smuzhiyun }
659*4882a593Smuzhiyun #endif
660*4882a593Smuzhiyun
661*4882a593Smuzhiyun #if defined(CONFIG_CPU_S3C2410) || defined(CONFIG_CPU_S3C2440) || \
662*4882a593Smuzhiyun defined(CONFIG_CPU_S3C2442)
663*4882a593Smuzhiyun static struct resource s3c2410_dclk_resource[] = {
664*4882a593Smuzhiyun [0] = DEFINE_RES_MEM(0x56000084, 0x4),
665*4882a593Smuzhiyun };
666*4882a593Smuzhiyun
667*4882a593Smuzhiyun static struct s3c2410_clk_platform_data s3c_clk_platform_data = {
668*4882a593Smuzhiyun .modify_misccr = s3c2410_modify_misccr,
669*4882a593Smuzhiyun };
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun struct platform_device s3c2410_device_dclk = {
672*4882a593Smuzhiyun .name = "s3c2410-dclk",
673*4882a593Smuzhiyun .id = 0,
674*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(s3c2410_dclk_resource),
675*4882a593Smuzhiyun .resource = s3c2410_dclk_resource,
676*4882a593Smuzhiyun .dev = {
677*4882a593Smuzhiyun .platform_data = &s3c_clk_platform_data,
678*4882a593Smuzhiyun },
679*4882a593Smuzhiyun };
680*4882a593Smuzhiyun #endif
681