diff options
Diffstat (limited to 'arch/arm/plat-s3c64xx')
34 files changed, 3704 insertions, 0 deletions
diff --git a/arch/arm/plat-s3c64xx/Kconfig b/arch/arm/plat-s3c64xx/Kconfig new file mode 100644 index 000000000000..54375a00a7d2 --- /dev/null +++ b/arch/arm/plat-s3c64xx/Kconfig | |||
@@ -0,0 +1,62 @@ | |||
1 | # arch/arm/plat-s3c64xx/Kconfig | ||
2 | # | ||
3 | # Copyright 2008 Openmoko, Inc. | ||
4 | # Copyright 2008 Simtec Electronics | ||
5 | # Ben Dooks <ben@simtec.co.uk> | ||
6 | # | ||
7 | # Licensed under GPLv2 | ||
8 | |||
9 | config PLAT_S3C64XX | ||
10 | bool | ||
11 | depends on ARCH_S3C64XX | ||
12 | default y | ||
13 | select CPU_V6 | ||
14 | select PLAT_S3C | ||
15 | select ARM_VIC | ||
16 | select NO_IOPORT | ||
17 | select ARCH_REQUIRE_GPIOLIB | ||
18 | select S3C_GPIO_TRACK | ||
19 | select S3C_GPIO_PULL_UPDOWN | ||
20 | select S3C_GPIO_CFG_S3C24XX | ||
21 | select S3C_GPIO_CFG_S3C64XX | ||
22 | help | ||
23 | Base platform code for any Samsung S3C64XX device | ||
24 | |||
25 | if PLAT_S3C64XX | ||
26 | |||
27 | # Configuration options shared by all S3C64XX implementations | ||
28 | |||
29 | config CPU_S3C6400_INIT | ||
30 | bool | ||
31 | help | ||
32 | Common initialisation code for the S3C6400 that is shared | ||
33 | by other CPUs in the series, such as the S3C6410. | ||
34 | |||
35 | config CPU_S3C6400_CLOCK | ||
36 | bool | ||
37 | help | ||
38 | Common clock support code for the S3C6400 that is shared | ||
39 | by other CPUs in the series, such as the S3C6410. | ||
40 | |||
41 | # platform specific device setup | ||
42 | |||
43 | config S3C64XX_SETUP_I2C0 | ||
44 | bool | ||
45 | default y | ||
46 | help | ||
47 | Common setup code for i2c bus 0. | ||
48 | |||
49 | Note, currently since i2c0 is always compiled, this setup helper | ||
50 | is always compiled with it. | ||
51 | |||
52 | config S3C64XX_SETUP_I2C1 | ||
53 | bool | ||
54 | help | ||
55 | Common setup code for i2c bus 1. | ||
56 | |||
57 | config S3C64XX_SETUP_FB_24BPP | ||
58 | bool | ||
59 | help | ||
60 | Common setup code for S3C64XX with an 24bpp RGB display helper. | ||
61 | |||
62 | endif | ||
diff --git a/arch/arm/plat-s3c64xx/Makefile b/arch/arm/plat-s3c64xx/Makefile new file mode 100644 index 000000000000..2e6d79bf8f33 --- /dev/null +++ b/arch/arm/plat-s3c64xx/Makefile | |||
@@ -0,0 +1,31 @@ | |||
1 | # arch/arm/plat-s3c64xx/Makefile | ||
2 | # | ||
3 | # Copyright 2008 Openmoko, Inc. | ||
4 | # Copyright 2008 Simtec Electronics | ||
5 | # | ||
6 | # Licensed under GPLv2 | ||
7 | |||
8 | obj-y := | ||
9 | obj-m := | ||
10 | obj-n := dummy.o | ||
11 | obj- := | ||
12 | |||
13 | # Core files | ||
14 | |||
15 | obj-y += dev-uart.o | ||
16 | obj-y += cpu.o | ||
17 | obj-y += irq.o | ||
18 | obj-y += irq-eint.o | ||
19 | obj-y += clock.o | ||
20 | obj-y += gpiolib.o | ||
21 | |||
22 | # CPU support | ||
23 | |||
24 | obj-$(CONFIG_CPU_S3C6400_INIT) += s3c6400-init.o | ||
25 | obj-$(CONFIG_CPU_S3C6400_CLOCK) += s3c6400-clock.o | ||
26 | |||
27 | # Device setup | ||
28 | |||
29 | obj-$(CONFIG_S3C64XX_SETUP_I2C0) += setup-i2c0.o | ||
30 | obj-$(CONFIG_S3C64XX_SETUP_I2C1) += setup-i2c1.o | ||
31 | obj-$(CONFIG_S3C64XX_SETUP_FB_24BPP) += setup-fb-24bpp.o | ||
diff --git a/arch/arm/plat-s3c64xx/clock.c b/arch/arm/plat-s3c64xx/clock.c new file mode 100644 index 000000000000..136c982c68e1 --- /dev/null +++ b/arch/arm/plat-s3c64xx/clock.c | |||
@@ -0,0 +1,281 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/clock.c | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * S3C64XX Base clock support | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/init.h> | ||
16 | #include <linux/module.h> | ||
17 | #include <linux/interrupt.h> | ||
18 | #include <linux/ioport.h> | ||
19 | #include <linux/io.h> | ||
20 | |||
21 | #include <mach/hardware.h> | ||
22 | #include <mach/map.h> | ||
23 | |||
24 | #include <plat/regs-sys.h> | ||
25 | #include <plat/regs-clock.h> | ||
26 | #include <plat/cpu.h> | ||
27 | #include <plat/devs.h> | ||
28 | #include <plat/clock.h> | ||
29 | |||
30 | struct clk clk_27m = { | ||
31 | .name = "clk_27m", | ||
32 | .id = -1, | ||
33 | .rate = 27000000, | ||
34 | }; | ||
35 | |||
36 | static int clk_48m_ctrl(struct clk *clk, int enable) | ||
37 | { | ||
38 | unsigned long flags; | ||
39 | u32 val; | ||
40 | |||
41 | /* can't rely on clock lock, this register has other usages */ | ||
42 | local_irq_save(flags); | ||
43 | |||
44 | val = __raw_readl(S3C64XX_OTHERS); | ||
45 | if (enable) | ||
46 | val |= S3C64XX_OTHERS_USBMASK; | ||
47 | else | ||
48 | val &= ~S3C64XX_OTHERS_USBMASK; | ||
49 | |||
50 | __raw_writel(val, S3C64XX_OTHERS); | ||
51 | local_irq_restore(flags); | ||
52 | |||
53 | return 0; | ||
54 | } | ||
55 | |||
56 | struct clk clk_48m = { | ||
57 | .name = "clk_48m", | ||
58 | .id = -1, | ||
59 | .rate = 48000000, | ||
60 | .enable = clk_48m_ctrl, | ||
61 | }; | ||
62 | |||
63 | static int inline s3c64xx_gate(void __iomem *reg, | ||
64 | struct clk *clk, | ||
65 | int enable) | ||
66 | { | ||
67 | unsigned int ctrlbit = clk->ctrlbit; | ||
68 | u32 con; | ||
69 | |||
70 | con = __raw_readl(reg); | ||
71 | |||
72 | if (enable) | ||
73 | con |= ctrlbit; | ||
74 | else | ||
75 | con &= ~ctrlbit; | ||
76 | |||
77 | __raw_writel(con, reg); | ||
78 | return 0; | ||
79 | } | ||
80 | |||
81 | static int s3c64xx_pclk_ctrl(struct clk *clk, int enable) | ||
82 | { | ||
83 | return s3c64xx_gate(S3C_PCLK_GATE, clk, enable); | ||
84 | } | ||
85 | |||
86 | static int s3c64xx_hclk_ctrl(struct clk *clk, int enable) | ||
87 | { | ||
88 | return s3c64xx_gate(S3C_HCLK_GATE, clk, enable); | ||
89 | } | ||
90 | |||
91 | int s3c64xx_sclk_ctrl(struct clk *clk, int enable) | ||
92 | { | ||
93 | return s3c64xx_gate(S3C_SCLK_GATE, clk, enable); | ||
94 | } | ||
95 | |||
96 | static struct clk init_clocks_disable[] = { | ||
97 | { | ||
98 | .name = "nand", | ||
99 | .id = -1, | ||
100 | .parent = &clk_h, | ||
101 | }, { | ||
102 | .name = "adc", | ||
103 | .id = -1, | ||
104 | .parent = &clk_p, | ||
105 | .enable = s3c64xx_pclk_ctrl, | ||
106 | .ctrlbit = S3C_CLKCON_PCLK_TSADC, | ||
107 | }, { | ||
108 | .name = "i2c", | ||
109 | .id = -1, | ||
110 | .parent = &clk_p, | ||
111 | .enable = s3c64xx_pclk_ctrl, | ||
112 | .ctrlbit = S3C_CLKCON_PCLK_IIC, | ||
113 | }, { | ||
114 | .name = "iis", | ||
115 | .id = 0, | ||
116 | .parent = &clk_p, | ||
117 | .enable = s3c64xx_pclk_ctrl, | ||
118 | .ctrlbit = S3C_CLKCON_PCLK_IIS0, | ||
119 | }, { | ||
120 | .name = "iis", | ||
121 | .id = 1, | ||
122 | .parent = &clk_p, | ||
123 | .enable = s3c64xx_pclk_ctrl, | ||
124 | .ctrlbit = S3C_CLKCON_PCLK_IIS1, | ||
125 | }, { | ||
126 | .name = "spi", | ||
127 | .id = 0, | ||
128 | .parent = &clk_p, | ||
129 | .enable = s3c64xx_pclk_ctrl, | ||
130 | .ctrlbit = S3C_CLKCON_PCLK_SPI0, | ||
131 | }, { | ||
132 | .name = "spi", | ||
133 | .id = 1, | ||
134 | .parent = &clk_p, | ||
135 | .enable = s3c64xx_pclk_ctrl, | ||
136 | .ctrlbit = S3C_CLKCON_PCLK_SPI1, | ||
137 | }, { | ||
138 | .name = "48m", | ||
139 | .id = 0, | ||
140 | .parent = &clk_48m, | ||
141 | .enable = s3c64xx_sclk_ctrl, | ||
142 | .ctrlbit = S3C_CLKCON_SCLK_MMC0_48, | ||
143 | }, { | ||
144 | .name = "48m", | ||
145 | .id = 1, | ||
146 | .parent = &clk_48m, | ||
147 | .enable = s3c64xx_sclk_ctrl, | ||
148 | .ctrlbit = S3C_CLKCON_SCLK_MMC1_48, | ||
149 | }, { | ||
150 | .name = "48m", | ||
151 | .id = 2, | ||
152 | .parent = &clk_48m, | ||
153 | .enable = s3c64xx_sclk_ctrl, | ||
154 | .ctrlbit = S3C_CLKCON_SCLK_MMC2_48, | ||
155 | }, | ||
156 | }; | ||
157 | |||
158 | static struct clk init_clocks[] = { | ||
159 | { | ||
160 | .name = "lcd", | ||
161 | .id = -1, | ||
162 | .parent = &clk_h, | ||
163 | .enable = s3c64xx_hclk_ctrl, | ||
164 | .ctrlbit = S3C_CLKCON_HCLK_LCD, | ||
165 | }, { | ||
166 | .name = "gpio", | ||
167 | .id = -1, | ||
168 | .parent = &clk_p, | ||
169 | .enable = s3c64xx_pclk_ctrl, | ||
170 | .ctrlbit = S3C_CLKCON_PCLK_GPIO, | ||
171 | }, { | ||
172 | .name = "usb-host", | ||
173 | .id = -1, | ||
174 | .parent = &clk_h, | ||
175 | .enable = s3c64xx_hclk_ctrl, | ||
176 | .ctrlbit = S3C_CLKCON_SCLK_UHOST, | ||
177 | }, { | ||
178 | .name = "hsmmc", | ||
179 | .id = 0, | ||
180 | .parent = &clk_h, | ||
181 | .enable = s3c64xx_hclk_ctrl, | ||
182 | .ctrlbit = S3C_CLKCON_HCLK_HSMMC0, | ||
183 | }, { | ||
184 | .name = "hsmmc", | ||
185 | .id = 1, | ||
186 | .parent = &clk_h, | ||
187 | .enable = s3c64xx_hclk_ctrl, | ||
188 | .ctrlbit = S3C_CLKCON_HCLK_HSMMC1, | ||
189 | }, { | ||
190 | .name = "hsmmc", | ||
191 | .id = 2, | ||
192 | .parent = &clk_h, | ||
193 | .enable = s3c64xx_hclk_ctrl, | ||
194 | .ctrlbit = S3C_CLKCON_HCLK_HSMMC2, | ||
195 | }, { | ||
196 | .name = "timers", | ||
197 | .id = -1, | ||
198 | .parent = &clk_p, | ||
199 | .enable = s3c64xx_pclk_ctrl, | ||
200 | .ctrlbit = S3C_CLKCON_PCLK_PWM, | ||
201 | }, { | ||
202 | .name = "uart", | ||
203 | .id = 0, | ||
204 | .parent = &clk_p, | ||
205 | .enable = s3c64xx_pclk_ctrl, | ||
206 | .ctrlbit = S3C_CLKCON_PCLK_UART0, | ||
207 | }, { | ||
208 | .name = "uart", | ||
209 | .id = 1, | ||
210 | .parent = &clk_p, | ||
211 | .enable = s3c64xx_pclk_ctrl, | ||
212 | .ctrlbit = S3C_CLKCON_PCLK_UART1, | ||
213 | }, { | ||
214 | .name = "uart", | ||
215 | .id = 2, | ||
216 | .parent = &clk_p, | ||
217 | .enable = s3c64xx_pclk_ctrl, | ||
218 | .ctrlbit = S3C_CLKCON_PCLK_UART2, | ||
219 | }, { | ||
220 | .name = "uart", | ||
221 | .id = 3, | ||
222 | .parent = &clk_p, | ||
223 | .enable = s3c64xx_pclk_ctrl, | ||
224 | .ctrlbit = S3C_CLKCON_PCLK_UART3, | ||
225 | }, { | ||
226 | .name = "rtc", | ||
227 | .id = -1, | ||
228 | .parent = &clk_p, | ||
229 | .enable = s3c64xx_pclk_ctrl, | ||
230 | .ctrlbit = S3C_CLKCON_PCLK_RTC, | ||
231 | }, { | ||
232 | .name = "watchdog", | ||
233 | .id = -1, | ||
234 | .parent = &clk_p, | ||
235 | .ctrlbit = S3C_CLKCON_PCLK_WDT, | ||
236 | }, { | ||
237 | .name = "ac97", | ||
238 | .id = -1, | ||
239 | .parent = &clk_p, | ||
240 | .ctrlbit = S3C_CLKCON_PCLK_AC97, | ||
241 | } | ||
242 | }; | ||
243 | |||
244 | static struct clk *clks[] __initdata = { | ||
245 | &clk_ext, | ||
246 | &clk_epll, | ||
247 | &clk_27m, | ||
248 | &clk_48m, | ||
249 | }; | ||
250 | |||
251 | void s3c64xx_register_clocks(void) | ||
252 | { | ||
253 | struct clk *clkp; | ||
254 | int ret; | ||
255 | int ptr; | ||
256 | |||
257 | s3c24xx_register_clocks(clks, ARRAY_SIZE(clks)); | ||
258 | |||
259 | clkp = init_clocks; | ||
260 | for (ptr = 0; ptr < ARRAY_SIZE(init_clocks); ptr++, clkp++) { | ||
261 | ret = s3c24xx_register_clock(clkp); | ||
262 | if (ret < 0) { | ||
263 | printk(KERN_ERR "Failed to register clock %s (%d)\n", | ||
264 | clkp->name, ret); | ||
265 | } | ||
266 | } | ||
267 | |||
268 | clkp = init_clocks_disable; | ||
269 | for (ptr = 0; ptr < ARRAY_SIZE(init_clocks_disable); ptr++, clkp++) { | ||
270 | |||
271 | ret = s3c24xx_register_clock(clkp); | ||
272 | if (ret < 0) { | ||
273 | printk(KERN_ERR "Failed to register clock %s (%d)\n", | ||
274 | clkp->name, ret); | ||
275 | } | ||
276 | |||
277 | (clkp->enable)(clkp, 0); | ||
278 | } | ||
279 | |||
280 | s3c_pwmclk_init(); | ||
281 | } | ||
diff --git a/arch/arm/plat-s3c64xx/cpu.c b/arch/arm/plat-s3c64xx/cpu.c new file mode 100644 index 000000000000..fbde183a4560 --- /dev/null +++ b/arch/arm/plat-s3c64xx/cpu.c | |||
@@ -0,0 +1,114 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/cpu.c | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * S3C64XX CPU Support | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/init.h> | ||
16 | #include <linux/module.h> | ||
17 | #include <linux/interrupt.h> | ||
18 | #include <linux/ioport.h> | ||
19 | #include <linux/serial_core.h> | ||
20 | #include <linux/platform_device.h> | ||
21 | #include <linux/io.h> | ||
22 | |||
23 | #include <mach/hardware.h> | ||
24 | #include <mach/map.h> | ||
25 | |||
26 | #include <asm/mach/arch.h> | ||
27 | #include <asm/mach/map.h> | ||
28 | |||
29 | #include <plat/regs-serial.h> | ||
30 | |||
31 | #include <plat/cpu.h> | ||
32 | #include <plat/devs.h> | ||
33 | #include <plat/clock.h> | ||
34 | |||
35 | #include <plat/s3c6400.h> | ||
36 | #include <plat/s3c6410.h> | ||
37 | |||
38 | /* table of supported CPUs */ | ||
39 | |||
40 | static const char name_s3c6400[] = "S3C6400"; | ||
41 | static const char name_s3c6410[] = "S3C6410"; | ||
42 | |||
43 | static struct cpu_table cpu_ids[] __initdata = { | ||
44 | { | ||
45 | .idcode = 0x36400000, | ||
46 | .idmask = 0xfffff000, | ||
47 | .map_io = s3c6400_map_io, | ||
48 | .init_clocks = s3c6400_init_clocks, | ||
49 | .init_uarts = s3c6400_init_uarts, | ||
50 | .init = s3c6400_init, | ||
51 | .name = name_s3c6400, | ||
52 | }, { | ||
53 | .idcode = 0x36410100, | ||
54 | .idmask = 0xffffff00, | ||
55 | .map_io = s3c6410_map_io, | ||
56 | .init_clocks = s3c6410_init_clocks, | ||
57 | .init_uarts = s3c6410_init_uarts, | ||
58 | .init = s3c6410_init, | ||
59 | .name = name_s3c6410, | ||
60 | }, | ||
61 | }; | ||
62 | |||
63 | /* minimal IO mapping */ | ||
64 | |||
65 | /* see notes on uart map in arch/arm/mach-s3c6400/include/mach/debug-macro.S */ | ||
66 | #define UART_OFFS (S3C_PA_UART & 0xfffff) | ||
67 | |||
68 | static struct map_desc s3c_iodesc[] __initdata = { | ||
69 | { | ||
70 | .virtual = (unsigned long)S3C_VA_SYS, | ||
71 | .pfn = __phys_to_pfn(S3C64XX_PA_SYSCON), | ||
72 | .length = SZ_4K, | ||
73 | .type = MT_DEVICE, | ||
74 | }, { | ||
75 | .virtual = (unsigned long)(S3C_VA_UART + UART_OFFS), | ||
76 | .pfn = __phys_to_pfn(S3C_PA_UART), | ||
77 | .length = SZ_4K, | ||
78 | .type = MT_DEVICE, | ||
79 | }, { | ||
80 | .virtual = (unsigned long)S3C_VA_VIC0, | ||
81 | .pfn = __phys_to_pfn(S3C64XX_PA_VIC0), | ||
82 | .length = SZ_16K, | ||
83 | .type = MT_DEVICE, | ||
84 | }, { | ||
85 | .virtual = (unsigned long)S3C_VA_VIC1, | ||
86 | .pfn = __phys_to_pfn(S3C64XX_PA_VIC1), | ||
87 | .length = SZ_16K, | ||
88 | .type = MT_DEVICE, | ||
89 | }, { | ||
90 | .virtual = (unsigned long)S3C_VA_TIMER, | ||
91 | .pfn = __phys_to_pfn(S3C_PA_TIMER), | ||
92 | .length = SZ_16K, | ||
93 | .type = MT_DEVICE, | ||
94 | }, { | ||
95 | .virtual = (unsigned long)S3C64XX_VA_GPIO, | ||
96 | .pfn = __phys_to_pfn(S3C64XX_PA_GPIO), | ||
97 | .length = SZ_4K, | ||
98 | .type = MT_DEVICE, | ||
99 | }, | ||
100 | }; | ||
101 | |||
102 | /* read cpu identification code */ | ||
103 | |||
104 | void __init s3c64xx_init_io(struct map_desc *mach_desc, int size) | ||
105 | { | ||
106 | unsigned long idcode; | ||
107 | |||
108 | /* initialise the io descriptors we need for initialisation */ | ||
109 | iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc)); | ||
110 | iotable_init(mach_desc, size); | ||
111 | |||
112 | idcode = __raw_readl(S3C_VA_SYS + 0x118); | ||
113 | s3c_init_cpu(idcode, cpu_ids, ARRAY_SIZE(cpu_ids)); | ||
114 | } | ||
diff --git a/arch/arm/plat-s3c64xx/dev-uart.c b/arch/arm/plat-s3c64xx/dev-uart.c new file mode 100644 index 000000000000..62c11a6fc7ba --- /dev/null +++ b/arch/arm/plat-s3c64xx/dev-uart.c | |||
@@ -0,0 +1,176 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/dev-uart.c | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * Base S3C64XX UART resource and device definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/types.h> | ||
18 | #include <linux/interrupt.h> | ||
19 | #include <linux/list.h> | ||
20 | #include <linux/platform_device.h> | ||
21 | |||
22 | #include <asm/mach/arch.h> | ||
23 | #include <asm/mach/irq.h> | ||
24 | #include <mach/hardware.h> | ||
25 | #include <mach/map.h> | ||
26 | |||
27 | #include <plat/devs.h> | ||
28 | |||
29 | /* Serial port registrations */ | ||
30 | |||
31 | /* 64xx uarts are closer together */ | ||
32 | |||
33 | static struct resource s3c64xx_uart0_resource[] = { | ||
34 | [0] = { | ||
35 | .start = S3C_PA_UART0, | ||
36 | .end = S3C_PA_UART0 + 0x100, | ||
37 | .flags = IORESOURCE_MEM, | ||
38 | }, | ||
39 | [1] = { | ||
40 | .start = IRQ_S3CUART_RX0, | ||
41 | .end = IRQ_S3CUART_RX0, | ||
42 | .flags = IORESOURCE_IRQ, | ||
43 | }, | ||
44 | [2] = { | ||
45 | .start = IRQ_S3CUART_TX0, | ||
46 | .end = IRQ_S3CUART_TX0, | ||
47 | .flags = IORESOURCE_IRQ, | ||
48 | |||
49 | }, | ||
50 | [3] = { | ||
51 | .start = IRQ_S3CUART_ERR0, | ||
52 | .end = IRQ_S3CUART_ERR0, | ||
53 | .flags = IORESOURCE_IRQ, | ||
54 | } | ||
55 | }; | ||
56 | |||
57 | static struct resource s3c64xx_uart1_resource[] = { | ||
58 | [0] = { | ||
59 | .start = S3C_PA_UART1, | ||
60 | .end = S3C_PA_UART1 + 0x100, | ||
61 | .flags = IORESOURCE_MEM, | ||
62 | }, | ||
63 | [1] = { | ||
64 | .start = IRQ_S3CUART_RX1, | ||
65 | .end = IRQ_S3CUART_RX1, | ||
66 | .flags = IORESOURCE_IRQ, | ||
67 | }, | ||
68 | [2] = { | ||
69 | .start = IRQ_S3CUART_TX1, | ||
70 | .end = IRQ_S3CUART_TX1, | ||
71 | .flags = IORESOURCE_IRQ, | ||
72 | |||
73 | }, | ||
74 | [3] = { | ||
75 | .start = IRQ_S3CUART_ERR1, | ||
76 | .end = IRQ_S3CUART_ERR1, | ||
77 | .flags = IORESOURCE_IRQ, | ||
78 | }, | ||
79 | }; | ||
80 | |||
81 | static struct resource s3c6xx_uart2_resource[] = { | ||
82 | [0] = { | ||
83 | .start = S3C_PA_UART2, | ||
84 | .end = S3C_PA_UART2 + 0x100, | ||
85 | .flags = IORESOURCE_MEM, | ||
86 | }, | ||
87 | [1] = { | ||
88 | .start = IRQ_S3CUART_RX2, | ||
89 | .end = IRQ_S3CUART_RX2, | ||
90 | .flags = IORESOURCE_IRQ, | ||
91 | }, | ||
92 | [2] = { | ||
93 | .start = IRQ_S3CUART_TX2, | ||
94 | .end = IRQ_S3CUART_TX2, | ||
95 | .flags = IORESOURCE_IRQ, | ||
96 | |||
97 | }, | ||
98 | [3] = { | ||
99 | .start = IRQ_S3CUART_ERR2, | ||
100 | .end = IRQ_S3CUART_ERR2, | ||
101 | .flags = IORESOURCE_IRQ, | ||
102 | }, | ||
103 | }; | ||
104 | |||
105 | static struct resource s3c64xx_uart3_resource[] = { | ||
106 | [0] = { | ||
107 | .start = S3C_PA_UART3, | ||
108 | .end = S3C_PA_UART3 + 0x100, | ||
109 | .flags = IORESOURCE_MEM, | ||
110 | }, | ||
111 | [1] = { | ||
112 | .start = IRQ_S3CUART_RX3, | ||
113 | .end = IRQ_S3CUART_RX3, | ||
114 | .flags = IORESOURCE_IRQ, | ||
115 | }, | ||
116 | [2] = { | ||
117 | .start = IRQ_S3CUART_TX3, | ||
118 | .end = IRQ_S3CUART_TX3, | ||
119 | .flags = IORESOURCE_IRQ, | ||
120 | |||
121 | }, | ||
122 | [3] = { | ||
123 | .start = IRQ_S3CUART_ERR3, | ||
124 | .end = IRQ_S3CUART_ERR3, | ||
125 | .flags = IORESOURCE_IRQ, | ||
126 | }, | ||
127 | }; | ||
128 | |||
129 | |||
130 | struct s3c24xx_uart_resources s3c64xx_uart_resources[] __initdata = { | ||
131 | [0] = { | ||
132 | .resources = s3c64xx_uart0_resource, | ||
133 | .nr_resources = ARRAY_SIZE(s3c64xx_uart0_resource), | ||
134 | }, | ||
135 | [1] = { | ||
136 | .resources = s3c64xx_uart1_resource, | ||
137 | .nr_resources = ARRAY_SIZE(s3c64xx_uart1_resource), | ||
138 | }, | ||
139 | [2] = { | ||
140 | .resources = s3c6xx_uart2_resource, | ||
141 | .nr_resources = ARRAY_SIZE(s3c6xx_uart2_resource), | ||
142 | }, | ||
143 | [3] = { | ||
144 | .resources = s3c64xx_uart3_resource, | ||
145 | .nr_resources = ARRAY_SIZE(s3c64xx_uart3_resource), | ||
146 | }, | ||
147 | }; | ||
148 | |||
149 | /* uart devices */ | ||
150 | |||
151 | static struct platform_device s3c24xx_uart_device0 = { | ||
152 | .id = 0, | ||
153 | }; | ||
154 | |||
155 | static struct platform_device s3c24xx_uart_device1 = { | ||
156 | .id = 1, | ||
157 | }; | ||
158 | |||
159 | static struct platform_device s3c24xx_uart_device2 = { | ||
160 | .id = 2, | ||
161 | }; | ||
162 | |||
163 | static struct platform_device s3c24xx_uart_device3 = { | ||
164 | .id = 3, | ||
165 | }; | ||
166 | |||
167 | struct platform_device *s3c24xx_uart_src[4] = { | ||
168 | &s3c24xx_uart_device0, | ||
169 | &s3c24xx_uart_device1, | ||
170 | &s3c24xx_uart_device2, | ||
171 | &s3c24xx_uart_device3, | ||
172 | }; | ||
173 | |||
174 | struct platform_device *s3c24xx_uart_devs[4] = { | ||
175 | }; | ||
176 | |||
diff --git a/arch/arm/plat-s3c64xx/gpiolib.c b/arch/arm/plat-s3c64xx/gpiolib.c new file mode 100644 index 000000000000..cc62941d7b5c --- /dev/null +++ b/arch/arm/plat-s3c64xx/gpiolib.c | |||
@@ -0,0 +1,420 @@ | |||
1 | /* arch/arm/plat-s3c64xx/gpiolib.c | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * S3C64XX - GPIOlib support | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/irq.h> | ||
17 | #include <linux/io.h> | ||
18 | |||
19 | #include <mach/map.h> | ||
20 | #include <mach/gpio.h> | ||
21 | #include <mach/gpio-core.h> | ||
22 | |||
23 | #include <plat/gpio-cfg.h> | ||
24 | #include <plat/gpio-cfg-helpers.h> | ||
25 | #include <plat/regs-gpio.h> | ||
26 | |||
27 | /* GPIO bank summary: | ||
28 | * | ||
29 | * Bank GPIOs Style SlpCon ExtInt Group | ||
30 | * A 8 4Bit Yes 1 | ||
31 | * B 7 4Bit Yes 1 | ||
32 | * C 8 4Bit Yes 2 | ||
33 | * D 5 4Bit Yes 3 | ||
34 | * E 5 4Bit Yes None | ||
35 | * F 16 2Bit Yes 4 [1] | ||
36 | * G 7 4Bit Yes 5 | ||
37 | * H 10 4Bit[2] Yes 6 | ||
38 | * I 16 2Bit Yes None | ||
39 | * J 12 2Bit Yes None | ||
40 | * K 16 4Bit[2] No None | ||
41 | * L 15 4Bit[2] No None | ||
42 | * M 6 4Bit No IRQ_EINT | ||
43 | * N 16 2Bit No IRQ_EINT | ||
44 | * O 16 2Bit Yes 7 | ||
45 | * P 15 2Bit Yes 8 | ||
46 | * Q 9 2Bit Yes 9 | ||
47 | * | ||
48 | * [1] BANKF pins 14,15 do not form part of the external interrupt sources | ||
49 | * [2] BANK has two control registers, GPxCON0 and GPxCON1 | ||
50 | */ | ||
51 | |||
52 | #define OFF_GPCON (0x00) | ||
53 | #define OFF_GPDAT (0x04) | ||
54 | |||
55 | #define con_4bit_shift(__off) ((__off) * 4) | ||
56 | |||
57 | #if 1 | ||
58 | #define gpio_dbg(x...) do { } while(0) | ||
59 | #else | ||
60 | #define gpio_dbg(x...) printk(KERN_DEBUG ## x) | ||
61 | #endif | ||
62 | |||
63 | /* The s3c64xx_gpiolib_4bit routines are to control the gpio banks where | ||
64 | * the gpio configuration register (GPxCON) has 4 bits per GPIO, as the | ||
65 | * following example: | ||
66 | * | ||
67 | * base + 0x00: Control register, 4 bits per gpio | ||
68 | * gpio n: 4 bits starting at (4*n) | ||
69 | * 0000 = input, 0001 = output, others mean special-function | ||
70 | * base + 0x04: Data register, 1 bit per gpio | ||
71 | * bit n: data bit n | ||
72 | * | ||
73 | * Note, since the data register is one bit per gpio and is at base + 0x4 | ||
74 | * we can use s3c_gpiolib_get and s3c_gpiolib_set to change the state of | ||
75 | * the output. | ||
76 | */ | ||
77 | |||
78 | static int s3c64xx_gpiolib_4bit_input(struct gpio_chip *chip, unsigned offset) | ||
79 | { | ||
80 | struct s3c_gpio_chip *ourchip = to_s3c_gpio(chip); | ||
81 | void __iomem *base = ourchip->base; | ||
82 | unsigned long con; | ||
83 | |||
84 | con = __raw_readl(base + OFF_GPCON); | ||
85 | con &= ~(0xf << con_4bit_shift(offset)); | ||
86 | __raw_writel(con, base + OFF_GPCON); | ||
87 | |||
88 | gpio_dbg("%s: %p: CON now %08lx\n", __func__, base, con); | ||
89 | |||
90 | return 0; | ||
91 | } | ||
92 | |||
93 | static int s3c64xx_gpiolib_4bit_output(struct gpio_chip *chip, | ||
94 | unsigned offset, int value) | ||
95 | { | ||
96 | struct s3c_gpio_chip *ourchip = to_s3c_gpio(chip); | ||
97 | void __iomem *base = ourchip->base; | ||
98 | unsigned long con; | ||
99 | unsigned long dat; | ||
100 | |||
101 | con = __raw_readl(base + OFF_GPCON); | ||
102 | con &= ~(0xf << con_4bit_shift(offset)); | ||
103 | con |= 0x1 << con_4bit_shift(offset); | ||
104 | |||
105 | dat = __raw_readl(base + OFF_GPDAT); | ||
106 | if (value) | ||
107 | dat |= 1 << offset; | ||
108 | else | ||
109 | dat &= ~(1 << offset); | ||
110 | |||
111 | __raw_writel(dat, base + OFF_GPDAT); | ||
112 | __raw_writel(con, base + OFF_GPCON); | ||
113 | __raw_writel(dat, base + OFF_GPDAT); | ||
114 | |||
115 | gpio_dbg("%s: %p: CON %08lx, DAT %08lx\n", __func__, base, con, dat); | ||
116 | |||
117 | return 0; | ||
118 | } | ||
119 | |||
120 | /* The next set of routines are for the case where the GPIO configuration | ||
121 | * registers are 4 bits per GPIO but there is more than one register (the | ||
122 | * bank has more than 8 GPIOs. | ||
123 | * | ||
124 | * This case is the similar to the 4 bit case, but the registers are as | ||
125 | * follows: | ||
126 | * | ||
127 | * base + 0x00: Control register, 4 bits per gpio (lower 8 GPIOs) | ||
128 | * gpio n: 4 bits starting at (4*n) | ||
129 | * 0000 = input, 0001 = output, others mean special-function | ||
130 | * base + 0x04: Control register, 4 bits per gpio (up to 8 additions GPIOs) | ||
131 | * gpio n: 4 bits starting at (4*n) | ||
132 | * 0000 = input, 0001 = output, others mean special-function | ||
133 | * base + 0x08: Data register, 1 bit per gpio | ||
134 | * bit n: data bit n | ||
135 | * | ||
136 | * To allow us to use the s3c_gpiolib_get and s3c_gpiolib_set routines we | ||
137 | * store the 'base + 0x4' address so that these routines see the data | ||
138 | * register at ourchip->base + 0x04. | ||
139 | */ | ||
140 | |||
141 | static int s3c64xx_gpiolib_4bit2_input(struct gpio_chip *chip, unsigned offset) | ||
142 | { | ||
143 | struct s3c_gpio_chip *ourchip = to_s3c_gpio(chip); | ||
144 | void __iomem *base = ourchip->base; | ||
145 | void __iomem *regcon = base; | ||
146 | unsigned long con; | ||
147 | |||
148 | if (offset > 7) | ||
149 | offset -= 8; | ||
150 | else | ||
151 | regcon -= 4; | ||
152 | |||
153 | con = __raw_readl(regcon); | ||
154 | con &= ~(0xf << con_4bit_shift(offset)); | ||
155 | __raw_writel(con, regcon); | ||
156 | |||
157 | gpio_dbg("%s: %p: CON %08lx\n", __func__, base, con); | ||
158 | |||
159 | return 0; | ||
160 | |||
161 | } | ||
162 | |||
163 | static int s3c64xx_gpiolib_4bit2_output(struct gpio_chip *chip, | ||
164 | unsigned offset, int value) | ||
165 | { | ||
166 | struct s3c_gpio_chip *ourchip = to_s3c_gpio(chip); | ||
167 | void __iomem *base = ourchip->base; | ||
168 | void __iomem *regcon = base; | ||
169 | unsigned long con; | ||
170 | unsigned long dat; | ||
171 | |||
172 | if (offset > 7) | ||
173 | offset -= 8; | ||
174 | else | ||
175 | regcon -= 4; | ||
176 | |||
177 | con = __raw_readl(regcon); | ||
178 | con &= ~(0xf << con_4bit_shift(offset)); | ||
179 | con |= 0x1 << con_4bit_shift(offset); | ||
180 | |||
181 | dat = __raw_readl(base + OFF_GPDAT); | ||
182 | if (value) | ||
183 | dat |= 1 << offset; | ||
184 | else | ||
185 | dat &= ~(1 << offset); | ||
186 | |||
187 | __raw_writel(dat, base + OFF_GPDAT); | ||
188 | __raw_writel(con, regcon); | ||
189 | __raw_writel(dat, base + OFF_GPDAT); | ||
190 | |||
191 | gpio_dbg("%s: %p: CON %08lx, DAT %08lx\n", __func__, base, con, dat); | ||
192 | |||
193 | return 0; | ||
194 | } | ||
195 | |||
196 | static struct s3c_gpio_cfg gpio_4bit_cfg_noint = { | ||
197 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | ||
198 | .set_pull = s3c_gpio_setpull_updown, | ||
199 | .get_pull = s3c_gpio_getpull_updown, | ||
200 | }; | ||
201 | |||
202 | static struct s3c_gpio_cfg gpio_4bit_cfg_eint0111 = { | ||
203 | .cfg_eint = 7, | ||
204 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | ||
205 | .set_pull = s3c_gpio_setpull_updown, | ||
206 | .get_pull = s3c_gpio_getpull_updown, | ||
207 | }; | ||
208 | |||
209 | static struct s3c_gpio_cfg gpio_4bit_cfg_eint0011 = { | ||
210 | .cfg_eint = 3, | ||
211 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | ||
212 | .set_pull = s3c_gpio_setpull_updown, | ||
213 | .get_pull = s3c_gpio_getpull_updown, | ||
214 | }; | ||
215 | |||
216 | static struct s3c_gpio_chip gpio_4bit[] = { | ||
217 | { | ||
218 | .base = S3C64XX_GPA_BASE, | ||
219 | .config = &gpio_4bit_cfg_eint0111, | ||
220 | .chip = { | ||
221 | .base = S3C64XX_GPA(0), | ||
222 | .ngpio = S3C64XX_GPIO_A_NR, | ||
223 | .label = "GPA", | ||
224 | }, | ||
225 | }, { | ||
226 | .base = S3C64XX_GPB_BASE, | ||
227 | .config = &gpio_4bit_cfg_eint0111, | ||
228 | .chip = { | ||
229 | .base = S3C64XX_GPB(0), | ||
230 | .ngpio = S3C64XX_GPIO_B_NR, | ||
231 | .label = "GPB", | ||
232 | }, | ||
233 | }, { | ||
234 | .base = S3C64XX_GPC_BASE, | ||
235 | .config = &gpio_4bit_cfg_eint0111, | ||
236 | .chip = { | ||
237 | .base = S3C64XX_GPC(0), | ||
238 | .ngpio = S3C64XX_GPIO_C_NR, | ||
239 | .label = "GPC", | ||
240 | }, | ||
241 | }, { | ||
242 | .base = S3C64XX_GPD_BASE, | ||
243 | .config = &gpio_4bit_cfg_eint0111, | ||
244 | .chip = { | ||
245 | .base = S3C64XX_GPD(0), | ||
246 | .ngpio = S3C64XX_GPIO_D_NR, | ||
247 | .label = "GPD", | ||
248 | }, | ||
249 | }, { | ||
250 | .base = S3C64XX_GPE_BASE, | ||
251 | .config = &gpio_4bit_cfg_noint, | ||
252 | .chip = { | ||
253 | .base = S3C64XX_GPE(0), | ||
254 | .ngpio = S3C64XX_GPIO_E_NR, | ||
255 | .label = "GPE", | ||
256 | }, | ||
257 | }, { | ||
258 | .base = S3C64XX_GPG_BASE, | ||
259 | .config = &gpio_4bit_cfg_eint0111, | ||
260 | .chip = { | ||
261 | .base = S3C64XX_GPG(0), | ||
262 | .ngpio = S3C64XX_GPIO_G_NR, | ||
263 | .label = "GPG", | ||
264 | }, | ||
265 | }, { | ||
266 | .base = S3C64XX_GPM_BASE, | ||
267 | .config = &gpio_4bit_cfg_eint0011, | ||
268 | .chip = { | ||
269 | .base = S3C64XX_GPM(0), | ||
270 | .ngpio = S3C64XX_GPIO_M_NR, | ||
271 | .label = "GPM", | ||
272 | }, | ||
273 | }, | ||
274 | }; | ||
275 | |||
276 | static struct s3c_gpio_chip gpio_4bit2[] = { | ||
277 | { | ||
278 | .base = S3C64XX_GPH_BASE + 0x4, | ||
279 | .config = &gpio_4bit_cfg_eint0111, | ||
280 | .chip = { | ||
281 | .base = S3C64XX_GPH(0), | ||
282 | .ngpio = S3C64XX_GPIO_H_NR, | ||
283 | .label = "GPH", | ||
284 | }, | ||
285 | }, { | ||
286 | .base = S3C64XX_GPK_BASE + 0x4, | ||
287 | .config = &gpio_4bit_cfg_noint, | ||
288 | .chip = { | ||
289 | .base = S3C64XX_GPK(0), | ||
290 | .ngpio = S3C64XX_GPIO_K_NR, | ||
291 | .label = "GPK", | ||
292 | }, | ||
293 | }, { | ||
294 | .base = S3C64XX_GPL_BASE + 0x4, | ||
295 | .config = &gpio_4bit_cfg_eint0011, | ||
296 | .chip = { | ||
297 | .base = S3C64XX_GPL(0), | ||
298 | .ngpio = S3C64XX_GPIO_L_NR, | ||
299 | .label = "GPL", | ||
300 | }, | ||
301 | }, | ||
302 | }; | ||
303 | |||
304 | static struct s3c_gpio_cfg gpio_2bit_cfg_noint = { | ||
305 | .set_config = s3c_gpio_setcfg_s3c24xx, | ||
306 | .set_pull = s3c_gpio_setpull_updown, | ||
307 | .get_pull = s3c_gpio_getpull_updown, | ||
308 | }; | ||
309 | |||
310 | static struct s3c_gpio_cfg gpio_2bit_cfg_eint10 = { | ||
311 | .cfg_eint = 2, | ||
312 | .set_config = s3c_gpio_setcfg_s3c24xx, | ||
313 | .set_pull = s3c_gpio_setpull_updown, | ||
314 | .get_pull = s3c_gpio_getpull_updown, | ||
315 | }; | ||
316 | |||
317 | static struct s3c_gpio_cfg gpio_2bit_cfg_eint11 = { | ||
318 | .cfg_eint = 3, | ||
319 | .set_config = s3c_gpio_setcfg_s3c24xx, | ||
320 | .set_pull = s3c_gpio_setpull_updown, | ||
321 | .get_pull = s3c_gpio_getpull_updown, | ||
322 | }; | ||
323 | |||
324 | static struct s3c_gpio_chip gpio_2bit[] = { | ||
325 | { | ||
326 | .base = S3C64XX_GPF_BASE, | ||
327 | .config = &gpio_2bit_cfg_eint11, | ||
328 | .chip = { | ||
329 | .base = S3C64XX_GPF(0), | ||
330 | .ngpio = S3C64XX_GPIO_F_NR, | ||
331 | .label = "GPF", | ||
332 | }, | ||
333 | }, { | ||
334 | .base = S3C64XX_GPI_BASE, | ||
335 | .config = &gpio_2bit_cfg_noint, | ||
336 | .chip = { | ||
337 | .base = S3C64XX_GPI(0), | ||
338 | .ngpio = S3C64XX_GPIO_I_NR, | ||
339 | .label = "GPI", | ||
340 | }, | ||
341 | }, { | ||
342 | .base = S3C64XX_GPJ_BASE, | ||
343 | .config = &gpio_2bit_cfg_noint, | ||
344 | .chip = { | ||
345 | .base = S3C64XX_GPJ(0), | ||
346 | .ngpio = S3C64XX_GPIO_J_NR, | ||
347 | .label = "GPJ", | ||
348 | }, | ||
349 | }, { | ||
350 | .base = S3C64XX_GPN_BASE, | ||
351 | .config = &gpio_2bit_cfg_eint10, | ||
352 | .chip = { | ||
353 | .base = S3C64XX_GPN(0), | ||
354 | .ngpio = S3C64XX_GPIO_N_NR, | ||
355 | .label = "GPN", | ||
356 | }, | ||
357 | }, { | ||
358 | .base = S3C64XX_GPO_BASE, | ||
359 | .config = &gpio_2bit_cfg_eint11, | ||
360 | .chip = { | ||
361 | .base = S3C64XX_GPO(0), | ||
362 | .ngpio = S3C64XX_GPIO_O_NR, | ||
363 | .label = "GPO", | ||
364 | }, | ||
365 | }, { | ||
366 | .base = S3C64XX_GPP_BASE, | ||
367 | .config = &gpio_2bit_cfg_eint11, | ||
368 | .chip = { | ||
369 | .base = S3C64XX_GPP(0), | ||
370 | .ngpio = S3C64XX_GPIO_P_NR, | ||
371 | .label = "GPP", | ||
372 | }, | ||
373 | }, { | ||
374 | .base = S3C64XX_GPQ_BASE, | ||
375 | .config = &gpio_2bit_cfg_eint11, | ||
376 | .chip = { | ||
377 | .base = S3C64XX_GPQ(0), | ||
378 | .ngpio = S3C64XX_GPIO_Q_NR, | ||
379 | .label = "GPQ", | ||
380 | }, | ||
381 | }, | ||
382 | }; | ||
383 | |||
384 | static __init void s3c64xx_gpiolib_add_4bit(struct s3c_gpio_chip *chip) | ||
385 | { | ||
386 | chip->chip.direction_input = s3c64xx_gpiolib_4bit_input; | ||
387 | chip->chip.direction_output = s3c64xx_gpiolib_4bit_output; | ||
388 | } | ||
389 | |||
390 | static __init void s3c64xx_gpiolib_add_4bit2(struct s3c_gpio_chip *chip) | ||
391 | { | ||
392 | chip->chip.direction_input = s3c64xx_gpiolib_4bit2_input; | ||
393 | chip->chip.direction_output = s3c64xx_gpiolib_4bit2_output; | ||
394 | } | ||
395 | |||
396 | static __init void s3c64xx_gpiolib_add(struct s3c_gpio_chip *chips, | ||
397 | int nr_chips, | ||
398 | void (*fn)(struct s3c_gpio_chip *)) | ||
399 | { | ||
400 | for (; nr_chips > 0; nr_chips--, chips++) { | ||
401 | if (fn) | ||
402 | (fn)(chips); | ||
403 | s3c_gpiolib_add(chips); | ||
404 | } | ||
405 | } | ||
406 | |||
407 | static __init int s3c64xx_gpiolib_init(void) | ||
408 | { | ||
409 | s3c64xx_gpiolib_add(gpio_4bit, ARRAY_SIZE(gpio_4bit), | ||
410 | s3c64xx_gpiolib_add_4bit); | ||
411 | |||
412 | s3c64xx_gpiolib_add(gpio_4bit2, ARRAY_SIZE(gpio_4bit2), | ||
413 | s3c64xx_gpiolib_add_4bit2); | ||
414 | |||
415 | s3c64xx_gpiolib_add(gpio_2bit, ARRAY_SIZE(gpio_2bit), NULL); | ||
416 | |||
417 | return 0; | ||
418 | } | ||
419 | |||
420 | arch_initcall(s3c64xx_gpiolib_init); | ||
diff --git a/arch/arm/plat-s3c64xx/include/plat/gpio-bank-a.h b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-a.h new file mode 100644 index 000000000000..9aa0e427d113 --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-a.h | |||
@@ -0,0 +1,48 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/include/plat/gpio-bank-a.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank A register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPACON (S3C64XX_GPA_BASE + 0x00) | ||
16 | #define S3C64XX_GPADAT (S3C64XX_GPA_BASE + 0x04) | ||
17 | #define S3C64XX_GPAPUD (S3C64XX_GPA_BASE + 0x08) | ||
18 | #define S3C64XX_GPACONSLP (S3C64XX_GPA_BASE + 0x0c) | ||
19 | #define S3C64XX_GPAPUDSLP (S3C64XX_GPA_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPA_CONMASK(__gpio) (0xf << ((__gpio) * 4)) | ||
22 | #define S3C64XX_GPA_INPUT(__gpio) (0x0 << ((__gpio) * 4)) | ||
23 | #define S3C64XX_GPA_OUTPUT(__gpio) (0x1 << ((__gpio) * 4)) | ||
24 | |||
25 | #define S3C64XX_GPA0_UART_RXD0 (0x02 << 0) | ||
26 | #define S3C64XX_GPA0_EINT_G1_0 (0x07 << 0) | ||
27 | |||
28 | #define S3C64XX_GPA1_UART_TXD0 (0x02 << 4) | ||
29 | #define S3C64XX_GPA1_EINT_G1_1 (0x07 << 4) | ||
30 | |||
31 | #define S3C64XX_GPA2_UART_nCTS0 (0x02 << 8) | ||
32 | #define S3C64XX_GPA2_EINT_G1_2 (0x07 << 8) | ||
33 | |||
34 | #define S3C64XX_GPA3_UART_nRTS0 (0x02 << 12) | ||
35 | #define S3C64XX_GPA3_EINT_G1_3 (0x07 << 12) | ||
36 | |||
37 | #define S3C64XX_GPA4_UART_RXD1 (0x02 << 16) | ||
38 | #define S3C64XX_GPA4_EINT_G1_4 (0x07 << 16) | ||
39 | |||
40 | #define S3C64XX_GPA5_UART_TXD1 (0x02 << 20) | ||
41 | #define S3C64XX_GPA5_EINT_G1_5 (0x07 << 20) | ||
42 | |||
43 | #define S3C64XX_GPA6_UART_nCTS1 (0x02 << 24) | ||
44 | #define S3C64XX_GPA6_EINT_G1_6 (0x07 << 24) | ||
45 | |||
46 | #define S3C64XX_GPA7_UART_nRTS1 (0x02 << 28) | ||
47 | #define S3C64XX_GPA7_EINT_G1_7 (0x07 << 28) | ||
48 | |||
diff --git a/arch/arm/plat-s3c64xx/include/plat/gpio-bank-b.h b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-b.h new file mode 100644 index 000000000000..3933adb4d50a --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-b.h | |||
@@ -0,0 +1,60 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/include/plat/gpio-bank-b.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank B register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPBCON (S3C64XX_GPB_BASE + 0x00) | ||
16 | #define S3C64XX_GPBDAT (S3C64XX_GPB_BASE + 0x04) | ||
17 | #define S3C64XX_GPBPUD (S3C64XX_GPB_BASE + 0x08) | ||
18 | #define S3C64XX_GPBCONSLP (S3C64XX_GPB_BASE + 0x0c) | ||
19 | #define S3C64XX_GPBPUDSLP (S3C64XX_GPB_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPB_CONMASK(__gpio) (0xf << ((__gpio) * 4)) | ||
22 | #define S3C64XX_GPB_INPUT(__gpio) (0x0 << ((__gpio) * 4)) | ||
23 | #define S3C64XX_GPB_OUTPUT(__gpio) (0x1 << ((__gpio) * 4)) | ||
24 | |||
25 | #define S3C64XX_GPB0_UART_RXD2 (0x02 << 0) | ||
26 | #define S3C64XX_GPB0_EXTDMA_REQ (0x03 << 0) | ||
27 | #define S3C64XX_GPB0_IrDA_RXD (0x04 << 0) | ||
28 | #define S3C64XX_GPB0_ADDR_CF0 (0x05 << 0) | ||
29 | #define S3C64XX_GPB0_EINT_G1_8 (0x07 << 0) | ||
30 | |||
31 | #define S3C64XX_GPB1_UART_TXD2 (0x02 << 4) | ||
32 | #define S3C64XX_GPB1_EXTDMA_ACK (0x03 << 4) | ||
33 | #define S3C64XX_GPB1_IrDA_TXD (0x04 << 4) | ||
34 | #define S3C64XX_GPB1_ADDR_CF1 (0x05 << 4) | ||
35 | #define S3C64XX_GPB1_EINT_G1_9 (0x07 << 4) | ||
36 | |||
37 | #define S3C64XX_GPB2_UART_RXD3 (0x02 << 8) | ||
38 | #define S3C64XX_GPB2_IrDA_RXD (0x03 << 8) | ||
39 | #define S3C64XX_GPB2_EXTDMA_REQ (0x04 << 8) | ||
40 | #define S3C64XX_GPB2_ADDR_CF2 (0x05 << 8) | ||
41 | #define S3C64XX_GPB2_I2C_SCL1 (0x06 << 8) | ||
42 | #define S3C64XX_GPB2_EINT_G1_10 (0x07 << 8) | ||
43 | |||
44 | #define S3C64XX_GPB3_UART_TXD3 (0x02 << 12) | ||
45 | #define S3C64XX_GPB3_IrDA_TXD (0x03 << 12) | ||
46 | #define S3C64XX_GPB3_EXTDMA_ACK (0x04 << 12) | ||
47 | #define S3C64XX_GPB3_I2C_SDA1 (0x06 << 12) | ||
48 | #define S3C64XX_GPB3_EINT_G1_11 (0x07 << 12) | ||
49 | |||
50 | #define S3C64XX_GPB4_IrDA_SDBW (0x02 << 16) | ||
51 | #define S3C64XX_GPB4_CAM_FIELD (0x03 << 16) | ||
52 | #define S3C64XX_GPB4_CF_DATA_DIR (0x04 << 16) | ||
53 | #define S3C64XX_GPB4_EINT_G1_12 (0x07 << 16) | ||
54 | |||
55 | #define S3C64XX_GPB5_I2C_SCL0 (0x02 << 20) | ||
56 | #define S3C64XX_GPB5_EINT_G1_13 (0x07 << 20) | ||
57 | |||
58 | #define S3C64XX_GPB6_I2C_SDA0 (0x02 << 24) | ||
59 | #define S3C64XX_GPB6_EINT_G1_14 (0x07 << 24) | ||
60 | |||
diff --git a/arch/arm/plat-s3c64xx/include/plat/gpio-bank-c.h b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-c.h new file mode 100644 index 000000000000..c47daf7e2723 --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-c.h | |||
@@ -0,0 +1,53 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/include/plat/gpio-bank-c.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank C register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPCCON (S3C64XX_GPC_BASE + 0x00) | ||
16 | #define S3C64XX_GPCDAT (S3C64XX_GPC_BASE + 0x04) | ||
17 | #define S3C64XX_GPCPUD (S3C64XX_GPC_BASE + 0x08) | ||
18 | #define S3C64XX_GPCCONSLP (S3C64XX_GPC_BASE + 0x0c) | ||
19 | #define S3C64XX_GPCPUDSLP (S3C64XX_GPC_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPC_CONMASK(__gpio) (0xf << ((__gpio) * 4)) | ||
22 | #define S3C64XX_GPC_INPUT(__gpio) (0x0 << ((__gpio) * 4)) | ||
23 | #define S3C64XX_GPC_OUTPUT(__gpio) (0x1 << ((__gpio) * 4)) | ||
24 | |||
25 | #define S3C64XX_GPC0_SPI_MISO0 (0x02 << 0) | ||
26 | #define S3C64XX_GPC0_EINT_G2_0 (0x07 << 0) | ||
27 | |||
28 | #define S3C64XX_GPC1_SPI_CLKO (0x02 << 4) | ||
29 | #define S3C64XX_GPC1_EINT_G2_1 (0x07 << 4) | ||
30 | |||
31 | #define S3C64XX_GPC2_SPI_MOSIO (0x02 << 8) | ||
32 | #define S3C64XX_GPC2_EINT_G2_2 (0x07 << 8) | ||
33 | |||
34 | #define S3C64XX_GPC3_SPI_nCSO (0x02 << 12) | ||
35 | #define S3C64XX_GPC3_EINT_G2_3 (0x07 << 12) | ||
36 | |||
37 | #define S3C64XX_GPC4_SPI_MISO1 (0x02 << 16) | ||
38 | #define S3C64XX_GPC4_MMC2_CMD (0x03 << 16) | ||
39 | #define S3C64XX_GPC4_I2S0_V40_DO (0x05 << 16) | ||
40 | #define S3C64XX_GPC4_EINT_G2_4 (0x07 << 16) | ||
41 | |||
42 | #define S3C64XX_GPC5_SPI_CLK1 (0x02 << 20) | ||
43 | #define S3C64XX_GPC5_MMC2_CLK (0x03 << 20) | ||
44 | #define S3C64XX_GPC5_I2S1_V40_DO (0x05 << 20) | ||
45 | #define S3C64XX_GPC5_EINT_G2_5 (0x07 << 20) | ||
46 | |||
47 | #define S3C64XX_GPC6_SPI_MOSI1 (0x02 << 24) | ||
48 | #define S3C64XX_GPC6_EINT_G2_6 (0x07 << 24) | ||
49 | |||
50 | #define S3C64XX_GPC7_SPI_nCS1 (0x02 << 28) | ||
51 | #define S3C64XX_GPC7_I2S2_V40_DO (0x05 << 28) | ||
52 | #define S3C64XX_GPC7_EINT_G2_7 (0x07 << 28) | ||
53 | |||
diff --git a/arch/arm/plat-s3c64xx/include/plat/gpio-bank-d.h b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-d.h new file mode 100644 index 000000000000..6fe4a49c26f0 --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-d.h | |||
@@ -0,0 +1,49 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/include/plat/gpio-bank-d.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank D register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPDCON (S3C64XX_GPD_BASE + 0x00) | ||
16 | #define S3C64XX_GPDDAT (S3C64XX_GPD_BASE + 0x04) | ||
17 | #define S3C64XX_GPDPUD (S3C64XX_GPD_BASE + 0x08) | ||
18 | #define S3C64XX_GPDCONSLP (S3C64XX_GPD_BASE + 0x0c) | ||
19 | #define S3C64XX_GPDPUDSLP (S3C64XX_GPD_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPD_CONMASK(__gpio) (0xf << ((__gpio) * 4)) | ||
22 | #define S3C64XX_GPD_INPUT(__gpio) (0x0 << ((__gpio) * 4)) | ||
23 | #define S3C64XX_GPD_OUTPUT(__gpio) (0x1 << ((__gpio) * 4)) | ||
24 | |||
25 | #define S3C64XX_GPD0_PCM0_SCLK (0x02 << 0) | ||
26 | #define S3C64XX_GPD0_I2S0_CLK (0x03 << 0) | ||
27 | #define S3C64XX_GPD0_AC97_BITCLK (0x04 << 0) | ||
28 | #define S3C64XX_GPD0_EINT_G3_0 (0x07 << 0) | ||
29 | |||
30 | #define S3C64XX_GPD1_PCM0_EXTCLK (0x02 << 4) | ||
31 | #define S3C64XX_GPD1_I2S0_CDCLK (0x03 << 4) | ||
32 | #define S3C64XX_GPD1_AC97_nRESET (0x04 << 4) | ||
33 | #define S3C64XX_GPD1_EINT_G3_1 (0x07 << 4) | ||
34 | |||
35 | #define S3C64XX_GPD2_PCM0_FSYNC (0x02 << 8) | ||
36 | #define S3C64XX_GPD2_I2S0_LRCLK (0x03 << 8) | ||
37 | #define S3C64XX_GPD2_AC97_SYNC (0x04 << 8) | ||
38 | #define S3C64XX_GPD2_EINT_G3_2 (0x07 << 8) | ||
39 | |||
40 | #define S3C64XX_GPD3_PCM0_SIN (0x02 << 12) | ||
41 | #define S3C64XX_GPD3_I2S0_DI (0x03 << 12) | ||
42 | #define S3C64XX_GPD3_AC97_SDI (0x04 << 12) | ||
43 | #define S3C64XX_GPD3_EINT_G3_3 (0x07 << 12) | ||
44 | |||
45 | #define S3C64XX_GPD4_PCM0_SOUT (0x02 << 16) | ||
46 | #define S3C64XX_GPD4_I2S0_D0 (0x03 << 16) | ||
47 | #define S3C64XX_GPD4_AC97_SDO (0x04 << 16) | ||
48 | #define S3C64XX_GPD4_EINT_G3_4 (0x07 << 16) | ||
49 | |||
diff --git a/arch/arm/plat-s3c64xx/include/plat/gpio-bank-e.h b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-e.h new file mode 100644 index 000000000000..7fcf3d8e0a48 --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-e.h | |||
@@ -0,0 +1,44 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/include/plat/gpio-bank-e.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank E register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPECON (S3C64XX_GPE_BASE + 0x00) | ||
16 | #define S3C64XX_GPEDAT (S3C64XX_GPE_BASE + 0x04) | ||
17 | #define S3C64XX_GPEPUD (S3C64XX_GPE_BASE + 0x08) | ||
18 | #define S3C64XX_GPECONSLP (S3C64XX_GPE_BASE + 0x0c) | ||
19 | #define S3C64XX_GPEPUDSLP (S3C64XX_GPE_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPE_CONMASK(__gpio) (0xf << ((__gpio) * 4)) | ||
22 | #define S3C64XX_GPE_INPUT(__gpio) (0x0 << ((__gpio) * 4)) | ||
23 | #define S3C64XX_GPE_OUTPUT(__gpio) (0x1 << ((__gpio) * 4)) | ||
24 | |||
25 | #define S3C64XX_GPE0_PCM1_SCLK (0x02 << 0) | ||
26 | #define S3C64XX_GPE0_I2S1_CLK (0x03 << 0) | ||
27 | #define S3C64XX_GPE0_AC97_BITCLK (0x04 << 0) | ||
28 | |||
29 | #define S3C64XX_GPE1_PCM1_EXTCLK (0x02 << 4) | ||
30 | #define S3C64XX_GPE1_I2S1_CDCLK (0x03 << 4) | ||
31 | #define S3C64XX_GPE1_AC97_nRESET (0x04 << 4) | ||
32 | |||
33 | #define S3C64XX_GPE2_PCM1_FSYNC (0x02 << 8) | ||
34 | #define S3C64XX_GPE2_I2S1_LRCLK (0x03 << 8) | ||
35 | #define S3C64XX_GPE2_AC97_SYNC (0x04 << 8) | ||
36 | |||
37 | #define S3C64XX_GPE3_PCM1_SIN (0x02 << 12) | ||
38 | #define S3C64XX_GPE3_I2S1_DI (0x03 << 12) | ||
39 | #define S3C64XX_GPE3_AC97_SDI (0x04 << 12) | ||
40 | |||
41 | #define S3C64XX_GPE4_PCM1_SOUT (0x02 << 16) | ||
42 | #define S3C64XX_GPE4_I2S1_D0 (0x03 << 16) | ||
43 | #define S3C64XX_GPE4_AC97_SDO (0x04 << 16) | ||
44 | |||
diff --git a/arch/arm/plat-s3c64xx/include/plat/gpio-bank-f.h b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-f.h new file mode 100644 index 000000000000..f3faff974a18 --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-f.h | |||
@@ -0,0 +1,71 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/include/plat/gpio-bank-f.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank F register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPFCON (S3C64XX_GPF_BASE + 0x00) | ||
16 | #define S3C64XX_GPFDAT (S3C64XX_GPF_BASE + 0x04) | ||
17 | #define S3C64XX_GPFPUD (S3C64XX_GPF_BASE + 0x08) | ||
18 | #define S3C64XX_GPFCONSLP (S3C64XX_GPF_BASE + 0x0c) | ||
19 | #define S3C64XX_GPFPUDSLP (S3C64XX_GPF_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPF_CONMASK(__gpio) (0x3 << ((__gpio) * 2)) | ||
22 | #define S3C64XX_GPF_INPUT(__gpio) (0x0 << ((__gpio) * 2)) | ||
23 | #define S3C64XX_GPF_OUTPUT(__gpio) (0x1 << ((__gpio) * 2)) | ||
24 | |||
25 | #define S3C64XX_GPF0_CAMIF_CLK (0x02 << 0) | ||
26 | #define S3C64XX_GPF0_EINT_G4_0 (0x03 << 0) | ||
27 | |||
28 | #define S3C64XX_GPF1_CAMIF_HREF (0x02 << 2) | ||
29 | #define S3C64XX_GPF1_EINT_G4_1 (0x03 << 2) | ||
30 | |||
31 | #define S3C64XX_GPF2_CAMIF_PCLK (0x02 << 4) | ||
32 | #define S3C64XX_GPF2_EINT_G4_2 (0x03 << 4) | ||
33 | |||
34 | #define S3C64XX_GPF3_CAMIF_nRST (0x02 << 6) | ||
35 | #define S3C64XX_GPF3_EINT_G4_3 (0x03 << 6) | ||
36 | |||
37 | #define S3C64XX_GPF4_CAMIF_VSYNC (0x02 << 8) | ||
38 | #define S3C64XX_GPF4_EINT_G4_4 (0x03 << 8) | ||
39 | |||
40 | #define S3C64XX_GPF5_CAMIF_YDATA0 (0x02 << 10) | ||
41 | #define S3C64XX_GPF5_EINT_G4_5 (0x03 << 10) | ||
42 | |||
43 | #define S3C64XX_GPF6_CAMIF_YDATA1 (0x02 << 12) | ||
44 | #define S3C64XX_GPF6_EINT_G4_6 (0x03 << 12) | ||
45 | |||
46 | #define S3C64XX_GPF7_CAMIF_YDATA2 (0x02 << 14) | ||
47 | #define S3C64XX_GPF7_EINT_G4_7 (0x03 << 14) | ||
48 | |||
49 | #define S3C64XX_GPF8_CAMIF_YDATA3 (0x02 << 16) | ||
50 | #define S3C64XX_GPF8_EINT_G4_8 (0x03 << 16) | ||
51 | |||
52 | #define S3C64XX_GPF9_CAMIF_YDATA4 (0x02 << 18) | ||
53 | #define S3C64XX_GPF9_EINT_G4_9 (0x03 << 18) | ||
54 | |||
55 | #define S3C64XX_GPF10_CAMIF_YDATA5 (0x02 << 20) | ||
56 | #define S3C64XX_GPF10_EINT_G4_10 (0x03 << 20) | ||
57 | |||
58 | #define S3C64XX_GPF11_CAMIF_YDATA6 (0x02 << 22) | ||
59 | #define S3C64XX_GPF11_EINT_G4_11 (0x03 << 22) | ||
60 | |||
61 | #define S3C64XX_GPF12_CAMIF_YDATA7 (0x02 << 24) | ||
62 | #define S3C64XX_GPF12_EINT_G4_12 (0x03 << 24) | ||
63 | |||
64 | #define S3C64XX_GPF13_PWM_ECLK (0x02 << 26) | ||
65 | #define S3C64XX_GPF13_EINT_G4_13 (0x03 << 26) | ||
66 | |||
67 | #define S3C64XX_GPF14_PWM_TOUT0 (0x02 << 28) | ||
68 | #define S3C64XX_GPF14_CLKOUT0 (0x03 << 28) | ||
69 | |||
70 | #define S3C64XX_GPF15_PWM_TOUT1 (0x02 << 30) | ||
71 | |||
diff --git a/arch/arm/plat-s3c64xx/include/plat/gpio-bank-g.h b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-g.h new file mode 100644 index 000000000000..35bbd2378e55 --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-g.h | |||
@@ -0,0 +1,42 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/include/plat/gpio-bank-g.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank G register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPGCON (S3C64XX_GPG_BASE + 0x00) | ||
16 | #define S3C64XX_GPGDAT (S3C64XX_GPG_BASE + 0x04) | ||
17 | #define S3C64XX_GPGPUD (S3C64XX_GPG_BASE + 0x08) | ||
18 | #define S3C64XX_GPGCONSLP (S3C64XX_GPG_BASE + 0x0c) | ||
19 | #define S3C64XX_GPGPUDSLP (S3C64XX_GPG_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPG_CONMASK(__gpio) (0xf << ((__gpio) * 4)) | ||
22 | #define S3C64XX_GPG_INPUT(__gpio) (0x0 << ((__gpio) * 4)) | ||
23 | #define S3C64XX_GPG_OUTPUT(__gpio) (0x1 << ((__gpio) * 4)) | ||
24 | |||
25 | #define S3C64XX_GPG0_MMC0_CLK (0x02 << 0) | ||
26 | #define S3C64XX_GPG0_EINT_G5_0 (0x07 << 0) | ||
27 | |||
28 | #define S3C64XX_GPG1_MMC0_CMD (0x02 << 4) | ||
29 | #define S3C64XX_GPG1_EINT_G5_1 (0x07 << 4) | ||
30 | |||
31 | #define S3C64XX_GPG2_MMC0_DATA0 (0x02 << 8) | ||
32 | #define S3C64XX_GPG2_EINT_G5_2 (0x07 << 8) | ||
33 | |||
34 | #define S3C64XX_GPG3_MMC0_DATA1 (0x02 << 12) | ||
35 | #define S3C64XX_GPG3_EINT_G5_3 (0x07 << 12) | ||
36 | |||
37 | #define S3C64XX_GPG4_MMC0_DATA2 (0x02 << 16) | ||
38 | #define S3C64XX_GPG4_EINT_G5_4 (0x07 << 16) | ||
39 | |||
40 | #define S3C64XX_GPG5_MMC0_DATA3 (0x02 << 20) | ||
41 | #define S3C64XX_GPG5_EINT_G5_5 (0x07 << 20) | ||
42 | |||
diff --git a/arch/arm/plat-s3c64xx/include/plat/gpio-bank-h.h b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-h.h new file mode 100644 index 000000000000..81549516572f --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-h.h | |||
@@ -0,0 +1,74 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/include/plat/gpio-bank-h.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank H register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPHCON0 (S3C64XX_GPH_BASE + 0x00) | ||
16 | #define S3C64XX_GPHCON1 (S3C64XX_GPH_BASE + 0x04) | ||
17 | #define S3C64XX_GPHDAT (S3C64XX_GPH_BASE + 0x08) | ||
18 | #define S3C64XX_GPHPUD (S3C64XX_GPH_BASE + 0x0c) | ||
19 | #define S3C64XX_GPHCONSLP (S3C64XX_GPH_BASE + 0x10) | ||
20 | #define S3C64XX_GPHPUDSLP (S3C64XX_GPH_BASE + 0x14) | ||
21 | |||
22 | #define S3C64XX_GPH_CONMASK(__gpio) (0xf << ((__gpio) * 4)) | ||
23 | #define S3C64XX_GPH_INPUT(__gpio) (0x0 << ((__gpio) * 4)) | ||
24 | #define S3C64XX_GPH_OUTPUT(__gpio) (0x1 << ((__gpio) * 4)) | ||
25 | |||
26 | #define S3C64XX_GPH0_MMC1_CLK (0x02 << 0) | ||
27 | #define S3C64XX_GPH0_KP_COL0 (0x04 << 0) | ||
28 | #define S3C64XX_GPH0_EINT_G6_0 (0x07 << 0) | ||
29 | |||
30 | #define S3C64XX_GPH1_MMC1_CMD (0x02 << 4) | ||
31 | #define S3C64XX_GPH1_KP_COL1 (0x04 << 4) | ||
32 | #define S3C64XX_GPH1_EINT_G6_1 (0x07 << 4) | ||
33 | |||
34 | #define S3C64XX_GPH2_MMC1_DATA0 (0x02 << 8) | ||
35 | #define S3C64XX_GPH2_KP_COL2 (0x04 << 8) | ||
36 | #define S3C64XX_GPH2_EINT_G6_2 (0x07 << 8) | ||
37 | |||
38 | #define S3C64XX_GPH3_MMC1_DATA1 (0x02 << 12) | ||
39 | #define S3C64XX_GPH3_KP_COL3 (0x04 << 12) | ||
40 | #define S3C64XX_GPH3_EINT_G6_3 (0x07 << 12) | ||
41 | |||
42 | #define S3C64XX_GPH4_MMC1_DATA2 (0x02 << 16) | ||
43 | #define S3C64XX_GPH4_KP_COL4 (0x04 << 16) | ||
44 | #define S3C64XX_GPH4_EINT_G6_4 (0x07 << 16) | ||
45 | |||
46 | #define S3C64XX_GPH5_MMC1_DATA3 (0x02 << 20) | ||
47 | #define S3C64XX_GPH5_KP_COL5 (0x04 << 20) | ||
48 | #define S3C64XX_GPH5_EINT_G6_5 (0x07 << 20) | ||
49 | |||
50 | #define S3C64XX_GPH6_MMC1_DATA4 (0x02 << 24) | ||
51 | #define S3C64XX_GPH6_MMC2_DATA0 (0x03 << 24) | ||
52 | #define S3C64XX_GPH6_KP_COL6 (0x04 << 24) | ||
53 | #define S3C64XX_GPH6_I2S_V40_BCLK (0x05 << 24) | ||
54 | #define S3C64XX_GPH6_ADDR_CF0 (0x06 << 24) | ||
55 | #define S3C64XX_GPH6_EINT_G6_6 (0x07 << 24) | ||
56 | |||
57 | #define S3C64XX_GPH7_MMC1_DATA5 (0x02 << 28) | ||
58 | #define S3C64XX_GPH7_MMC2_DATA1 (0x03 << 28) | ||
59 | #define S3C64XX_GPH7_KP_COL7 (0x04 << 28) | ||
60 | #define S3C64XX_GPH7_I2S_V40_CDCLK (0x05 << 28) | ||
61 | #define S3C64XX_GPH7_ADDR_CF1 (0x06 << 28) | ||
62 | #define S3C64XX_GPH7_EINT_G6_7 (0x07 << 28) | ||
63 | |||
64 | #define S3C64XX_GPH8_MMC1_DATA6 (0x02 << 32) | ||
65 | #define S3C64XX_GPH8_MMC2_DATA2 (0x03 << 32) | ||
66 | #define S3C64XX_GPH8_I2S_V40_LRCLK (0x05 << 32) | ||
67 | #define S3C64XX_GPH8_ADDR_CF2 (0x06 << 32) | ||
68 | #define S3C64XX_GPH8_EINT_G6_8 (0x07 << 32) | ||
69 | |||
70 | #define S3C64XX_GPH9_MMC1_DATA7 (0x02 << 36) | ||
71 | #define S3C64XX_GPH9_MMC2_DATA3 (0x03 << 36) | ||
72 | #define S3C64XX_GPH9_I2S_V40_DI (0x05 << 36) | ||
73 | #define S3C64XX_GPH9_EINT_G6_9 (0x07 << 36) | ||
74 | |||
diff --git a/arch/arm/plat-s3c64xx/include/plat/gpio-bank-i.h b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-i.h new file mode 100644 index 000000000000..ce9ebe335566 --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-i.h | |||
@@ -0,0 +1,40 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/include/plat/gpio-bank-i.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank I register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPICON (S3C64XX_GPI_BASE + 0x00) | ||
16 | #define S3C64XX_GPIDAT (S3C64XX_GPI_BASE + 0x04) | ||
17 | #define S3C64XX_GPIPUD (S3C64XX_GPI_BASE + 0x08) | ||
18 | #define S3C64XX_GPICONSLP (S3C64XX_GPI_BASE + 0x0c) | ||
19 | #define S3C64XX_GPIPUDSLP (S3C64XX_GPI_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPI_CONMASK(__gpio) (0x3 << ((__gpio) * 2)) | ||
22 | #define S3C64XX_GPI_INPUT(__gpio) (0x0 << ((__gpio) * 2)) | ||
23 | #define S3C64XX_GPI_OUTPUT(__gpio) (0x1 << ((__gpio) * 2)) | ||
24 | |||
25 | #define S3C64XX_GPI0_VD0 (0x02 << 0) | ||
26 | #define S3C64XX_GPI1_VD1 (0x02 << 2) | ||
27 | #define S3C64XX_GPI2_VD2 (0x02 << 4) | ||
28 | #define S3C64XX_GPI3_VD3 (0x02 << 6) | ||
29 | #define S3C64XX_GPI4_VD4 (0x02 << 8) | ||
30 | #define S3C64XX_GPI5_VD5 (0x02 << 10) | ||
31 | #define S3C64XX_GPI6_VD6 (0x02 << 12) | ||
32 | #define S3C64XX_GPI7_VD7 (0x02 << 14) | ||
33 | #define S3C64XX_GPI8_VD8 (0x02 << 16) | ||
34 | #define S3C64XX_GPI9_VD9 (0x02 << 18) | ||
35 | #define S3C64XX_GPI10_VD10 (0x02 << 20) | ||
36 | #define S3C64XX_GPI11_VD11 (0x02 << 22) | ||
37 | #define S3C64XX_GPI12_VD12 (0x02 << 24) | ||
38 | #define S3C64XX_GPI13_VD13 (0x02 << 26) | ||
39 | #define S3C64XX_GPI14_VD14 (0x02 << 28) | ||
40 | #define S3C64XX_GPI15_VD15 (0x02 << 30) | ||
diff --git a/arch/arm/plat-s3c64xx/include/plat/gpio-bank-j.h b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-j.h new file mode 100644 index 000000000000..21a906299d30 --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-j.h | |||
@@ -0,0 +1,36 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/include/plat/gpio-bank-j.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank J register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPJCON (S3C64XX_GPJ_BASE + 0x00) | ||
16 | #define S3C64XX_GPJDAT (S3C64XX_GPJ_BASE + 0x04) | ||
17 | #define S3C64XX_GPJPUD (S3C64XX_GPJ_BASE + 0x08) | ||
18 | #define S3C64XX_GPJCONSLP (S3C64XX_GPJ_BASE + 0x0c) | ||
19 | #define S3C64XX_GPJPUDSLP (S3C64XX_GPJ_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPJ_CONMASK(__gpio) (0x3 << ((__gpio) * 2)) | ||
22 | #define S3C64XX_GPJ_INPUT(__gpio) (0x0 << ((__gpio) * 2)) | ||
23 | #define S3C64XX_GPJ_OUTPUT(__gpio) (0x1 << ((__gpio) * 2)) | ||
24 | |||
25 | #define S3C64XX_GPJ0_VD16 (0x02 << 0) | ||
26 | #define S3C64XX_GPJ1_VD17 (0x02 << 2) | ||
27 | #define S3C64XX_GPJ2_VD18 (0x02 << 4) | ||
28 | #define S3C64XX_GPJ3_VD19 (0x02 << 6) | ||
29 | #define S3C64XX_GPJ4_VD20 (0x02 << 8) | ||
30 | #define S3C64XX_GPJ5_VD21 (0x02 << 10) | ||
31 | #define S3C64XX_GPJ6_VD22 (0x02 << 12) | ||
32 | #define S3C64XX_GPJ7_VD23 (0x02 << 14) | ||
33 | #define S3C64XX_GPJ8_LCD_HSYNC (0x02 << 16) | ||
34 | #define S3C64XX_GPJ9_LCD_VSYNC (0x02 << 18) | ||
35 | #define S3C64XX_GPJ10_LCD_VDEN (0x02 << 20) | ||
36 | #define S3C64XX_GPJ11_LCD_VCLK (0x02 << 22) | ||
diff --git a/arch/arm/plat-s3c64xx/include/plat/gpio-bank-n.h b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-n.h new file mode 100644 index 000000000000..569e76120881 --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-n.h | |||
@@ -0,0 +1,54 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/include/plat/gpio-bank-n.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank N register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPNCON (S3C64XX_GPN_BASE + 0x00) | ||
16 | #define S3C64XX_GPNDAT (S3C64XX_GPN_BASE + 0x04) | ||
17 | #define S3C64XX_GPNPUD (S3C64XX_GPN_BASE + 0x08) | ||
18 | |||
19 | #define S3C64XX_GPN_CONMASK(__gpio) (0x3 << ((__gpio) * 2)) | ||
20 | #define S3C64XX_GPN_INPUT(__gpio) (0x0 << ((__gpio) * 2)) | ||
21 | #define S3C64XX_GPN_OUTPUT(__gpio) (0x1 << ((__gpio) * 2)) | ||
22 | |||
23 | #define S3C64XX_GPN0_EINT0 (0x02 << 0) | ||
24 | #define S3C64XX_GPN0_KP_ROW0 (0x03 << 0) | ||
25 | |||
26 | #define S3C64XX_GPN1_EINT1 (0x02 << 2) | ||
27 | #define S3C64XX_GPN1_KP_ROW1 (0x03 << 2) | ||
28 | |||
29 | #define S3C64XX_GPN2_EINT2 (0x02 << 4) | ||
30 | #define S3C64XX_GPN2_KP_ROW2 (0x03 << 4) | ||
31 | |||
32 | #define S3C64XX_GPN3_EINT3 (0x02 << 6) | ||
33 | #define S3C64XX_GPN3_KP_ROW3 (0x03 << 6) | ||
34 | |||
35 | #define S3C64XX_GPN4_EINT4 (0x02 << 8) | ||
36 | #define S3C64XX_GPN4_KP_ROW4 (0x03 << 8) | ||
37 | |||
38 | #define S3C64XX_GPN5_EINT5 (0x02 << 10) | ||
39 | #define S3C64XX_GPN5_KP_ROW5 (0x03 << 10) | ||
40 | |||
41 | #define S3C64XX_GPN6_EINT6 (0x02 << 12) | ||
42 | #define S3C64XX_GPN6_KP_ROW6 (0x03 << 12) | ||
43 | |||
44 | #define S3C64XX_GPN7_EINT7 (0x02 << 14) | ||
45 | #define S3C64XX_GPN7_KP_ROW7 (0x03 << 14) | ||
46 | |||
47 | #define S3C64XX_GPN8_EINT8 (0x02 << 16) | ||
48 | #define S3C64XX_GPN9_EINT9 (0x02 << 18) | ||
49 | #define S3C64XX_GPN10_EINT10 (0x02 << 20) | ||
50 | #define S3C64XX_GPN11_EINT11 (0x02 << 22) | ||
51 | #define S3C64XX_GPN12_EINT12 (0x02 << 24) | ||
52 | #define S3C64XX_GPN13_EINT13 (0x02 << 26) | ||
53 | #define S3C64XX_GPN14_EINT14 (0x02 << 28) | ||
54 | #define S3C64XX_GPN15_EINT15 (0x02 << 30) | ||
diff --git a/arch/arm/plat-s3c64xx/include/plat/gpio-bank-o.h b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-o.h new file mode 100644 index 000000000000..b09e12954b57 --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-o.h | |||
@@ -0,0 +1,70 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/include/plat/gpio-bank-o.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank O register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPOCON (S3C64XX_GPO_BASE + 0x00) | ||
16 | #define S3C64XX_GPODAT (S3C64XX_GPO_BASE + 0x04) | ||
17 | #define S3C64XX_GPOPUD (S3C64XX_GPO_BASE + 0x08) | ||
18 | #define S3C64XX_GPOCONSLP (S3C64XX_GPO_BASE + 0x0c) | ||
19 | #define S3C64XX_GPOPUDSLP (S3C64XX_GPO_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPO_CONMASK(__gpio) (0x3 << ((__gpio) * 2)) | ||
22 | #define S3C64XX_GPO_INPUT(__gpio) (0x0 << ((__gpio) * 2)) | ||
23 | #define S3C64XX_GPO_OUTPUT(__gpio) (0x1 << ((__gpio) * 2)) | ||
24 | |||
25 | #define S3C64XX_GPO0_MEM0_nCS2 (0x02 << 0) | ||
26 | #define S3C64XX_GPO0_EINT_G7_0 (0x03 << 0) | ||
27 | |||
28 | #define S3C64XX_GPO1_MEM0_nCS3 (0x02 << 2) | ||
29 | #define S3C64XX_GPO1_EINT_G7_1 (0x03 << 2) | ||
30 | |||
31 | #define S3C64XX_GPO2_MEM0_nCS4 (0x02 << 4) | ||
32 | #define S3C64XX_GPO2_EINT_G7_2 (0x03 << 4) | ||
33 | |||
34 | #define S3C64XX_GPO3_MEM0_nCS5 (0x02 << 6) | ||
35 | #define S3C64XX_GPO3_EINT_G7_3 (0x03 << 6) | ||
36 | |||
37 | #define S3C64XX_GPO4_EINT_G7_4 (0x03 << 8) | ||
38 | |||
39 | #define S3C64XX_GPO5_EINT_G7_5 (0x03 << 10) | ||
40 | |||
41 | #define S3C64XX_GPO6_MEM0_ADDR6 (0x02 << 12) | ||
42 | #define S3C64XX_GPO6_EINT_G7_6 (0x03 << 12) | ||
43 | |||
44 | #define S3C64XX_GPO7_MEM0_ADDR7 (0x02 << 14) | ||
45 | #define S3C64XX_GPO7_EINT_G7_7 (0x03 << 14) | ||
46 | |||
47 | #define S3C64XX_GPO8_MEM0_ADDR8 (0x02 << 16) | ||
48 | #define S3C64XX_GPO8_EINT_G7_8 (0x03 << 16) | ||
49 | |||
50 | #define S3C64XX_GPO9_MEM0_ADDR9 (0x02 << 18) | ||
51 | #define S3C64XX_GPO9_EINT_G7_9 (0x03 << 18) | ||
52 | |||
53 | #define S3C64XX_GPO10_MEM0_ADDR10 (0x02 << 20) | ||
54 | #define S3C64XX_GPO10_EINT_G7_10 (0x03 << 20) | ||
55 | |||
56 | #define S3C64XX_GPO11_MEM0_ADDR11 (0x02 << 22) | ||
57 | #define S3C64XX_GPO11_EINT_G7_11 (0x03 << 22) | ||
58 | |||
59 | #define S3C64XX_GPO12_MEM0_ADDR12 (0x02 << 24) | ||
60 | #define S3C64XX_GPO12_EINT_G7_12 (0x03 << 24) | ||
61 | |||
62 | #define S3C64XX_GPO13_MEM0_ADDR13 (0x02 << 26) | ||
63 | #define S3C64XX_GPO13_EINT_G7_13 (0x03 << 26) | ||
64 | |||
65 | #define S3C64XX_GPO14_MEM0_ADDR14 (0x02 << 28) | ||
66 | #define S3C64XX_GPO14_EINT_G7_14 (0x03 << 28) | ||
67 | |||
68 | #define S3C64XX_GPO15_MEM0_ADDR15 (0x02 << 30) | ||
69 | #define S3C64XX_GPO15_EINT_G7_15 (0x03 << 30) | ||
70 | |||
diff --git a/arch/arm/plat-s3c64xx/include/plat/gpio-bank-p.h b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-p.h new file mode 100644 index 000000000000..92f00517926b --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-p.h | |||
@@ -0,0 +1,69 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/include/plat/gpio-bank-p.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank P register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPPCON (S3C64XX_GPP_BASE + 0x00) | ||
16 | #define S3C64XX_GPPDAT (S3C64XX_GPP_BASE + 0x04) | ||
17 | #define S3C64XX_GPPPUD (S3C64XX_GPP_BASE + 0x08) | ||
18 | #define S3C64XX_GPPCONSLP (S3C64XX_GPP_BASE + 0x0c) | ||
19 | #define S3C64XX_GPPPUDSLP (S3C64XX_GPP_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPP_CONMASK(__gpio) (0x3 << ((__gpio) * 2)) | ||
22 | #define S3C64XX_GPP_INPUT(__gpio) (0x0 << ((__gpio) * 2)) | ||
23 | #define S3C64XX_GPP_OUTPUT(__gpio) (0x1 << ((__gpio) * 2)) | ||
24 | |||
25 | #define S3C64XX_GPP0_MEM0_ADDRV (0x02 << 0) | ||
26 | #define S3C64XX_GPP0_EINT_G8_0 (0x03 << 0) | ||
27 | |||
28 | #define S3C64XX_GPP1_MEM0_SMCLK (0x02 << 2) | ||
29 | #define S3C64XX_GPP1_EINT_G8_1 (0x03 << 2) | ||
30 | |||
31 | #define S3C64XX_GPP2_MEM0_nWAIT (0x02 << 4) | ||
32 | #define S3C64XX_GPP2_EINT_G8_2 (0x03 << 4) | ||
33 | |||
34 | #define S3C64XX_GPP3_MEM0_RDY0_ALE (0x02 << 6) | ||
35 | #define S3C64XX_GPP3_EINT_G8_3 (0x03 << 6) | ||
36 | |||
37 | #define S3C64XX_GPP4_MEM0_RDY1_CLE (0x02 << 8) | ||
38 | #define S3C64XX_GPP4_EINT_G8_4 (0x03 << 8) | ||
39 | |||
40 | #define S3C64XX_GPP5_MEM0_INTsm0_FWE (0x02 << 10) | ||
41 | #define S3C64XX_GPP5_EINT_G8_5 (0x03 << 10) | ||
42 | |||
43 | #define S3C64XX_GPP6_MEM0_(null) (0x02 << 12) | ||
44 | #define S3C64XX_GPP6_EINT_G8_6 (0x03 << 12) | ||
45 | |||
46 | #define S3C64XX_GPP7_MEM0_INTsm1_FRE (0x02 << 14) | ||
47 | #define S3C64XX_GPP7_EINT_G8_7 (0x03 << 14) | ||
48 | |||
49 | #define S3C64XX_GPP8_MEM0_RPn_RnB (0x02 << 16) | ||
50 | #define S3C64XX_GPP8_EINT_G8_8 (0x03 << 16) | ||
51 | |||
52 | #define S3C64XX_GPP9_MEM0_ATA_RESET (0x02 << 18) | ||
53 | #define S3C64XX_GPP9_EINT_G8_9 (0x03 << 18) | ||
54 | |||
55 | #define S3C64XX_GPP10_MEM0_ATA_INPACK (0x02 << 20) | ||
56 | #define S3C64XX_GPP10_EINT_G8_10 (0x03 << 20) | ||
57 | |||
58 | #define S3C64XX_GPP11_MEM0_ATA_REG (0x02 << 22) | ||
59 | #define S3C64XX_GPP11_EINT_G8_11 (0x03 << 22) | ||
60 | |||
61 | #define S3C64XX_GPP12_MEM0_ATA_WE (0x02 << 24) | ||
62 | #define S3C64XX_GPP12_EINT_G8_12 (0x03 << 24) | ||
63 | |||
64 | #define S3C64XX_GPP13_MEM0_ATA_OE (0x02 << 26) | ||
65 | #define S3C64XX_GPP13_EINT_G8_13 (0x03 << 26) | ||
66 | |||
67 | #define S3C64XX_GPP14_MEM0_ATA_CD (0x02 << 28) | ||
68 | #define S3C64XX_GPP14_EINT_G8_14 (0x03 << 28) | ||
69 | |||
diff --git a/arch/arm/plat-s3c64xx/include/plat/gpio-bank-q.h b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-q.h new file mode 100644 index 000000000000..565e60aaee47 --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/gpio-bank-q.h | |||
@@ -0,0 +1,46 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/include/plat/gpio-bank-q.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank Q register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPQCON (S3C64XX_GPQ_BASE + 0x00) | ||
16 | #define S3C64XX_GPQDAT (S3C64XX_GPQ_BASE + 0x04) | ||
17 | #define S3C64XX_GPQPUD (S3C64XX_GPQ_BASE + 0x08) | ||
18 | #define S3C64XX_GPQCONSLP (S3C64XX_GPQ_BASE + 0x0c) | ||
19 | #define S3C64XX_GPQPUDSLP (S3C64XX_GPQ_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPQ_CONMASK(__gpio) (0x3 << ((__gpio) * 2)) | ||
22 | #define S3C64XX_GPQ_INPUT(__gpio) (0x0 << ((__gpio) * 2)) | ||
23 | #define S3C64XX_GPQ_OUTPUT(__gpio) (0x1 << ((__gpio) * 2)) | ||
24 | |||
25 | #define S3C64XX_GPQ0_MEM0_ADDR18_RAS (0x02 << 0) | ||
26 | #define S3C64XX_GPQ0_EINT_G9_0 (0x03 << 0) | ||
27 | |||
28 | #define S3C64XX_GPQ1_MEM0_ADDR19_CAS (0x02 << 2) | ||
29 | #define S3C64XX_GPQ1_EINT_G9_1 (0x03 << 2) | ||
30 | |||
31 | #define S3C64XX_GPQ2_EINT_G9_2 (0x03 << 4) | ||
32 | |||
33 | #define S3C64XX_GPQ3_EINT_G9_3 (0x03 << 6) | ||
34 | |||
35 | #define S3C64XX_GPQ4_EINT_G9_4 (0x03 << 8) | ||
36 | |||
37 | #define S3C64XX_GPQ5_EINT_G9_5 (0x03 << 10) | ||
38 | |||
39 | #define S3C64XX_GPQ6_EINT_G9_6 (0x03 << 12) | ||
40 | |||
41 | #define S3C64XX_GPQ7_MEM0_ADDR17_WENDMC (0x02 << 14) | ||
42 | #define S3C64XX_GPQ7_EINT_G9_7 (0x03 << 14) | ||
43 | |||
44 | #define S3C64XX_GPQ8_MEM0_ADDR16_APDMC (0x02 << 16) | ||
45 | #define S3C64XX_GPQ8_EINT_G9_8 (0x03 << 16) | ||
46 | |||
diff --git a/arch/arm/plat-s3c64xx/include/plat/irqs.h b/arch/arm/plat-s3c64xx/include/plat/irqs.h new file mode 100644 index 000000000000..02e8dd4c97d5 --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/irqs.h | |||
@@ -0,0 +1,201 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/include/mach/irqs.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * S3C64XX - Common IRQ support | ||
9 | */ | ||
10 | |||
11 | #ifndef __ASM_PLAT_S3C64XX_IRQS_H | ||
12 | #define __ASM_PLAT_S3C64XX_IRQS_H __FILE__ | ||
13 | |||
14 | /* we keep the first set of CPU IRQs out of the range of | ||
15 | * the ISA space, so that the PC104 has them to itself | ||
16 | * and we don't end up having to do horrible things to the | ||
17 | * standard ISA drivers.... | ||
18 | * | ||
19 | * note, since we're using the VICs, our start must be a | ||
20 | * mulitple of 32 to allow the common code to work | ||
21 | */ | ||
22 | |||
23 | #define S3C_IRQ_OFFSET (32) | ||
24 | |||
25 | #define S3C_IRQ(x) ((x) + S3C_IRQ_OFFSET) | ||
26 | |||
27 | #define S3C_VIC0_BASE S3C_IRQ(0) | ||
28 | #define S3C_VIC1_BASE S3C_IRQ(32) | ||
29 | |||
30 | /* UART interrupts, each UART has 4 intterupts per channel so | ||
31 | * use the space between the ISA and S3C main interrupts. Note, these | ||
32 | * are not in the same order as the S3C24XX series! */ | ||
33 | |||
34 | #define IRQ_S3CUART_BASE0 (16) | ||
35 | #define IRQ_S3CUART_BASE1 (20) | ||
36 | #define IRQ_S3CUART_BASE2 (24) | ||
37 | #define IRQ_S3CUART_BASE3 (28) | ||
38 | |||
39 | #define UART_IRQ_RXD (0) | ||
40 | #define UART_IRQ_ERR (1) | ||
41 | #define UART_IRQ_TXD (2) | ||
42 | #define UART_IRQ_MODEM (3) | ||
43 | |||
44 | #define IRQ_S3CUART_RX0 (IRQ_S3CUART_BASE0 + UART_IRQ_RXD) | ||
45 | #define IRQ_S3CUART_TX0 (IRQ_S3CUART_BASE0 + UART_IRQ_TXD) | ||
46 | #define IRQ_S3CUART_ERR0 (IRQ_S3CUART_BASE0 + UART_IRQ_ERR) | ||
47 | |||
48 | #define IRQ_S3CUART_RX1 (IRQ_S3CUART_BASE1 + UART_IRQ_RXD) | ||
49 | #define IRQ_S3CUART_TX1 (IRQ_S3CUART_BASE1 + UART_IRQ_TXD) | ||
50 | #define IRQ_S3CUART_ERR1 (IRQ_S3CUART_BASE1 + UART_IRQ_ERR) | ||
51 | |||
52 | #define IRQ_S3CUART_RX2 (IRQ_S3CUART_BASE2 + UART_IRQ_RXD) | ||
53 | #define IRQ_S3CUART_TX2 (IRQ_S3CUART_BASE2 + UART_IRQ_TXD) | ||
54 | #define IRQ_S3CUART_ERR2 (IRQ_S3CUART_BASE2 + UART_IRQ_ERR) | ||
55 | |||
56 | #define IRQ_S3CUART_RX3 (IRQ_S3CUART_BASE3 + UART_IRQ_RXD) | ||
57 | #define IRQ_S3CUART_TX3 (IRQ_S3CUART_BASE3 + UART_IRQ_TXD) | ||
58 | #define IRQ_S3CUART_ERR3 (IRQ_S3CUART_BASE3 + UART_IRQ_ERR) | ||
59 | |||
60 | /* VIC based IRQs */ | ||
61 | |||
62 | #define S3C64XX_IRQ_VIC0(x) (S3C_VIC0_BASE + (x)) | ||
63 | #define S3C64XX_IRQ_VIC1(x) (S3C_VIC1_BASE + (x)) | ||
64 | |||
65 | /* VIC0 */ | ||
66 | |||
67 | #define IRQ_EINT0_3 S3C64XX_IRQ_VIC0(0) | ||
68 | #define IRQ_EINT4_11 S3C64XX_IRQ_VIC0(1) | ||
69 | #define IRQ_RTC_TIC S3C64XX_IRQ_VIC0(2) | ||
70 | #define IRQ_CAMIF_C S3C64XX_IRQ_VIC0(3) | ||
71 | #define IRQ_CAMIF_P S3C64XX_IRQ_VIC0(4) | ||
72 | #define IRQ_CAMIF_MC S3C64XX_IRQ_VIC0(5) | ||
73 | #define IRQ_S3C6410_IIC1 S3C64XX_IRQ_VIC0(5) | ||
74 | #define IRQ_S3C6410_IIS S3C64XX_IRQ_VIC0(6) | ||
75 | #define IRQ_S3C6400_CAMIF_MP S3C64XX_IRQ_VIC0(6) | ||
76 | #define IRQ_CAMIF_WE_C S3C64XX_IRQ_VIC0(7) | ||
77 | #define IRQ_S3C6410_G3D S3C64XX_IRQ_VIC0(8) | ||
78 | #define IRQ_S3C6400_CAMIF_WE_P S3C64XX_IRQ_VIC0(8) | ||
79 | #define IRQ_POST0 S3C64XX_IRQ_VIC0(9) | ||
80 | #define IRQ_ROTATOR S3C64XX_IRQ_VIC0(10) | ||
81 | #define IRQ_2D S3C64XX_IRQ_VIC0(11) | ||
82 | #define IRQ_TVENC S3C64XX_IRQ_VIC0(12) | ||
83 | #define IRQ_SCALER S3C64XX_IRQ_VIC0(13) | ||
84 | #define IRQ_BATF S3C64XX_IRQ_VIC0(14) | ||
85 | #define IRQ_JPEG S3C64XX_IRQ_VIC0(15) | ||
86 | #define IRQ_MFC S3C64XX_IRQ_VIC0(16) | ||
87 | #define IRQ_SDMA0 S3C64XX_IRQ_VIC0(17) | ||
88 | #define IRQ_SDMA1 S3C64XX_IRQ_VIC0(18) | ||
89 | #define IRQ_ARM_DMAERR S3C64XX_IRQ_VIC0(19) | ||
90 | #define IRQ_ARM_DMA S3C64XX_IRQ_VIC0(20) | ||
91 | #define IRQ_ARM_DMAS S3C64XX_IRQ_VIC0(21) | ||
92 | #define IRQ_KEYPAD S3C64XX_IRQ_VIC0(22) | ||
93 | #define IRQ_TIMER0_VIC S3C64XX_IRQ_VIC0(23) | ||
94 | #define IRQ_TIMER1_VIC S3C64XX_IRQ_VIC0(24) | ||
95 | #define IRQ_TIMER2_VIC S3C64XX_IRQ_VIC0(25) | ||
96 | #define IRQ_WDT S3C64XX_IRQ_VIC0(26) | ||
97 | #define IRQ_TIMER3_VIC S3C64XX_IRQ_VIC0(27) | ||
98 | #define IRQ_TIMER4_VIC S3C64XX_IRQ_VIC0(28) | ||
99 | #define IRQ_LCD_FIFO S3C64XX_IRQ_VIC0(29) | ||
100 | #define IRQ_LCD_VSYNC S3C64XX_IRQ_VIC0(30) | ||
101 | #define IRQ_LCD_SYSTEM S3C64XX_IRQ_VIC0(31) | ||
102 | |||
103 | /* VIC1 */ | ||
104 | |||
105 | #define IRQ_EINT12_19 S3C64XX_IRQ_VIC1(0) | ||
106 | #define IRQ_EINT20_27 S3C64XX_IRQ_VIC1(1) | ||
107 | #define IRQ_PCM0 S3C64XX_IRQ_VIC1(2) | ||
108 | #define IRQ_PCM1 S3C64XX_IRQ_VIC1(3) | ||
109 | #define IRQ_AC97 S3C64XX_IRQ_VIC1(4) | ||
110 | #define IRQ_UART0 S3C64XX_IRQ_VIC1(5) | ||
111 | #define IRQ_UART1 S3C64XX_IRQ_VIC1(6) | ||
112 | #define IRQ_UART2 S3C64XX_IRQ_VIC1(7) | ||
113 | #define IRQ_UART3 S3C64XX_IRQ_VIC1(8) | ||
114 | #define IRQ_DMA0 S3C64XX_IRQ_VIC1(9) | ||
115 | #define IRQ_DMA1 S3C64XX_IRQ_VIC1(10) | ||
116 | #define IRQ_ONENAND0 S3C64XX_IRQ_VIC1(11) | ||
117 | #define IRQ_ONENAND1 S3C64XX_IRQ_VIC1(12) | ||
118 | #define IRQ_NFC S3C64XX_IRQ_VIC1(13) | ||
119 | #define IRQ_CFCON S3C64XX_IRQ_VIC1(14) | ||
120 | #define IRQ_UHOST S3C64XX_IRQ_VIC1(15) | ||
121 | #define IRQ_SPI0 S3C64XX_IRQ_VIC1(16) | ||
122 | #define IRQ_SPI1 S3C64XX_IRQ_VIC1(17) | ||
123 | #define IRQ_IIC S3C64XX_IRQ_VIC1(18) | ||
124 | #define IRQ_HSItx S3C64XX_IRQ_VIC1(19) | ||
125 | #define IRQ_HSIrx S3C64XX_IRQ_VIC1(20) | ||
126 | #define IRQ_RESERVED S3C64XX_IRQ_VIC1(21) | ||
127 | #define IRQ_MSM S3C64XX_IRQ_VIC1(22) | ||
128 | #define IRQ_HOSTIF S3C64XX_IRQ_VIC1(23) | ||
129 | #define IRQ_HSMMC0 S3C64XX_IRQ_VIC1(24) | ||
130 | #define IRQ_HSMMC1 S3C64XX_IRQ_VIC1(25) | ||
131 | #define IRQ_HSMMC2 IRQ_SPI1 /* shared with SPI1 */ | ||
132 | #define IRQ_OTG S3C64XX_IRQ_VIC1(26) | ||
133 | #define IRQ_IRDA S3C64XX_IRQ_VIC1(27) | ||
134 | #define IRQ_RTC_ALARM S3C64XX_IRQ_VIC1(28) | ||
135 | #define IRQ_SEC S3C64XX_IRQ_VIC1(29) | ||
136 | #define IRQ_PENDN S3C64XX_IRQ_VIC1(30) | ||
137 | #define IRQ_TC IRQ_PENDN | ||
138 | #define IRQ_ADC S3C64XX_IRQ_VIC1(31) | ||
139 | |||
140 | #define S3C64XX_TIMER_IRQ(x) S3C_IRQ(64 + (x)) | ||
141 | |||
142 | #define IRQ_TIMER0 S3C64XX_TIMER_IRQ(0) | ||
143 | #define IRQ_TIMER1 S3C64XX_TIMER_IRQ(1) | ||
144 | #define IRQ_TIMER2 S3C64XX_TIMER_IRQ(2) | ||
145 | #define IRQ_TIMER3 S3C64XX_TIMER_IRQ(3) | ||
146 | #define IRQ_TIMER4 S3C64XX_TIMER_IRQ(4) | ||
147 | |||
148 | /* compatibility for device defines */ | ||
149 | |||
150 | #define IRQ_IIC1 IRQ_S3C6410_IIC1 | ||
151 | |||
152 | /* Since the IRQ_EINT(x) are a linear mapping on current s3c64xx series | ||
153 | * we just defined them as an IRQ_EINT(x) macro from S3C_IRQ_EINT_BASE | ||
154 | * which we place after the pair of VICs. */ | ||
155 | |||
156 | #define S3C_IRQ_EINT_BASE S3C_IRQ(64+5) | ||
157 | |||
158 | #define S3C_EINT(x) ((x) + S3C_IRQ_EINT_BASE) | ||
159 | #define IRQ_EINT(x) S3C_EINT(x) | ||
160 | |||
161 | /* Next the external interrupt groups. These are similar to the IRQ_EINT(x) | ||
162 | * that they are sourced from the GPIO pins but with a different scheme for | ||
163 | * priority and source indication. | ||
164 | * | ||
165 | * The IRQ_EINT(x) can be thought of as 'group 0' of the available GPIO | ||
166 | * interrupts, but for historical reasons they are kept apart from these | ||
167 | * next interrupts. | ||
168 | * | ||
169 | * Use IRQ_EINT_GROUP(group, offset) to get the number for use in the | ||
170 | * machine specific support files. | ||
171 | */ | ||
172 | |||
173 | #define IRQ_EINT_GROUP1_NR (15) | ||
174 | #define IRQ_EINT_GROUP2_NR (8) | ||
175 | #define IRQ_EINT_GROUP3_NR (5) | ||
176 | #define IRQ_EINT_GROUP4_NR (14) | ||
177 | #define IRQ_EINT_GROUP5_NR (7) | ||
178 | #define IRQ_EINT_GROUP6_NR (10) | ||
179 | #define IRQ_EINT_GROUP7_NR (16) | ||
180 | #define IRQ_EINT_GROUP8_NR (15) | ||
181 | #define IRQ_EINT_GROUP9_NR (9) | ||
182 | |||
183 | #define IRQ_EINT_GROUP_BASE S3C_EINT(28) | ||
184 | #define IRQ_EINT_GROUP1_BASE (IRQ_EINT_GROUP_BASE + 0x00) | ||
185 | #define IRQ_EINT_GROUP2_BASE (IRQ_EINT_GROUP1_BASE + IRQ_EINT_GROUP1_NR) | ||
186 | #define IRQ_EINT_GROUP3_BASE (IRQ_EINT_GROUP2_BASE + IRQ_EINT_GROUP2_NR) | ||
187 | #define IRQ_EINT_GROUP4_BASE (IRQ_EINT_GROUP3_BASE + IRQ_EINT_GROUP3_NR) | ||
188 | #define IRQ_EINT_GROUP5_BASE (IRQ_EINT_GROUP4_BASE + IRQ_EINT_GROUP4_NR) | ||
189 | #define IRQ_EINT_GROUP6_BASE (IRQ_EINT_GROUP5_BASE + IRQ_EINT_GROUP5_NR) | ||
190 | #define IRQ_EINT_GROUP7_BASE (IRQ_EINT_GROUP6_BASE + IRQ_EINT_GROUP6_NR) | ||
191 | #define IRQ_EINT_GROUP8_BASE (IRQ_EINT_GROUP7_BASE + IRQ_EINT_GROUP7_NR) | ||
192 | #define IRQ_EINT_GROUP9_BASE (IRQ_EINT_GROUP8_BASE + IRQ_EINT_GROUP8_NR) | ||
193 | |||
194 | #define IRQ_EINT_GROUP(group, no) (IRQ_EINT_GROUP##group##__BASE + (x)) | ||
195 | |||
196 | /* Set the default NR_IRQS */ | ||
197 | |||
198 | #define NR_IRQS (IRQ_EINT_GROUP9_BASE + IRQ_EINT_GROUP9_NR + 1) | ||
199 | |||
200 | #endif /* __ASM_PLAT_S3C64XX_IRQS_H */ | ||
201 | |||
diff --git a/arch/arm/plat-s3c64xx/include/plat/pll.h b/arch/arm/plat-s3c64xx/include/plat/pll.h new file mode 100644 index 000000000000..90bbd72fdc4e --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/pll.h | |||
@@ -0,0 +1,74 @@ | |||
1 | /* arch/arm/plat-s3c64xx/include/plat/pll.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * S3C64XX PLL code | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C6400_PLL_MDIV_MASK ((1 << (25-16+1)) - 1) | ||
16 | #define S3C6400_PLL_PDIV_MASK ((1 << (13-8+1)) - 1) | ||
17 | #define S3C6400_PLL_SDIV_MASK ((1 << (2-0+1)) - 1) | ||
18 | #define S3C6400_PLL_MDIV_SHIFT (16) | ||
19 | #define S3C6400_PLL_PDIV_SHIFT (8) | ||
20 | #define S3C6400_PLL_SDIV_SHIFT (0) | ||
21 | |||
22 | #include <asm/div64.h> | ||
23 | |||
24 | static inline unsigned long s3c6400_get_pll(unsigned long baseclk, | ||
25 | u32 pllcon) | ||
26 | { | ||
27 | u32 mdiv, pdiv, sdiv; | ||
28 | u64 fvco = baseclk; | ||
29 | |||
30 | mdiv = (pllcon >> S3C6400_PLL_MDIV_SHIFT) & S3C6400_PLL_MDIV_MASK; | ||
31 | pdiv = (pllcon >> S3C6400_PLL_PDIV_SHIFT) & S3C6400_PLL_PDIV_MASK; | ||
32 | sdiv = (pllcon >> S3C6400_PLL_SDIV_SHIFT) & S3C6400_PLL_SDIV_MASK; | ||
33 | |||
34 | fvco *= mdiv; | ||
35 | do_div(fvco, (pdiv << sdiv)); | ||
36 | |||
37 | return (unsigned long)fvco; | ||
38 | } | ||
39 | |||
40 | #define S3C6400_EPLL_MDIV_MASK ((1 << (23-16)) - 1) | ||
41 | #define S3C6400_EPLL_PDIV_MASK ((1 << (13-8)) - 1) | ||
42 | #define S3C6400_EPLL_SDIV_MASK ((1 << (2-0)) - 1) | ||
43 | #define S3C6400_EPLL_MDIV_SHIFT (16) | ||
44 | #define S3C6400_EPLL_PDIV_SHIFT (8) | ||
45 | #define S3C6400_EPLL_SDIV_SHIFT (0) | ||
46 | #define S3C6400_EPLL_KDIV_MASK (0xffff) | ||
47 | |||
48 | static inline unsigned long s3c6400_get_epll(unsigned long baseclk) | ||
49 | { | ||
50 | unsigned long result; | ||
51 | u32 epll0 = __raw_readl(S3C_EPLL_CON0); | ||
52 | u32 epll1 = __raw_readl(S3C_EPLL_CON1); | ||
53 | u32 mdiv, pdiv, sdiv, kdiv; | ||
54 | u64 tmp; | ||
55 | |||
56 | mdiv = (epll0 >> S3C6400_EPLL_MDIV_SHIFT) & S3C6400_EPLL_MDIV_MASK; | ||
57 | pdiv = (epll0 >> S3C6400_EPLL_PDIV_SHIFT) & S3C6400_EPLL_PDIV_MASK; | ||
58 | sdiv = (epll0 >> S3C6400_EPLL_SDIV_SHIFT) & S3C6400_EPLL_SDIV_MASK; | ||
59 | kdiv = epll1 & S3C6400_EPLL_KDIV_MASK; | ||
60 | |||
61 | /* We need to multiple baseclk by mdiv (the integer part) and kdiv | ||
62 | * which is in 2^16ths, so shift mdiv up (does not overflow) and | ||
63 | * add kdiv before multiplying. The use of tmp is to avoid any | ||
64 | * overflows before shifting bac down into result when multipling | ||
65 | * by the mdiv and kdiv pair. | ||
66 | */ | ||
67 | |||
68 | tmp = baseclk; | ||
69 | tmp *= (mdiv << 16) + kdiv; | ||
70 | do_div(tmp, (pdiv << sdiv)); | ||
71 | result = tmp >> 16; | ||
72 | |||
73 | return result; | ||
74 | } | ||
diff --git a/arch/arm/plat-s3c64xx/include/plat/regs-clock.h b/arch/arm/plat-s3c64xx/include/plat/regs-clock.h new file mode 100644 index 000000000000..b1082c163247 --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/regs-clock.h | |||
@@ -0,0 +1,224 @@ | |||
1 | /* arch/arm/plat-s3c64xx/include/plat/regs-clock.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * S3C64XX clock register definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #ifndef __PLAT_REGS_CLOCK_H | ||
16 | #define __PLAT_REGS_CLOCK_H __FILE__ | ||
17 | |||
18 | #define S3C_CLKREG(x) (S3C_VA_SYS + (x)) | ||
19 | |||
20 | #define S3C_APLL_LOCK S3C_CLKREG(0x00) | ||
21 | #define S3C_MPLL_LOCK S3C_CLKREG(0x04) | ||
22 | #define S3C_EPLL_LOCK S3C_CLKREG(0x08) | ||
23 | #define S3C_APLL_CON S3C_CLKREG(0x0C) | ||
24 | #define S3C_MPLL_CON S3C_CLKREG(0x10) | ||
25 | #define S3C_EPLL_CON0 S3C_CLKREG(0x14) | ||
26 | #define S3C_EPLL_CON1 S3C_CLKREG(0x18) | ||
27 | #define S3C_CLK_SRC S3C_CLKREG(0x1C) | ||
28 | #define S3C_CLK_DIV0 S3C_CLKREG(0x20) | ||
29 | #define S3C_CLK_DIV1 S3C_CLKREG(0x24) | ||
30 | #define S3C_CLK_DIV2 S3C_CLKREG(0x28) | ||
31 | #define S3C_CLK_OUT S3C_CLKREG(0x2C) | ||
32 | #define S3C_HCLK_GATE S3C_CLKREG(0x30) | ||
33 | #define S3C_PCLK_GATE S3C_CLKREG(0x34) | ||
34 | #define S3C_SCLK_GATE S3C_CLKREG(0x38) | ||
35 | |||
36 | /* CLKDIV0 */ | ||
37 | #define S3C6400_CLKDIV0_MFC_MASK (0xf << 28) | ||
38 | #define S3C6400_CLKDIV0_MFC_SHIFT (28) | ||
39 | #define S3C6400_CLKDIV0_JPEG_MASK (0xf << 24) | ||
40 | #define S3C6400_CLKDIV0_JPEG_SHIFT (24) | ||
41 | #define S3C6400_CLKDIV0_CAM_MASK (0xf << 20) | ||
42 | #define S3C6400_CLKDIV0_CAM_SHIFT (20) | ||
43 | #define S3C6400_CLKDIV0_SECURITY_MASK (0x3 << 18) | ||
44 | #define S3C6400_CLKDIV0_SECURITY_SHIFT (18) | ||
45 | #define S3C6400_CLKDIV0_PCLK_MASK (0xf << 12) | ||
46 | #define S3C6400_CLKDIV0_PCLK_SHIFT (12) | ||
47 | #define S3C6400_CLKDIV0_HCLK2_MASK (0x7 << 9) | ||
48 | #define S3C6400_CLKDIV0_HCLK2_SHIFT (9) | ||
49 | #define S3C6400_CLKDIV0_HCLK_MASK (0x1 << 8) | ||
50 | #define S3C6400_CLKDIV0_HCLK_SHIFT (8) | ||
51 | #define S3C6400_CLKDIV0_MPLL_MASK (0x1 << 4) | ||
52 | #define S3C6400_CLKDIV0_MPLL_SHIFT (4) | ||
53 | #define S3C6400_CLKDIV0_ARM_MASK (0x3 << 0) | ||
54 | #define S3C6410_CLKDIV0_ARM_MASK (0x7 << 0) | ||
55 | #define S3C6400_CLKDIV0_ARM_SHIFT (0) | ||
56 | |||
57 | /* CLKDIV1 */ | ||
58 | #define S3C6410_CLKDIV1_FIMC_MASK (0xf << 24) | ||
59 | #define S3C6410_CLKDIV1_FIMC_SHIFT (24) | ||
60 | #define S3C6400_CLKDIV1_UHOST_MASK (0xf << 20) | ||
61 | #define S3C6400_CLKDIV1_UHOST_SHIFT (20) | ||
62 | #define S3C6400_CLKDIV1_SCALER_MASK (0xf << 16) | ||
63 | #define S3C6400_CLKDIV1_SCALER_SHIFT (16) | ||
64 | #define S3C6400_CLKDIV1_LCD_MASK (0xf << 12) | ||
65 | #define S3C6400_CLKDIV1_LCD_SHIFT (12) | ||
66 | #define S3C6400_CLKDIV1_MMC2_MASK (0xf << 8) | ||
67 | #define S3C6400_CLKDIV1_MMC2_SHIFT (8) | ||
68 | #define S3C6400_CLKDIV1_MMC1_MASK (0xf << 4) | ||
69 | #define S3C6400_CLKDIV1_MMC1_SHIFT (4) | ||
70 | #define S3C6400_CLKDIV1_MMC0_MASK (0xf << 0) | ||
71 | #define S3C6400_CLKDIV1_MMC0_SHIFT (0) | ||
72 | |||
73 | /* CLKDIV2 */ | ||
74 | #define S3C6410_CLKDIV2_AUDIO2_MASK (0xf << 24) | ||
75 | #define S3C6410_CLKDIV2_AUDIO2_SHIFT (24) | ||
76 | #define S3C6400_CLKDIV2_IRDA_MASK (0xf << 20) | ||
77 | #define S3C6400_CLKDIV2_IRDA_SHIFT (20) | ||
78 | #define S3C6400_CLKDIV2_UART_MASK (0xf << 16) | ||
79 | #define S3C6400_CLKDIV2_UART_SHIFT (16) | ||
80 | #define S3C6400_CLKDIV2_AUDIO1_MASK (0xf << 12) | ||
81 | #define S3C6400_CLKDIV2_AUDIO1_SHIFT (12) | ||
82 | #define S3C6400_CLKDIV2_AUDIO0_MASK (0xf << 8) | ||
83 | #define S3C6400_CLKDIV2_AUDIO0_SHIFT (8) | ||
84 | #define S3C6400_CLKDIV2_SPI1_MASK (0xf << 4) | ||
85 | #define S3C6400_CLKDIV2_SPI1_SHIFT (4) | ||
86 | #define S3C6400_CLKDIV2_SPI0_MASK (0xf << 0) | ||
87 | #define S3C6400_CLKDIV2_SPI0_SHIFT (0) | ||
88 | |||
89 | /* HCLK GATE Registers */ | ||
90 | #define S3C_CLKCON_HCLK_BUS (1<<30) | ||
91 | #define S3C_CLKCON_HCLK_SECUR (1<<29) | ||
92 | #define S3C_CLKCON_HCLK_SDMA1 (1<<28) | ||
93 | #define S3C_CLKCON_HCLK_SDMA2 (1<<27) | ||
94 | #define S3C_CLKCON_HCLK_UHOST (1<<26) | ||
95 | #define S3C_CLKCON_HCLK_IROM (1<<25) | ||
96 | #define S3C_CLKCON_HCLK_DDR1 (1<<24) | ||
97 | #define S3C_CLKCON_HCLK_DDR0 (1<<23) | ||
98 | #define S3C_CLKCON_HCLK_MEM1 (1<<22) | ||
99 | #define S3C_CLKCON_HCLK_MEM0 (1<<21) | ||
100 | #define S3C_CLKCON_HCLK_USB (1<<20) | ||
101 | #define S3C_CLKCON_HCLK_HSMMC2 (1<<19) | ||
102 | #define S3C_CLKCON_HCLK_HSMMC1 (1<<18) | ||
103 | #define S3C_CLKCON_HCLK_HSMMC0 (1<<17) | ||
104 | #define S3C_CLKCON_HCLK_MDP (1<<16) | ||
105 | #define S3C_CLKCON_HCLK_DHOST (1<<15) | ||
106 | #define S3C_CLKCON_HCLK_IHOST (1<<14) | ||
107 | #define S3C_CLKCON_HCLK_DMA1 (1<<13) | ||
108 | #define S3C_CLKCON_HCLK_DMA0 (1<<12) | ||
109 | #define S3C_CLKCON_HCLK_JPEG (1<<11) | ||
110 | #define S3C_CLKCON_HCLK_CAMIF (1<<10) | ||
111 | #define S3C_CLKCON_HCLK_SCALER (1<<9) | ||
112 | #define S3C_CLKCON_HCLK_2D (1<<8) | ||
113 | #define S3C_CLKCON_HCLK_TV (1<<7) | ||
114 | #define S3C_CLKCON_HCLK_POST0 (1<<5) | ||
115 | #define S3C_CLKCON_HCLK_ROT (1<<4) | ||
116 | #define S3C_CLKCON_HCLK_LCD (1<<3) | ||
117 | #define S3C_CLKCON_HCLK_TZIC (1<<2) | ||
118 | #define S3C_CLKCON_HCLK_INTC (1<<1) | ||
119 | #define S3C_CLKCON_HCLK_MFC (1<<0) | ||
120 | |||
121 | /* PCLK GATE Registers */ | ||
122 | #define S3C6410_CLKCON_PCLK_I2C1 (1<<27) | ||
123 | #define S3C6410_CLKCON_PCLK_IIS2 (1<<26) | ||
124 | #define S3C_CLKCON_PCLK_SKEY (1<<24) | ||
125 | #define S3C_CLKCON_PCLK_CHIPID (1<<23) | ||
126 | #define S3C_CLKCON_PCLK_SPI1 (1<<22) | ||
127 | #define S3C_CLKCON_PCLK_SPI0 (1<<21) | ||
128 | #define S3C_CLKCON_PCLK_HSIRX (1<<20) | ||
129 | #define S3C_CLKCON_PCLK_HSITX (1<<19) | ||
130 | #define S3C_CLKCON_PCLK_GPIO (1<<18) | ||
131 | #define S3C_CLKCON_PCLK_IIC (1<<17) | ||
132 | #define S3C_CLKCON_PCLK_IIS1 (1<<16) | ||
133 | #define S3C_CLKCON_PCLK_IIS0 (1<<15) | ||
134 | #define S3C_CLKCON_PCLK_AC97 (1<<14) | ||
135 | #define S3C_CLKCON_PCLK_TZPC (1<<13) | ||
136 | #define S3C_CLKCON_PCLK_TSADC (1<<12) | ||
137 | #define S3C_CLKCON_PCLK_KEYPAD (1<<11) | ||
138 | #define S3C_CLKCON_PCLK_IRDA (1<<10) | ||
139 | #define S3C_CLKCON_PCLK_PCM1 (1<<9) | ||
140 | #define S3C_CLKCON_PCLK_PCM0 (1<<8) | ||
141 | #define S3C_CLKCON_PCLK_PWM (1<<7) | ||
142 | #define S3C_CLKCON_PCLK_RTC (1<<6) | ||
143 | #define S3C_CLKCON_PCLK_WDT (1<<5) | ||
144 | #define S3C_CLKCON_PCLK_UART3 (1<<4) | ||
145 | #define S3C_CLKCON_PCLK_UART2 (1<<3) | ||
146 | #define S3C_CLKCON_PCLK_UART1 (1<<2) | ||
147 | #define S3C_CLKCON_PCLK_UART0 (1<<1) | ||
148 | #define S3C_CLKCON_PCLK_MFC (1<<0) | ||
149 | |||
150 | /* SCLK GATE Registers */ | ||
151 | #define S3C_CLKCON_SCLK_UHOST (1<<30) | ||
152 | #define S3C_CLKCON_SCLK_MMC2_48 (1<<29) | ||
153 | #define S3C_CLKCON_SCLK_MMC1_48 (1<<28) | ||
154 | #define S3C_CLKCON_SCLK_MMC0_48 (1<<27) | ||
155 | #define S3C_CLKCON_SCLK_MMC2 (1<<26) | ||
156 | #define S3C_CLKCON_SCLK_MMC1 (1<<25) | ||
157 | #define S3C_CLKCON_SCLK_MMC0 (1<<24) | ||
158 | #define S3C_CLKCON_SCLK_SPI1_48 (1<<23) | ||
159 | #define S3C_CLKCON_SCLK_SPI0_48 (1<<22) | ||
160 | #define S3C_CLKCON_SCLK_SPI1 (1<<21) | ||
161 | #define S3C_CLKCON_SCLK_SPI0 (1<<20) | ||
162 | #define S3C_CLKCON_SCLK_DAC27 (1<<19) | ||
163 | #define S3C_CLKCON_SCLK_TV27 (1<<18) | ||
164 | #define S3C_CLKCON_SCLK_SCALER27 (1<<17) | ||
165 | #define S3C_CLKCON_SCLK_SCALER (1<<16) | ||
166 | #define S3C_CLKCON_SCLK_LCD27 (1<<15) | ||
167 | #define S3C_CLKCON_SCLK_LCD (1<<14) | ||
168 | #define S3C6400_CLKCON_SCLK_POST1_27 (1<<13) | ||
169 | #define S3C6410_CLKCON_FIMC (1<<13) | ||
170 | #define S3C_CLKCON_SCLK_POST0_27 (1<<12) | ||
171 | #define S3C6400_CLKCON_SCLK_POST1 (1<<11) | ||
172 | #define S3C6410_CLKCON_SCLK_AUDIO2 (1<<11) | ||
173 | #define S3C_CLKCON_SCLK_POST0 (1<<10) | ||
174 | #define S3C_CLKCON_SCLK_AUDIO1 (1<<9) | ||
175 | #define S3C_CLKCON_SCLK_AUDIO0 (1<<8) | ||
176 | #define S3C_CLKCON_SCLK_SECUR (1<<7) | ||
177 | #define S3C_CLKCON_SCLK_IRDA (1<<6) | ||
178 | #define S3C_CLKCON_SCLK_UART (1<<5) | ||
179 | #define S3C_CLKCON_SCLK_ONENAND (1<<4) | ||
180 | #define S3C_CLKCON_SCLK_MFC (1<<3) | ||
181 | #define S3C_CLKCON_SCLK_CAM (1<<2) | ||
182 | #define S3C_CLKCON_SCLK_JPEG (1<<1) | ||
183 | |||
184 | /* CLKSRC */ | ||
185 | |||
186 | #define S3C6400_CLKSRC_APLL_MOUT (1 << 0) | ||
187 | #define S3C6400_CLKSRC_MPLL_MOUT (1 << 1) | ||
188 | #define S3C6400_CLKSRC_EPLL_MOUT (1 << 2) | ||
189 | #define S3C6400_CLKSRC_APLL_MOUT_SHIFT (0) | ||
190 | #define S3C6400_CLKSRC_MPLL_MOUT_SHIFT (1) | ||
191 | #define S3C6400_CLKSRC_EPLL_MOUT_SHIFT (2) | ||
192 | #define S3C6400_CLKSRC_MFC (1 << 4) | ||
193 | |||
194 | #define S3C6410_CLKSRC_TV27_MASK (0x1 << 31) | ||
195 | #define S3C6410_CLKSRC_TV27_SHIFT (31) | ||
196 | #define S3C6410_CLKSRC_DAC27_MASK (0x1 << 30) | ||
197 | #define S3C6410_CLKSRC_DAC27_SHIFT (30) | ||
198 | #define S3C6400_CLKSRC_SCALER_MASK (0x3 << 28) | ||
199 | #define S3C6400_CLKSRC_SCALER_SHIFT (28) | ||
200 | #define S3C6400_CLKSRC_LCD_MASK (0x3 << 26) | ||
201 | #define S3C6400_CLKSRC_LCD_SHIFT (26) | ||
202 | #define S3C6400_CLKSRC_IRDA_MASK (0x3 << 24) | ||
203 | #define S3C6400_CLKSRC_IRDA_SHIFT (24) | ||
204 | #define S3C6400_CLKSRC_MMC2_MASK (0x3 << 22) | ||
205 | #define S3C6400_CLKSRC_MMC2_SHIFT (22) | ||
206 | #define S3C6400_CLKSRC_MMC1_MASK (0x3 << 20) | ||
207 | #define S3C6400_CLKSRC_MMC1_SHIFT (20) | ||
208 | #define S3C6400_CLKSRC_MMC0_MASK (0x3 << 18) | ||
209 | #define S3C6400_CLKSRC_MMC0_SHIFT (18) | ||
210 | #define S3C6400_CLKSRC_SPI1_MASK (0x3 << 16) | ||
211 | #define S3C6400_CLKSRC_SPI1_SHIFT (16) | ||
212 | #define S3C6400_CLKSRC_SPI0_MASK (0x3 << 14) | ||
213 | #define S3C6400_CLKSRC_SPI0_SHIFT (14) | ||
214 | #define S3C6400_CLKSRC_UART_MASK (0x1 << 13) | ||
215 | #define S3C6400_CLKSRC_UART_SHIFT (13) | ||
216 | #define S3C6400_CLKSRC_AUDIO1_MASK (0x7 << 10) | ||
217 | #define S3C6400_CLKSRC_AUDIO1_SHIFT (10) | ||
218 | #define S3C6400_CLKSRC_AUDIO0_MASK (0x7 << 7) | ||
219 | #define S3C6400_CLKSRC_AUDIO0_SHIFT (7) | ||
220 | #define S3C6400_CLKSRC_UHOST_MASK (0x3 << 5) | ||
221 | #define S3C6400_CLKSRC_UHOST_SHIFT (5) | ||
222 | |||
223 | |||
224 | #endif /* _PLAT_REGS_CLOCK_H */ | ||
diff --git a/arch/arm/plat-s3c64xx/include/plat/regs-gpio.h b/arch/arm/plat-s3c64xx/include/plat/regs-gpio.h new file mode 100644 index 000000000000..75b873d82808 --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/regs-gpio.h | |||
@@ -0,0 +1,35 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/include/mach/regs-gpio.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * S3C64XX - GPIO register definitions | ||
9 | */ | ||
10 | |||
11 | #ifndef __ASM_PLAT_S3C64XX_REGS_GPIO_H | ||
12 | #define __ASM_PLAT_S3C64XX_REGS_GPIO_H __FILE__ | ||
13 | |||
14 | /* Base addresses for each of the banks */ | ||
15 | |||
16 | #define S3C64XX_GPA_BASE (S3C64XX_VA_GPIO + 0x0000) | ||
17 | #define S3C64XX_GPB_BASE (S3C64XX_VA_GPIO + 0x0020) | ||
18 | #define S3C64XX_GPC_BASE (S3C64XX_VA_GPIO + 0x0040) | ||
19 | #define S3C64XX_GPD_BASE (S3C64XX_VA_GPIO + 0x0060) | ||
20 | #define S3C64XX_GPE_BASE (S3C64XX_VA_GPIO + 0x0080) | ||
21 | #define S3C64XX_GPF_BASE (S3C64XX_VA_GPIO + 0x00A0) | ||
22 | #define S3C64XX_GPG_BASE (S3C64XX_VA_GPIO + 0x00C0) | ||
23 | #define S3C64XX_GPH_BASE (S3C64XX_VA_GPIO + 0x00E0) | ||
24 | #define S3C64XX_GPI_BASE (S3C64XX_VA_GPIO + 0x0100) | ||
25 | #define S3C64XX_GPJ_BASE (S3C64XX_VA_GPIO + 0x0120) | ||
26 | #define S3C64XX_GPK_BASE (S3C64XX_VA_GPIO + 0x0800) | ||
27 | #define S3C64XX_GPL_BASE (S3C64XX_VA_GPIO + 0x0810) | ||
28 | #define S3C64XX_GPM_BASE (S3C64XX_VA_GPIO + 0x0820) | ||
29 | #define S3C64XX_GPN_BASE (S3C64XX_VA_GPIO + 0x0830) | ||
30 | #define S3C64XX_GPO_BASE (S3C64XX_VA_GPIO + 0x0140) | ||
31 | #define S3C64XX_GPP_BASE (S3C64XX_VA_GPIO + 0x0160) | ||
32 | #define S3C64XX_GPQ_BASE (S3C64XX_VA_GPIO + 0x0180) | ||
33 | |||
34 | #endif /* __ASM_PLAT_S3C64XX_REGS_GPIO_H */ | ||
35 | |||
diff --git a/arch/arm/plat-s3c64xx/include/plat/regs-sys.h b/arch/arm/plat-s3c64xx/include/plat/regs-sys.h new file mode 100644 index 000000000000..d8ed82917096 --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/regs-sys.h | |||
@@ -0,0 +1,24 @@ | |||
1 | /* arch/arm/plat-s3c64xx/include/plat/regs-sys.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * S3C64XX system register definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #ifndef __PLAT_REGS_SYS_H | ||
16 | #define __PLAT_REGS_SYS_H __FILE__ | ||
17 | |||
18 | #define S3C_SYSREG(x) (S3C_VA_SYS + (x)) | ||
19 | |||
20 | #define S3C64XX_OTHERS S3C_SYSREG(0x900) | ||
21 | |||
22 | #define S3C64XX_OTHERS_USBMASK (1 << 16) | ||
23 | |||
24 | #endif /* _PLAT_REGS_SYS_H */ | ||
diff --git a/arch/arm/plat-s3c64xx/include/plat/s3c6400.h b/arch/arm/plat-s3c64xx/include/plat/s3c6400.h new file mode 100644 index 000000000000..571eaa2e54f1 --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/s3c6400.h | |||
@@ -0,0 +1,35 @@ | |||
1 | /* arch/arm/plat-s3c64xx/include/plat/s3c6400.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * Header file for s3c6400 cpu support | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | /* Common init code for S3C6400 related SoCs */ | ||
16 | |||
17 | extern void s3c6400_common_init_uarts(struct s3c2410_uartcfg *cfg, int no); | ||
18 | extern void s3c6400_register_clocks(void); | ||
19 | extern void s3c6400_setup_clocks(void); | ||
20 | |||
21 | #ifdef CONFIG_CPU_S3C6400 | ||
22 | |||
23 | extern int s3c6400_init(void); | ||
24 | extern void s3c6400_map_io(void); | ||
25 | extern void s3c6400_init_clocks(int xtal); | ||
26 | |||
27 | #define s3c6400_init_uarts s3c6400_common_init_uarts | ||
28 | |||
29 | #else | ||
30 | #define s3c6400_init_clocks NULL | ||
31 | #define s3c6400_init_uarts NULL | ||
32 | #define s3c6400_map_io NULL | ||
33 | #define s3c6400_init NULL | ||
34 | #endif | ||
35 | |||
diff --git a/arch/arm/plat-s3c64xx/include/plat/s3c6410.h b/arch/arm/plat-s3c64xx/include/plat/s3c6410.h new file mode 100644 index 000000000000..50dcdd6f6800 --- /dev/null +++ b/arch/arm/plat-s3c64xx/include/plat/s3c6410.h | |||
@@ -0,0 +1,29 @@ | |||
1 | /* arch/arm/plat-s3c64xx/include/plat/s3c6410.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * Header file for s3c6410 cpu support | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #ifdef CONFIG_CPU_S3C6410 | ||
16 | |||
17 | extern int s3c6410_init(void); | ||
18 | extern void s3c6410_init_irq(void); | ||
19 | extern void s3c6410_map_io(void); | ||
20 | extern void s3c6410_init_clocks(int xtal); | ||
21 | |||
22 | #define s3c6410_init_uarts s3c6400_common_init_uarts | ||
23 | |||
24 | #else | ||
25 | #define s3c6410_init_clocks NULL | ||
26 | #define s3c6410_init_uarts NULL | ||
27 | #define s3c6410_map_io NULL | ||
28 | #define s3c6410_init NULL | ||
29 | #endif | ||
diff --git a/arch/arm/plat-s3c64xx/irq-eint.c b/arch/arm/plat-s3c64xx/irq-eint.c new file mode 100644 index 000000000000..1f7cc0067f5c --- /dev/null +++ b/arch/arm/plat-s3c64xx/irq-eint.c | |||
@@ -0,0 +1,202 @@ | |||
1 | /* arch/arm/plat-s3c64xx/irq-eint.c | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * S3C64XX - Interrupt handling for IRQ_EINT(x) | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/interrupt.h> | ||
17 | #include <linux/irq.h> | ||
18 | #include <linux/io.h> | ||
19 | |||
20 | #include <asm/hardware/vic.h> | ||
21 | |||
22 | #include <plat/regs-irqtype.h> | ||
23 | |||
24 | #include <mach/map.h> | ||
25 | #include <plat/cpu.h> | ||
26 | |||
27 | /* GPIO is 0x7F008xxx, */ | ||
28 | #define S3C64XX_GPIOREG(x) (S3C64XX_VA_GPIO + (x)) | ||
29 | |||
30 | #define S3C64XX_EINT0CON0 S3C64XX_GPIOREG(0x900) | ||
31 | #define S3C64XX_EINT0CON1 S3C64XX_GPIOREG(0x904) | ||
32 | #define S3C64XX_EINT0FLTCON0 S3C64XX_GPIOREG(0x910) | ||
33 | #define S3C64XX_EINT0FLTCON1 S3C64XX_GPIOREG(0x914) | ||
34 | #define S3C64XX_EINT0FLTCON2 S3C64XX_GPIOREG(0x918) | ||
35 | #define S3C64XX_EINT0FLTCON3 S3C64XX_GPIOREG(0x91C) | ||
36 | |||
37 | #define S3C64XX_EINT0MASK S3C64XX_GPIOREG(0x920) | ||
38 | #define S3C64XX_EINT0PEND S3C64XX_GPIOREG(0x924) | ||
39 | |||
40 | |||
41 | #define eint_offset(irq) ((irq) - IRQ_EINT(0)) | ||
42 | #define eint_irq_to_bit(irq) (1 << eint_offset(irq)) | ||
43 | |||
44 | static inline void s3c_irq_eint_mask(unsigned int irq) | ||
45 | { | ||
46 | u32 mask; | ||
47 | |||
48 | mask = __raw_readl(S3C64XX_EINT0MASK); | ||
49 | mask |= eint_irq_to_bit(irq); | ||
50 | __raw_writel(mask, S3C64XX_EINT0MASK); | ||
51 | } | ||
52 | |||
53 | static void s3c_irq_eint_unmask(unsigned int irq) | ||
54 | { | ||
55 | u32 mask; | ||
56 | |||
57 | mask = __raw_readl(S3C64XX_EINT0MASK); | ||
58 | mask |= eint_irq_to_bit(irq); | ||
59 | __raw_writel(mask, S3C64XX_EINT0MASK); | ||
60 | } | ||
61 | |||
62 | static inline void s3c_irq_eint_ack(unsigned int irq) | ||
63 | { | ||
64 | __raw_writel(eint_irq_to_bit(irq), S3C64XX_EINT0PEND); | ||
65 | } | ||
66 | |||
67 | static void s3c_irq_eint_maskack(unsigned int irq) | ||
68 | { | ||
69 | /* compiler should in-line these */ | ||
70 | s3c_irq_eint_mask(irq); | ||
71 | s3c_irq_eint_ack(irq); | ||
72 | } | ||
73 | |||
74 | static int s3c_irq_eint_set_type(unsigned int irq, unsigned int type) | ||
75 | { | ||
76 | int offs = eint_offset(irq); | ||
77 | int shift; | ||
78 | u32 ctrl, mask; | ||
79 | u32 newvalue = 0; | ||
80 | void __iomem *reg; | ||
81 | |||
82 | if (offs > 27) | ||
83 | return -EINVAL; | ||
84 | |||
85 | if (offs <= 15) | ||
86 | reg = S3C64XX_EINT0CON0; | ||
87 | else | ||
88 | reg = S3C64XX_EINT0CON1; | ||
89 | |||
90 | switch (type) { | ||
91 | case IRQ_TYPE_NONE: | ||
92 | printk(KERN_WARNING "No edge setting!\n"); | ||
93 | break; | ||
94 | |||
95 | case IRQ_TYPE_EDGE_RISING: | ||
96 | newvalue = S3C2410_EXTINT_RISEEDGE; | ||
97 | break; | ||
98 | |||
99 | case IRQ_TYPE_EDGE_FALLING: | ||
100 | newvalue = S3C2410_EXTINT_FALLEDGE; | ||
101 | break; | ||
102 | |||
103 | case IRQ_TYPE_EDGE_BOTH: | ||
104 | newvalue = S3C2410_EXTINT_BOTHEDGE; | ||
105 | break; | ||
106 | |||
107 | case IRQ_TYPE_LEVEL_LOW: | ||
108 | newvalue = S3C2410_EXTINT_LOWLEV; | ||
109 | break; | ||
110 | |||
111 | case IRQ_TYPE_LEVEL_HIGH: | ||
112 | newvalue = S3C2410_EXTINT_HILEV; | ||
113 | break; | ||
114 | |||
115 | default: | ||
116 | printk(KERN_ERR "No such irq type %d", type); | ||
117 | return -1; | ||
118 | } | ||
119 | |||
120 | shift = (offs / 2) * 4; | ||
121 | mask = 0x7 << shift; | ||
122 | |||
123 | ctrl = __raw_readl(reg); | ||
124 | ctrl &= ~mask; | ||
125 | ctrl |= newvalue << shift; | ||
126 | __raw_writel(ctrl, reg); | ||
127 | |||
128 | return 0; | ||
129 | } | ||
130 | |||
131 | static struct irq_chip s3c_irq_eint = { | ||
132 | .name = "s3c-eint", | ||
133 | .mask = s3c_irq_eint_mask, | ||
134 | .unmask = s3c_irq_eint_unmask, | ||
135 | .mask_ack = s3c_irq_eint_maskack, | ||
136 | .ack = s3c_irq_eint_ack, | ||
137 | .set_type = s3c_irq_eint_set_type, | ||
138 | }; | ||
139 | |||
140 | /* s3c_irq_demux_eint | ||
141 | * | ||
142 | * This function demuxes the IRQ from the group0 external interrupts, | ||
143 | * from IRQ_EINT(0) to IRQ_EINT(27). It is designed to be inlined into | ||
144 | * the specific handlers s3c_irq_demux_eintX_Y. | ||
145 | */ | ||
146 | static inline void s3c_irq_demux_eint(unsigned int start, unsigned int end) | ||
147 | { | ||
148 | u32 status = __raw_readl(S3C64XX_EINT0PEND); | ||
149 | u32 mask = __raw_readl(S3C64XX_EINT0MASK); | ||
150 | unsigned int irq; | ||
151 | |||
152 | status &= ~mask; | ||
153 | status >>= start; | ||
154 | status &= (1 << (end - start + 1)) - 1; | ||
155 | |||
156 | for (irq = IRQ_EINT(start); irq <= IRQ_EINT(end); irq++) { | ||
157 | if (status & 1) | ||
158 | generic_handle_irq(irq); | ||
159 | |||
160 | status >>= 1; | ||
161 | } | ||
162 | } | ||
163 | |||
164 | static void s3c_irq_demux_eint0_3(unsigned int irq, struct irq_desc *desc) | ||
165 | { | ||
166 | s3c_irq_demux_eint(0, 3); | ||
167 | } | ||
168 | |||
169 | static void s3c_irq_demux_eint4_11(unsigned int irq, struct irq_desc *desc) | ||
170 | { | ||
171 | s3c_irq_demux_eint(4, 11); | ||
172 | } | ||
173 | |||
174 | static void s3c_irq_demux_eint12_19(unsigned int irq, struct irq_desc *desc) | ||
175 | { | ||
176 | s3c_irq_demux_eint(12, 19); | ||
177 | } | ||
178 | |||
179 | static void s3c_irq_demux_eint20_27(unsigned int irq, struct irq_desc *desc) | ||
180 | { | ||
181 | s3c_irq_demux_eint(20, 27); | ||
182 | } | ||
183 | |||
184 | int __init s3c64xx_init_irq_eint(void) | ||
185 | { | ||
186 | int irq; | ||
187 | |||
188 | for (irq = IRQ_EINT(0); irq <= IRQ_EINT(27); irq++) { | ||
189 | set_irq_chip(irq, &s3c_irq_eint); | ||
190 | set_irq_handler(irq, handle_level_irq); | ||
191 | set_irq_flags(irq, IRQF_VALID); | ||
192 | } | ||
193 | |||
194 | set_irq_chained_handler(IRQ_EINT0_3, s3c_irq_demux_eint0_3); | ||
195 | set_irq_chained_handler(IRQ_EINT4_11, s3c_irq_demux_eint4_11); | ||
196 | set_irq_chained_handler(IRQ_EINT12_19, s3c_irq_demux_eint12_19); | ||
197 | set_irq_chained_handler(IRQ_EINT20_27, s3c_irq_demux_eint20_27); | ||
198 | |||
199 | return 0; | ||
200 | } | ||
201 | |||
202 | arch_initcall(s3c64xx_init_irq_eint); | ||
diff --git a/arch/arm/plat-s3c64xx/irq.c b/arch/arm/plat-s3c64xx/irq.c new file mode 100644 index 000000000000..a94f1d5e819d --- /dev/null +++ b/arch/arm/plat-s3c64xx/irq.c | |||
@@ -0,0 +1,257 @@ | |||
1 | /* arch/arm/plat-s3c64xx/irq.c | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * S3C64XX - Interrupt handling | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/interrupt.h> | ||
17 | #include <linux/irq.h> | ||
18 | #include <linux/io.h> | ||
19 | |||
20 | #include <asm/hardware/vic.h> | ||
21 | |||
22 | #include <mach/map.h> | ||
23 | #include <plat/regs-timer.h> | ||
24 | #include <plat/cpu.h> | ||
25 | |||
26 | /* Timer interrupt handling */ | ||
27 | |||
28 | static void s3c_irq_demux_timer(unsigned int base_irq, unsigned int sub_irq) | ||
29 | { | ||
30 | generic_handle_irq(sub_irq); | ||
31 | } | ||
32 | |||
33 | static void s3c_irq_demux_timer0(unsigned int irq, struct irq_desc *desc) | ||
34 | { | ||
35 | s3c_irq_demux_timer(irq, IRQ_TIMER0); | ||
36 | } | ||
37 | |||
38 | static void s3c_irq_demux_timer1(unsigned int irq, struct irq_desc *desc) | ||
39 | { | ||
40 | s3c_irq_demux_timer(irq, IRQ_TIMER1); | ||
41 | } | ||
42 | |||
43 | static void s3c_irq_demux_timer2(unsigned int irq, struct irq_desc *desc) | ||
44 | { | ||
45 | s3c_irq_demux_timer(irq, IRQ_TIMER2); | ||
46 | } | ||
47 | |||
48 | static void s3c_irq_demux_timer3(unsigned int irq, struct irq_desc *desc) | ||
49 | { | ||
50 | s3c_irq_demux_timer(irq, IRQ_TIMER3); | ||
51 | } | ||
52 | |||
53 | static void s3c_irq_demux_timer4(unsigned int irq, struct irq_desc *desc) | ||
54 | { | ||
55 | s3c_irq_demux_timer(irq, IRQ_TIMER4); | ||
56 | } | ||
57 | |||
58 | /* We assume the IRQ_TIMER0..IRQ_TIMER4 range is continuous. */ | ||
59 | |||
60 | static void s3c_irq_timer_mask(unsigned int irq) | ||
61 | { | ||
62 | u32 reg = __raw_readl(S3C64XX_TINT_CSTAT); | ||
63 | |||
64 | reg &= 0x1f; /* mask out pending interrupts */ | ||
65 | reg &= ~(1 << (irq - IRQ_TIMER0)); | ||
66 | __raw_writel(reg, S3C64XX_TINT_CSTAT); | ||
67 | } | ||
68 | |||
69 | static void s3c_irq_timer_unmask(unsigned int irq) | ||
70 | { | ||
71 | u32 reg = __raw_readl(S3C64XX_TINT_CSTAT); | ||
72 | |||
73 | reg &= 0x1f; /* mask out pending interrupts */ | ||
74 | reg |= 1 << (irq - IRQ_TIMER0); | ||
75 | __raw_writel(reg, S3C64XX_TINT_CSTAT); | ||
76 | } | ||
77 | |||
78 | static void s3c_irq_timer_ack(unsigned int irq) | ||
79 | { | ||
80 | u32 reg = __raw_readl(S3C64XX_TINT_CSTAT); | ||
81 | |||
82 | reg &= 0x1f; | ||
83 | reg |= (1 << 5) << (irq - IRQ_TIMER0); | ||
84 | __raw_writel(reg, S3C64XX_TINT_CSTAT); | ||
85 | } | ||
86 | |||
87 | static struct irq_chip s3c_irq_timer = { | ||
88 | .name = "s3c-timer", | ||
89 | .mask = s3c_irq_timer_mask, | ||
90 | .unmask = s3c_irq_timer_unmask, | ||
91 | .ack = s3c_irq_timer_ack, | ||
92 | }; | ||
93 | |||
94 | struct uart_irq { | ||
95 | void __iomem *regs; | ||
96 | unsigned int base_irq; | ||
97 | unsigned int parent_irq; | ||
98 | }; | ||
99 | |||
100 | /* Note, we make use of the fact that the parent IRQs, IRQ_UART[0..3] | ||
101 | * are consecutive when looking up the interrupt in the demux routines. | ||
102 | */ | ||
103 | static struct uart_irq uart_irqs[] = { | ||
104 | [0] = { | ||
105 | .regs = S3C_VA_UART0, | ||
106 | .base_irq = IRQ_S3CUART_BASE0, | ||
107 | .parent_irq = IRQ_UART0, | ||
108 | }, | ||
109 | [1] = { | ||
110 | .regs = S3C_VA_UART1, | ||
111 | .base_irq = IRQ_S3CUART_BASE1, | ||
112 | .parent_irq = IRQ_UART1, | ||
113 | }, | ||
114 | [2] = { | ||
115 | .regs = S3C_VA_UART2, | ||
116 | .base_irq = IRQ_S3CUART_BASE2, | ||
117 | .parent_irq = IRQ_UART2, | ||
118 | }, | ||
119 | [3] = { | ||
120 | .regs = S3C_VA_UART3, | ||
121 | .base_irq = IRQ_S3CUART_BASE3, | ||
122 | .parent_irq = IRQ_UART3, | ||
123 | }, | ||
124 | }; | ||
125 | |||
126 | static inline void __iomem *s3c_irq_uart_base(unsigned int irq) | ||
127 | { | ||
128 | struct uart_irq *uirq = get_irq_chip_data(irq); | ||
129 | return uirq->regs; | ||
130 | } | ||
131 | |||
132 | static inline unsigned int s3c_irq_uart_bit(unsigned int irq) | ||
133 | { | ||
134 | return irq & 3; | ||
135 | } | ||
136 | |||
137 | /* UART interrupt registers, not worth adding to seperate include header */ | ||
138 | #define S3C64XX_UINTP 0x30 | ||
139 | #define S3C64XX_UINTSP 0x34 | ||
140 | #define S3C64XX_UINTM 0x38 | ||
141 | |||
142 | static void s3c_irq_uart_mask(unsigned int irq) | ||
143 | { | ||
144 | void __iomem *regs = s3c_irq_uart_base(irq); | ||
145 | unsigned int bit = s3c_irq_uart_bit(irq); | ||
146 | u32 reg; | ||
147 | |||
148 | reg = __raw_readl(regs + S3C64XX_UINTM); | ||
149 | reg |= (1 << bit); | ||
150 | __raw_writel(reg, regs + S3C64XX_UINTM); | ||
151 | } | ||
152 | |||
153 | static void s3c_irq_uart_maskack(unsigned int irq) | ||
154 | { | ||
155 | void __iomem *regs = s3c_irq_uart_base(irq); | ||
156 | unsigned int bit = s3c_irq_uart_bit(irq); | ||
157 | u32 reg; | ||
158 | |||
159 | reg = __raw_readl(regs + S3C64XX_UINTM); | ||
160 | reg |= (1 << bit); | ||
161 | __raw_writel(reg, regs + S3C64XX_UINTM); | ||
162 | __raw_writel(1 << bit, regs + S3C64XX_UINTP); | ||
163 | } | ||
164 | |||
165 | static void s3c_irq_uart_unmask(unsigned int irq) | ||
166 | { | ||
167 | void __iomem *regs = s3c_irq_uart_base(irq); | ||
168 | unsigned int bit = s3c_irq_uart_bit(irq); | ||
169 | u32 reg; | ||
170 | |||
171 | reg = __raw_readl(regs + S3C64XX_UINTM); | ||
172 | reg &= ~(1 << bit); | ||
173 | __raw_writel(reg, regs + S3C64XX_UINTM); | ||
174 | } | ||
175 | |||
176 | static void s3c_irq_uart_ack(unsigned int irq) | ||
177 | { | ||
178 | void __iomem *regs = s3c_irq_uart_base(irq); | ||
179 | unsigned int bit = s3c_irq_uart_bit(irq); | ||
180 | |||
181 | __raw_writel(1 << bit, regs + S3C64XX_UINTP); | ||
182 | } | ||
183 | |||
184 | static void s3c_irq_demux_uart(unsigned int irq, struct irq_desc *desc) | ||
185 | { | ||
186 | struct uart_irq *uirq = &uart_irqs[irq - IRQ_UART0]; | ||
187 | u32 pend = __raw_readl(uirq->regs + S3C64XX_UINTP); | ||
188 | int base = uirq->base_irq; | ||
189 | |||
190 | if (pend & (1 << 0)) | ||
191 | generic_handle_irq(base); | ||
192 | if (pend & (1 << 1)) | ||
193 | generic_handle_irq(base + 1); | ||
194 | if (pend & (1 << 2)) | ||
195 | generic_handle_irq(base + 2); | ||
196 | if (pend & (1 << 3)) | ||
197 | generic_handle_irq(base + 3); | ||
198 | } | ||
199 | |||
200 | static struct irq_chip s3c_irq_uart = { | ||
201 | .name = "s3c-uart", | ||
202 | .mask = s3c_irq_uart_mask, | ||
203 | .unmask = s3c_irq_uart_unmask, | ||
204 | .mask_ack = s3c_irq_uart_maskack, | ||
205 | .ack = s3c_irq_uart_ack, | ||
206 | }; | ||
207 | |||
208 | static void __init s3c64xx_uart_irq(struct uart_irq *uirq) | ||
209 | { | ||
210 | void *reg_base = uirq->regs; | ||
211 | unsigned int irq; | ||
212 | int offs; | ||
213 | |||
214 | /* mask all interrupts at the start. */ | ||
215 | __raw_writel(0xf, reg_base + S3C64XX_UINTM); | ||
216 | |||
217 | for (offs = 0; offs < 3; offs++) { | ||
218 | irq = uirq->base_irq + offs; | ||
219 | |||
220 | set_irq_chip(irq, &s3c_irq_uart); | ||
221 | set_irq_chip_data(irq, uirq); | ||
222 | set_irq_handler(irq, handle_level_irq); | ||
223 | set_irq_flags(irq, IRQF_VALID); | ||
224 | } | ||
225 | |||
226 | set_irq_chained_handler(uirq->parent_irq, s3c_irq_demux_uart); | ||
227 | } | ||
228 | |||
229 | void __init s3c64xx_init_irq(u32 vic0_valid, u32 vic1_valid) | ||
230 | { | ||
231 | int uart, irq; | ||
232 | |||
233 | printk(KERN_DEBUG "%s: initialising interrupts\n", __func__); | ||
234 | |||
235 | /* initialise the pair of VICs */ | ||
236 | vic_init(S3C_VA_VIC0, S3C_VIC0_BASE, vic0_valid); | ||
237 | vic_init(S3C_VA_VIC1, S3C_VIC1_BASE, vic1_valid); | ||
238 | |||
239 | /* add the timer sub-irqs */ | ||
240 | |||
241 | set_irq_chained_handler(IRQ_TIMER0_VIC, s3c_irq_demux_timer0); | ||
242 | set_irq_chained_handler(IRQ_TIMER1_VIC, s3c_irq_demux_timer1); | ||
243 | set_irq_chained_handler(IRQ_TIMER2_VIC, s3c_irq_demux_timer2); | ||
244 | set_irq_chained_handler(IRQ_TIMER3_VIC, s3c_irq_demux_timer3); | ||
245 | set_irq_chained_handler(IRQ_TIMER4_VIC, s3c_irq_demux_timer4); | ||
246 | |||
247 | for (irq = IRQ_TIMER0; irq <= IRQ_TIMER4; irq++) { | ||
248 | set_irq_chip(irq, &s3c_irq_timer); | ||
249 | set_irq_handler(irq, handle_level_irq); | ||
250 | set_irq_flags(irq, IRQF_VALID); | ||
251 | } | ||
252 | |||
253 | for (uart = 0; uart < ARRAY_SIZE(uart_irqs); uart++) | ||
254 | s3c64xx_uart_irq(&uart_irqs[uart]); | ||
255 | } | ||
256 | |||
257 | |||
diff --git a/arch/arm/plat-s3c64xx/s3c6400-clock.c b/arch/arm/plat-s3c64xx/s3c6400-clock.c new file mode 100644 index 000000000000..8d9a0cada668 --- /dev/null +++ b/arch/arm/plat-s3c64xx/s3c6400-clock.c | |||
@@ -0,0 +1,655 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/s3c6400-clock.c | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * S3C6400 based common clock support | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/init.h> | ||
16 | #include <linux/module.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/list.h> | ||
19 | #include <linux/errno.h> | ||
20 | #include <linux/err.h> | ||
21 | #include <linux/clk.h> | ||
22 | #include <linux/sysdev.h> | ||
23 | #include <linux/io.h> | ||
24 | |||
25 | #include <mach/hardware.h> | ||
26 | #include <mach/map.h> | ||
27 | |||
28 | #include <plat/cpu-freq.h> | ||
29 | |||
30 | #include <plat/regs-clock.h> | ||
31 | #include <plat/clock.h> | ||
32 | #include <plat/cpu.h> | ||
33 | #include <plat/pll.h> | ||
34 | |||
35 | /* fin_apll, fin_mpll and fin_epll are all the same clock, which we call | ||
36 | * ext_xtal_mux for want of an actual name from the manual. | ||
37 | */ | ||
38 | |||
39 | struct clk clk_ext_xtal_mux = { | ||
40 | .name = "ext_xtal", | ||
41 | .id = -1, | ||
42 | }; | ||
43 | |||
44 | #define clk_fin_apll clk_ext_xtal_mux | ||
45 | #define clk_fin_mpll clk_ext_xtal_mux | ||
46 | #define clk_fin_epll clk_ext_xtal_mux | ||
47 | |||
48 | #define clk_fout_mpll clk_mpll | ||
49 | |||
50 | struct clk_sources { | ||
51 | unsigned int nr_sources; | ||
52 | struct clk **sources; | ||
53 | }; | ||
54 | |||
55 | struct clksrc_clk { | ||
56 | struct clk clk; | ||
57 | unsigned int mask; | ||
58 | unsigned int shift; | ||
59 | |||
60 | struct clk_sources *sources; | ||
61 | |||
62 | unsigned int divider_shift; | ||
63 | void __iomem *reg_divider; | ||
64 | }; | ||
65 | |||
66 | struct clk clk_fout_apll = { | ||
67 | .name = "fout_apll", | ||
68 | .id = -1, | ||
69 | }; | ||
70 | |||
71 | static struct clk *clk_src_apll_list[] = { | ||
72 | [0] = &clk_fin_apll, | ||
73 | [1] = &clk_fout_apll, | ||
74 | }; | ||
75 | |||
76 | static struct clk_sources clk_src_apll = { | ||
77 | .sources = clk_src_apll_list, | ||
78 | .nr_sources = ARRAY_SIZE(clk_src_apll_list), | ||
79 | }; | ||
80 | |||
81 | struct clksrc_clk clk_mout_apll = { | ||
82 | .clk = { | ||
83 | .name = "mout_apll", | ||
84 | .id = -1, | ||
85 | }, | ||
86 | .shift = S3C6400_CLKSRC_APLL_MOUT_SHIFT, | ||
87 | .mask = S3C6400_CLKSRC_APLL_MOUT, | ||
88 | .sources = &clk_src_apll, | ||
89 | }; | ||
90 | |||
91 | struct clk clk_fout_epll = { | ||
92 | .name = "fout_epll", | ||
93 | .id = -1, | ||
94 | }; | ||
95 | |||
96 | static struct clk *clk_src_epll_list[] = { | ||
97 | [0] = &clk_fin_epll, | ||
98 | [1] = &clk_fout_epll, | ||
99 | }; | ||
100 | |||
101 | static struct clk_sources clk_src_epll = { | ||
102 | .sources = clk_src_epll_list, | ||
103 | .nr_sources = ARRAY_SIZE(clk_src_epll_list), | ||
104 | }; | ||
105 | |||
106 | struct clksrc_clk clk_mout_epll = { | ||
107 | .clk = { | ||
108 | .name = "mout_epll", | ||
109 | .id = -1, | ||
110 | }, | ||
111 | .shift = S3C6400_CLKSRC_EPLL_MOUT_SHIFT, | ||
112 | .mask = S3C6400_CLKSRC_EPLL_MOUT, | ||
113 | .sources = &clk_src_epll, | ||
114 | }; | ||
115 | |||
116 | static struct clk *clk_src_mpll_list[] = { | ||
117 | [0] = &clk_fin_mpll, | ||
118 | [1] = &clk_fout_mpll, | ||
119 | }; | ||
120 | |||
121 | static struct clk_sources clk_src_mpll = { | ||
122 | .sources = clk_src_mpll_list, | ||
123 | .nr_sources = ARRAY_SIZE(clk_src_mpll_list), | ||
124 | }; | ||
125 | |||
126 | struct clksrc_clk clk_mout_mpll = { | ||
127 | .clk = { | ||
128 | .name = "mout_mpll", | ||
129 | .id = -1, | ||
130 | }, | ||
131 | .shift = S3C6400_CLKSRC_MPLL_MOUT_SHIFT, | ||
132 | .mask = S3C6400_CLKSRC_MPLL_MOUT, | ||
133 | .sources = &clk_src_mpll, | ||
134 | }; | ||
135 | |||
136 | static unsigned long s3c64xx_clk_doutmpll_get_rate(struct clk *clk) | ||
137 | { | ||
138 | unsigned long rate = clk_get_rate(clk->parent); | ||
139 | |||
140 | printk(KERN_DEBUG "%s: parent is %ld\n", __func__, rate); | ||
141 | |||
142 | if (__raw_readl(S3C_CLK_DIV0) & S3C6400_CLKDIV0_MPLL_MASK) | ||
143 | rate /= 2; | ||
144 | |||
145 | return rate; | ||
146 | } | ||
147 | |||
148 | struct clk clk_dout_mpll = { | ||
149 | .name = "dout_mpll", | ||
150 | .id = -1, | ||
151 | .parent = &clk_mout_mpll.clk, | ||
152 | .get_rate = s3c64xx_clk_doutmpll_get_rate, | ||
153 | }; | ||
154 | |||
155 | static struct clk *clkset_spi_mmc_list[] = { | ||
156 | &clk_mout_epll.clk, | ||
157 | &clk_dout_mpll, | ||
158 | &clk_fin_epll, | ||
159 | &clk_27m, | ||
160 | }; | ||
161 | |||
162 | static struct clk_sources clkset_spi_mmc = { | ||
163 | .sources = clkset_spi_mmc_list, | ||
164 | .nr_sources = ARRAY_SIZE(clkset_spi_mmc_list), | ||
165 | }; | ||
166 | |||
167 | static struct clk *clkset_irda_list[] = { | ||
168 | &clk_mout_epll.clk, | ||
169 | &clk_dout_mpll, | ||
170 | NULL, | ||
171 | &clk_27m, | ||
172 | }; | ||
173 | |||
174 | static struct clk_sources clkset_irda = { | ||
175 | .sources = clkset_irda_list, | ||
176 | .nr_sources = ARRAY_SIZE(clkset_irda_list), | ||
177 | }; | ||
178 | |||
179 | static struct clk *clkset_uart_list[] = { | ||
180 | &clk_mout_epll.clk, | ||
181 | &clk_dout_mpll, | ||
182 | NULL, | ||
183 | NULL | ||
184 | }; | ||
185 | |||
186 | static struct clk_sources clkset_uart = { | ||
187 | .sources = clkset_uart_list, | ||
188 | .nr_sources = ARRAY_SIZE(clkset_uart_list), | ||
189 | }; | ||
190 | |||
191 | static struct clk *clkset_uhost_list[] = { | ||
192 | &clk_mout_epll.clk, | ||
193 | &clk_dout_mpll, | ||
194 | &clk_fin_epll, | ||
195 | &clk_48m, | ||
196 | }; | ||
197 | |||
198 | static struct clk_sources clkset_uhost = { | ||
199 | .sources = clkset_uhost_list, | ||
200 | .nr_sources = ARRAY_SIZE(clkset_uhost_list), | ||
201 | }; | ||
202 | |||
203 | |||
204 | /* The peripheral clocks are all controlled via clocksource followed | ||
205 | * by an optional divider and gate stage. We currently roll this into | ||
206 | * one clock which hides the intermediate clock from the mux. | ||
207 | * | ||
208 | * Note, the JPEG clock can only be an even divider... | ||
209 | * | ||
210 | * The scaler and LCD clocks depend on the S3C64XX version, and also | ||
211 | * have a common parent divisor so are not included here. | ||
212 | */ | ||
213 | |||
214 | static inline struct clksrc_clk *to_clksrc(struct clk *clk) | ||
215 | { | ||
216 | return container_of(clk, struct clksrc_clk, clk); | ||
217 | } | ||
218 | |||
219 | static unsigned long s3c64xx_getrate_clksrc(struct clk *clk) | ||
220 | { | ||
221 | struct clksrc_clk *sclk = to_clksrc(clk); | ||
222 | unsigned long rate = clk_get_rate(clk->parent); | ||
223 | u32 clkdiv = __raw_readl(sclk->reg_divider); | ||
224 | |||
225 | clkdiv >>= sclk->divider_shift; | ||
226 | clkdiv &= 0xf; | ||
227 | clkdiv++; | ||
228 | |||
229 | rate /= clkdiv; | ||
230 | return rate; | ||
231 | } | ||
232 | |||
233 | static int s3c64xx_setrate_clksrc(struct clk *clk, unsigned long rate) | ||
234 | { | ||
235 | struct clksrc_clk *sclk = to_clksrc(clk); | ||
236 | void __iomem *reg = sclk->reg_divider; | ||
237 | unsigned int div; | ||
238 | u32 val; | ||
239 | |||
240 | rate = clk_round_rate(clk, rate); | ||
241 | div = clk_get_rate(clk->parent) / rate; | ||
242 | |||
243 | val = __raw_readl(reg); | ||
244 | val &= ~sclk->mask; | ||
245 | val |= (rate - 1) << sclk->shift; | ||
246 | __raw_writel(val, reg); | ||
247 | |||
248 | return 0; | ||
249 | } | ||
250 | |||
251 | static int s3c64xx_setparent_clksrc(struct clk *clk, struct clk *parent) | ||
252 | { | ||
253 | struct clksrc_clk *sclk = to_clksrc(clk); | ||
254 | struct clk_sources *srcs = sclk->sources; | ||
255 | u32 clksrc = __raw_readl(S3C_CLK_SRC); | ||
256 | int src_nr = -1; | ||
257 | int ptr; | ||
258 | |||
259 | for (ptr = 0; ptr < srcs->nr_sources; ptr++) | ||
260 | if (srcs->sources[ptr] == parent) { | ||
261 | src_nr = ptr; | ||
262 | break; | ||
263 | } | ||
264 | |||
265 | if (src_nr >= 0) { | ||
266 | clksrc &= ~sclk->mask; | ||
267 | clksrc |= src_nr << sclk->shift; | ||
268 | |||
269 | __raw_writel(clksrc, S3C_CLK_SRC); | ||
270 | return 0; | ||
271 | } | ||
272 | |||
273 | return -EINVAL; | ||
274 | } | ||
275 | |||
276 | static unsigned long s3c64xx_roundrate_clksrc(struct clk *clk, | ||
277 | unsigned long rate) | ||
278 | { | ||
279 | unsigned long parent_rate = clk_get_rate(clk->parent); | ||
280 | int div; | ||
281 | |||
282 | if (rate > parent_rate) | ||
283 | rate = parent_rate; | ||
284 | else { | ||
285 | div = rate / parent_rate; | ||
286 | |||
287 | if (div == 0) | ||
288 | div = 1; | ||
289 | if (div > 16) | ||
290 | div = 16; | ||
291 | |||
292 | rate = parent_rate / div; | ||
293 | } | ||
294 | |||
295 | return rate; | ||
296 | } | ||
297 | |||
298 | static struct clksrc_clk clk_mmc0 = { | ||
299 | .clk = { | ||
300 | .name = "mmc_bus", | ||
301 | .id = 0, | ||
302 | .ctrlbit = S3C_CLKCON_SCLK_MMC0, | ||
303 | .enable = s3c64xx_sclk_ctrl, | ||
304 | .set_parent = s3c64xx_setparent_clksrc, | ||
305 | .get_rate = s3c64xx_getrate_clksrc, | ||
306 | .set_rate = s3c64xx_setrate_clksrc, | ||
307 | .round_rate = s3c64xx_roundrate_clksrc, | ||
308 | }, | ||
309 | .shift = S3C6400_CLKSRC_MMC0_SHIFT, | ||
310 | .mask = S3C6400_CLKSRC_MMC0_MASK, | ||
311 | .sources = &clkset_spi_mmc, | ||
312 | .divider_shift = S3C6400_CLKDIV1_MMC0_SHIFT, | ||
313 | .reg_divider = S3C_CLK_DIV1, | ||
314 | }; | ||
315 | |||
316 | static struct clksrc_clk clk_mmc1 = { | ||
317 | .clk = { | ||
318 | .name = "mmc_bus", | ||
319 | .id = 1, | ||
320 | .ctrlbit = S3C_CLKCON_SCLK_MMC1, | ||
321 | .enable = s3c64xx_sclk_ctrl, | ||
322 | .get_rate = s3c64xx_getrate_clksrc, | ||
323 | .set_rate = s3c64xx_setrate_clksrc, | ||
324 | .set_parent = s3c64xx_setparent_clksrc, | ||
325 | .round_rate = s3c64xx_roundrate_clksrc, | ||
326 | }, | ||
327 | .shift = S3C6400_CLKSRC_MMC1_SHIFT, | ||
328 | .mask = S3C6400_CLKSRC_MMC1_MASK, | ||
329 | .sources = &clkset_spi_mmc, | ||
330 | .divider_shift = S3C6400_CLKDIV1_MMC1_SHIFT, | ||
331 | .reg_divider = S3C_CLK_DIV1, | ||
332 | }; | ||
333 | |||
334 | static struct clksrc_clk clk_mmc2 = { | ||
335 | .clk = { | ||
336 | .name = "mmc_bus", | ||
337 | .id = 2, | ||
338 | .ctrlbit = S3C_CLKCON_SCLK_MMC2, | ||
339 | .enable = s3c64xx_sclk_ctrl, | ||
340 | .get_rate = s3c64xx_getrate_clksrc, | ||
341 | .set_rate = s3c64xx_setrate_clksrc, | ||
342 | .set_parent = s3c64xx_setparent_clksrc, | ||
343 | .round_rate = s3c64xx_roundrate_clksrc, | ||
344 | }, | ||
345 | .shift = S3C6400_CLKSRC_MMC2_SHIFT, | ||
346 | .mask = S3C6400_CLKSRC_MMC2_MASK, | ||
347 | .sources = &clkset_spi_mmc, | ||
348 | .divider_shift = S3C6400_CLKDIV1_MMC2_SHIFT, | ||
349 | .reg_divider = S3C_CLK_DIV1, | ||
350 | }; | ||
351 | |||
352 | static struct clksrc_clk clk_usbhost = { | ||
353 | .clk = { | ||
354 | .name = "usb-host-bus", | ||
355 | .id = -1, | ||
356 | .ctrlbit = S3C_CLKCON_SCLK_UHOST, | ||
357 | .enable = s3c64xx_sclk_ctrl, | ||
358 | .set_parent = s3c64xx_setparent_clksrc, | ||
359 | .get_rate = s3c64xx_getrate_clksrc, | ||
360 | .set_rate = s3c64xx_setrate_clksrc, | ||
361 | .round_rate = s3c64xx_roundrate_clksrc, | ||
362 | }, | ||
363 | .shift = S3C6400_CLKSRC_UHOST_SHIFT, | ||
364 | .mask = S3C6400_CLKSRC_UHOST_MASK, | ||
365 | .sources = &clkset_uhost, | ||
366 | .divider_shift = S3C6400_CLKDIV1_UHOST_SHIFT, | ||
367 | .reg_divider = S3C_CLK_DIV1, | ||
368 | }; | ||
369 | |||
370 | static struct clksrc_clk clk_uart_uclk1 = { | ||
371 | .clk = { | ||
372 | .name = "uclk1", | ||
373 | .id = -1, | ||
374 | .ctrlbit = S3C_CLKCON_SCLK_UART, | ||
375 | .enable = s3c64xx_sclk_ctrl, | ||
376 | .set_parent = s3c64xx_setparent_clksrc, | ||
377 | .get_rate = s3c64xx_getrate_clksrc, | ||
378 | .set_rate = s3c64xx_setrate_clksrc, | ||
379 | .round_rate = s3c64xx_roundrate_clksrc, | ||
380 | }, | ||
381 | .shift = S3C6400_CLKSRC_UART_SHIFT, | ||
382 | .mask = S3C6400_CLKSRC_UART_MASK, | ||
383 | .sources = &clkset_uart, | ||
384 | .divider_shift = S3C6400_CLKDIV2_UART_SHIFT, | ||
385 | .reg_divider = S3C_CLK_DIV2, | ||
386 | }; | ||
387 | |||
388 | /* Where does UCLK0 come from? */ | ||
389 | |||
390 | static struct clksrc_clk clk_spi0 = { | ||
391 | .clk = { | ||
392 | .name = "spi-bus", | ||
393 | .id = 0, | ||
394 | .ctrlbit = S3C_CLKCON_SCLK_SPI0, | ||
395 | .enable = s3c64xx_sclk_ctrl, | ||
396 | .set_parent = s3c64xx_setparent_clksrc, | ||
397 | .get_rate = s3c64xx_getrate_clksrc, | ||
398 | .set_rate = s3c64xx_setrate_clksrc, | ||
399 | .round_rate = s3c64xx_roundrate_clksrc, | ||
400 | }, | ||
401 | .shift = S3C6400_CLKSRC_SPI0_SHIFT, | ||
402 | .mask = S3C6400_CLKSRC_SPI0_MASK, | ||
403 | .sources = &clkset_spi_mmc, | ||
404 | .divider_shift = S3C6400_CLKDIV2_SPI0_SHIFT, | ||
405 | .reg_divider = S3C_CLK_DIV2, | ||
406 | }; | ||
407 | |||
408 | static struct clksrc_clk clk_spi1 = { | ||
409 | .clk = { | ||
410 | .name = "spi-bus", | ||
411 | .id = 1, | ||
412 | .ctrlbit = S3C_CLKCON_SCLK_SPI1, | ||
413 | .enable = s3c64xx_sclk_ctrl, | ||
414 | .set_parent = s3c64xx_setparent_clksrc, | ||
415 | .get_rate = s3c64xx_getrate_clksrc, | ||
416 | .set_rate = s3c64xx_setrate_clksrc, | ||
417 | .round_rate = s3c64xx_roundrate_clksrc, | ||
418 | }, | ||
419 | .shift = S3C6400_CLKSRC_SPI1_SHIFT, | ||
420 | .mask = S3C6400_CLKSRC_SPI1_MASK, | ||
421 | .sources = &clkset_spi_mmc, | ||
422 | .divider_shift = S3C6400_CLKDIV2_SPI1_SHIFT, | ||
423 | .reg_divider = S3C_CLK_DIV2, | ||
424 | }; | ||
425 | |||
426 | static struct clk clk_iis_cd0 = { | ||
427 | .name = "iis_cdclk0", | ||
428 | .id = -1, | ||
429 | }; | ||
430 | |||
431 | static struct clk clk_iis_cd1 = { | ||
432 | .name = "iis_cdclk1", | ||
433 | .id = -1, | ||
434 | }; | ||
435 | |||
436 | static struct clk clk_pcm_cd = { | ||
437 | .name = "pcm_cdclk", | ||
438 | .id = -1, | ||
439 | }; | ||
440 | |||
441 | static struct clk *clkset_audio0_list[] = { | ||
442 | [0] = &clk_mout_epll.clk, | ||
443 | [1] = &clk_dout_mpll, | ||
444 | [2] = &clk_fin_epll, | ||
445 | [3] = &clk_iis_cd0, | ||
446 | [4] = &clk_pcm_cd, | ||
447 | }; | ||
448 | |||
449 | static struct clk_sources clkset_audio0 = { | ||
450 | .sources = clkset_audio0_list, | ||
451 | .nr_sources = ARRAY_SIZE(clkset_audio0_list), | ||
452 | }; | ||
453 | |||
454 | static struct clksrc_clk clk_audio0 = { | ||
455 | .clk = { | ||
456 | .name = "audio-bus", | ||
457 | .id = 0, | ||
458 | .ctrlbit = S3C_CLKCON_SCLK_AUDIO0, | ||
459 | .enable = s3c64xx_sclk_ctrl, | ||
460 | .set_parent = s3c64xx_setparent_clksrc, | ||
461 | .get_rate = s3c64xx_getrate_clksrc, | ||
462 | .set_rate = s3c64xx_setrate_clksrc, | ||
463 | .round_rate = s3c64xx_roundrate_clksrc, | ||
464 | }, | ||
465 | .shift = S3C6400_CLKSRC_AUDIO0_SHIFT, | ||
466 | .mask = S3C6400_CLKSRC_AUDIO0_MASK, | ||
467 | .sources = &clkset_audio0, | ||
468 | .divider_shift = S3C6400_CLKDIV2_AUDIO0_SHIFT, | ||
469 | .reg_divider = S3C_CLK_DIV2, | ||
470 | }; | ||
471 | |||
472 | static struct clk *clkset_audio1_list[] = { | ||
473 | [0] = &clk_mout_epll.clk, | ||
474 | [1] = &clk_dout_mpll, | ||
475 | [2] = &clk_fin_epll, | ||
476 | [3] = &clk_iis_cd1, | ||
477 | [4] = &clk_pcm_cd, | ||
478 | }; | ||
479 | |||
480 | static struct clk_sources clkset_audio1 = { | ||
481 | .sources = clkset_audio1_list, | ||
482 | .nr_sources = ARRAY_SIZE(clkset_audio1_list), | ||
483 | }; | ||
484 | |||
485 | static struct clksrc_clk clk_audio1 = { | ||
486 | .clk = { | ||
487 | .name = "audio-bus", | ||
488 | .id = 1, | ||
489 | .ctrlbit = S3C_CLKCON_SCLK_AUDIO1, | ||
490 | .enable = s3c64xx_sclk_ctrl, | ||
491 | .set_parent = s3c64xx_setparent_clksrc, | ||
492 | .get_rate = s3c64xx_getrate_clksrc, | ||
493 | .set_rate = s3c64xx_setrate_clksrc, | ||
494 | .round_rate = s3c64xx_roundrate_clksrc, | ||
495 | }, | ||
496 | .shift = S3C6400_CLKSRC_AUDIO1_SHIFT, | ||
497 | .mask = S3C6400_CLKSRC_AUDIO1_MASK, | ||
498 | .sources = &clkset_audio1, | ||
499 | .divider_shift = S3C6400_CLKDIV2_AUDIO1_SHIFT, | ||
500 | .reg_divider = S3C_CLK_DIV2, | ||
501 | }; | ||
502 | |||
503 | static struct clksrc_clk clk_irda = { | ||
504 | .clk = { | ||
505 | .name = "irda-bus", | ||
506 | .id = 0, | ||
507 | .ctrlbit = S3C_CLKCON_SCLK_IRDA, | ||
508 | .enable = s3c64xx_sclk_ctrl, | ||
509 | .set_parent = s3c64xx_setparent_clksrc, | ||
510 | .get_rate = s3c64xx_getrate_clksrc, | ||
511 | .set_rate = s3c64xx_setrate_clksrc, | ||
512 | .round_rate = s3c64xx_roundrate_clksrc, | ||
513 | }, | ||
514 | .shift = S3C6400_CLKSRC_IRDA_SHIFT, | ||
515 | .mask = S3C6400_CLKSRC_IRDA_MASK, | ||
516 | .sources = &clkset_irda, | ||
517 | .divider_shift = S3C6400_CLKDIV2_IRDA_SHIFT, | ||
518 | .reg_divider = S3C_CLK_DIV2, | ||
519 | }; | ||
520 | |||
521 | /* Clock initialisation code */ | ||
522 | |||
523 | static struct clksrc_clk *init_parents[] = { | ||
524 | &clk_mout_apll, | ||
525 | &clk_mout_epll, | ||
526 | &clk_mout_mpll, | ||
527 | &clk_mmc0, | ||
528 | &clk_mmc1, | ||
529 | &clk_mmc2, | ||
530 | &clk_usbhost, | ||
531 | &clk_uart_uclk1, | ||
532 | &clk_spi0, | ||
533 | &clk_spi1, | ||
534 | &clk_audio0, | ||
535 | &clk_audio1, | ||
536 | &clk_irda, | ||
537 | }; | ||
538 | |||
539 | static void __init_or_cpufreq s3c6400_set_clksrc(struct clksrc_clk *clk) | ||
540 | { | ||
541 | struct clk_sources *srcs = clk->sources; | ||
542 | u32 clksrc = __raw_readl(S3C_CLK_SRC); | ||
543 | |||
544 | clksrc &= clk->mask; | ||
545 | clksrc >>= clk->shift; | ||
546 | |||
547 | if (clksrc > srcs->nr_sources || !srcs->sources[clksrc]) { | ||
548 | printk(KERN_ERR "%s: bad source %d\n", | ||
549 | clk->clk.name, clksrc); | ||
550 | return; | ||
551 | } | ||
552 | |||
553 | clk->clk.parent = srcs->sources[clksrc]; | ||
554 | |||
555 | printk(KERN_INFO "%s: source is %s (%d), rate is %ld\n", | ||
556 | clk->clk.name, clk->clk.parent->name, clksrc, | ||
557 | clk_get_rate(&clk->clk)); | ||
558 | } | ||
559 | |||
560 | #define GET_DIV(clk, field) ((((clk) & field##_MASK) >> field##_SHIFT) + 1) | ||
561 | |||
562 | void __init_or_cpufreq s3c6400_setup_clocks(void) | ||
563 | { | ||
564 | struct clk *xtal_clk; | ||
565 | unsigned long xtal; | ||
566 | unsigned long fclk; | ||
567 | unsigned long hclk; | ||
568 | unsigned long hclk2; | ||
569 | unsigned long pclk; | ||
570 | unsigned long epll; | ||
571 | unsigned long apll; | ||
572 | unsigned long mpll; | ||
573 | unsigned int ptr; | ||
574 | u32 clkdiv0; | ||
575 | |||
576 | printk(KERN_DEBUG "%s: registering clocks\n", __func__); | ||
577 | |||
578 | clkdiv0 = __raw_readl(S3C_CLK_DIV0); | ||
579 | printk(KERN_DEBUG "%s: clkdiv0 = %08x\n", __func__, clkdiv0); | ||
580 | |||
581 | xtal_clk = clk_get(NULL, "xtal"); | ||
582 | BUG_ON(IS_ERR(xtal_clk)); | ||
583 | |||
584 | xtal = clk_get_rate(xtal_clk); | ||
585 | clk_put(xtal_clk); | ||
586 | |||
587 | printk(KERN_DEBUG "%s: xtal is %ld\n", __func__, xtal); | ||
588 | |||
589 | epll = s3c6400_get_epll(xtal); | ||
590 | mpll = s3c6400_get_pll(xtal, __raw_readl(S3C_MPLL_CON)); | ||
591 | apll = s3c6400_get_pll(xtal, __raw_readl(S3C_APLL_CON)); | ||
592 | |||
593 | fclk = mpll; | ||
594 | |||
595 | printk(KERN_INFO "S3C64XX: PLL settings, A=%ld, M=%ld, E=%ld\n", | ||
596 | apll, mpll, epll); | ||
597 | |||
598 | hclk2 = mpll / GET_DIV(clkdiv0, S3C6400_CLKDIV0_HCLK2); | ||
599 | hclk = hclk2 / GET_DIV(clkdiv0, S3C6400_CLKDIV0_HCLK); | ||
600 | pclk = hclk2 / GET_DIV(clkdiv0, S3C6400_CLKDIV0_PCLK); | ||
601 | |||
602 | printk(KERN_INFO "S3C64XX: HCLK2=%ld, HCLK=%ld, PCLK=%ld\n", | ||
603 | hclk2, hclk, pclk); | ||
604 | |||
605 | clk_fout_mpll.rate = mpll; | ||
606 | clk_fout_epll.rate = epll; | ||
607 | clk_fout_apll.rate = apll; | ||
608 | |||
609 | clk_h.rate = hclk; | ||
610 | clk_p.rate = pclk; | ||
611 | clk_f.rate = fclk; | ||
612 | |||
613 | for (ptr = 0; ptr < ARRAY_SIZE(init_parents); ptr++) | ||
614 | s3c6400_set_clksrc(init_parents[ptr]); | ||
615 | } | ||
616 | |||
617 | static struct clk *clks[] __initdata = { | ||
618 | &clk_ext_xtal_mux, | ||
619 | &clk_iis_cd0, | ||
620 | &clk_iis_cd1, | ||
621 | &clk_pcm_cd, | ||
622 | &clk_mout_epll.clk, | ||
623 | &clk_fout_epll, | ||
624 | &clk_mout_mpll.clk, | ||
625 | &clk_dout_mpll, | ||
626 | &clk_mmc0.clk, | ||
627 | &clk_mmc1.clk, | ||
628 | &clk_mmc2.clk, | ||
629 | &clk_usbhost.clk, | ||
630 | &clk_uart_uclk1.clk, | ||
631 | &clk_spi0.clk, | ||
632 | &clk_spi1.clk, | ||
633 | &clk_audio0.clk, | ||
634 | &clk_audio1.clk, | ||
635 | &clk_irda.clk, | ||
636 | }; | ||
637 | |||
638 | void __init s3c6400_register_clocks(void) | ||
639 | { | ||
640 | struct clk *clkp; | ||
641 | int ret; | ||
642 | int ptr; | ||
643 | |||
644 | for (ptr = 0; ptr < ARRAY_SIZE(clks); ptr++) { | ||
645 | clkp = clks[ptr]; | ||
646 | ret = s3c24xx_register_clock(clkp); | ||
647 | if (ret < 0) { | ||
648 | printk(KERN_ERR "Failed to register clock %s (%d)\n", | ||
649 | clkp->name, ret); | ||
650 | } | ||
651 | } | ||
652 | |||
653 | clk_mpll.parent = &clk_mout_mpll.clk; | ||
654 | clk_epll.parent = &clk_mout_epll.clk; | ||
655 | } | ||
diff --git a/arch/arm/plat-s3c64xx/s3c6400-init.c b/arch/arm/plat-s3c64xx/s3c6400-init.c new file mode 100644 index 000000000000..6c28f39df097 --- /dev/null +++ b/arch/arm/plat-s3c64xx/s3c6400-init.c | |||
@@ -0,0 +1,29 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/s3c6400-init.c | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * S3C6400 - CPU initialisation (common with other S3C64XX chips) | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/types.h> | ||
17 | #include <linux/init.h> | ||
18 | |||
19 | #include <plat/cpu.h> | ||
20 | #include <plat/devs.h> | ||
21 | #include <plat/s3c6400.h> | ||
22 | #include <plat/s3c6410.h> | ||
23 | |||
24 | /* uart registration process */ | ||
25 | |||
26 | void __init s3c6400_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
27 | { | ||
28 | s3c24xx_init_uartdevs("s3c6400-uart", s3c64xx_uart_resources, cfg, no); | ||
29 | } | ||
diff --git a/arch/arm/plat-s3c64xx/setup-fb-24bpp.c b/arch/arm/plat-s3c64xx/setup-fb-24bpp.c new file mode 100644 index 000000000000..8e28e448dd20 --- /dev/null +++ b/arch/arm/plat-s3c64xx/setup-fb-24bpp.c | |||
@@ -0,0 +1,37 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/setup-fb-24bpp.c | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * Base S3C64XX setup information for 24bpp LCD framebuffer | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/types.h> | ||
17 | #include <linux/fb.h> | ||
18 | |||
19 | #include <mach/regs-fb.h> | ||
20 | #include <mach/gpio.h> | ||
21 | #include <plat/fb.h> | ||
22 | #include <plat/gpio-cfg.h> | ||
23 | |||
24 | extern void s3c64xx_fb_gpio_setup_24bpp(void) | ||
25 | { | ||
26 | unsigned int gpio; | ||
27 | |||
28 | for (gpio = S3C64XX_GPI(0); gpio <= S3C64XX_GPI(15); gpio++) { | ||
29 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
30 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
31 | } | ||
32 | |||
33 | for (gpio = S3C64XX_GPJ(0); gpio <= S3C64XX_GPJ(11); gpio++) { | ||
34 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
35 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
36 | } | ||
37 | } | ||
diff --git a/arch/arm/plat-s3c64xx/setup-i2c0.c b/arch/arm/plat-s3c64xx/setup-i2c0.c new file mode 100644 index 000000000000..364480763728 --- /dev/null +++ b/arch/arm/plat-s3c64xx/setup-i2c0.c | |||
@@ -0,0 +1,31 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/setup-i2c0.c | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * Base S3C64XX I2C bus 0 gpio configuration | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/types.h> | ||
17 | |||
18 | struct platform_device; /* don't need the contents */ | ||
19 | |||
20 | #include <mach/gpio.h> | ||
21 | #include <plat/iic.h> | ||
22 | #include <plat/gpio-bank-b.h> | ||
23 | #include <plat/gpio-cfg.h> | ||
24 | |||
25 | void s3c_i2c0_cfg_gpio(struct platform_device *dev) | ||
26 | { | ||
27 | s3c_gpio_cfgpin(S3C64XX_GPB(5), S3C64XX_GPB5_I2C_SCL0); | ||
28 | s3c_gpio_cfgpin(S3C64XX_GPB(6), S3C64XX_GPB6_I2C_SDA0); | ||
29 | s3c_gpio_setpull(S3C64XX_GPB(5), S3C_GPIO_PULL_UP); | ||
30 | s3c_gpio_setpull(S3C64XX_GPB(6), S3C_GPIO_PULL_UP); | ||
31 | } | ||
diff --git a/arch/arm/plat-s3c64xx/setup-i2c1.c b/arch/arm/plat-s3c64xx/setup-i2c1.c new file mode 100644 index 000000000000..bbe229bd90ca --- /dev/null +++ b/arch/arm/plat-s3c64xx/setup-i2c1.c | |||
@@ -0,0 +1,31 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/setup-i2c1.c | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * Base S3C64XX I2C bus 1 gpio configuration | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/types.h> | ||
17 | |||
18 | struct platform_device; /* don't need the contents */ | ||
19 | |||
20 | #include <mach/gpio.h> | ||
21 | #include <plat/iic.h> | ||
22 | #include <plat/gpio-bank-b.h> | ||
23 | #include <plat/gpio-cfg.h> | ||
24 | |||
25 | void s3c_i2c1_cfg_gpio(struct platform_device *dev) | ||
26 | { | ||
27 | s3c_gpio_cfgpin(S3C64XX_GPB(2), S3C64XX_GPB2_I2C_SCL1); | ||
28 | s3c_gpio_cfgpin(S3C64XX_GPB(3), S3C64XX_GPB3_I2C_SDA1); | ||
29 | s3c_gpio_setpull(S3C64XX_GPB(2), S3C_GPIO_PULL_UP); | ||
30 | s3c_gpio_setpull(S3C64XX_GPB(3), S3C_GPIO_PULL_UP); | ||
31 | } | ||