diff options
author | Ben Dooks <ben-linux@fluff.org> | 2010-02-22 18:38:26 -0500 |
---|---|---|
committer | Ben Dooks <ben-linux@fluff.org> | 2010-02-22 18:38:26 -0500 |
commit | 7f0ff702cdf51472750f4b6042866f1b83a11215 (patch) | |
tree | 15ce32849cfb8ff3c7205e97a5f76051c08058b0 /arch/arm/mach-s3c64xx | |
parent | d35b7a829a13b69c4747b69380b504b6544a2375 (diff) | |
parent | 110d85acd479b80dc11b7fa3abef63285da8ea0c (diff) |
ARM: Merge next-samsung-s3c64xx-platdeletion
Merge branch 'next-samsung-s3c64xx-platdeletion' into next-samsung
Conflicts:
arch/arm/mach-s3c64xx/Makefile (fixed)
Diffstat (limited to 'arch/arm/mach-s3c64xx')
70 files changed, 7982 insertions, 0 deletions
diff --git a/arch/arm/mach-s3c64xx/Kconfig b/arch/arm/mach-s3c64xx/Kconfig new file mode 100644 index 000000000000..44cdd80ea107 --- /dev/null +++ b/arch/arm/mach-s3c64xx/Kconfig | |||
@@ -0,0 +1,165 @@ | |||
1 | # Copyright 2008 Openmoko, Inc. | ||
2 | # Simtec Electronics, Ben Dooks <ben@simtec.co.uk> | ||
3 | # | ||
4 | # Licensed under GPLv2 | ||
5 | |||
6 | # temporary until we can eliminate all drivers using it. | ||
7 | config PLAT_S3C64XX | ||
8 | bool | ||
9 | depends on ARCH_S3C64XX | ||
10 | default y | ||
11 | help | ||
12 | Base platform code for any Samsung S3C64XX device | ||
13 | |||
14 | |||
15 | # Configuration options for the S3C6410 CPU | ||
16 | |||
17 | config CPU_S3C6400 | ||
18 | bool | ||
19 | help | ||
20 | Enable S3C6400 CPU support | ||
21 | |||
22 | config CPU_S3C6410 | ||
23 | bool | ||
24 | help | ||
25 | Enable S3C6410 CPU support | ||
26 | |||
27 | config S3C64XX_DMA | ||
28 | bool "S3C64XX DMA" | ||
29 | select S3C_DMA | ||
30 | |||
31 | config S3C64XX_SETUP_SDHCI | ||
32 | select S3C64XX_SETUP_SDHCI_GPIO | ||
33 | bool | ||
34 | help | ||
35 | Internal configuration for default SDHCI setup for S3C6400 and | ||
36 | S3C6410 SoCs. | ||
37 | |||
38 | # platform specific device setup | ||
39 | |||
40 | config S3C64XX_SETUP_I2C0 | ||
41 | bool | ||
42 | default y | ||
43 | help | ||
44 | Common setup code for i2c bus 0. | ||
45 | |||
46 | Note, currently since i2c0 is always compiled, this setup helper | ||
47 | is always compiled with it. | ||
48 | |||
49 | config S3C64XX_SETUP_I2C1 | ||
50 | bool | ||
51 | help | ||
52 | Common setup code for i2c bus 1. | ||
53 | |||
54 | config S3C64XX_SETUP_FB_24BPP | ||
55 | bool | ||
56 | help | ||
57 | Common setup code for S3C64XX with an 24bpp RGB display helper. | ||
58 | |||
59 | config S3C64XX_SETUP_SDHCI_GPIO | ||
60 | bool | ||
61 | help | ||
62 | Common setup code for S3C64XX SDHCI GPIO configurations | ||
63 | |||
64 | # S36400 Macchine support | ||
65 | |||
66 | config MACH_SMDK6400 | ||
67 | bool "SMDK6400" | ||
68 | select CPU_S3C6400 | ||
69 | select S3C_DEV_HSMMC | ||
70 | select S3C_DEV_NAND | ||
71 | select S3C64XX_SETUP_SDHCI | ||
72 | help | ||
73 | Machine support for the Samsung SMDK6400 | ||
74 | |||
75 | # S3C6410 machine support | ||
76 | |||
77 | config MACH_ANW6410 | ||
78 | bool "A&W6410" | ||
79 | select CPU_S3C6410 | ||
80 | select S3C_DEV_FB | ||
81 | select S3C64XX_SETUP_FB_24BPP | ||
82 | help | ||
83 | Machine support for the A&W6410 | ||
84 | |||
85 | config MACH_SMDK6410 | ||
86 | bool "SMDK6410" | ||
87 | select CPU_S3C6410 | ||
88 | select S3C_DEV_HSMMC | ||
89 | select S3C_DEV_HSMMC1 | ||
90 | select S3C_DEV_I2C1 | ||
91 | select S3C_DEV_FB | ||
92 | select S3C_DEV_USB_HOST | ||
93 | select S3C_DEV_USB_HSOTG | ||
94 | select S3C64XX_SETUP_SDHCI | ||
95 | select S3C64XX_SETUP_I2C1 | ||
96 | select S3C64XX_SETUP_FB_24BPP | ||
97 | help | ||
98 | Machine support for the Samsung SMDK6410 | ||
99 | |||
100 | # At least some of the SMDK6410s were shipped with the card detect | ||
101 | # for the MMC/SD slots connected to the same input. This means that | ||
102 | # either the boards need to be altered to have channel0 to an alternate | ||
103 | # configuration or that only one slot can be used. | ||
104 | |||
105 | choice | ||
106 | prompt "SMDK6410 MMC/SD slot setup" | ||
107 | depends on MACH_SMDK6410 | ||
108 | |||
109 | config SMDK6410_SD_CH0 | ||
110 | bool "Use channel 0 only" | ||
111 | depends on MACH_SMDK6410 | ||
112 | help | ||
113 | Select CON7 (channel 0) as the MMC/SD slot, as | ||
114 | at least some SMDK6410 boards come with the | ||
115 | resistors fitted so that the card detects for | ||
116 | channels 0 and 1 are the same. | ||
117 | |||
118 | config SMDK6410_SD_CH1 | ||
119 | bool "Use channel 1 only" | ||
120 | depends on MACH_SMDK6410 | ||
121 | help | ||
122 | Select CON6 (channel 1) as the MMC/SD slot, as | ||
123 | at least some SMDK6410 boards come with the | ||
124 | resistors fitted so that the card detects for | ||
125 | channels 0 and 1 are the same. | ||
126 | |||
127 | endchoice | ||
128 | |||
129 | config SMDK6410_WM1190_EV1 | ||
130 | bool "Support Wolfson Microelectronics 1190-EV1 PMIC card" | ||
131 | depends on MACH_SMDK6410 | ||
132 | select REGULATOR | ||
133 | select REGULATOR_WM8350 | ||
134 | select S3C24XX_GPIO_EXTRA64 | ||
135 | select MFD_WM8350_I2C | ||
136 | select MFD_WM8350_CONFIG_MODE_0 | ||
137 | select MFD_WM8350_CONFIG_MODE_3 | ||
138 | select MFD_WM8352_CONFIG_MODE_0 | ||
139 | help | ||
140 | The Wolfson Microelectronics 1190-EV1 is a WM835x based PMIC | ||
141 | and audio daughtercard for the Samsung SMDK6410 reference | ||
142 | platform. Enabling this option will build support for this | ||
143 | module into the kernel. The presence of the module will be | ||
144 | detected at runtime so the the resulting kernel can be used | ||
145 | with or without the 1190-EV1 fitted. | ||
146 | |||
147 | config MACH_NCP | ||
148 | bool "NCP" | ||
149 | select CPU_S3C6410 | ||
150 | select S3C_DEV_I2C1 | ||
151 | select S3C_DEV_HSMMC1 | ||
152 | select S3C64XX_SETUP_I2C1 | ||
153 | help | ||
154 | Machine support for the Samsung NCP | ||
155 | |||
156 | config MACH_HMT | ||
157 | bool "Airgoo HMT" | ||
158 | select CPU_S3C6410 | ||
159 | select S3C_DEV_FB | ||
160 | select S3C_DEV_NAND | ||
161 | select S3C_DEV_USB_HOST | ||
162 | select S3C64XX_SETUP_FB_24BPP | ||
163 | select HAVE_PWM | ||
164 | help | ||
165 | Machine support for the Airgoo HMT | ||
diff --git a/arch/arm/mach-s3c64xx/Makefile b/arch/arm/mach-s3c64xx/Makefile new file mode 100644 index 000000000000..d1d341a14f75 --- /dev/null +++ b/arch/arm/mach-s3c64xx/Makefile | |||
@@ -0,0 +1,62 @@ | |||
1 | # arch/arm/mach-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 := | ||
11 | obj- := | ||
12 | |||
13 | # Core files | ||
14 | obj-y += cpu.o | ||
15 | obj-y += clock.o | ||
16 | obj-y += gpiolib.o | ||
17 | |||
18 | # Core support for S3C6400 system | ||
19 | |||
20 | obj-$(CONFIG_CPU_S3C6400) += s3c6400.o | ||
21 | obj-$(CONFIG_CPU_S3C6410) += s3c6410.o | ||
22 | |||
23 | obj-y += irq.o | ||
24 | obj-y += irq-eint.o | ||
25 | |||
26 | # CPU frequency scaling | ||
27 | |||
28 | obj-$(CONFIG_CPU_FREQ_S3C64XX) += cpufreq.o | ||
29 | |||
30 | # DMA support | ||
31 | |||
32 | obj-$(CONFIG_S3C64XX_DMA) += dma.o | ||
33 | |||
34 | # Device setup | ||
35 | |||
36 | obj-$(CONFIG_S3C64XX_SETUP_I2C0) += setup-i2c0.o | ||
37 | obj-$(CONFIG_S3C64XX_SETUP_I2C1) += setup-i2c1.o | ||
38 | obj-$(CONFIG_S3C64XX_SETUP_SDHCI) += setup-sdhci.o | ||
39 | obj-$(CONFIG_S3C64XX_SETUP_FB_24BPP) += setup-fb-24bpp.o | ||
40 | obj-$(CONFIG_S3C64XX_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o | ||
41 | |||
42 | # PM | ||
43 | |||
44 | obj-$(CONFIG_PM) += pm.o | ||
45 | obj-$(CONFIG_PM) += sleep.o | ||
46 | obj-$(CONFIG_PM) += irq-pm.o | ||
47 | |||
48 | # Machine support | ||
49 | |||
50 | obj-$(CONFIG_MACH_ANW6410) += mach-anw6410.o | ||
51 | obj-$(CONFIG_MACH_SMDK6400) += mach-smdk6400.o | ||
52 | obj-$(CONFIG_MACH_SMDK6410) += mach-smdk6410.o | ||
53 | obj-$(CONFIG_MACH_NCP) += mach-ncp.o | ||
54 | obj-$(CONFIG_MACH_HMT) += mach-hmt.o | ||
55 | |||
56 | # device support | ||
57 | |||
58 | obj-y += dev-uart.o | ||
59 | obj-y += dev-rtc.o | ||
60 | obj-$(CONFIG_S3C_ADC) += dev-adc.o | ||
61 | obj-$(CONFIG_SND_S3C24XX_SOC) += dev-audio.o | ||
62 | obj-$(CONFIG_S3C64XX_DEV_SPI) += dev-spi.o | ||
diff --git a/arch/arm/mach-s3c64xx/Makefile.boot b/arch/arm/mach-s3c64xx/Makefile.boot new file mode 100644 index 000000000000..ba41fdc0a586 --- /dev/null +++ b/arch/arm/mach-s3c64xx/Makefile.boot | |||
@@ -0,0 +1,2 @@ | |||
1 | zreladdr-y := 0x50008000 | ||
2 | params_phys-y := 0x50000100 | ||
diff --git a/arch/arm/mach-s3c64xx/clock.c b/arch/arm/mach-s3c64xx/clock.c new file mode 100644 index 000000000000..7f5e1aa99ce1 --- /dev/null +++ b/arch/arm/mach-s3c64xx/clock.c | |||
@@ -0,0 +1,801 @@ | |||
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/clk.h> | ||
20 | #include <linux/err.h> | ||
21 | #include <linux/io.h> | ||
22 | |||
23 | #include <mach/hardware.h> | ||
24 | #include <mach/map.h> | ||
25 | |||
26 | #include <mach/regs-sys.h> | ||
27 | #include <mach/regs-clock.h> | ||
28 | #include <mach/pll.h> | ||
29 | |||
30 | #include <plat/cpu.h> | ||
31 | #include <plat/devs.h> | ||
32 | #include <plat/cpu-freq.h> | ||
33 | #include <plat/clock.h> | ||
34 | #include <plat/clock-clksrc.h> | ||
35 | |||
36 | /* fin_apll, fin_mpll and fin_epll are all the same clock, which we call | ||
37 | * ext_xtal_mux for want of an actual name from the manual. | ||
38 | */ | ||
39 | |||
40 | static struct clk clk_ext_xtal_mux = { | ||
41 | .name = "ext_xtal", | ||
42 | .id = -1, | ||
43 | }; | ||
44 | |||
45 | #define clk_fin_apll clk_ext_xtal_mux | ||
46 | #define clk_fin_mpll clk_ext_xtal_mux | ||
47 | #define clk_fin_epll clk_ext_xtal_mux | ||
48 | |||
49 | #define clk_fout_mpll clk_mpll | ||
50 | #define clk_fout_epll clk_epll | ||
51 | |||
52 | struct clk clk_h2 = { | ||
53 | .name = "hclk2", | ||
54 | .id = -1, | ||
55 | .rate = 0, | ||
56 | }; | ||
57 | |||
58 | struct clk clk_27m = { | ||
59 | .name = "clk_27m", | ||
60 | .id = -1, | ||
61 | .rate = 27000000, | ||
62 | }; | ||
63 | |||
64 | static int clk_48m_ctrl(struct clk *clk, int enable) | ||
65 | { | ||
66 | unsigned long flags; | ||
67 | u32 val; | ||
68 | |||
69 | /* can't rely on clock lock, this register has other usages */ | ||
70 | local_irq_save(flags); | ||
71 | |||
72 | val = __raw_readl(S3C64XX_OTHERS); | ||
73 | if (enable) | ||
74 | val |= S3C64XX_OTHERS_USBMASK; | ||
75 | else | ||
76 | val &= ~S3C64XX_OTHERS_USBMASK; | ||
77 | |||
78 | __raw_writel(val, S3C64XX_OTHERS); | ||
79 | local_irq_restore(flags); | ||
80 | |||
81 | return 0; | ||
82 | } | ||
83 | |||
84 | struct clk clk_48m = { | ||
85 | .name = "clk_48m", | ||
86 | .id = -1, | ||
87 | .rate = 48000000, | ||
88 | .enable = clk_48m_ctrl, | ||
89 | }; | ||
90 | |||
91 | static int inline s3c64xx_gate(void __iomem *reg, | ||
92 | struct clk *clk, | ||
93 | int enable) | ||
94 | { | ||
95 | unsigned int ctrlbit = clk->ctrlbit; | ||
96 | u32 con; | ||
97 | |||
98 | con = __raw_readl(reg); | ||
99 | |||
100 | if (enable) | ||
101 | con |= ctrlbit; | ||
102 | else | ||
103 | con &= ~ctrlbit; | ||
104 | |||
105 | __raw_writel(con, reg); | ||
106 | return 0; | ||
107 | } | ||
108 | |||
109 | static int s3c64xx_pclk_ctrl(struct clk *clk, int enable) | ||
110 | { | ||
111 | return s3c64xx_gate(S3C_PCLK_GATE, clk, enable); | ||
112 | } | ||
113 | |||
114 | static int s3c64xx_hclk_ctrl(struct clk *clk, int enable) | ||
115 | { | ||
116 | return s3c64xx_gate(S3C_HCLK_GATE, clk, enable); | ||
117 | } | ||
118 | |||
119 | int s3c64xx_sclk_ctrl(struct clk *clk, int enable) | ||
120 | { | ||
121 | return s3c64xx_gate(S3C_SCLK_GATE, clk, enable); | ||
122 | } | ||
123 | |||
124 | static struct clk init_clocks_disable[] = { | ||
125 | { | ||
126 | .name = "nand", | ||
127 | .id = -1, | ||
128 | .parent = &clk_h, | ||
129 | }, { | ||
130 | .name = "adc", | ||
131 | .id = -1, | ||
132 | .parent = &clk_p, | ||
133 | .enable = s3c64xx_pclk_ctrl, | ||
134 | .ctrlbit = S3C_CLKCON_PCLK_TSADC, | ||
135 | }, { | ||
136 | .name = "i2c", | ||
137 | .id = -1, | ||
138 | .parent = &clk_p, | ||
139 | .enable = s3c64xx_pclk_ctrl, | ||
140 | .ctrlbit = S3C_CLKCON_PCLK_IIC, | ||
141 | }, { | ||
142 | .name = "iis", | ||
143 | .id = 0, | ||
144 | .parent = &clk_p, | ||
145 | .enable = s3c64xx_pclk_ctrl, | ||
146 | .ctrlbit = S3C_CLKCON_PCLK_IIS0, | ||
147 | }, { | ||
148 | .name = "iis", | ||
149 | .id = 1, | ||
150 | .parent = &clk_p, | ||
151 | .enable = s3c64xx_pclk_ctrl, | ||
152 | .ctrlbit = S3C_CLKCON_PCLK_IIS1, | ||
153 | }, { | ||
154 | .name = "spi", | ||
155 | .id = 0, | ||
156 | .parent = &clk_p, | ||
157 | .enable = s3c64xx_pclk_ctrl, | ||
158 | .ctrlbit = S3C_CLKCON_PCLK_SPI0, | ||
159 | }, { | ||
160 | .name = "spi", | ||
161 | .id = 1, | ||
162 | .parent = &clk_p, | ||
163 | .enable = s3c64xx_pclk_ctrl, | ||
164 | .ctrlbit = S3C_CLKCON_PCLK_SPI1, | ||
165 | }, { | ||
166 | .name = "spi_48m", | ||
167 | .id = 0, | ||
168 | .parent = &clk_48m, | ||
169 | .enable = s3c64xx_sclk_ctrl, | ||
170 | .ctrlbit = S3C_CLKCON_SCLK_SPI0_48, | ||
171 | }, { | ||
172 | .name = "spi_48m", | ||
173 | .id = 1, | ||
174 | .parent = &clk_48m, | ||
175 | .enable = s3c64xx_sclk_ctrl, | ||
176 | .ctrlbit = S3C_CLKCON_SCLK_SPI1_48, | ||
177 | }, { | ||
178 | .name = "48m", | ||
179 | .id = 0, | ||
180 | .parent = &clk_48m, | ||
181 | .enable = s3c64xx_sclk_ctrl, | ||
182 | .ctrlbit = S3C_CLKCON_SCLK_MMC0_48, | ||
183 | }, { | ||
184 | .name = "48m", | ||
185 | .id = 1, | ||
186 | .parent = &clk_48m, | ||
187 | .enable = s3c64xx_sclk_ctrl, | ||
188 | .ctrlbit = S3C_CLKCON_SCLK_MMC1_48, | ||
189 | }, { | ||
190 | .name = "48m", | ||
191 | .id = 2, | ||
192 | .parent = &clk_48m, | ||
193 | .enable = s3c64xx_sclk_ctrl, | ||
194 | .ctrlbit = S3C_CLKCON_SCLK_MMC2_48, | ||
195 | }, { | ||
196 | .name = "dma0", | ||
197 | .id = -1, | ||
198 | .parent = &clk_h, | ||
199 | .enable = s3c64xx_hclk_ctrl, | ||
200 | .ctrlbit = S3C_CLKCON_HCLK_DMA0, | ||
201 | }, { | ||
202 | .name = "dma1", | ||
203 | .id = -1, | ||
204 | .parent = &clk_h, | ||
205 | .enable = s3c64xx_hclk_ctrl, | ||
206 | .ctrlbit = S3C_CLKCON_HCLK_DMA1, | ||
207 | }, | ||
208 | }; | ||
209 | |||
210 | static struct clk init_clocks[] = { | ||
211 | { | ||
212 | .name = "lcd", | ||
213 | .id = -1, | ||
214 | .parent = &clk_h, | ||
215 | .enable = s3c64xx_hclk_ctrl, | ||
216 | .ctrlbit = S3C_CLKCON_HCLK_LCD, | ||
217 | }, { | ||
218 | .name = "gpio", | ||
219 | .id = -1, | ||
220 | .parent = &clk_p, | ||
221 | .enable = s3c64xx_pclk_ctrl, | ||
222 | .ctrlbit = S3C_CLKCON_PCLK_GPIO, | ||
223 | }, { | ||
224 | .name = "usb-host", | ||
225 | .id = -1, | ||
226 | .parent = &clk_h, | ||
227 | .enable = s3c64xx_hclk_ctrl, | ||
228 | .ctrlbit = S3C_CLKCON_HCLK_UHOST, | ||
229 | }, { | ||
230 | .name = "hsmmc", | ||
231 | .id = 0, | ||
232 | .parent = &clk_h, | ||
233 | .enable = s3c64xx_hclk_ctrl, | ||
234 | .ctrlbit = S3C_CLKCON_HCLK_HSMMC0, | ||
235 | }, { | ||
236 | .name = "hsmmc", | ||
237 | .id = 1, | ||
238 | .parent = &clk_h, | ||
239 | .enable = s3c64xx_hclk_ctrl, | ||
240 | .ctrlbit = S3C_CLKCON_HCLK_HSMMC1, | ||
241 | }, { | ||
242 | .name = "hsmmc", | ||
243 | .id = 2, | ||
244 | .parent = &clk_h, | ||
245 | .enable = s3c64xx_hclk_ctrl, | ||
246 | .ctrlbit = S3C_CLKCON_HCLK_HSMMC2, | ||
247 | }, { | ||
248 | .name = "timers", | ||
249 | .id = -1, | ||
250 | .parent = &clk_p, | ||
251 | .enable = s3c64xx_pclk_ctrl, | ||
252 | .ctrlbit = S3C_CLKCON_PCLK_PWM, | ||
253 | }, { | ||
254 | .name = "uart", | ||
255 | .id = 0, | ||
256 | .parent = &clk_p, | ||
257 | .enable = s3c64xx_pclk_ctrl, | ||
258 | .ctrlbit = S3C_CLKCON_PCLK_UART0, | ||
259 | }, { | ||
260 | .name = "uart", | ||
261 | .id = 1, | ||
262 | .parent = &clk_p, | ||
263 | .enable = s3c64xx_pclk_ctrl, | ||
264 | .ctrlbit = S3C_CLKCON_PCLK_UART1, | ||
265 | }, { | ||
266 | .name = "uart", | ||
267 | .id = 2, | ||
268 | .parent = &clk_p, | ||
269 | .enable = s3c64xx_pclk_ctrl, | ||
270 | .ctrlbit = S3C_CLKCON_PCLK_UART2, | ||
271 | }, { | ||
272 | .name = "uart", | ||
273 | .id = 3, | ||
274 | .parent = &clk_p, | ||
275 | .enable = s3c64xx_pclk_ctrl, | ||
276 | .ctrlbit = S3C_CLKCON_PCLK_UART3, | ||
277 | }, { | ||
278 | .name = "rtc", | ||
279 | .id = -1, | ||
280 | .parent = &clk_p, | ||
281 | .enable = s3c64xx_pclk_ctrl, | ||
282 | .ctrlbit = S3C_CLKCON_PCLK_RTC, | ||
283 | }, { | ||
284 | .name = "watchdog", | ||
285 | .id = -1, | ||
286 | .parent = &clk_p, | ||
287 | .ctrlbit = S3C_CLKCON_PCLK_WDT, | ||
288 | }, { | ||
289 | .name = "ac97", | ||
290 | .id = -1, | ||
291 | .parent = &clk_p, | ||
292 | .ctrlbit = S3C_CLKCON_PCLK_AC97, | ||
293 | } | ||
294 | }; | ||
295 | |||
296 | |||
297 | static struct clk clk_fout_apll = { | ||
298 | .name = "fout_apll", | ||
299 | .id = -1, | ||
300 | }; | ||
301 | |||
302 | static struct clk *clk_src_apll_list[] = { | ||
303 | [0] = &clk_fin_apll, | ||
304 | [1] = &clk_fout_apll, | ||
305 | }; | ||
306 | |||
307 | static struct clksrc_sources clk_src_apll = { | ||
308 | .sources = clk_src_apll_list, | ||
309 | .nr_sources = ARRAY_SIZE(clk_src_apll_list), | ||
310 | }; | ||
311 | |||
312 | static struct clksrc_clk clk_mout_apll = { | ||
313 | .clk = { | ||
314 | .name = "mout_apll", | ||
315 | .id = -1, | ||
316 | }, | ||
317 | .reg_src = { .reg = S3C_CLK_SRC, .shift = 0, .size = 1 }, | ||
318 | .sources = &clk_src_apll, | ||
319 | }; | ||
320 | |||
321 | static struct clk *clk_src_epll_list[] = { | ||
322 | [0] = &clk_fin_epll, | ||
323 | [1] = &clk_fout_epll, | ||
324 | }; | ||
325 | |||
326 | static struct clksrc_sources clk_src_epll = { | ||
327 | .sources = clk_src_epll_list, | ||
328 | .nr_sources = ARRAY_SIZE(clk_src_epll_list), | ||
329 | }; | ||
330 | |||
331 | static struct clksrc_clk clk_mout_epll = { | ||
332 | .clk = { | ||
333 | .name = "mout_epll", | ||
334 | .id = -1, | ||
335 | }, | ||
336 | .reg_src = { .reg = S3C_CLK_SRC, .shift = 2, .size = 1 }, | ||
337 | .sources = &clk_src_epll, | ||
338 | }; | ||
339 | |||
340 | static struct clk *clk_src_mpll_list[] = { | ||
341 | [0] = &clk_fin_mpll, | ||
342 | [1] = &clk_fout_mpll, | ||
343 | }; | ||
344 | |||
345 | static struct clksrc_sources clk_src_mpll = { | ||
346 | .sources = clk_src_mpll_list, | ||
347 | .nr_sources = ARRAY_SIZE(clk_src_mpll_list), | ||
348 | }; | ||
349 | |||
350 | static struct clksrc_clk clk_mout_mpll = { | ||
351 | .clk = { | ||
352 | .name = "mout_mpll", | ||
353 | .id = -1, | ||
354 | }, | ||
355 | .reg_src = { .reg = S3C_CLK_SRC, .shift = 1, .size = 1 }, | ||
356 | .sources = &clk_src_mpll, | ||
357 | }; | ||
358 | |||
359 | static unsigned int armclk_mask; | ||
360 | |||
361 | static unsigned long s3c64xx_clk_arm_get_rate(struct clk *clk) | ||
362 | { | ||
363 | unsigned long rate = clk_get_rate(clk->parent); | ||
364 | u32 clkdiv; | ||
365 | |||
366 | /* divisor mask starts at bit0, so no need to shift */ | ||
367 | clkdiv = __raw_readl(S3C_CLK_DIV0) & armclk_mask; | ||
368 | |||
369 | return rate / (clkdiv + 1); | ||
370 | } | ||
371 | |||
372 | static unsigned long s3c64xx_clk_arm_round_rate(struct clk *clk, | ||
373 | unsigned long rate) | ||
374 | { | ||
375 | unsigned long parent = clk_get_rate(clk->parent); | ||
376 | u32 div; | ||
377 | |||
378 | if (parent < rate) | ||
379 | return parent; | ||
380 | |||
381 | div = (parent / rate) - 1; | ||
382 | if (div > armclk_mask) | ||
383 | div = armclk_mask; | ||
384 | |||
385 | return parent / (div + 1); | ||
386 | } | ||
387 | |||
388 | static int s3c64xx_clk_arm_set_rate(struct clk *clk, unsigned long rate) | ||
389 | { | ||
390 | unsigned long parent = clk_get_rate(clk->parent); | ||
391 | u32 div; | ||
392 | u32 val; | ||
393 | |||
394 | if (rate < parent / (armclk_mask + 1)) | ||
395 | return -EINVAL; | ||
396 | |||
397 | rate = clk_round_rate(clk, rate); | ||
398 | div = clk_get_rate(clk->parent) / rate; | ||
399 | |||
400 | val = __raw_readl(S3C_CLK_DIV0); | ||
401 | val &= ~armclk_mask; | ||
402 | val |= (div - 1); | ||
403 | __raw_writel(val, S3C_CLK_DIV0); | ||
404 | |||
405 | return 0; | ||
406 | |||
407 | } | ||
408 | |||
409 | static struct clk clk_arm = { | ||
410 | .name = "armclk", | ||
411 | .id = -1, | ||
412 | .parent = &clk_mout_apll.clk, | ||
413 | .ops = &(struct clk_ops) { | ||
414 | .get_rate = s3c64xx_clk_arm_get_rate, | ||
415 | .set_rate = s3c64xx_clk_arm_set_rate, | ||
416 | .round_rate = s3c64xx_clk_arm_round_rate, | ||
417 | }, | ||
418 | }; | ||
419 | |||
420 | static unsigned long s3c64xx_clk_doutmpll_get_rate(struct clk *clk) | ||
421 | { | ||
422 | unsigned long rate = clk_get_rate(clk->parent); | ||
423 | |||
424 | printk(KERN_DEBUG "%s: parent is %ld\n", __func__, rate); | ||
425 | |||
426 | if (__raw_readl(S3C_CLK_DIV0) & S3C6400_CLKDIV0_MPLL_MASK) | ||
427 | rate /= 2; | ||
428 | |||
429 | return rate; | ||
430 | } | ||
431 | |||
432 | static struct clk_ops clk_dout_ops = { | ||
433 | .get_rate = s3c64xx_clk_doutmpll_get_rate, | ||
434 | }; | ||
435 | |||
436 | static struct clk clk_dout_mpll = { | ||
437 | .name = "dout_mpll", | ||
438 | .id = -1, | ||
439 | .parent = &clk_mout_mpll.clk, | ||
440 | .ops = &clk_dout_ops, | ||
441 | }; | ||
442 | |||
443 | static struct clk *clkset_spi_mmc_list[] = { | ||
444 | &clk_mout_epll.clk, | ||
445 | &clk_dout_mpll, | ||
446 | &clk_fin_epll, | ||
447 | &clk_27m, | ||
448 | }; | ||
449 | |||
450 | static struct clksrc_sources clkset_spi_mmc = { | ||
451 | .sources = clkset_spi_mmc_list, | ||
452 | .nr_sources = ARRAY_SIZE(clkset_spi_mmc_list), | ||
453 | }; | ||
454 | |||
455 | static struct clk *clkset_irda_list[] = { | ||
456 | &clk_mout_epll.clk, | ||
457 | &clk_dout_mpll, | ||
458 | NULL, | ||
459 | &clk_27m, | ||
460 | }; | ||
461 | |||
462 | static struct clksrc_sources clkset_irda = { | ||
463 | .sources = clkset_irda_list, | ||
464 | .nr_sources = ARRAY_SIZE(clkset_irda_list), | ||
465 | }; | ||
466 | |||
467 | static struct clk *clkset_uart_list[] = { | ||
468 | &clk_mout_epll.clk, | ||
469 | &clk_dout_mpll, | ||
470 | NULL, | ||
471 | NULL | ||
472 | }; | ||
473 | |||
474 | static struct clksrc_sources clkset_uart = { | ||
475 | .sources = clkset_uart_list, | ||
476 | .nr_sources = ARRAY_SIZE(clkset_uart_list), | ||
477 | }; | ||
478 | |||
479 | static struct clk *clkset_uhost_list[] = { | ||
480 | &clk_48m, | ||
481 | &clk_mout_epll.clk, | ||
482 | &clk_dout_mpll, | ||
483 | &clk_fin_epll, | ||
484 | }; | ||
485 | |||
486 | static struct clksrc_sources clkset_uhost = { | ||
487 | .sources = clkset_uhost_list, | ||
488 | .nr_sources = ARRAY_SIZE(clkset_uhost_list), | ||
489 | }; | ||
490 | |||
491 | /* The peripheral clocks are all controlled via clocksource followed | ||
492 | * by an optional divider and gate stage. We currently roll this into | ||
493 | * one clock which hides the intermediate clock from the mux. | ||
494 | * | ||
495 | * Note, the JPEG clock can only be an even divider... | ||
496 | * | ||
497 | * The scaler and LCD clocks depend on the S3C64XX version, and also | ||
498 | * have a common parent divisor so are not included here. | ||
499 | */ | ||
500 | |||
501 | /* clocks that feed other parts of the clock source tree */ | ||
502 | |||
503 | static struct clk clk_iis_cd0 = { | ||
504 | .name = "iis_cdclk0", | ||
505 | .id = -1, | ||
506 | }; | ||
507 | |||
508 | static struct clk clk_iis_cd1 = { | ||
509 | .name = "iis_cdclk1", | ||
510 | .id = -1, | ||
511 | }; | ||
512 | |||
513 | static struct clk clk_pcm_cd = { | ||
514 | .name = "pcm_cdclk", | ||
515 | .id = -1, | ||
516 | }; | ||
517 | |||
518 | static struct clk *clkset_audio0_list[] = { | ||
519 | [0] = &clk_mout_epll.clk, | ||
520 | [1] = &clk_dout_mpll, | ||
521 | [2] = &clk_fin_epll, | ||
522 | [3] = &clk_iis_cd0, | ||
523 | [4] = &clk_pcm_cd, | ||
524 | }; | ||
525 | |||
526 | static struct clksrc_sources clkset_audio0 = { | ||
527 | .sources = clkset_audio0_list, | ||
528 | .nr_sources = ARRAY_SIZE(clkset_audio0_list), | ||
529 | }; | ||
530 | |||
531 | static struct clk *clkset_audio1_list[] = { | ||
532 | [0] = &clk_mout_epll.clk, | ||
533 | [1] = &clk_dout_mpll, | ||
534 | [2] = &clk_fin_epll, | ||
535 | [3] = &clk_iis_cd1, | ||
536 | [4] = &clk_pcm_cd, | ||
537 | }; | ||
538 | |||
539 | static struct clksrc_sources clkset_audio1 = { | ||
540 | .sources = clkset_audio1_list, | ||
541 | .nr_sources = ARRAY_SIZE(clkset_audio1_list), | ||
542 | }; | ||
543 | |||
544 | static struct clk *clkset_camif_list[] = { | ||
545 | &clk_h2, | ||
546 | }; | ||
547 | |||
548 | static struct clksrc_sources clkset_camif = { | ||
549 | .sources = clkset_camif_list, | ||
550 | .nr_sources = ARRAY_SIZE(clkset_camif_list), | ||
551 | }; | ||
552 | |||
553 | static struct clksrc_clk clksrcs[] = { | ||
554 | { | ||
555 | .clk = { | ||
556 | .name = "mmc_bus", | ||
557 | .id = 0, | ||
558 | .ctrlbit = S3C_CLKCON_SCLK_MMC0, | ||
559 | .enable = s3c64xx_sclk_ctrl, | ||
560 | }, | ||
561 | .reg_src = { .reg = S3C_CLK_SRC, .shift = 18, .size = 2 }, | ||
562 | .reg_div = { .reg = S3C_CLK_DIV1, .shift = 0, .size = 4 }, | ||
563 | .sources = &clkset_spi_mmc, | ||
564 | }, { | ||
565 | .clk = { | ||
566 | .name = "mmc_bus", | ||
567 | .id = 1, | ||
568 | .ctrlbit = S3C_CLKCON_SCLK_MMC1, | ||
569 | .enable = s3c64xx_sclk_ctrl, | ||
570 | }, | ||
571 | .reg_src = { .reg = S3C_CLK_SRC, .shift = 20, .size = 2 }, | ||
572 | .reg_div = { .reg = S3C_CLK_DIV1, .shift = 4, .size = 4 }, | ||
573 | .sources = &clkset_spi_mmc, | ||
574 | }, { | ||
575 | .clk = { | ||
576 | .name = "mmc_bus", | ||
577 | .id = 2, | ||
578 | .ctrlbit = S3C_CLKCON_SCLK_MMC2, | ||
579 | .enable = s3c64xx_sclk_ctrl, | ||
580 | }, | ||
581 | .reg_src = { .reg = S3C_CLK_SRC, .shift = 22, .size = 2 }, | ||
582 | .reg_div = { .reg = S3C_CLK_DIV1, .shift = 8, .size = 4 }, | ||
583 | .sources = &clkset_spi_mmc, | ||
584 | }, { | ||
585 | .clk = { | ||
586 | .name = "usb-bus-host", | ||
587 | .id = -1, | ||
588 | .ctrlbit = S3C_CLKCON_SCLK_UHOST, | ||
589 | .enable = s3c64xx_sclk_ctrl, | ||
590 | }, | ||
591 | .reg_src = { .reg = S3C_CLK_SRC, .shift = 5, .size = 2 }, | ||
592 | .reg_div = { .reg = S3C_CLK_DIV1, .shift = 20, .size = 4 }, | ||
593 | .sources = &clkset_uhost, | ||
594 | }, { | ||
595 | .clk = { | ||
596 | .name = "uclk1", | ||
597 | .id = -1, | ||
598 | .ctrlbit = S3C_CLKCON_SCLK_UART, | ||
599 | .enable = s3c64xx_sclk_ctrl, | ||
600 | }, | ||
601 | .reg_src = { .reg = S3C_CLK_SRC, .shift = 13, .size = 1 }, | ||
602 | .reg_div = { .reg = S3C_CLK_DIV2, .shift = 16, .size = 4 }, | ||
603 | .sources = &clkset_uart, | ||
604 | }, { | ||
605 | /* Where does UCLK0 come from? */ | ||
606 | .clk = { | ||
607 | .name = "spi-bus", | ||
608 | .id = 0, | ||
609 | .ctrlbit = S3C_CLKCON_SCLK_SPI0, | ||
610 | .enable = s3c64xx_sclk_ctrl, | ||
611 | }, | ||
612 | .reg_src = { .reg = S3C_CLK_SRC, .shift = 14, .size = 2 }, | ||
613 | .reg_div = { .reg = S3C_CLK_DIV2, .shift = 0, .size = 4 }, | ||
614 | .sources = &clkset_spi_mmc, | ||
615 | }, { | ||
616 | .clk = { | ||
617 | .name = "spi-bus", | ||
618 | .id = 1, | ||
619 | .ctrlbit = S3C_CLKCON_SCLK_SPI1, | ||
620 | .enable = s3c64xx_sclk_ctrl, | ||
621 | }, | ||
622 | .reg_src = { .reg = S3C_CLK_SRC, .shift = 16, .size = 2 }, | ||
623 | .reg_div = { .reg = S3C_CLK_DIV2, .shift = 4, .size = 4 }, | ||
624 | .sources = &clkset_spi_mmc, | ||
625 | }, { | ||
626 | .clk = { | ||
627 | .name = "audio-bus", | ||
628 | .id = 0, | ||
629 | .ctrlbit = S3C_CLKCON_SCLK_AUDIO0, | ||
630 | .enable = s3c64xx_sclk_ctrl, | ||
631 | }, | ||
632 | .reg_src = { .reg = S3C_CLK_SRC, .shift = 7, .size = 3 }, | ||
633 | .reg_div = { .reg = S3C_CLK_DIV2, .shift = 8, .size = 4 }, | ||
634 | .sources = &clkset_audio0, | ||
635 | }, { | ||
636 | .clk = { | ||
637 | .name = "audio-bus", | ||
638 | .id = 1, | ||
639 | .ctrlbit = S3C_CLKCON_SCLK_AUDIO1, | ||
640 | .enable = s3c64xx_sclk_ctrl, | ||
641 | }, | ||
642 | .reg_src = { .reg = S3C_CLK_SRC, .shift = 10, .size = 3 }, | ||
643 | .reg_div = { .reg = S3C_CLK_DIV2, .shift = 12, .size = 4 }, | ||
644 | .sources = &clkset_audio1, | ||
645 | }, { | ||
646 | .clk = { | ||
647 | .name = "irda-bus", | ||
648 | .id = 0, | ||
649 | .ctrlbit = S3C_CLKCON_SCLK_IRDA, | ||
650 | .enable = s3c64xx_sclk_ctrl, | ||
651 | }, | ||
652 | .reg_src = { .reg = S3C_CLK_SRC, .shift = 24, .size = 2 }, | ||
653 | .reg_div = { .reg = S3C_CLK_DIV2, .shift = 20, .size = 4 }, | ||
654 | .sources = &clkset_irda, | ||
655 | }, { | ||
656 | .clk = { | ||
657 | .name = "camera", | ||
658 | .id = -1, | ||
659 | .ctrlbit = S3C_CLKCON_SCLK_CAM, | ||
660 | .enable = s3c64xx_sclk_ctrl, | ||
661 | }, | ||
662 | .reg_div = { .reg = S3C_CLK_DIV0, .shift = 20, .size = 4 }, | ||
663 | .reg_src = { .reg = NULL, .shift = 0, .size = 0 }, | ||
664 | .sources = &clkset_camif, | ||
665 | }, | ||
666 | }; | ||
667 | |||
668 | /* Clock initialisation code */ | ||
669 | |||
670 | static struct clksrc_clk *init_parents[] = { | ||
671 | &clk_mout_apll, | ||
672 | &clk_mout_epll, | ||
673 | &clk_mout_mpll, | ||
674 | }; | ||
675 | |||
676 | #define GET_DIV(clk, field) ((((clk) & field##_MASK) >> field##_SHIFT) + 1) | ||
677 | |||
678 | void __init_or_cpufreq s3c6400_setup_clocks(void) | ||
679 | { | ||
680 | struct clk *xtal_clk; | ||
681 | unsigned long xtal; | ||
682 | unsigned long fclk; | ||
683 | unsigned long hclk; | ||
684 | unsigned long hclk2; | ||
685 | unsigned long pclk; | ||
686 | unsigned long epll; | ||
687 | unsigned long apll; | ||
688 | unsigned long mpll; | ||
689 | unsigned int ptr; | ||
690 | u32 clkdiv0; | ||
691 | |||
692 | printk(KERN_DEBUG "%s: registering clocks\n", __func__); | ||
693 | |||
694 | clkdiv0 = __raw_readl(S3C_CLK_DIV0); | ||
695 | printk(KERN_DEBUG "%s: clkdiv0 = %08x\n", __func__, clkdiv0); | ||
696 | |||
697 | xtal_clk = clk_get(NULL, "xtal"); | ||
698 | BUG_ON(IS_ERR(xtal_clk)); | ||
699 | |||
700 | xtal = clk_get_rate(xtal_clk); | ||
701 | clk_put(xtal_clk); | ||
702 | |||
703 | printk(KERN_DEBUG "%s: xtal is %ld\n", __func__, xtal); | ||
704 | |||
705 | /* For now assume the mux always selects the crystal */ | ||
706 | clk_ext_xtal_mux.parent = xtal_clk; | ||
707 | |||
708 | epll = s3c6400_get_epll(xtal); | ||
709 | mpll = s3c6400_get_pll(xtal, __raw_readl(S3C_MPLL_CON)); | ||
710 | apll = s3c6400_get_pll(xtal, __raw_readl(S3C_APLL_CON)); | ||
711 | |||
712 | fclk = mpll; | ||
713 | |||
714 | printk(KERN_INFO "S3C64XX: PLL settings, A=%ld, M=%ld, E=%ld\n", | ||
715 | apll, mpll, epll); | ||
716 | |||
717 | hclk2 = mpll / GET_DIV(clkdiv0, S3C6400_CLKDIV0_HCLK2); | ||
718 | hclk = hclk2 / GET_DIV(clkdiv0, S3C6400_CLKDIV0_HCLK); | ||
719 | pclk = hclk2 / GET_DIV(clkdiv0, S3C6400_CLKDIV0_PCLK); | ||
720 | |||
721 | printk(KERN_INFO "S3C64XX: HCLK2=%ld, HCLK=%ld, PCLK=%ld\n", | ||
722 | hclk2, hclk, pclk); | ||
723 | |||
724 | clk_fout_mpll.rate = mpll; | ||
725 | clk_fout_epll.rate = epll; | ||
726 | clk_fout_apll.rate = apll; | ||
727 | |||
728 | clk_h2.rate = hclk2; | ||
729 | clk_h.rate = hclk; | ||
730 | clk_p.rate = pclk; | ||
731 | clk_f.rate = fclk; | ||
732 | |||
733 | for (ptr = 0; ptr < ARRAY_SIZE(init_parents); ptr++) | ||
734 | s3c_set_clksrc(init_parents[ptr], true); | ||
735 | |||
736 | for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++) | ||
737 | s3c_set_clksrc(&clksrcs[ptr], true); | ||
738 | } | ||
739 | |||
740 | static struct clk *clks1[] __initdata = { | ||
741 | &clk_ext_xtal_mux, | ||
742 | &clk_iis_cd0, | ||
743 | &clk_iis_cd1, | ||
744 | &clk_pcm_cd, | ||
745 | &clk_mout_epll.clk, | ||
746 | &clk_mout_mpll.clk, | ||
747 | &clk_dout_mpll, | ||
748 | &clk_arm, | ||
749 | }; | ||
750 | |||
751 | static struct clk *clks[] __initdata = { | ||
752 | &clk_ext, | ||
753 | &clk_epll, | ||
754 | &clk_27m, | ||
755 | &clk_48m, | ||
756 | &clk_h2, | ||
757 | }; | ||
758 | |||
759 | /** | ||
760 | * s3c64xx_register_clocks - register clocks for s3c6400 and s3c6410 | ||
761 | * @xtal: The rate for the clock crystal feeding the PLLs. | ||
762 | * @armclk_divlimit: Divisor mask for ARMCLK. | ||
763 | * | ||
764 | * Register the clocks for the S3C6400 and S3C6410 SoC range, such | ||
765 | * as ARMCLK as well as the necessary parent clocks. | ||
766 | * | ||
767 | * This call does not setup the clocks, which is left to the | ||
768 | * s3c6400_setup_clocks() call which may be needed by the cpufreq | ||
769 | * or resume code to re-set the clocks if the bootloader has changed | ||
770 | * them. | ||
771 | */ | ||
772 | void __init s3c64xx_register_clocks(unsigned long xtal, | ||
773 | unsigned armclk_divlimit) | ||
774 | { | ||
775 | struct clk *clkp; | ||
776 | int ret; | ||
777 | int ptr; | ||
778 | |||
779 | armclk_mask = armclk_divlimit; | ||
780 | |||
781 | s3c24xx_register_baseclocks(xtal); | ||
782 | s3c24xx_register_clocks(clks, ARRAY_SIZE(clks)); | ||
783 | |||
784 | s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks)); | ||
785 | |||
786 | clkp = init_clocks_disable; | ||
787 | for (ptr = 0; ptr < ARRAY_SIZE(init_clocks_disable); ptr++, clkp++) { | ||
788 | |||
789 | ret = s3c24xx_register_clock(clkp); | ||
790 | if (ret < 0) { | ||
791 | printk(KERN_ERR "Failed to register clock %s (%d)\n", | ||
792 | clkp->name, ret); | ||
793 | } | ||
794 | |||
795 | (clkp->enable)(clkp, 0); | ||
796 | } | ||
797 | |||
798 | s3c24xx_register_clocks(clks1, ARRAY_SIZE(clks1)); | ||
799 | s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs)); | ||
800 | s3c_pwmclk_init(); | ||
801 | } | ||
diff --git a/arch/arm/mach-s3c64xx/cpu.c b/arch/arm/mach-s3c64xx/cpu.c new file mode 100644 index 000000000000..374e45e566b8 --- /dev/null +++ b/arch/arm/mach-s3c64xx/cpu.c | |||
@@ -0,0 +1,167 @@ | |||
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/sysdev.h> | ||
20 | #include <linux/serial_core.h> | ||
21 | #include <linux/platform_device.h> | ||
22 | #include <linux/io.h> | ||
23 | |||
24 | #include <mach/hardware.h> | ||
25 | #include <mach/map.h> | ||
26 | |||
27 | #include <asm/mach/arch.h> | ||
28 | #include <asm/mach/map.h> | ||
29 | |||
30 | #include <plat/regs-serial.h> | ||
31 | |||
32 | #include <plat/cpu.h> | ||
33 | #include <plat/devs.h> | ||
34 | #include <plat/clock.h> | ||
35 | |||
36 | #include <mach/s3c6400.h> | ||
37 | #include <mach/s3c6410.h> | ||
38 | |||
39 | /* table of supported CPUs */ | ||
40 | |||
41 | static const char name_s3c6400[] = "S3C6400"; | ||
42 | static const char name_s3c6410[] = "S3C6410"; | ||
43 | |||
44 | static struct cpu_table cpu_ids[] __initdata = { | ||
45 | { | ||
46 | .idcode = 0x36400000, | ||
47 | .idmask = 0xfffff000, | ||
48 | .map_io = s3c6400_map_io, | ||
49 | .init_clocks = s3c6400_init_clocks, | ||
50 | .init_uarts = s3c6400_init_uarts, | ||
51 | .init = s3c6400_init, | ||
52 | .name = name_s3c6400, | ||
53 | }, { | ||
54 | .idcode = 0x36410100, | ||
55 | .idmask = 0xffffff00, | ||
56 | .map_io = s3c6410_map_io, | ||
57 | .init_clocks = s3c6410_init_clocks, | ||
58 | .init_uarts = s3c6410_init_uarts, | ||
59 | .init = s3c6410_init, | ||
60 | .name = name_s3c6410, | ||
61 | }, | ||
62 | }; | ||
63 | |||
64 | /* minimal IO mapping */ | ||
65 | |||
66 | /* see notes on uart map in arch/arm/mach-s3c6400/include/mach/debug-macro.S */ | ||
67 | #define UART_OFFS (S3C_PA_UART & 0xfffff) | ||
68 | |||
69 | static struct map_desc s3c_iodesc[] __initdata = { | ||
70 | { | ||
71 | .virtual = (unsigned long)S3C_VA_SYS, | ||
72 | .pfn = __phys_to_pfn(S3C64XX_PA_SYSCON), | ||
73 | .length = SZ_4K, | ||
74 | .type = MT_DEVICE, | ||
75 | }, { | ||
76 | .virtual = (unsigned long)S3C_VA_MEM, | ||
77 | .pfn = __phys_to_pfn(S3C64XX_PA_SROM), | ||
78 | .length = SZ_4K, | ||
79 | .type = MT_DEVICE, | ||
80 | }, { | ||
81 | .virtual = (unsigned long)(S3C_VA_UART + UART_OFFS), | ||
82 | .pfn = __phys_to_pfn(S3C_PA_UART), | ||
83 | .length = SZ_4K, | ||
84 | .type = MT_DEVICE, | ||
85 | }, { | ||
86 | .virtual = (unsigned long)VA_VIC0, | ||
87 | .pfn = __phys_to_pfn(S3C64XX_PA_VIC0), | ||
88 | .length = SZ_16K, | ||
89 | .type = MT_DEVICE, | ||
90 | }, { | ||
91 | .virtual = (unsigned long)VA_VIC1, | ||
92 | .pfn = __phys_to_pfn(S3C64XX_PA_VIC1), | ||
93 | .length = SZ_16K, | ||
94 | .type = MT_DEVICE, | ||
95 | }, { | ||
96 | .virtual = (unsigned long)S3C_VA_TIMER, | ||
97 | .pfn = __phys_to_pfn(S3C_PA_TIMER), | ||
98 | .length = SZ_16K, | ||
99 | .type = MT_DEVICE, | ||
100 | }, { | ||
101 | .virtual = (unsigned long)S3C64XX_VA_GPIO, | ||
102 | .pfn = __phys_to_pfn(S3C64XX_PA_GPIO), | ||
103 | .length = SZ_4K, | ||
104 | .type = MT_DEVICE, | ||
105 | }, { | ||
106 | .virtual = (unsigned long)S3C64XX_VA_MODEM, | ||
107 | .pfn = __phys_to_pfn(S3C64XX_PA_MODEM), | ||
108 | .length = SZ_4K, | ||
109 | .type = MT_DEVICE, | ||
110 | }, { | ||
111 | .virtual = (unsigned long)S3C_VA_WATCHDOG, | ||
112 | .pfn = __phys_to_pfn(S3C64XX_PA_WATCHDOG), | ||
113 | .length = SZ_4K, | ||
114 | .type = MT_DEVICE, | ||
115 | }, { | ||
116 | .virtual = (unsigned long)S3C_VA_USB_HSPHY, | ||
117 | .pfn = __phys_to_pfn(S3C64XX_PA_USB_HSPHY), | ||
118 | .length = SZ_1K, | ||
119 | .type = MT_DEVICE, | ||
120 | }, | ||
121 | }; | ||
122 | |||
123 | |||
124 | struct sysdev_class s3c64xx_sysclass = { | ||
125 | .name = "s3c64xx-core", | ||
126 | }; | ||
127 | |||
128 | static struct sys_device s3c64xx_sysdev = { | ||
129 | .cls = &s3c64xx_sysclass, | ||
130 | }; | ||
131 | |||
132 | /* uart registration process */ | ||
133 | |||
134 | void __init s3c6400_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
135 | { | ||
136 | s3c24xx_init_uartdevs("s3c6400-uart", s3c64xx_uart_resources, cfg, no); | ||
137 | } | ||
138 | |||
139 | /* read cpu identification code */ | ||
140 | |||
141 | void __init s3c64xx_init_io(struct map_desc *mach_desc, int size) | ||
142 | { | ||
143 | unsigned long idcode; | ||
144 | |||
145 | /* initialise the io descriptors we need for initialisation */ | ||
146 | iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc)); | ||
147 | iotable_init(mach_desc, size); | ||
148 | |||
149 | idcode = __raw_readl(S3C_VA_SYS + 0x118); | ||
150 | if (!idcode) { | ||
151 | /* S3C6400 has the ID register in a different place, | ||
152 | * and needs a write before it can be read. */ | ||
153 | |||
154 | __raw_writel(0x0, S3C_VA_SYS + 0xA1C); | ||
155 | idcode = __raw_readl(S3C_VA_SYS + 0xA1C); | ||
156 | } | ||
157 | |||
158 | s3c_init_cpu(idcode, cpu_ids, ARRAY_SIZE(cpu_ids)); | ||
159 | } | ||
160 | |||
161 | static __init int s3c64xx_sysdev_init(void) | ||
162 | { | ||
163 | sysdev_class_register(&s3c64xx_sysclass); | ||
164 | return sysdev_register(&s3c64xx_sysdev); | ||
165 | } | ||
166 | |||
167 | core_initcall(s3c64xx_sysdev_init); | ||
diff --git a/arch/arm/mach-s3c64xx/cpufreq.c b/arch/arm/mach-s3c64xx/cpufreq.c new file mode 100644 index 000000000000..74c0e8347de5 --- /dev/null +++ b/arch/arm/mach-s3c64xx/cpufreq.c | |||
@@ -0,0 +1,270 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/cpufreq.c | ||
2 | * | ||
3 | * Copyright 2009 Wolfson Microelectronics plc | ||
4 | * | ||
5 | * S3C64xx CPUfreq Support | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/types.h> | ||
14 | #include <linux/init.h> | ||
15 | #include <linux/cpufreq.h> | ||
16 | #include <linux/clk.h> | ||
17 | #include <linux/err.h> | ||
18 | #include <linux/regulator/consumer.h> | ||
19 | |||
20 | static struct clk *armclk; | ||
21 | static struct regulator *vddarm; | ||
22 | static unsigned long regulator_latency; | ||
23 | |||
24 | #ifdef CONFIG_CPU_S3C6410 | ||
25 | struct s3c64xx_dvfs { | ||
26 | unsigned int vddarm_min; | ||
27 | unsigned int vddarm_max; | ||
28 | }; | ||
29 | |||
30 | static struct s3c64xx_dvfs s3c64xx_dvfs_table[] = { | ||
31 | [0] = { 1000000, 1150000 }, | ||
32 | [1] = { 1050000, 1150000 }, | ||
33 | [2] = { 1100000, 1150000 }, | ||
34 | [3] = { 1200000, 1350000 }, | ||
35 | }; | ||
36 | |||
37 | static struct cpufreq_frequency_table s3c64xx_freq_table[] = { | ||
38 | { 0, 66000 }, | ||
39 | { 0, 133000 }, | ||
40 | { 1, 222000 }, | ||
41 | { 1, 266000 }, | ||
42 | { 2, 333000 }, | ||
43 | { 2, 400000 }, | ||
44 | { 2, 532000 }, | ||
45 | { 2, 533000 }, | ||
46 | { 3, 667000 }, | ||
47 | { 0, CPUFREQ_TABLE_END }, | ||
48 | }; | ||
49 | #endif | ||
50 | |||
51 | static int s3c64xx_cpufreq_verify_speed(struct cpufreq_policy *policy) | ||
52 | { | ||
53 | if (policy->cpu != 0) | ||
54 | return -EINVAL; | ||
55 | |||
56 | return cpufreq_frequency_table_verify(policy, s3c64xx_freq_table); | ||
57 | } | ||
58 | |||
59 | static unsigned int s3c64xx_cpufreq_get_speed(unsigned int cpu) | ||
60 | { | ||
61 | if (cpu != 0) | ||
62 | return 0; | ||
63 | |||
64 | return clk_get_rate(armclk) / 1000; | ||
65 | } | ||
66 | |||
67 | static int s3c64xx_cpufreq_set_target(struct cpufreq_policy *policy, | ||
68 | unsigned int target_freq, | ||
69 | unsigned int relation) | ||
70 | { | ||
71 | int ret; | ||
72 | unsigned int i; | ||
73 | struct cpufreq_freqs freqs; | ||
74 | struct s3c64xx_dvfs *dvfs; | ||
75 | |||
76 | ret = cpufreq_frequency_table_target(policy, s3c64xx_freq_table, | ||
77 | target_freq, relation, &i); | ||
78 | if (ret != 0) | ||
79 | return ret; | ||
80 | |||
81 | freqs.cpu = 0; | ||
82 | freqs.old = clk_get_rate(armclk) / 1000; | ||
83 | freqs.new = s3c64xx_freq_table[i].frequency; | ||
84 | freqs.flags = 0; | ||
85 | dvfs = &s3c64xx_dvfs_table[s3c64xx_freq_table[i].index]; | ||
86 | |||
87 | if (freqs.old == freqs.new) | ||
88 | return 0; | ||
89 | |||
90 | pr_debug("cpufreq: Transition %d-%dkHz\n", freqs.old, freqs.new); | ||
91 | |||
92 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | ||
93 | |||
94 | #ifdef CONFIG_REGULATOR | ||
95 | if (vddarm && freqs.new > freqs.old) { | ||
96 | ret = regulator_set_voltage(vddarm, | ||
97 | dvfs->vddarm_min, | ||
98 | dvfs->vddarm_max); | ||
99 | if (ret != 0) { | ||
100 | pr_err("cpufreq: Failed to set VDDARM for %dkHz: %d\n", | ||
101 | freqs.new, ret); | ||
102 | goto err; | ||
103 | } | ||
104 | } | ||
105 | #endif | ||
106 | |||
107 | ret = clk_set_rate(armclk, freqs.new * 1000); | ||
108 | if (ret < 0) { | ||
109 | pr_err("cpufreq: Failed to set rate %dkHz: %d\n", | ||
110 | freqs.new, ret); | ||
111 | goto err; | ||
112 | } | ||
113 | |||
114 | #ifdef CONFIG_REGULATOR | ||
115 | if (vddarm && freqs.new < freqs.old) { | ||
116 | ret = regulator_set_voltage(vddarm, | ||
117 | dvfs->vddarm_min, | ||
118 | dvfs->vddarm_max); | ||
119 | if (ret != 0) { | ||
120 | pr_err("cpufreq: Failed to set VDDARM for %dkHz: %d\n", | ||
121 | freqs.new, ret); | ||
122 | goto err_clk; | ||
123 | } | ||
124 | } | ||
125 | #endif | ||
126 | |||
127 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | ||
128 | |||
129 | pr_debug("cpufreq: Set actual frequency %lukHz\n", | ||
130 | clk_get_rate(armclk) / 1000); | ||
131 | |||
132 | return 0; | ||
133 | |||
134 | err_clk: | ||
135 | if (clk_set_rate(armclk, freqs.old * 1000) < 0) | ||
136 | pr_err("Failed to restore original clock rate\n"); | ||
137 | err: | ||
138 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | ||
139 | |||
140 | return ret; | ||
141 | } | ||
142 | |||
143 | #ifdef CONFIG_REGULATOR | ||
144 | static void __init s3c64xx_cpufreq_config_regulator(void) | ||
145 | { | ||
146 | int count, v, i, found; | ||
147 | struct cpufreq_frequency_table *freq; | ||
148 | struct s3c64xx_dvfs *dvfs; | ||
149 | |||
150 | count = regulator_count_voltages(vddarm); | ||
151 | if (count < 0) { | ||
152 | pr_err("cpufreq: Unable to check supported voltages\n"); | ||
153 | } | ||
154 | |||
155 | freq = s3c64xx_freq_table; | ||
156 | while (count > 0 && freq->frequency != CPUFREQ_TABLE_END) { | ||
157 | if (freq->frequency == CPUFREQ_ENTRY_INVALID) | ||
158 | continue; | ||
159 | |||
160 | dvfs = &s3c64xx_dvfs_table[freq->index]; | ||
161 | found = 0; | ||
162 | |||
163 | for (i = 0; i < count; i++) { | ||
164 | v = regulator_list_voltage(vddarm, i); | ||
165 | if (v >= dvfs->vddarm_min && v <= dvfs->vddarm_max) | ||
166 | found = 1; | ||
167 | } | ||
168 | |||
169 | if (!found) { | ||
170 | pr_debug("cpufreq: %dkHz unsupported by regulator\n", | ||
171 | freq->frequency); | ||
172 | freq->frequency = CPUFREQ_ENTRY_INVALID; | ||
173 | } | ||
174 | |||
175 | freq++; | ||
176 | } | ||
177 | |||
178 | /* Guess based on having to do an I2C/SPI write; in future we | ||
179 | * will be able to query the regulator performance here. */ | ||
180 | regulator_latency = 1 * 1000 * 1000; | ||
181 | } | ||
182 | #endif | ||
183 | |||
184 | static int __init s3c64xx_cpufreq_driver_init(struct cpufreq_policy *policy) | ||
185 | { | ||
186 | int ret; | ||
187 | struct cpufreq_frequency_table *freq; | ||
188 | |||
189 | if (policy->cpu != 0) | ||
190 | return -EINVAL; | ||
191 | |||
192 | if (s3c64xx_freq_table == NULL) { | ||
193 | pr_err("cpufreq: No frequency information for this CPU\n"); | ||
194 | return -ENODEV; | ||
195 | } | ||
196 | |||
197 | armclk = clk_get(NULL, "armclk"); | ||
198 | if (IS_ERR(armclk)) { | ||
199 | pr_err("cpufreq: Unable to obtain ARMCLK: %ld\n", | ||
200 | PTR_ERR(armclk)); | ||
201 | return PTR_ERR(armclk); | ||
202 | } | ||
203 | |||
204 | #ifdef CONFIG_REGULATOR | ||
205 | vddarm = regulator_get(NULL, "vddarm"); | ||
206 | if (IS_ERR(vddarm)) { | ||
207 | ret = PTR_ERR(vddarm); | ||
208 | pr_err("cpufreq: Failed to obtain VDDARM: %d\n", ret); | ||
209 | pr_err("cpufreq: Only frequency scaling available\n"); | ||
210 | vddarm = NULL; | ||
211 | } else { | ||
212 | s3c64xx_cpufreq_config_regulator(); | ||
213 | } | ||
214 | #endif | ||
215 | |||
216 | freq = s3c64xx_freq_table; | ||
217 | while (freq->frequency != CPUFREQ_TABLE_END) { | ||
218 | unsigned long r; | ||
219 | |||
220 | /* Check for frequencies we can generate */ | ||
221 | r = clk_round_rate(armclk, freq->frequency * 1000); | ||
222 | r /= 1000; | ||
223 | if (r != freq->frequency) { | ||
224 | pr_debug("cpufreq: %dkHz unsupported by clock\n", | ||
225 | freq->frequency); | ||
226 | freq->frequency = CPUFREQ_ENTRY_INVALID; | ||
227 | } | ||
228 | |||
229 | /* If we have no regulator then assume startup | ||
230 | * frequency is the maximum we can support. */ | ||
231 | if (!vddarm && freq->frequency > s3c64xx_cpufreq_get_speed(0)) | ||
232 | freq->frequency = CPUFREQ_ENTRY_INVALID; | ||
233 | |||
234 | freq++; | ||
235 | } | ||
236 | |||
237 | policy->cur = clk_get_rate(armclk) / 1000; | ||
238 | |||
239 | /* Datasheet says PLL stabalisation time (if we were to use | ||
240 | * the PLLs, which we don't currently) is ~300us worst case, | ||
241 | * but add some fudge. | ||
242 | */ | ||
243 | policy->cpuinfo.transition_latency = (500 * 1000) + regulator_latency; | ||
244 | |||
245 | ret = cpufreq_frequency_table_cpuinfo(policy, s3c64xx_freq_table); | ||
246 | if (ret != 0) { | ||
247 | pr_err("cpufreq: Failed to configure frequency table: %d\n", | ||
248 | ret); | ||
249 | regulator_put(vddarm); | ||
250 | clk_put(armclk); | ||
251 | } | ||
252 | |||
253 | return ret; | ||
254 | } | ||
255 | |||
256 | static struct cpufreq_driver s3c64xx_cpufreq_driver = { | ||
257 | .owner = THIS_MODULE, | ||
258 | .flags = 0, | ||
259 | .verify = s3c64xx_cpufreq_verify_speed, | ||
260 | .target = s3c64xx_cpufreq_set_target, | ||
261 | .get = s3c64xx_cpufreq_get_speed, | ||
262 | .init = s3c64xx_cpufreq_driver_init, | ||
263 | .name = "s3c", | ||
264 | }; | ||
265 | |||
266 | static int __init s3c64xx_cpufreq_init(void) | ||
267 | { | ||
268 | return cpufreq_register_driver(&s3c64xx_cpufreq_driver); | ||
269 | } | ||
270 | module_init(s3c64xx_cpufreq_init); | ||
diff --git a/arch/arm/mach-s3c64xx/dev-adc.c b/arch/arm/mach-s3c64xx/dev-adc.c new file mode 100644 index 000000000000..fafef9b6bcfa --- /dev/null +++ b/arch/arm/mach-s3c64xx/dev-adc.c | |||
@@ -0,0 +1,46 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/dev-adc.c | ||
2 | * | ||
3 | * Copyright 2010 Maurus Cuelenaere | ||
4 | * | ||
5 | * S3C64xx series device definition for ADC device | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/string.h> | ||
14 | #include <linux/platform_device.h> | ||
15 | |||
16 | #include <mach/irqs.h> | ||
17 | #include <mach/map.h> | ||
18 | |||
19 | #include <plat/adc.h> | ||
20 | #include <plat/devs.h> | ||
21 | #include <plat/cpu.h> | ||
22 | |||
23 | static struct resource s3c_adc_resource[] = { | ||
24 | [0] = { | ||
25 | .start = S3C64XX_PA_ADC, | ||
26 | .end = S3C64XX_PA_ADC + SZ_256 - 1, | ||
27 | .flags = IORESOURCE_MEM, | ||
28 | }, | ||
29 | [1] = { | ||
30 | .start = IRQ_TC, | ||
31 | .end = IRQ_TC, | ||
32 | .flags = IORESOURCE_IRQ, | ||
33 | }, | ||
34 | [2] = { | ||
35 | .start = IRQ_ADC, | ||
36 | .end = IRQ_ADC, | ||
37 | .flags = IORESOURCE_IRQ, | ||
38 | }, | ||
39 | }; | ||
40 | |||
41 | struct platform_device s3c_device_adc = { | ||
42 | .name = "s3c64xx-adc", | ||
43 | .id = -1, | ||
44 | .num_resources = ARRAY_SIZE(s3c_adc_resource), | ||
45 | .resource = s3c_adc_resource, | ||
46 | }; | ||
diff --git a/arch/arm/mach-s3c64xx/dev-audio.c b/arch/arm/mach-s3c64xx/dev-audio.c new file mode 100644 index 000000000000..aaffb8066707 --- /dev/null +++ b/arch/arm/mach-s3c64xx/dev-audio.c | |||
@@ -0,0 +1,257 @@ | |||
1 | /* linux/arch/arm/plat-s3c/dev-audio.c | ||
2 | * | ||
3 | * Copyright 2009 Wolfson Microelectronics | ||
4 | * Mark Brown <broonie@opensource.wolfsonmicro.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/string.h> | ||
13 | #include <linux/platform_device.h> | ||
14 | |||
15 | #include <mach/irqs.h> | ||
16 | #include <mach/map.h> | ||
17 | #include <mach/dma.h> | ||
18 | #include <mach/gpio.h> | ||
19 | |||
20 | #include <plat/devs.h> | ||
21 | #include <plat/audio.h> | ||
22 | #include <plat/gpio-cfg.h> | ||
23 | |||
24 | #include <mach/gpio-bank-c.h> | ||
25 | #include <mach/gpio-bank-d.h> | ||
26 | #include <mach/gpio-bank-e.h> | ||
27 | #include <mach/gpio-bank-h.h> | ||
28 | |||
29 | static int s3c64xx_i2sv3_cfg_gpio(struct platform_device *pdev) | ||
30 | { | ||
31 | switch (pdev->id) { | ||
32 | case 0: | ||
33 | s3c_gpio_cfgpin(S3C64XX_GPD(0), S3C64XX_GPD0_I2S0_CLK); | ||
34 | s3c_gpio_cfgpin(S3C64XX_GPD(1), S3C64XX_GPD1_I2S0_CDCLK); | ||
35 | s3c_gpio_cfgpin(S3C64XX_GPD(2), S3C64XX_GPD2_I2S0_LRCLK); | ||
36 | s3c_gpio_cfgpin(S3C64XX_GPD(3), S3C64XX_GPD3_I2S0_DI); | ||
37 | s3c_gpio_cfgpin(S3C64XX_GPD(4), S3C64XX_GPD4_I2S0_D0); | ||
38 | break; | ||
39 | case 1: | ||
40 | s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C64XX_GPE0_I2S1_CLK); | ||
41 | s3c_gpio_cfgpin(S3C64XX_GPE(1), S3C64XX_GPE1_I2S1_CDCLK); | ||
42 | s3c_gpio_cfgpin(S3C64XX_GPE(2), S3C64XX_GPE2_I2S1_LRCLK); | ||
43 | s3c_gpio_cfgpin(S3C64XX_GPE(3), S3C64XX_GPE3_I2S1_DI); | ||
44 | s3c_gpio_cfgpin(S3C64XX_GPE(4), S3C64XX_GPE4_I2S1_D0); | ||
45 | default: | ||
46 | printk(KERN_DEBUG "Invalid I2S Controller number!"); | ||
47 | return -EINVAL; | ||
48 | } | ||
49 | |||
50 | return 0; | ||
51 | } | ||
52 | |||
53 | static int s3c64xx_i2sv4_cfg_gpio(struct platform_device *pdev) | ||
54 | { | ||
55 | s3c_gpio_cfgpin(S3C64XX_GPC(4), S3C64XX_GPC4_I2S_V40_DO0); | ||
56 | s3c_gpio_cfgpin(S3C64XX_GPC(5), S3C64XX_GPC5_I2S_V40_DO1); | ||
57 | s3c_gpio_cfgpin(S3C64XX_GPC(7), S3C64XX_GPC7_I2S_V40_DO2); | ||
58 | s3c_gpio_cfgpin(S3C64XX_GPH(6), S3C64XX_GPH6_I2S_V40_BCLK); | ||
59 | s3c_gpio_cfgpin(S3C64XX_GPH(7), S3C64XX_GPH7_I2S_V40_CDCLK); | ||
60 | s3c_gpio_cfgpin(S3C64XX_GPH(8), S3C64XX_GPH8_I2S_V40_LRCLK); | ||
61 | s3c_gpio_cfgpin(S3C64XX_GPH(9), S3C64XX_GPH9_I2S_V40_DI); | ||
62 | |||
63 | return 0; | ||
64 | } | ||
65 | |||
66 | static struct resource s3c64xx_iis0_resource[] = { | ||
67 | [0] = { | ||
68 | .start = S3C64XX_PA_IIS0, | ||
69 | .end = S3C64XX_PA_IIS0 + 0x100 - 1, | ||
70 | .flags = IORESOURCE_MEM, | ||
71 | }, | ||
72 | [1] = { | ||
73 | .start = DMACH_I2S0_OUT, | ||
74 | .end = DMACH_I2S0_OUT, | ||
75 | .flags = IORESOURCE_DMA, | ||
76 | }, | ||
77 | [2] = { | ||
78 | .start = DMACH_I2S0_IN, | ||
79 | .end = DMACH_I2S0_IN, | ||
80 | .flags = IORESOURCE_DMA, | ||
81 | }, | ||
82 | }; | ||
83 | |||
84 | static struct s3c_audio_pdata s3c_i2s0_pdata = { | ||
85 | .cfg_gpio = s3c64xx_i2sv3_cfg_gpio, | ||
86 | }; | ||
87 | |||
88 | struct platform_device s3c64xx_device_iis0 = { | ||
89 | .name = "s3c64xx-iis", | ||
90 | .id = 0, | ||
91 | .num_resources = ARRAY_SIZE(s3c64xx_iis0_resource), | ||
92 | .resource = s3c64xx_iis0_resource, | ||
93 | .dev = { | ||
94 | .platform_data = &s3c_i2s0_pdata, | ||
95 | }, | ||
96 | }; | ||
97 | EXPORT_SYMBOL(s3c64xx_device_iis0); | ||
98 | |||
99 | static struct resource s3c64xx_iis1_resource[] = { | ||
100 | [0] = { | ||
101 | .start = S3C64XX_PA_IIS1, | ||
102 | .end = S3C64XX_PA_IIS1 + 0x100 - 1, | ||
103 | .flags = IORESOURCE_MEM, | ||
104 | }, | ||
105 | [1] = { | ||
106 | .start = DMACH_I2S1_OUT, | ||
107 | .end = DMACH_I2S1_OUT, | ||
108 | .flags = IORESOURCE_DMA, | ||
109 | }, | ||
110 | [2] = { | ||
111 | .start = DMACH_I2S1_IN, | ||
112 | .end = DMACH_I2S1_IN, | ||
113 | .flags = IORESOURCE_DMA, | ||
114 | }, | ||
115 | }; | ||
116 | |||
117 | static struct s3c_audio_pdata s3c_i2s1_pdata = { | ||
118 | .cfg_gpio = s3c64xx_i2sv3_cfg_gpio, | ||
119 | }; | ||
120 | |||
121 | struct platform_device s3c64xx_device_iis1 = { | ||
122 | .name = "s3c64xx-iis", | ||
123 | .id = 1, | ||
124 | .num_resources = ARRAY_SIZE(s3c64xx_iis1_resource), | ||
125 | .resource = s3c64xx_iis1_resource, | ||
126 | .dev = { | ||
127 | .platform_data = &s3c_i2s1_pdata, | ||
128 | }, | ||
129 | }; | ||
130 | EXPORT_SYMBOL(s3c64xx_device_iis1); | ||
131 | |||
132 | static struct resource s3c64xx_iisv4_resource[] = { | ||
133 | [0] = { | ||
134 | .start = S3C64XX_PA_IISV4, | ||
135 | .end = S3C64XX_PA_IISV4 + 0x100 - 1, | ||
136 | .flags = IORESOURCE_MEM, | ||
137 | }, | ||
138 | [1] = { | ||
139 | .start = DMACH_HSI_I2SV40_TX, | ||
140 | .end = DMACH_HSI_I2SV40_TX, | ||
141 | .flags = IORESOURCE_DMA, | ||
142 | }, | ||
143 | [2] = { | ||
144 | .start = DMACH_HSI_I2SV40_RX, | ||
145 | .end = DMACH_HSI_I2SV40_RX, | ||
146 | .flags = IORESOURCE_DMA, | ||
147 | }, | ||
148 | }; | ||
149 | |||
150 | static struct s3c_audio_pdata s3c_i2sv4_pdata = { | ||
151 | .cfg_gpio = s3c64xx_i2sv4_cfg_gpio, | ||
152 | }; | ||
153 | |||
154 | struct platform_device s3c64xx_device_iisv4 = { | ||
155 | .name = "s3c64xx-iis-v4", | ||
156 | .id = -1, | ||
157 | .num_resources = ARRAY_SIZE(s3c64xx_iisv4_resource), | ||
158 | .resource = s3c64xx_iisv4_resource, | ||
159 | .dev = { | ||
160 | .platform_data = &s3c_i2sv4_pdata, | ||
161 | }, | ||
162 | }; | ||
163 | EXPORT_SYMBOL(s3c64xx_device_iisv4); | ||
164 | |||
165 | |||
166 | /* PCM Controller platform_devices */ | ||
167 | |||
168 | static int s3c64xx_pcm_cfg_gpio(struct platform_device *pdev) | ||
169 | { | ||
170 | switch (pdev->id) { | ||
171 | case 0: | ||
172 | s3c_gpio_cfgpin(S3C64XX_GPD(0), S3C64XX_GPD0_PCM0_SCLK); | ||
173 | s3c_gpio_cfgpin(S3C64XX_GPD(1), S3C64XX_GPD1_PCM0_EXTCLK); | ||
174 | s3c_gpio_cfgpin(S3C64XX_GPD(2), S3C64XX_GPD2_PCM0_FSYNC); | ||
175 | s3c_gpio_cfgpin(S3C64XX_GPD(3), S3C64XX_GPD3_PCM0_SIN); | ||
176 | s3c_gpio_cfgpin(S3C64XX_GPD(4), S3C64XX_GPD4_PCM0_SOUT); | ||
177 | break; | ||
178 | case 1: | ||
179 | s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C64XX_GPE0_PCM1_SCLK); | ||
180 | s3c_gpio_cfgpin(S3C64XX_GPE(1), S3C64XX_GPE1_PCM1_EXTCLK); | ||
181 | s3c_gpio_cfgpin(S3C64XX_GPE(2), S3C64XX_GPE2_PCM1_FSYNC); | ||
182 | s3c_gpio_cfgpin(S3C64XX_GPE(3), S3C64XX_GPE3_PCM1_SIN); | ||
183 | s3c_gpio_cfgpin(S3C64XX_GPE(4), S3C64XX_GPE4_PCM1_SOUT); | ||
184 | break; | ||
185 | default: | ||
186 | printk(KERN_DEBUG "Invalid PCM Controller number!"); | ||
187 | return -EINVAL; | ||
188 | } | ||
189 | |||
190 | return 0; | ||
191 | } | ||
192 | |||
193 | static struct resource s3c64xx_pcm0_resource[] = { | ||
194 | [0] = { | ||
195 | .start = S3C64XX_PA_PCM0, | ||
196 | .end = S3C64XX_PA_PCM0 + 0x100 - 1, | ||
197 | .flags = IORESOURCE_MEM, | ||
198 | }, | ||
199 | [1] = { | ||
200 | .start = DMACH_PCM0_TX, | ||
201 | .end = DMACH_PCM0_TX, | ||
202 | .flags = IORESOURCE_DMA, | ||
203 | }, | ||
204 | [2] = { | ||
205 | .start = DMACH_PCM0_RX, | ||
206 | .end = DMACH_PCM0_RX, | ||
207 | .flags = IORESOURCE_DMA, | ||
208 | }, | ||
209 | }; | ||
210 | |||
211 | static struct s3c_audio_pdata s3c_pcm0_pdata = { | ||
212 | .cfg_gpio = s3c64xx_pcm_cfg_gpio, | ||
213 | }; | ||
214 | |||
215 | struct platform_device s3c64xx_device_pcm0 = { | ||
216 | .name = "samsung-pcm", | ||
217 | .id = 0, | ||
218 | .num_resources = ARRAY_SIZE(s3c64xx_pcm0_resource), | ||
219 | .resource = s3c64xx_pcm0_resource, | ||
220 | .dev = { | ||
221 | .platform_data = &s3c_pcm0_pdata, | ||
222 | }, | ||
223 | }; | ||
224 | EXPORT_SYMBOL(s3c64xx_device_pcm0); | ||
225 | |||
226 | static struct resource s3c64xx_pcm1_resource[] = { | ||
227 | [0] = { | ||
228 | .start = S3C64XX_PA_PCM1, | ||
229 | .end = S3C64XX_PA_PCM1 + 0x100 - 1, | ||
230 | .flags = IORESOURCE_MEM, | ||
231 | }, | ||
232 | [1] = { | ||
233 | .start = DMACH_PCM1_TX, | ||
234 | .end = DMACH_PCM1_TX, | ||
235 | .flags = IORESOURCE_DMA, | ||
236 | }, | ||
237 | [2] = { | ||
238 | .start = DMACH_PCM1_RX, | ||
239 | .end = DMACH_PCM1_RX, | ||
240 | .flags = IORESOURCE_DMA, | ||
241 | }, | ||
242 | }; | ||
243 | |||
244 | static struct s3c_audio_pdata s3c_pcm1_pdata = { | ||
245 | .cfg_gpio = s3c64xx_pcm_cfg_gpio, | ||
246 | }; | ||
247 | |||
248 | struct platform_device s3c64xx_device_pcm1 = { | ||
249 | .name = "samsung-pcm", | ||
250 | .id = 1, | ||
251 | .num_resources = ARRAY_SIZE(s3c64xx_pcm1_resource), | ||
252 | .resource = s3c64xx_pcm1_resource, | ||
253 | .dev = { | ||
254 | .platform_data = &s3c_pcm1_pdata, | ||
255 | }, | ||
256 | }; | ||
257 | EXPORT_SYMBOL(s3c64xx_device_pcm1); | ||
diff --git a/arch/arm/mach-s3c64xx/dev-rtc.c b/arch/arm/mach-s3c64xx/dev-rtc.c new file mode 100644 index 000000000000..b9e7a05f0129 --- /dev/null +++ b/arch/arm/mach-s3c64xx/dev-rtc.c | |||
@@ -0,0 +1,43 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/dev-rtc.c | ||
2 | * | ||
3 | * Copyright 2009 by Maurus Cuelenaere <mcuelenaere@gmail.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | */ | ||
9 | |||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/string.h> | ||
12 | #include <linux/platform_device.h> | ||
13 | |||
14 | #include <mach/irqs.h> | ||
15 | #include <mach/map.h> | ||
16 | |||
17 | #include <plat/devs.h> | ||
18 | |||
19 | static struct resource s3c_rtc_resource[] = { | ||
20 | [0] = { | ||
21 | .start = S3C64XX_PA_RTC, | ||
22 | .end = S3C64XX_PA_RTC + 0xff, | ||
23 | .flags = IORESOURCE_MEM, | ||
24 | }, | ||
25 | [1] = { | ||
26 | .start = IRQ_RTC_ALARM, | ||
27 | .end = IRQ_RTC_ALARM, | ||
28 | .flags = IORESOURCE_IRQ, | ||
29 | }, | ||
30 | [2] = { | ||
31 | .start = IRQ_RTC_TIC, | ||
32 | .end = IRQ_RTC_TIC, | ||
33 | .flags = IORESOURCE_IRQ | ||
34 | } | ||
35 | }; | ||
36 | |||
37 | struct platform_device s3c_device_rtc = { | ||
38 | .name = "s3c64xx-rtc", | ||
39 | .id = -1, | ||
40 | .num_resources = ARRAY_SIZE(s3c_rtc_resource), | ||
41 | .resource = s3c_rtc_resource, | ||
42 | }; | ||
43 | EXPORT_SYMBOL(s3c_device_rtc); | ||
diff --git a/arch/arm/mach-s3c64xx/dev-spi.c b/arch/arm/mach-s3c64xx/dev-spi.c new file mode 100644 index 000000000000..29c32d088515 --- /dev/null +++ b/arch/arm/mach-s3c64xx/dev-spi.c | |||
@@ -0,0 +1,182 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/dev-spi.c | ||
2 | * | ||
3 | * Copyright (C) 2009 Samsung Electronics Ltd. | ||
4 | * Jaswinder Singh <jassi.brar@samsung.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/string.h> | ||
13 | #include <linux/platform_device.h> | ||
14 | #include <linux/dma-mapping.h> | ||
15 | |||
16 | #include <mach/dma.h> | ||
17 | #include <mach/map.h> | ||
18 | #include <mach/gpio.h> | ||
19 | #include <mach/gpio-bank-c.h> | ||
20 | #include <mach/spi-clocks.h> | ||
21 | |||
22 | #include <plat/s3c64xx-spi.h> | ||
23 | #include <plat/gpio-cfg.h> | ||
24 | #include <plat/irqs.h> | ||
25 | |||
26 | static char *spi_src_clks[] = { | ||
27 | [S3C64XX_SPI_SRCCLK_PCLK] = "pclk", | ||
28 | [S3C64XX_SPI_SRCCLK_SPIBUS] = "spi-bus", | ||
29 | [S3C64XX_SPI_SRCCLK_48M] = "spi_48m", | ||
30 | }; | ||
31 | |||
32 | /* SPI Controller platform_devices */ | ||
33 | |||
34 | /* Since we emulate multi-cs capability, we do not touch the GPC-3,7. | ||
35 | * The emulated CS is toggled by board specific mechanism, as it can | ||
36 | * be either some immediate GPIO or some signal out of some other | ||
37 | * chip in between ... or some yet another way. | ||
38 | * We simply do not assume anything about CS. | ||
39 | */ | ||
40 | static int s3c64xx_spi_cfg_gpio(struct platform_device *pdev) | ||
41 | { | ||
42 | switch (pdev->id) { | ||
43 | case 0: | ||
44 | s3c_gpio_cfgpin(S3C64XX_GPC(0), S3C64XX_GPC0_SPI_MISO0); | ||
45 | s3c_gpio_cfgpin(S3C64XX_GPC(1), S3C64XX_GPC1_SPI_CLKO); | ||
46 | s3c_gpio_cfgpin(S3C64XX_GPC(2), S3C64XX_GPC2_SPI_MOSIO); | ||
47 | s3c_gpio_setpull(S3C64XX_GPC(0), S3C_GPIO_PULL_UP); | ||
48 | s3c_gpio_setpull(S3C64XX_GPC(1), S3C_GPIO_PULL_UP); | ||
49 | s3c_gpio_setpull(S3C64XX_GPC(2), S3C_GPIO_PULL_UP); | ||
50 | break; | ||
51 | |||
52 | case 1: | ||
53 | s3c_gpio_cfgpin(S3C64XX_GPC(4), S3C64XX_GPC4_SPI_MISO1); | ||
54 | s3c_gpio_cfgpin(S3C64XX_GPC(5), S3C64XX_GPC5_SPI_CLK1); | ||
55 | s3c_gpio_cfgpin(S3C64XX_GPC(6), S3C64XX_GPC6_SPI_MOSI1); | ||
56 | s3c_gpio_setpull(S3C64XX_GPC(4), S3C_GPIO_PULL_UP); | ||
57 | s3c_gpio_setpull(S3C64XX_GPC(5), S3C_GPIO_PULL_UP); | ||
58 | s3c_gpio_setpull(S3C64XX_GPC(6), S3C_GPIO_PULL_UP); | ||
59 | break; | ||
60 | |||
61 | default: | ||
62 | dev_err(&pdev->dev, "Invalid SPI Controller number!"); | ||
63 | return -EINVAL; | ||
64 | } | ||
65 | |||
66 | return 0; | ||
67 | } | ||
68 | |||
69 | static struct resource s3c64xx_spi0_resource[] = { | ||
70 | [0] = { | ||
71 | .start = S3C64XX_PA_SPI0, | ||
72 | .end = S3C64XX_PA_SPI0 + 0x100 - 1, | ||
73 | .flags = IORESOURCE_MEM, | ||
74 | }, | ||
75 | [1] = { | ||
76 | .start = DMACH_SPI0_TX, | ||
77 | .end = DMACH_SPI0_TX, | ||
78 | .flags = IORESOURCE_DMA, | ||
79 | }, | ||
80 | [2] = { | ||
81 | .start = DMACH_SPI0_RX, | ||
82 | .end = DMACH_SPI0_RX, | ||
83 | .flags = IORESOURCE_DMA, | ||
84 | }, | ||
85 | [3] = { | ||
86 | .start = IRQ_SPI0, | ||
87 | .end = IRQ_SPI0, | ||
88 | .flags = IORESOURCE_IRQ, | ||
89 | }, | ||
90 | }; | ||
91 | |||
92 | static struct s3c64xx_spi_info s3c64xx_spi0_pdata = { | ||
93 | .cfg_gpio = s3c64xx_spi_cfg_gpio, | ||
94 | .fifo_lvl_mask = 0x7f, | ||
95 | .rx_lvl_offset = 13, | ||
96 | }; | ||
97 | |||
98 | static u64 spi_dmamask = DMA_BIT_MASK(32); | ||
99 | |||
100 | struct platform_device s3c64xx_device_spi0 = { | ||
101 | .name = "s3c64xx-spi", | ||
102 | .id = 0, | ||
103 | .num_resources = ARRAY_SIZE(s3c64xx_spi0_resource), | ||
104 | .resource = s3c64xx_spi0_resource, | ||
105 | .dev = { | ||
106 | .dma_mask = &spi_dmamask, | ||
107 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
108 | .platform_data = &s3c64xx_spi0_pdata, | ||
109 | }, | ||
110 | }; | ||
111 | EXPORT_SYMBOL(s3c64xx_device_spi0); | ||
112 | |||
113 | static struct resource s3c64xx_spi1_resource[] = { | ||
114 | [0] = { | ||
115 | .start = S3C64XX_PA_SPI1, | ||
116 | .end = S3C64XX_PA_SPI1 + 0x100 - 1, | ||
117 | .flags = IORESOURCE_MEM, | ||
118 | }, | ||
119 | [1] = { | ||
120 | .start = DMACH_SPI1_TX, | ||
121 | .end = DMACH_SPI1_TX, | ||
122 | .flags = IORESOURCE_DMA, | ||
123 | }, | ||
124 | [2] = { | ||
125 | .start = DMACH_SPI1_RX, | ||
126 | .end = DMACH_SPI1_RX, | ||
127 | .flags = IORESOURCE_DMA, | ||
128 | }, | ||
129 | [3] = { | ||
130 | .start = IRQ_SPI1, | ||
131 | .end = IRQ_SPI1, | ||
132 | .flags = IORESOURCE_IRQ, | ||
133 | }, | ||
134 | }; | ||
135 | |||
136 | static struct s3c64xx_spi_info s3c64xx_spi1_pdata = { | ||
137 | .cfg_gpio = s3c64xx_spi_cfg_gpio, | ||
138 | .fifo_lvl_mask = 0x7f, | ||
139 | .rx_lvl_offset = 13, | ||
140 | }; | ||
141 | |||
142 | struct platform_device s3c64xx_device_spi1 = { | ||
143 | .name = "s3c64xx-spi", | ||
144 | .id = 1, | ||
145 | .num_resources = ARRAY_SIZE(s3c64xx_spi1_resource), | ||
146 | .resource = s3c64xx_spi1_resource, | ||
147 | .dev = { | ||
148 | .dma_mask = &spi_dmamask, | ||
149 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
150 | .platform_data = &s3c64xx_spi1_pdata, | ||
151 | }, | ||
152 | }; | ||
153 | EXPORT_SYMBOL(s3c64xx_device_spi1); | ||
154 | |||
155 | void __init s3c64xx_spi_set_info(int cntrlr, int src_clk_nr, int num_cs) | ||
156 | { | ||
157 | struct s3c64xx_spi_info *pd; | ||
158 | |||
159 | /* Reject invalid configuration */ | ||
160 | if (!num_cs || src_clk_nr < 0 | ||
161 | || src_clk_nr > S3C64XX_SPI_SRCCLK_48M) { | ||
162 | printk(KERN_ERR "%s: Invalid SPI configuration\n", __func__); | ||
163 | return; | ||
164 | } | ||
165 | |||
166 | switch (cntrlr) { | ||
167 | case 0: | ||
168 | pd = &s3c64xx_spi0_pdata; | ||
169 | break; | ||
170 | case 1: | ||
171 | pd = &s3c64xx_spi1_pdata; | ||
172 | break; | ||
173 | default: | ||
174 | printk(KERN_ERR "%s: Invalid SPI controller(%d)\n", | ||
175 | __func__, cntrlr); | ||
176 | return; | ||
177 | } | ||
178 | |||
179 | pd->num_cs = num_cs; | ||
180 | pd->src_clk_nr = src_clk_nr; | ||
181 | pd->src_clk_name = spi_src_clks[src_clk_nr]; | ||
182 | } | ||
diff --git a/arch/arm/mach-s3c64xx/dev-uart.c b/arch/arm/mach-s3c64xx/dev-uart.c new file mode 100644 index 000000000000..f797f748b999 --- /dev/null +++ b/arch/arm/mach-s3c64xx/dev-uart.c | |||
@@ -0,0 +1,147 @@ | |||
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 | }; | ||
diff --git a/arch/arm/mach-s3c64xx/dma.c b/arch/arm/mach-s3c64xx/dma.c new file mode 100644 index 000000000000..b62bdf18dca4 --- /dev/null +++ b/arch/arm/mach-s3c64xx/dma.c | |||
@@ -0,0 +1,749 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/dma.c | ||
2 | * | ||
3 | * Copyright 2009 Openmoko, Inc. | ||
4 | * Copyright 2009 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * S3C64XX DMA core | ||
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/module.h> | ||
17 | #include <linux/interrupt.h> | ||
18 | #include <linux/dmapool.h> | ||
19 | #include <linux/sysdev.h> | ||
20 | #include <linux/errno.h> | ||
21 | #include <linux/delay.h> | ||
22 | #include <linux/clk.h> | ||
23 | #include <linux/err.h> | ||
24 | #include <linux/io.h> | ||
25 | |||
26 | #include <mach/dma.h> | ||
27 | #include <mach/map.h> | ||
28 | #include <mach/irqs.h> | ||
29 | |||
30 | #include <mach/regs-sys.h> | ||
31 | |||
32 | #include <asm/hardware/pl080.h> | ||
33 | |||
34 | /* dma channel state information */ | ||
35 | |||
36 | struct s3c64xx_dmac { | ||
37 | struct sys_device sysdev; | ||
38 | struct clk *clk; | ||
39 | void __iomem *regs; | ||
40 | struct s3c2410_dma_chan *channels; | ||
41 | enum dma_ch chanbase; | ||
42 | }; | ||
43 | |||
44 | /* pool to provide LLI buffers */ | ||
45 | static struct dma_pool *dma_pool; | ||
46 | |||
47 | /* Debug configuration and code */ | ||
48 | |||
49 | static unsigned char debug_show_buffs = 0; | ||
50 | |||
51 | static void dbg_showchan(struct s3c2410_dma_chan *chan) | ||
52 | { | ||
53 | pr_debug("DMA%d: %08x->%08x L %08x C %08x,%08x S %08x\n", | ||
54 | chan->number, | ||
55 | readl(chan->regs + PL080_CH_SRC_ADDR), | ||
56 | readl(chan->regs + PL080_CH_DST_ADDR), | ||
57 | readl(chan->regs + PL080_CH_LLI), | ||
58 | readl(chan->regs + PL080_CH_CONTROL), | ||
59 | readl(chan->regs + PL080S_CH_CONTROL2), | ||
60 | readl(chan->regs + PL080S_CH_CONFIG)); | ||
61 | } | ||
62 | |||
63 | static void show_lli(struct pl080s_lli *lli) | ||
64 | { | ||
65 | pr_debug("LLI[%p] %08x->%08x, NL %08x C %08x,%08x\n", | ||
66 | lli, lli->src_addr, lli->dst_addr, lli->next_lli, | ||
67 | lli->control0, lli->control1); | ||
68 | } | ||
69 | |||
70 | static void dbg_showbuffs(struct s3c2410_dma_chan *chan) | ||
71 | { | ||
72 | struct s3c64xx_dma_buff *ptr; | ||
73 | struct s3c64xx_dma_buff *end; | ||
74 | |||
75 | pr_debug("DMA%d: buffs next %p, curr %p, end %p\n", | ||
76 | chan->number, chan->next, chan->curr, chan->end); | ||
77 | |||
78 | ptr = chan->next; | ||
79 | end = chan->end; | ||
80 | |||
81 | if (debug_show_buffs) { | ||
82 | for (; ptr != NULL; ptr = ptr->next) { | ||
83 | pr_debug("DMA%d: %08x ", | ||
84 | chan->number, ptr->lli_dma); | ||
85 | show_lli(ptr->lli); | ||
86 | } | ||
87 | } | ||
88 | } | ||
89 | |||
90 | /* End of Debug */ | ||
91 | |||
92 | static struct s3c2410_dma_chan *s3c64xx_dma_map_channel(unsigned int channel) | ||
93 | { | ||
94 | struct s3c2410_dma_chan *chan; | ||
95 | unsigned int start, offs; | ||
96 | |||
97 | start = 0; | ||
98 | |||
99 | if (channel >= DMACH_PCM1_TX) | ||
100 | start = 8; | ||
101 | |||
102 | for (offs = 0; offs < 8; offs++) { | ||
103 | chan = &s3c2410_chans[start + offs]; | ||
104 | if (!chan->in_use) | ||
105 | goto found; | ||
106 | } | ||
107 | |||
108 | return NULL; | ||
109 | |||
110 | found: | ||
111 | s3c_dma_chan_map[channel] = chan; | ||
112 | return chan; | ||
113 | } | ||
114 | |||
115 | int s3c2410_dma_config(unsigned int channel, int xferunit) | ||
116 | { | ||
117 | struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); | ||
118 | |||
119 | if (chan == NULL) | ||
120 | return -EINVAL; | ||
121 | |||
122 | switch (xferunit) { | ||
123 | case 1: | ||
124 | chan->hw_width = 0; | ||
125 | break; | ||
126 | case 2: | ||
127 | chan->hw_width = 1; | ||
128 | break; | ||
129 | case 4: | ||
130 | chan->hw_width = 2; | ||
131 | break; | ||
132 | default: | ||
133 | printk(KERN_ERR "%s: illegal width %d\n", __func__, xferunit); | ||
134 | return -EINVAL; | ||
135 | } | ||
136 | |||
137 | return 0; | ||
138 | } | ||
139 | EXPORT_SYMBOL(s3c2410_dma_config); | ||
140 | |||
141 | static void s3c64xx_dma_fill_lli(struct s3c2410_dma_chan *chan, | ||
142 | struct pl080s_lli *lli, | ||
143 | dma_addr_t data, int size) | ||
144 | { | ||
145 | dma_addr_t src, dst; | ||
146 | u32 control0, control1; | ||
147 | |||
148 | switch (chan->source) { | ||
149 | case S3C2410_DMASRC_HW: | ||
150 | src = chan->dev_addr; | ||
151 | dst = data; | ||
152 | control0 = PL080_CONTROL_SRC_AHB2; | ||
153 | control0 |= PL080_CONTROL_DST_INCR; | ||
154 | break; | ||
155 | |||
156 | case S3C2410_DMASRC_MEM: | ||
157 | src = data; | ||
158 | dst = chan->dev_addr; | ||
159 | control0 = PL080_CONTROL_DST_AHB2; | ||
160 | control0 |= PL080_CONTROL_SRC_INCR; | ||
161 | break; | ||
162 | default: | ||
163 | BUG(); | ||
164 | } | ||
165 | |||
166 | /* note, we do not currently setup any of the burst controls */ | ||
167 | |||
168 | control1 = size >> chan->hw_width; /* size in no of xfers */ | ||
169 | control0 |= PL080_CONTROL_PROT_SYS; /* always in priv. mode */ | ||
170 | control0 |= PL080_CONTROL_TC_IRQ_EN; /* always fire IRQ */ | ||
171 | control0 |= (u32)chan->hw_width << PL080_CONTROL_DWIDTH_SHIFT; | ||
172 | control0 |= (u32)chan->hw_width << PL080_CONTROL_SWIDTH_SHIFT; | ||
173 | |||
174 | lli->src_addr = src; | ||
175 | lli->dst_addr = dst; | ||
176 | lli->next_lli = 0; | ||
177 | lli->control0 = control0; | ||
178 | lli->control1 = control1; | ||
179 | } | ||
180 | |||
181 | static void s3c64xx_lli_to_regs(struct s3c2410_dma_chan *chan, | ||
182 | struct pl080s_lli *lli) | ||
183 | { | ||
184 | void __iomem *regs = chan->regs; | ||
185 | |||
186 | pr_debug("%s: LLI %p => regs\n", __func__, lli); | ||
187 | show_lli(lli); | ||
188 | |||
189 | writel(lli->src_addr, regs + PL080_CH_SRC_ADDR); | ||
190 | writel(lli->dst_addr, regs + PL080_CH_DST_ADDR); | ||
191 | writel(lli->next_lli, regs + PL080_CH_LLI); | ||
192 | writel(lli->control0, regs + PL080_CH_CONTROL); | ||
193 | writel(lli->control1, regs + PL080S_CH_CONTROL2); | ||
194 | } | ||
195 | |||
196 | static int s3c64xx_dma_start(struct s3c2410_dma_chan *chan) | ||
197 | { | ||
198 | struct s3c64xx_dmac *dmac = chan->dmac; | ||
199 | u32 config; | ||
200 | u32 bit = chan->bit; | ||
201 | |||
202 | dbg_showchan(chan); | ||
203 | |||
204 | pr_debug("%s: clearing interrupts\n", __func__); | ||
205 | |||
206 | /* clear interrupts */ | ||
207 | writel(bit, dmac->regs + PL080_TC_CLEAR); | ||
208 | writel(bit, dmac->regs + PL080_ERR_CLEAR); | ||
209 | |||
210 | pr_debug("%s: starting channel\n", __func__); | ||
211 | |||
212 | config = readl(chan->regs + PL080S_CH_CONFIG); | ||
213 | config |= PL080_CONFIG_ENABLE; | ||
214 | |||
215 | pr_debug("%s: writing config %08x\n", __func__, config); | ||
216 | writel(config, chan->regs + PL080S_CH_CONFIG); | ||
217 | |||
218 | return 0; | ||
219 | } | ||
220 | |||
221 | static int s3c64xx_dma_stop(struct s3c2410_dma_chan *chan) | ||
222 | { | ||
223 | u32 config; | ||
224 | int timeout; | ||
225 | |||
226 | pr_debug("%s: stopping channel\n", __func__); | ||
227 | |||
228 | dbg_showchan(chan); | ||
229 | |||
230 | config = readl(chan->regs + PL080S_CH_CONFIG); | ||
231 | config |= PL080_CONFIG_HALT; | ||
232 | writel(config, chan->regs + PL080S_CH_CONFIG); | ||
233 | |||
234 | timeout = 1000; | ||
235 | do { | ||
236 | config = readl(chan->regs + PL080S_CH_CONFIG); | ||
237 | pr_debug("%s: %d - config %08x\n", __func__, timeout, config); | ||
238 | if (config & PL080_CONFIG_ACTIVE) | ||
239 | udelay(10); | ||
240 | else | ||
241 | break; | ||
242 | } while (--timeout > 0); | ||
243 | |||
244 | if (config & PL080_CONFIG_ACTIVE) { | ||
245 | printk(KERN_ERR "%s: channel still active\n", __func__); | ||
246 | return -EFAULT; | ||
247 | } | ||
248 | |||
249 | config = readl(chan->regs + PL080S_CH_CONFIG); | ||
250 | config &= ~PL080_CONFIG_ENABLE; | ||
251 | writel(config, chan->regs + PL080S_CH_CONFIG); | ||
252 | |||
253 | return 0; | ||
254 | } | ||
255 | |||
256 | static inline void s3c64xx_dma_bufffdone(struct s3c2410_dma_chan *chan, | ||
257 | struct s3c64xx_dma_buff *buf, | ||
258 | enum s3c2410_dma_buffresult result) | ||
259 | { | ||
260 | if (chan->callback_fn != NULL) | ||
261 | (chan->callback_fn)(chan, buf->pw, 0, result); | ||
262 | } | ||
263 | |||
264 | static void s3c64xx_dma_freebuff(struct s3c64xx_dma_buff *buff) | ||
265 | { | ||
266 | dma_pool_free(dma_pool, buff->lli, buff->lli_dma); | ||
267 | kfree(buff); | ||
268 | } | ||
269 | |||
270 | static int s3c64xx_dma_flush(struct s3c2410_dma_chan *chan) | ||
271 | { | ||
272 | struct s3c64xx_dma_buff *buff, *next; | ||
273 | u32 config; | ||
274 | |||
275 | dbg_showchan(chan); | ||
276 | |||
277 | pr_debug("%s: flushing channel\n", __func__); | ||
278 | |||
279 | config = readl(chan->regs + PL080S_CH_CONFIG); | ||
280 | config &= ~PL080_CONFIG_ENABLE; | ||
281 | writel(config, chan->regs + PL080S_CH_CONFIG); | ||
282 | |||
283 | /* dump all the buffers associated with this channel */ | ||
284 | |||
285 | for (buff = chan->curr; buff != NULL; buff = next) { | ||
286 | next = buff->next; | ||
287 | pr_debug("%s: buff %p (next %p)\n", __func__, buff, buff->next); | ||
288 | |||
289 | s3c64xx_dma_bufffdone(chan, buff, S3C2410_RES_ABORT); | ||
290 | s3c64xx_dma_freebuff(buff); | ||
291 | } | ||
292 | |||
293 | chan->curr = chan->next = chan->end = NULL; | ||
294 | |||
295 | return 0; | ||
296 | } | ||
297 | |||
298 | int s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op) | ||
299 | { | ||
300 | struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); | ||
301 | |||
302 | WARN_ON(!chan); | ||
303 | if (!chan) | ||
304 | return -EINVAL; | ||
305 | |||
306 | switch (op) { | ||
307 | case S3C2410_DMAOP_START: | ||
308 | return s3c64xx_dma_start(chan); | ||
309 | |||
310 | case S3C2410_DMAOP_STOP: | ||
311 | return s3c64xx_dma_stop(chan); | ||
312 | |||
313 | case S3C2410_DMAOP_FLUSH: | ||
314 | return s3c64xx_dma_flush(chan); | ||
315 | |||
316 | /* belive PAUSE/RESUME are no-ops */ | ||
317 | case S3C2410_DMAOP_PAUSE: | ||
318 | case S3C2410_DMAOP_RESUME: | ||
319 | case S3C2410_DMAOP_STARTED: | ||
320 | case S3C2410_DMAOP_TIMEOUT: | ||
321 | return 0; | ||
322 | } | ||
323 | |||
324 | return -ENOENT; | ||
325 | } | ||
326 | EXPORT_SYMBOL(s3c2410_dma_ctrl); | ||
327 | |||
328 | /* s3c2410_dma_enque | ||
329 | * | ||
330 | */ | ||
331 | |||
332 | int s3c2410_dma_enqueue(unsigned int channel, void *id, | ||
333 | dma_addr_t data, int size) | ||
334 | { | ||
335 | struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); | ||
336 | struct s3c64xx_dma_buff *next; | ||
337 | struct s3c64xx_dma_buff *buff; | ||
338 | struct pl080s_lli *lli; | ||
339 | unsigned long flags; | ||
340 | int ret; | ||
341 | |||
342 | WARN_ON(!chan); | ||
343 | if (!chan) | ||
344 | return -EINVAL; | ||
345 | |||
346 | buff = kzalloc(sizeof(struct s3c64xx_dma_buff), GFP_ATOMIC); | ||
347 | if (!buff) { | ||
348 | printk(KERN_ERR "%s: no memory for buffer\n", __func__); | ||
349 | return -ENOMEM; | ||
350 | } | ||
351 | |||
352 | lli = dma_pool_alloc(dma_pool, GFP_ATOMIC, &buff->lli_dma); | ||
353 | if (!lli) { | ||
354 | printk(KERN_ERR "%s: no memory for lli\n", __func__); | ||
355 | ret = -ENOMEM; | ||
356 | goto err_buff; | ||
357 | } | ||
358 | |||
359 | pr_debug("%s: buff %p, dp %08x lli (%p, %08x) %d\n", | ||
360 | __func__, buff, data, lli, (u32)buff->lli_dma, size); | ||
361 | |||
362 | buff->lli = lli; | ||
363 | buff->pw = id; | ||
364 | |||
365 | s3c64xx_dma_fill_lli(chan, lli, data, size); | ||
366 | |||
367 | local_irq_save(flags); | ||
368 | |||
369 | if ((next = chan->next) != NULL) { | ||
370 | struct s3c64xx_dma_buff *end = chan->end; | ||
371 | struct pl080s_lli *endlli = end->lli; | ||
372 | |||
373 | pr_debug("enquing onto channel\n"); | ||
374 | |||
375 | end->next = buff; | ||
376 | endlli->next_lli = buff->lli_dma; | ||
377 | |||
378 | if (chan->flags & S3C2410_DMAF_CIRCULAR) { | ||
379 | struct s3c64xx_dma_buff *curr = chan->curr; | ||
380 | lli->next_lli = curr->lli_dma; | ||
381 | } | ||
382 | |||
383 | if (next == chan->curr) { | ||
384 | writel(buff->lli_dma, chan->regs + PL080_CH_LLI); | ||
385 | chan->next = buff; | ||
386 | } | ||
387 | |||
388 | show_lli(endlli); | ||
389 | chan->end = buff; | ||
390 | } else { | ||
391 | pr_debug("enquing onto empty channel\n"); | ||
392 | |||
393 | chan->curr = buff; | ||
394 | chan->next = buff; | ||
395 | chan->end = buff; | ||
396 | |||
397 | s3c64xx_lli_to_regs(chan, lli); | ||
398 | } | ||
399 | |||
400 | local_irq_restore(flags); | ||
401 | |||
402 | show_lli(lli); | ||
403 | |||
404 | dbg_showchan(chan); | ||
405 | dbg_showbuffs(chan); | ||
406 | return 0; | ||
407 | |||
408 | err_buff: | ||
409 | kfree(buff); | ||
410 | return ret; | ||
411 | } | ||
412 | |||
413 | EXPORT_SYMBOL(s3c2410_dma_enqueue); | ||
414 | |||
415 | |||
416 | int s3c2410_dma_devconfig(int channel, | ||
417 | enum s3c2410_dmasrc source, | ||
418 | unsigned long devaddr) | ||
419 | { | ||
420 | struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); | ||
421 | u32 peripheral; | ||
422 | u32 config = 0; | ||
423 | |||
424 | pr_debug("%s: channel %d, source %d, dev %08lx, chan %p\n", | ||
425 | __func__, channel, source, devaddr, chan); | ||
426 | |||
427 | WARN_ON(!chan); | ||
428 | if (!chan) | ||
429 | return -EINVAL; | ||
430 | |||
431 | peripheral = (chan->peripheral & 0xf); | ||
432 | chan->source = source; | ||
433 | chan->dev_addr = devaddr; | ||
434 | |||
435 | pr_debug("%s: peripheral %d\n", __func__, peripheral); | ||
436 | |||
437 | switch (source) { | ||
438 | case S3C2410_DMASRC_HW: | ||
439 | config = 2 << PL080_CONFIG_FLOW_CONTROL_SHIFT; | ||
440 | config |= peripheral << PL080_CONFIG_SRC_SEL_SHIFT; | ||
441 | break; | ||
442 | case S3C2410_DMASRC_MEM: | ||
443 | config = 1 << PL080_CONFIG_FLOW_CONTROL_SHIFT; | ||
444 | config |= peripheral << PL080_CONFIG_DST_SEL_SHIFT; | ||
445 | break; | ||
446 | default: | ||
447 | printk(KERN_ERR "%s: bad source\n", __func__); | ||
448 | return -EINVAL; | ||
449 | } | ||
450 | |||
451 | /* allow TC and ERR interrupts */ | ||
452 | config |= PL080_CONFIG_TC_IRQ_MASK; | ||
453 | config |= PL080_CONFIG_ERR_IRQ_MASK; | ||
454 | |||
455 | pr_debug("%s: config %08x\n", __func__, config); | ||
456 | |||
457 | writel(config, chan->regs + PL080S_CH_CONFIG); | ||
458 | |||
459 | return 0; | ||
460 | } | ||
461 | EXPORT_SYMBOL(s3c2410_dma_devconfig); | ||
462 | |||
463 | |||
464 | int s3c2410_dma_getposition(unsigned int channel, | ||
465 | dma_addr_t *src, dma_addr_t *dst) | ||
466 | { | ||
467 | struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); | ||
468 | |||
469 | WARN_ON(!chan); | ||
470 | if (!chan) | ||
471 | return -EINVAL; | ||
472 | |||
473 | if (src != NULL) | ||
474 | *src = readl(chan->regs + PL080_CH_SRC_ADDR); | ||
475 | |||
476 | if (dst != NULL) | ||
477 | *dst = readl(chan->regs + PL080_CH_DST_ADDR); | ||
478 | |||
479 | return 0; | ||
480 | } | ||
481 | EXPORT_SYMBOL(s3c2410_dma_getposition); | ||
482 | |||
483 | /* s3c2410_request_dma | ||
484 | * | ||
485 | * get control of an dma channel | ||
486 | */ | ||
487 | |||
488 | int s3c2410_dma_request(unsigned int channel, | ||
489 | struct s3c2410_dma_client *client, | ||
490 | void *dev) | ||
491 | { | ||
492 | struct s3c2410_dma_chan *chan; | ||
493 | unsigned long flags; | ||
494 | |||
495 | pr_debug("dma%d: s3c2410_request_dma: client=%s, dev=%p\n", | ||
496 | channel, client->name, dev); | ||
497 | |||
498 | local_irq_save(flags); | ||
499 | |||
500 | chan = s3c64xx_dma_map_channel(channel); | ||
501 | if (chan == NULL) { | ||
502 | local_irq_restore(flags); | ||
503 | return -EBUSY; | ||
504 | } | ||
505 | |||
506 | dbg_showchan(chan); | ||
507 | |||
508 | chan->client = client; | ||
509 | chan->in_use = 1; | ||
510 | chan->peripheral = channel; | ||
511 | |||
512 | local_irq_restore(flags); | ||
513 | |||
514 | /* need to setup */ | ||
515 | |||
516 | pr_debug("%s: channel initialised, %p\n", __func__, chan); | ||
517 | |||
518 | return chan->number | DMACH_LOW_LEVEL; | ||
519 | } | ||
520 | |||
521 | EXPORT_SYMBOL(s3c2410_dma_request); | ||
522 | |||
523 | /* s3c2410_dma_free | ||
524 | * | ||
525 | * release the given channel back to the system, will stop and flush | ||
526 | * any outstanding transfers, and ensure the channel is ready for the | ||
527 | * next claimant. | ||
528 | * | ||
529 | * Note, although a warning is currently printed if the freeing client | ||
530 | * info is not the same as the registrant's client info, the free is still | ||
531 | * allowed to go through. | ||
532 | */ | ||
533 | |||
534 | int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *client) | ||
535 | { | ||
536 | struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); | ||
537 | unsigned long flags; | ||
538 | |||
539 | if (chan == NULL) | ||
540 | return -EINVAL; | ||
541 | |||
542 | local_irq_save(flags); | ||
543 | |||
544 | if (chan->client != client) { | ||
545 | printk(KERN_WARNING "dma%d: possible free from different client (channel %p, passed %p)\n", | ||
546 | channel, chan->client, client); | ||
547 | } | ||
548 | |||
549 | /* sort out stopping and freeing the channel */ | ||
550 | |||
551 | |||
552 | chan->client = NULL; | ||
553 | chan->in_use = 0; | ||
554 | |||
555 | if (!(channel & DMACH_LOW_LEVEL)) | ||
556 | s3c_dma_chan_map[channel] = NULL; | ||
557 | |||
558 | local_irq_restore(flags); | ||
559 | |||
560 | return 0; | ||
561 | } | ||
562 | |||
563 | EXPORT_SYMBOL(s3c2410_dma_free); | ||
564 | |||
565 | static irqreturn_t s3c64xx_dma_irq(int irq, void *pw) | ||
566 | { | ||
567 | struct s3c64xx_dmac *dmac = pw; | ||
568 | struct s3c2410_dma_chan *chan; | ||
569 | enum s3c2410_dma_buffresult res; | ||
570 | u32 tcstat, errstat; | ||
571 | u32 bit; | ||
572 | int offs; | ||
573 | |||
574 | tcstat = readl(dmac->regs + PL080_TC_STATUS); | ||
575 | errstat = readl(dmac->regs + PL080_ERR_STATUS); | ||
576 | |||
577 | for (offs = 0, bit = 1; offs < 8; offs++, bit <<= 1) { | ||
578 | struct s3c64xx_dma_buff *buff; | ||
579 | |||
580 | if (!(errstat & bit) && !(tcstat & bit)) | ||
581 | continue; | ||
582 | |||
583 | chan = dmac->channels + offs; | ||
584 | res = S3C2410_RES_ERR; | ||
585 | |||
586 | if (tcstat & bit) { | ||
587 | writel(bit, dmac->regs + PL080_TC_CLEAR); | ||
588 | res = S3C2410_RES_OK; | ||
589 | } | ||
590 | |||
591 | if (errstat & bit) | ||
592 | writel(bit, dmac->regs + PL080_ERR_CLEAR); | ||
593 | |||
594 | /* 'next' points to the buffer that is next to the | ||
595 | * currently active buffer. | ||
596 | * For CIRCULAR queues, 'next' will be same as 'curr' | ||
597 | * when 'end' is the active buffer. | ||
598 | */ | ||
599 | buff = chan->curr; | ||
600 | while (buff && buff != chan->next | ||
601 | && buff->next != chan->next) | ||
602 | buff = buff->next; | ||
603 | |||
604 | if (!buff) | ||
605 | BUG(); | ||
606 | |||
607 | if (buff == chan->next) | ||
608 | buff = chan->end; | ||
609 | |||
610 | s3c64xx_dma_bufffdone(chan, buff, res); | ||
611 | |||
612 | /* Free the node and update curr, if non-circular queue */ | ||
613 | if (!(chan->flags & S3C2410_DMAF_CIRCULAR)) { | ||
614 | chan->curr = buff->next; | ||
615 | s3c64xx_dma_freebuff(buff); | ||
616 | } | ||
617 | |||
618 | /* Update 'next' */ | ||
619 | buff = chan->next; | ||
620 | if (chan->next == chan->end) { | ||
621 | chan->next = chan->curr; | ||
622 | if (!(chan->flags & S3C2410_DMAF_CIRCULAR)) | ||
623 | chan->end = NULL; | ||
624 | } else { | ||
625 | chan->next = buff->next; | ||
626 | } | ||
627 | } | ||
628 | |||
629 | return IRQ_HANDLED; | ||
630 | } | ||
631 | |||
632 | static struct sysdev_class dma_sysclass = { | ||
633 | .name = "s3c64xx-dma", | ||
634 | }; | ||
635 | |||
636 | static int s3c64xx_dma_init1(int chno, enum dma_ch chbase, | ||
637 | int irq, unsigned int base) | ||
638 | { | ||
639 | struct s3c2410_dma_chan *chptr = &s3c2410_chans[chno]; | ||
640 | struct s3c64xx_dmac *dmac; | ||
641 | char clkname[16]; | ||
642 | void __iomem *regs; | ||
643 | void __iomem *regptr; | ||
644 | int err, ch; | ||
645 | |||
646 | dmac = kzalloc(sizeof(struct s3c64xx_dmac), GFP_KERNEL); | ||
647 | if (!dmac) { | ||
648 | printk(KERN_ERR "%s: failed to alloc mem\n", __func__); | ||
649 | return -ENOMEM; | ||
650 | } | ||
651 | |||
652 | dmac->sysdev.id = chno / 8; | ||
653 | dmac->sysdev.cls = &dma_sysclass; | ||
654 | |||
655 | err = sysdev_register(&dmac->sysdev); | ||
656 | if (err) { | ||
657 | printk(KERN_ERR "%s: failed to register sysdevice\n", __func__); | ||
658 | goto err_alloc; | ||
659 | } | ||
660 | |||
661 | regs = ioremap(base, 0x200); | ||
662 | if (!regs) { | ||
663 | printk(KERN_ERR "%s: failed to ioremap()\n", __func__); | ||
664 | err = -ENXIO; | ||
665 | goto err_dev; | ||
666 | } | ||
667 | |||
668 | snprintf(clkname, sizeof(clkname), "dma%d", dmac->sysdev.id); | ||
669 | |||
670 | dmac->clk = clk_get(NULL, clkname); | ||
671 | if (IS_ERR(dmac->clk)) { | ||
672 | printk(KERN_ERR "%s: failed to get clock %s\n", __func__, clkname); | ||
673 | err = PTR_ERR(dmac->clk); | ||
674 | goto err_map; | ||
675 | } | ||
676 | |||
677 | clk_enable(dmac->clk); | ||
678 | |||
679 | dmac->regs = regs; | ||
680 | dmac->chanbase = chbase; | ||
681 | dmac->channels = chptr; | ||
682 | |||
683 | err = request_irq(irq, s3c64xx_dma_irq, 0, "DMA", dmac); | ||
684 | if (err < 0) { | ||
685 | printk(KERN_ERR "%s: failed to get irq\n", __func__); | ||
686 | goto err_clk; | ||
687 | } | ||
688 | |||
689 | regptr = regs + PL080_Cx_BASE(0); | ||
690 | |||
691 | for (ch = 0; ch < 8; ch++, chno++, chptr++) { | ||
692 | printk(KERN_INFO "%s: registering DMA %d (%p)\n", | ||
693 | __func__, chno, regptr); | ||
694 | |||
695 | chptr->bit = 1 << ch; | ||
696 | chptr->number = chno; | ||
697 | chptr->dmac = dmac; | ||
698 | chptr->regs = regptr; | ||
699 | regptr += PL008_Cx_STRIDE; | ||
700 | } | ||
701 | |||
702 | /* for the moment, permanently enable the controller */ | ||
703 | writel(PL080_CONFIG_ENABLE, regs + PL080_CONFIG); | ||
704 | |||
705 | printk(KERN_INFO "PL080: IRQ %d, at %p\n", irq, regs); | ||
706 | |||
707 | return 0; | ||
708 | |||
709 | err_clk: | ||
710 | clk_disable(dmac->clk); | ||
711 | clk_put(dmac->clk); | ||
712 | err_map: | ||
713 | iounmap(regs); | ||
714 | err_dev: | ||
715 | sysdev_unregister(&dmac->sysdev); | ||
716 | err_alloc: | ||
717 | kfree(dmac); | ||
718 | return err; | ||
719 | } | ||
720 | |||
721 | static int __init s3c64xx_dma_init(void) | ||
722 | { | ||
723 | int ret; | ||
724 | |||
725 | printk(KERN_INFO "%s: Registering DMA channels\n", __func__); | ||
726 | |||
727 | dma_pool = dma_pool_create("DMA-LLI", NULL, sizeof(struct pl080s_lli), 16, 0); | ||
728 | if (!dma_pool) { | ||
729 | printk(KERN_ERR "%s: failed to create pool\n", __func__); | ||
730 | return -ENOMEM; | ||
731 | } | ||
732 | |||
733 | ret = sysdev_class_register(&dma_sysclass); | ||
734 | if (ret) { | ||
735 | printk(KERN_ERR "%s: failed to create sysclass\n", __func__); | ||
736 | return -ENOMEM; | ||
737 | } | ||
738 | |||
739 | /* Set all DMA configuration to be DMA, not SDMA */ | ||
740 | writel(0xffffff, S3C_SYSREG(0x110)); | ||
741 | |||
742 | /* Register standard DMA controlers */ | ||
743 | s3c64xx_dma_init1(0, DMACH_UART0, IRQ_DMA0, 0x75000000); | ||
744 | s3c64xx_dma_init1(8, DMACH_PCM1_TX, IRQ_DMA1, 0x75100000); | ||
745 | |||
746 | return 0; | ||
747 | } | ||
748 | |||
749 | arch_initcall(s3c64xx_dma_init); | ||
diff --git a/arch/arm/mach-s3c64xx/gpiolib.c b/arch/arm/mach-s3c64xx/gpiolib.c new file mode 100644 index 000000000000..66e6794481d2 --- /dev/null +++ b/arch/arm/mach-s3c64xx/gpiolib.c | |||
@@ -0,0 +1,288 @@ | |||
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 | |||
22 | #include <plat/gpio-core.h> | ||
23 | #include <plat/gpio-cfg.h> | ||
24 | #include <plat/gpio-cfg-helpers.h> | ||
25 | #include <mach/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 | static struct s3c_gpio_cfg gpio_4bit_cfg_noint = { | ||
53 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | ||
54 | .set_pull = s3c_gpio_setpull_updown, | ||
55 | .get_pull = s3c_gpio_getpull_updown, | ||
56 | }; | ||
57 | |||
58 | static struct s3c_gpio_cfg gpio_4bit_cfg_eint0111 = { | ||
59 | .cfg_eint = 7, | ||
60 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | ||
61 | .set_pull = s3c_gpio_setpull_updown, | ||
62 | .get_pull = s3c_gpio_getpull_updown, | ||
63 | }; | ||
64 | |||
65 | static struct s3c_gpio_cfg gpio_4bit_cfg_eint0011 = { | ||
66 | .cfg_eint = 3, | ||
67 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | ||
68 | .set_pull = s3c_gpio_setpull_updown, | ||
69 | .get_pull = s3c_gpio_getpull_updown, | ||
70 | }; | ||
71 | |||
72 | int s3c64xx_gpio2int_gpm(struct gpio_chip *chip, unsigned pin) | ||
73 | { | ||
74 | return pin < 5 ? IRQ_EINT(23) + pin : -ENXIO; | ||
75 | } | ||
76 | |||
77 | static struct s3c_gpio_chip gpio_4bit[] = { | ||
78 | { | ||
79 | .base = S3C64XX_GPA_BASE, | ||
80 | .config = &gpio_4bit_cfg_eint0111, | ||
81 | .chip = { | ||
82 | .base = S3C64XX_GPA(0), | ||
83 | .ngpio = S3C64XX_GPIO_A_NR, | ||
84 | .label = "GPA", | ||
85 | }, | ||
86 | }, { | ||
87 | .base = S3C64XX_GPB_BASE, | ||
88 | .config = &gpio_4bit_cfg_eint0111, | ||
89 | .chip = { | ||
90 | .base = S3C64XX_GPB(0), | ||
91 | .ngpio = S3C64XX_GPIO_B_NR, | ||
92 | .label = "GPB", | ||
93 | }, | ||
94 | }, { | ||
95 | .base = S3C64XX_GPC_BASE, | ||
96 | .config = &gpio_4bit_cfg_eint0111, | ||
97 | .chip = { | ||
98 | .base = S3C64XX_GPC(0), | ||
99 | .ngpio = S3C64XX_GPIO_C_NR, | ||
100 | .label = "GPC", | ||
101 | }, | ||
102 | }, { | ||
103 | .base = S3C64XX_GPD_BASE, | ||
104 | .config = &gpio_4bit_cfg_eint0111, | ||
105 | .chip = { | ||
106 | .base = S3C64XX_GPD(0), | ||
107 | .ngpio = S3C64XX_GPIO_D_NR, | ||
108 | .label = "GPD", | ||
109 | }, | ||
110 | }, { | ||
111 | .base = S3C64XX_GPE_BASE, | ||
112 | .config = &gpio_4bit_cfg_noint, | ||
113 | .chip = { | ||
114 | .base = S3C64XX_GPE(0), | ||
115 | .ngpio = S3C64XX_GPIO_E_NR, | ||
116 | .label = "GPE", | ||
117 | }, | ||
118 | }, { | ||
119 | .base = S3C64XX_GPG_BASE, | ||
120 | .config = &gpio_4bit_cfg_eint0111, | ||
121 | .chip = { | ||
122 | .base = S3C64XX_GPG(0), | ||
123 | .ngpio = S3C64XX_GPIO_G_NR, | ||
124 | .label = "GPG", | ||
125 | }, | ||
126 | }, { | ||
127 | .base = S3C64XX_GPM_BASE, | ||
128 | .config = &gpio_4bit_cfg_eint0011, | ||
129 | .chip = { | ||
130 | .base = S3C64XX_GPM(0), | ||
131 | .ngpio = S3C64XX_GPIO_M_NR, | ||
132 | .label = "GPM", | ||
133 | .to_irq = s3c64xx_gpio2int_gpm, | ||
134 | }, | ||
135 | }, | ||
136 | }; | ||
137 | |||
138 | int s3c64xx_gpio2int_gpl(struct gpio_chip *chip, unsigned pin) | ||
139 | { | ||
140 | return pin >= 8 ? IRQ_EINT(16) + pin - 8 : -ENXIO; | ||
141 | } | ||
142 | |||
143 | static struct s3c_gpio_chip gpio_4bit2[] = { | ||
144 | { | ||
145 | .base = S3C64XX_GPH_BASE + 0x4, | ||
146 | .config = &gpio_4bit_cfg_eint0111, | ||
147 | .chip = { | ||
148 | .base = S3C64XX_GPH(0), | ||
149 | .ngpio = S3C64XX_GPIO_H_NR, | ||
150 | .label = "GPH", | ||
151 | }, | ||
152 | }, { | ||
153 | .base = S3C64XX_GPK_BASE + 0x4, | ||
154 | .config = &gpio_4bit_cfg_noint, | ||
155 | .chip = { | ||
156 | .base = S3C64XX_GPK(0), | ||
157 | .ngpio = S3C64XX_GPIO_K_NR, | ||
158 | .label = "GPK", | ||
159 | }, | ||
160 | }, { | ||
161 | .base = S3C64XX_GPL_BASE + 0x4, | ||
162 | .config = &gpio_4bit_cfg_eint0011, | ||
163 | .chip = { | ||
164 | .base = S3C64XX_GPL(0), | ||
165 | .ngpio = S3C64XX_GPIO_L_NR, | ||
166 | .label = "GPL", | ||
167 | .to_irq = s3c64xx_gpio2int_gpl, | ||
168 | }, | ||
169 | }, | ||
170 | }; | ||
171 | |||
172 | static struct s3c_gpio_cfg gpio_2bit_cfg_noint = { | ||
173 | .set_config = s3c_gpio_setcfg_s3c24xx, | ||
174 | .set_pull = s3c_gpio_setpull_updown, | ||
175 | .get_pull = s3c_gpio_getpull_updown, | ||
176 | }; | ||
177 | |||
178 | static struct s3c_gpio_cfg gpio_2bit_cfg_eint10 = { | ||
179 | .cfg_eint = 2, | ||
180 | .set_config = s3c_gpio_setcfg_s3c24xx, | ||
181 | .set_pull = s3c_gpio_setpull_updown, | ||
182 | .get_pull = s3c_gpio_getpull_updown, | ||
183 | }; | ||
184 | |||
185 | static struct s3c_gpio_cfg gpio_2bit_cfg_eint11 = { | ||
186 | .cfg_eint = 3, | ||
187 | .set_config = s3c_gpio_setcfg_s3c24xx, | ||
188 | .set_pull = s3c_gpio_setpull_updown, | ||
189 | .get_pull = s3c_gpio_getpull_updown, | ||
190 | }; | ||
191 | |||
192 | int s3c64xx_gpio2int_gpn(struct gpio_chip *chip, unsigned pin) | ||
193 | { | ||
194 | return IRQ_EINT(0) + pin; | ||
195 | } | ||
196 | |||
197 | static struct s3c_gpio_chip gpio_2bit[] = { | ||
198 | { | ||
199 | .base = S3C64XX_GPF_BASE, | ||
200 | .config = &gpio_2bit_cfg_eint11, | ||
201 | .chip = { | ||
202 | .base = S3C64XX_GPF(0), | ||
203 | .ngpio = S3C64XX_GPIO_F_NR, | ||
204 | .label = "GPF", | ||
205 | }, | ||
206 | }, { | ||
207 | .base = S3C64XX_GPI_BASE, | ||
208 | .config = &gpio_2bit_cfg_noint, | ||
209 | .chip = { | ||
210 | .base = S3C64XX_GPI(0), | ||
211 | .ngpio = S3C64XX_GPIO_I_NR, | ||
212 | .label = "GPI", | ||
213 | }, | ||
214 | }, { | ||
215 | .base = S3C64XX_GPJ_BASE, | ||
216 | .config = &gpio_2bit_cfg_noint, | ||
217 | .chip = { | ||
218 | .base = S3C64XX_GPJ(0), | ||
219 | .ngpio = S3C64XX_GPIO_J_NR, | ||
220 | .label = "GPJ", | ||
221 | }, | ||
222 | }, { | ||
223 | .base = S3C64XX_GPN_BASE, | ||
224 | .config = &gpio_2bit_cfg_eint10, | ||
225 | .chip = { | ||
226 | .base = S3C64XX_GPN(0), | ||
227 | .ngpio = S3C64XX_GPIO_N_NR, | ||
228 | .label = "GPN", | ||
229 | .to_irq = s3c64xx_gpio2int_gpn, | ||
230 | }, | ||
231 | }, { | ||
232 | .base = S3C64XX_GPO_BASE, | ||
233 | .config = &gpio_2bit_cfg_eint11, | ||
234 | .chip = { | ||
235 | .base = S3C64XX_GPO(0), | ||
236 | .ngpio = S3C64XX_GPIO_O_NR, | ||
237 | .label = "GPO", | ||
238 | }, | ||
239 | }, { | ||
240 | .base = S3C64XX_GPP_BASE, | ||
241 | .config = &gpio_2bit_cfg_eint11, | ||
242 | .chip = { | ||
243 | .base = S3C64XX_GPP(0), | ||
244 | .ngpio = S3C64XX_GPIO_P_NR, | ||
245 | .label = "GPP", | ||
246 | }, | ||
247 | }, { | ||
248 | .base = S3C64XX_GPQ_BASE, | ||
249 | .config = &gpio_2bit_cfg_eint11, | ||
250 | .chip = { | ||
251 | .base = S3C64XX_GPQ(0), | ||
252 | .ngpio = S3C64XX_GPIO_Q_NR, | ||
253 | .label = "GPQ", | ||
254 | }, | ||
255 | }, | ||
256 | }; | ||
257 | |||
258 | static __init void s3c64xx_gpiolib_add_2bit(struct s3c_gpio_chip *chip) | ||
259 | { | ||
260 | chip->pm = __gpio_pm(&s3c_gpio_pm_2bit); | ||
261 | } | ||
262 | |||
263 | static __init void s3c64xx_gpiolib_add(struct s3c_gpio_chip *chips, | ||
264 | int nr_chips, | ||
265 | void (*fn)(struct s3c_gpio_chip *)) | ||
266 | { | ||
267 | for (; nr_chips > 0; nr_chips--, chips++) { | ||
268 | if (fn) | ||
269 | (fn)(chips); | ||
270 | s3c_gpiolib_add(chips); | ||
271 | } | ||
272 | } | ||
273 | |||
274 | static __init int s3c64xx_gpiolib_init(void) | ||
275 | { | ||
276 | s3c64xx_gpiolib_add(gpio_4bit, ARRAY_SIZE(gpio_4bit), | ||
277 | samsung_gpiolib_add_4bit); | ||
278 | |||
279 | s3c64xx_gpiolib_add(gpio_4bit2, ARRAY_SIZE(gpio_4bit2), | ||
280 | samsung_gpiolib_add_4bit2); | ||
281 | |||
282 | s3c64xx_gpiolib_add(gpio_2bit, ARRAY_SIZE(gpio_2bit), | ||
283 | s3c64xx_gpiolib_add_2bit); | ||
284 | |||
285 | return 0; | ||
286 | } | ||
287 | |||
288 | core_initcall(s3c64xx_gpiolib_init); | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/debug-macro.S b/arch/arm/mach-s3c64xx/include/mach/debug-macro.S new file mode 100644 index 000000000000..b18ac5266dfc --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/debug-macro.S | |||
@@ -0,0 +1,39 @@ | |||
1 | /* arch/arm/mach-s3c6400/include/mach/debug-macro.S | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * http://armlinux.simtec.co.uk/ | ||
6 | * Ben Dooks <ben@simtec.co.uk> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | /* pull in the relevant register and map files. */ | ||
14 | |||
15 | #include <mach/map.h> | ||
16 | #include <plat/regs-serial.h> | ||
17 | |||
18 | /* note, for the boot process to work we have to keep the UART | ||
19 | * virtual address aligned to an 1MiB boundary for the L1 | ||
20 | * mapping the head code makes. We keep the UART virtual address | ||
21 | * aligned and add in the offset when we load the value here. | ||
22 | */ | ||
23 | |||
24 | .macro addruart, rx | ||
25 | mrc p15, 0, \rx, c1, c0 | ||
26 | tst \rx, #1 | ||
27 | ldreq \rx, = S3C_PA_UART | ||
28 | ldrne \rx, = (S3C_VA_UART + S3C_PA_UART & 0xfffff) | ||
29 | #if CONFIG_DEBUG_S3C_UART != 0 | ||
30 | add \rx, \rx, #(0x400 * CONFIG_DEBUG_S3C_UART) | ||
31 | #endif | ||
32 | .endm | ||
33 | |||
34 | /* include the reset of the code which will do the work, we're only | ||
35 | * compiling for a single cpu processor type so the default of s3c2440 | ||
36 | * will be fine with us. | ||
37 | */ | ||
38 | |||
39 | #include <plat/debug-macro.S> | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/dma.h b/arch/arm/mach-s3c64xx/include/mach/dma.h new file mode 100644 index 000000000000..0a5d9268a23e --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/dma.h | |||
@@ -0,0 +1,127 @@ | |||
1 | /* linux/arch/arm/mach-s3c6400/include/mach/dma.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 | * S3C6400 - DMA support | ||
9 | */ | ||
10 | |||
11 | #ifndef __ASM_ARCH_DMA_H | ||
12 | #define __ASM_ARCH_DMA_H __FILE__ | ||
13 | |||
14 | #define S3C_DMA_CHANNELS (16) | ||
15 | |||
16 | /* see mach-s3c2410/dma.h for notes on dma channel numbers */ | ||
17 | |||
18 | /* Note, for the S3C64XX architecture we keep the DMACH_ | ||
19 | * defines in the order they are allocated to [S]DMA0/[S]DMA1 | ||
20 | * so that is easy to do DHACH_ -> DMA controller conversion | ||
21 | */ | ||
22 | enum dma_ch { | ||
23 | /* DMA0/SDMA0 */ | ||
24 | DMACH_UART0 = 0, | ||
25 | DMACH_UART0_SRC2, | ||
26 | DMACH_UART1, | ||
27 | DMACH_UART1_SRC2, | ||
28 | DMACH_UART2, | ||
29 | DMACH_UART2_SRC2, | ||
30 | DMACH_UART3, | ||
31 | DMACH_UART3_SRC2, | ||
32 | DMACH_PCM0_TX, | ||
33 | DMACH_PCM0_RX, | ||
34 | DMACH_I2S0_OUT, | ||
35 | DMACH_I2S0_IN, | ||
36 | DMACH_SPI0_TX, | ||
37 | DMACH_SPI0_RX, | ||
38 | DMACH_HSI_I2SV40_TX, | ||
39 | DMACH_HSI_I2SV40_RX, | ||
40 | |||
41 | /* DMA1/SDMA1 */ | ||
42 | DMACH_PCM1_TX = 16, | ||
43 | DMACH_PCM1_RX, | ||
44 | DMACH_I2S1_OUT, | ||
45 | DMACH_I2S1_IN, | ||
46 | DMACH_SPI1_TX, | ||
47 | DMACH_SPI1_RX, | ||
48 | DMACH_AC97_PCMOUT, | ||
49 | DMACH_AC97_PCMIN, | ||
50 | DMACH_AC97_MICIN, | ||
51 | DMACH_PWM, | ||
52 | DMACH_IRDA, | ||
53 | DMACH_EXTERNAL, | ||
54 | DMACH_RES1, | ||
55 | DMACH_RES2, | ||
56 | DMACH_SECURITY_RX, /* SDMA1 only */ | ||
57 | DMACH_SECURITY_TX, /* SDMA1 only */ | ||
58 | DMACH_MAX /* the end */ | ||
59 | }; | ||
60 | |||
61 | static __inline__ bool s3c_dma_has_circular(void) | ||
62 | { | ||
63 | return true; | ||
64 | } | ||
65 | |||
66 | #define S3C2410_DMAF_CIRCULAR (1 << 0) | ||
67 | |||
68 | #include <plat/dma.h> | ||
69 | |||
70 | #define DMACH_LOW_LEVEL (1<<28) /* use this to specifiy hardware ch no */ | ||
71 | |||
72 | struct s3c64xx_dma_buff; | ||
73 | |||
74 | /** s3c64xx_dma_buff - S3C64XX DMA buffer descriptor | ||
75 | * @next: Pointer to next buffer in queue or ring. | ||
76 | * @pw: Client provided identifier | ||
77 | * @lli: Pointer to hardware descriptor this buffer is associated with. | ||
78 | * @lli_dma: Hardare address of the descriptor. | ||
79 | */ | ||
80 | struct s3c64xx_dma_buff { | ||
81 | struct s3c64xx_dma_buff *next; | ||
82 | |||
83 | void *pw; | ||
84 | struct pl080s_lli *lli; | ||
85 | dma_addr_t lli_dma; | ||
86 | }; | ||
87 | |||
88 | struct s3c64xx_dmac; | ||
89 | |||
90 | struct s3c2410_dma_chan { | ||
91 | unsigned char number; /* number of this dma channel */ | ||
92 | unsigned char in_use; /* channel allocated */ | ||
93 | unsigned char bit; /* bit for enable/disable/etc */ | ||
94 | unsigned char hw_width; | ||
95 | unsigned char peripheral; | ||
96 | |||
97 | unsigned int flags; | ||
98 | enum s3c2410_dmasrc source; | ||
99 | |||
100 | |||
101 | dma_addr_t dev_addr; | ||
102 | |||
103 | struct s3c2410_dma_client *client; | ||
104 | struct s3c64xx_dmac *dmac; /* pointer to controller */ | ||
105 | |||
106 | void __iomem *regs; | ||
107 | |||
108 | /* cdriver callbacks */ | ||
109 | s3c2410_dma_cbfn_t callback_fn; /* buffer done callback */ | ||
110 | s3c2410_dma_opfn_t op_fn; /* channel op callback */ | ||
111 | |||
112 | /* buffer list and information */ | ||
113 | struct s3c64xx_dma_buff *curr; /* current dma buffer */ | ||
114 | struct s3c64xx_dma_buff *next; /* next buffer to load */ | ||
115 | struct s3c64xx_dma_buff *end; /* end of queue */ | ||
116 | |||
117 | /* note, when channel is running in circular mode, curr is the | ||
118 | * first buffer enqueued, end is the last and curr is where the | ||
119 | * last buffer-done event is set-at. The buffers are not freed | ||
120 | * and the last buffer hardware descriptor points back to the | ||
121 | * first. | ||
122 | */ | ||
123 | }; | ||
124 | |||
125 | #include <plat/dma-core.h> | ||
126 | |||
127 | #endif /* __ASM_ARCH_IRQ_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/entry-macro.S b/arch/arm/mach-s3c64xx/include/mach/entry-macro.S new file mode 100644 index 000000000000..dd362604dcce --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/entry-macro.S | |||
@@ -0,0 +1,18 @@ | |||
1 | /* arch/arm/mach-s3c6400/include/mach/entry-macro.S | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * http://armlinux.simtec.co.uk/ | ||
6 | * Ben Dooks <ben@simtec.co.uk> | ||
7 | * | ||
8 | * Low-level IRQ helper macros for the Samsung S3C64XX series | ||
9 | * | ||
10 | * This file is licensed under the terms of the GNU General Public | ||
11 | * License version 2. This program is licensed "as is" without any | ||
12 | * warranty of any kind, whether express or implied. | ||
13 | */ | ||
14 | |||
15 | #include <mach/map.h> | ||
16 | #include <mach/irqs.h> | ||
17 | |||
18 | #include <asm/entry-macro-vic2.S> | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-a.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-a.h new file mode 100644 index 000000000000..34212e1a7e81 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-a.h | |||
@@ -0,0 +1,48 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/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/mach-s3c64xx/include/mach/gpio-bank-b.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-b.h new file mode 100644 index 000000000000..7232c037e642 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-b.h | |||
@@ -0,0 +1,60 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/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/mach-s3c64xx/include/mach/gpio-bank-c.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-c.h new file mode 100644 index 000000000000..db189ab1639a --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-c.h | |||
@@ -0,0 +1,53 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/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_I2S_V40_DO0 (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_I2S_V40_DO1 (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_I2S_V40_DO2 (0x05 << 28) | ||
52 | #define S3C64XX_GPC7_EINT_G2_7 (0x07 << 28) | ||
53 | |||
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-d.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-d.h new file mode 100644 index 000000000000..1a01cee7aca3 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-d.h | |||
@@ -0,0 +1,49 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/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/mach-s3c64xx/include/mach/gpio-bank-e.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-e.h new file mode 100644 index 000000000000..f057adb627dd --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-e.h | |||
@@ -0,0 +1,44 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/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/mach-s3c64xx/include/mach/gpio-bank-f.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-f.h new file mode 100644 index 000000000000..62ab8f5e7835 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-f.h | |||
@@ -0,0 +1,71 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/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/mach-s3c64xx/include/mach/gpio-bank-g.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-g.h new file mode 100644 index 000000000000..b94954af1598 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-g.h | |||
@@ -0,0 +1,42 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/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/mach-s3c64xx/include/mach/gpio-bank-h.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-h.h new file mode 100644 index 000000000000..5d75aaad865e --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-h.h | |||
@@ -0,0 +1,74 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/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 << 0) | ||
65 | #define S3C64XX_GPH8_MMC2_DATA2 (0x03 << 0) | ||
66 | #define S3C64XX_GPH8_I2S_V40_LRCLK (0x05 << 0) | ||
67 | #define S3C64XX_GPH8_ADDR_CF2 (0x06 << 0) | ||
68 | #define S3C64XX_GPH8_EINT_G6_8 (0x07 << 0) | ||
69 | |||
70 | #define S3C64XX_GPH9_OUTPUT (0x01 << 4) | ||
71 | #define S3C64XX_GPH9_MMC1_DATA7 (0x02 << 4) | ||
72 | #define S3C64XX_GPH9_MMC2_DATA3 (0x03 << 4) | ||
73 | #define S3C64XX_GPH9_I2S_V40_DI (0x05 << 4) | ||
74 | #define S3C64XX_GPH9_EINT_G6_9 (0x07 << 4) | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-i.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-i.h new file mode 100644 index 000000000000..4ceaa6098bc7 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-i.h | |||
@@ -0,0 +1,40 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/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/mach-s3c64xx/include/mach/gpio-bank-j.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-j.h new file mode 100644 index 000000000000..6f25cd079a40 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-j.h | |||
@@ -0,0 +1,36 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/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/mach-s3c64xx/include/mach/gpio-bank-n.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-n.h new file mode 100644 index 000000000000..d0aeda1cd9de --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-n.h | |||
@@ -0,0 +1,54 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/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/mach-s3c64xx/include/mach/gpio-bank-o.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-o.h new file mode 100644 index 000000000000..21868fa102d0 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-o.h | |||
@@ -0,0 +1,70 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/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/mach-s3c64xx/include/mach/gpio-bank-p.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-p.h new file mode 100644 index 000000000000..46bcfb63b8de --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-p.h | |||
@@ -0,0 +1,69 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/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/mach-s3c64xx/include/mach/gpio-bank-q.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-q.h new file mode 100644 index 000000000000..1712223487b0 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-q.h | |||
@@ -0,0 +1,46 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/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/mach-s3c64xx/include/mach/gpio.h b/arch/arm/mach-s3c64xx/include/mach/gpio.h new file mode 100644 index 000000000000..e8e35e8fe731 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/gpio.h | |||
@@ -0,0 +1,96 @@ | |||
1 | /* arch/arm/mach-s3c6400/include/mach/gpio.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * http://armlinux.simtec.co.uk/ | ||
6 | * Ben Dooks <ben@simtec.co.uk> | ||
7 | * | ||
8 | * S3C6400 - GPIO lib 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 | #define gpio_get_value __gpio_get_value | ||
16 | #define gpio_set_value __gpio_set_value | ||
17 | #define gpio_cansleep __gpio_cansleep | ||
18 | #define gpio_to_irq __gpio_to_irq | ||
19 | |||
20 | /* GPIO bank sizes */ | ||
21 | #define S3C64XX_GPIO_A_NR (8) | ||
22 | #define S3C64XX_GPIO_B_NR (7) | ||
23 | #define S3C64XX_GPIO_C_NR (8) | ||
24 | #define S3C64XX_GPIO_D_NR (5) | ||
25 | #define S3C64XX_GPIO_E_NR (5) | ||
26 | #define S3C64XX_GPIO_F_NR (16) | ||
27 | #define S3C64XX_GPIO_G_NR (7) | ||
28 | #define S3C64XX_GPIO_H_NR (10) | ||
29 | #define S3C64XX_GPIO_I_NR (16) | ||
30 | #define S3C64XX_GPIO_J_NR (12) | ||
31 | #define S3C64XX_GPIO_K_NR (16) | ||
32 | #define S3C64XX_GPIO_L_NR (15) | ||
33 | #define S3C64XX_GPIO_M_NR (6) | ||
34 | #define S3C64XX_GPIO_N_NR (16) | ||
35 | #define S3C64XX_GPIO_O_NR (16) | ||
36 | #define S3C64XX_GPIO_P_NR (15) | ||
37 | #define S3C64XX_GPIO_Q_NR (9) | ||
38 | |||
39 | /* GPIO bank numbes */ | ||
40 | |||
41 | /* CONFIG_S3C_GPIO_SPACE allows the user to select extra | ||
42 | * space for debugging purposes so that any accidental | ||
43 | * change from one gpio bank to another can be caught. | ||
44 | */ | ||
45 | |||
46 | #define S3C64XX_GPIO_NEXT(__gpio) \ | ||
47 | ((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 1) | ||
48 | |||
49 | enum s3c_gpio_number { | ||
50 | S3C64XX_GPIO_A_START = 0, | ||
51 | S3C64XX_GPIO_B_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_A), | ||
52 | S3C64XX_GPIO_C_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_B), | ||
53 | S3C64XX_GPIO_D_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_C), | ||
54 | S3C64XX_GPIO_E_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_D), | ||
55 | S3C64XX_GPIO_F_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_E), | ||
56 | S3C64XX_GPIO_G_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_F), | ||
57 | S3C64XX_GPIO_H_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_G), | ||
58 | S3C64XX_GPIO_I_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_H), | ||
59 | S3C64XX_GPIO_J_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_I), | ||
60 | S3C64XX_GPIO_K_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_J), | ||
61 | S3C64XX_GPIO_L_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_K), | ||
62 | S3C64XX_GPIO_M_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_L), | ||
63 | S3C64XX_GPIO_N_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_M), | ||
64 | S3C64XX_GPIO_O_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_N), | ||
65 | S3C64XX_GPIO_P_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_O), | ||
66 | S3C64XX_GPIO_Q_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_P), | ||
67 | }; | ||
68 | |||
69 | /* S3C64XX GPIO number definitions. */ | ||
70 | |||
71 | #define S3C64XX_GPA(_nr) (S3C64XX_GPIO_A_START + (_nr)) | ||
72 | #define S3C64XX_GPB(_nr) (S3C64XX_GPIO_B_START + (_nr)) | ||
73 | #define S3C64XX_GPC(_nr) (S3C64XX_GPIO_C_START + (_nr)) | ||
74 | #define S3C64XX_GPD(_nr) (S3C64XX_GPIO_D_START + (_nr)) | ||
75 | #define S3C64XX_GPE(_nr) (S3C64XX_GPIO_E_START + (_nr)) | ||
76 | #define S3C64XX_GPF(_nr) (S3C64XX_GPIO_F_START + (_nr)) | ||
77 | #define S3C64XX_GPG(_nr) (S3C64XX_GPIO_G_START + (_nr)) | ||
78 | #define S3C64XX_GPH(_nr) (S3C64XX_GPIO_H_START + (_nr)) | ||
79 | #define S3C64XX_GPI(_nr) (S3C64XX_GPIO_I_START + (_nr)) | ||
80 | #define S3C64XX_GPJ(_nr) (S3C64XX_GPIO_J_START + (_nr)) | ||
81 | #define S3C64XX_GPK(_nr) (S3C64XX_GPIO_K_START + (_nr)) | ||
82 | #define S3C64XX_GPL(_nr) (S3C64XX_GPIO_L_START + (_nr)) | ||
83 | #define S3C64XX_GPM(_nr) (S3C64XX_GPIO_M_START + (_nr)) | ||
84 | #define S3C64XX_GPN(_nr) (S3C64XX_GPIO_N_START + (_nr)) | ||
85 | #define S3C64XX_GPO(_nr) (S3C64XX_GPIO_O_START + (_nr)) | ||
86 | #define S3C64XX_GPP(_nr) (S3C64XX_GPIO_P_START + (_nr)) | ||
87 | #define S3C64XX_GPQ(_nr) (S3C64XX_GPIO_Q_START + (_nr)) | ||
88 | |||
89 | /* the end of the S3C64XX specific gpios */ | ||
90 | #define S3C64XX_GPIO_END (S3C64XX_GPQ(S3C64XX_GPIO_Q_NR) + 1) | ||
91 | #define S3C_GPIO_END S3C64XX_GPIO_END | ||
92 | |||
93 | /* define the number of gpios we need to the one after the GPQ() range */ | ||
94 | #define ARCH_NR_GPIOS (S3C64XX_GPQ(S3C64XX_GPIO_Q_NR) + 1) | ||
95 | |||
96 | #include <asm-generic/gpio.h> | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/hardware.h b/arch/arm/mach-s3c64xx/include/mach/hardware.h new file mode 100644 index 000000000000..862d033e57a4 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/hardware.h | |||
@@ -0,0 +1,16 @@ | |||
1 | /* linux/arch/arm/mach-s3c6400/include/mach/hardware.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 | * S3C6400 - Hardware support | ||
9 | */ | ||
10 | |||
11 | #ifndef __ASM_ARCH_HARDWARE_H | ||
12 | #define __ASM_ARCH_HARDWARE_H __FILE__ | ||
13 | |||
14 | /* currently nothing here, placeholder */ | ||
15 | |||
16 | #endif /* __ASM_ARCH_IRQ_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/irqs.h b/arch/arm/mach-s3c64xx/include/mach/irqs.h new file mode 100644 index 000000000000..44bb3e491b5c --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/irqs.h | |||
@@ -0,0 +1,214 @@ | |||
1 | /* linux/arch/arm/mach-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 - IRQ support | ||
9 | */ | ||
10 | |||
11 | #ifndef __ASM_MACH_S3C64XX_IRQS_H | ||
12 | #define __ASM_MACH_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 IRQ_VIC0_BASE S3C_IRQ(0) | ||
28 | #define IRQ_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) (IRQ_VIC0_BASE + (x)) | ||
63 | #define S3C64XX_IRQ_VIC1(x) (IRQ_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_USBH 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 | #define IRQ_EINT_BIT(x) ((x) - S3C_EINT(0)) | ||
161 | |||
162 | /* Next the external interrupt groups. These are similar to the IRQ_EINT(x) | ||
163 | * that they are sourced from the GPIO pins but with a different scheme for | ||
164 | * priority and source indication. | ||
165 | * | ||
166 | * The IRQ_EINT(x) can be thought of as 'group 0' of the available GPIO | ||
167 | * interrupts, but for historical reasons they are kept apart from these | ||
168 | * next interrupts. | ||
169 | * | ||
170 | * Use IRQ_EINT_GROUP(group, offset) to get the number for use in the | ||
171 | * machine specific support files. | ||
172 | */ | ||
173 | |||
174 | #define IRQ_EINT_GROUP1_NR (15) | ||
175 | #define IRQ_EINT_GROUP2_NR (8) | ||
176 | #define IRQ_EINT_GROUP3_NR (5) | ||
177 | #define IRQ_EINT_GROUP4_NR (14) | ||
178 | #define IRQ_EINT_GROUP5_NR (7) | ||
179 | #define IRQ_EINT_GROUP6_NR (10) | ||
180 | #define IRQ_EINT_GROUP7_NR (16) | ||
181 | #define IRQ_EINT_GROUP8_NR (15) | ||
182 | #define IRQ_EINT_GROUP9_NR (9) | ||
183 | |||
184 | #define IRQ_EINT_GROUP_BASE S3C_EINT(28) | ||
185 | #define IRQ_EINT_GROUP1_BASE (IRQ_EINT_GROUP_BASE + 0x00) | ||
186 | #define IRQ_EINT_GROUP2_BASE (IRQ_EINT_GROUP1_BASE + IRQ_EINT_GROUP1_NR) | ||
187 | #define IRQ_EINT_GROUP3_BASE (IRQ_EINT_GROUP2_BASE + IRQ_EINT_GROUP2_NR) | ||
188 | #define IRQ_EINT_GROUP4_BASE (IRQ_EINT_GROUP3_BASE + IRQ_EINT_GROUP3_NR) | ||
189 | #define IRQ_EINT_GROUP5_BASE (IRQ_EINT_GROUP4_BASE + IRQ_EINT_GROUP4_NR) | ||
190 | #define IRQ_EINT_GROUP6_BASE (IRQ_EINT_GROUP5_BASE + IRQ_EINT_GROUP5_NR) | ||
191 | #define IRQ_EINT_GROUP7_BASE (IRQ_EINT_GROUP6_BASE + IRQ_EINT_GROUP6_NR) | ||
192 | #define IRQ_EINT_GROUP8_BASE (IRQ_EINT_GROUP7_BASE + IRQ_EINT_GROUP7_NR) | ||
193 | #define IRQ_EINT_GROUP9_BASE (IRQ_EINT_GROUP8_BASE + IRQ_EINT_GROUP8_NR) | ||
194 | |||
195 | #define IRQ_EINT_GROUP(group, no) (IRQ_EINT_GROUP##group##_BASE + (no)) | ||
196 | |||
197 | /* Define a group of interrupts for board-specific use (eg, for MFD | ||
198 | * interrupt controllers). */ | ||
199 | #define IRQ_BOARD_START (IRQ_EINT_GROUP9_BASE + IRQ_EINT_GROUP9_NR + 1) | ||
200 | |||
201 | #ifdef CONFIG_SMDK6410_WM1190_EV1 | ||
202 | #define IRQ_BOARD_NR 64 | ||
203 | #else | ||
204 | #define IRQ_BOARD_NR 16 | ||
205 | #endif | ||
206 | |||
207 | #define IRQ_BOARD_END (IRQ_BOARD_START + IRQ_BOARD_NR) | ||
208 | |||
209 | /* Set the default NR_IRQS */ | ||
210 | |||
211 | #define NR_IRQS (IRQ_BOARD_END + 1) | ||
212 | |||
213 | #endif /* __ASM_MACH_S3C64XX_IRQS_H */ | ||
214 | |||
diff --git a/arch/arm/mach-s3c64xx/include/mach/map.h b/arch/arm/mach-s3c64xx/include/mach/map.h new file mode 100644 index 000000000000..801c1c0f3a95 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/map.h | |||
@@ -0,0 +1,107 @@ | |||
1 | /* linux/arch/arm/mach-s3c6400/include/mach/map.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * http://armlinux.simtec.co.uk/ | ||
6 | * Ben Dooks <ben@simtec.co.uk> | ||
7 | * | ||
8 | * S3C64XX - Memory map 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 __ASM_ARCH_MAP_H | ||
16 | #define __ASM_ARCH_MAP_H __FILE__ | ||
17 | |||
18 | #include <plat/map-base.h> | ||
19 | |||
20 | /* | ||
21 | * Post-mux Chip Select Regions Xm0CSn_ | ||
22 | * These may be used by SROM, NAND or CF depending on settings | ||
23 | */ | ||
24 | |||
25 | #define S3C64XX_PA_XM0CSN0 (0x10000000) | ||
26 | #define S3C64XX_PA_XM0CSN1 (0x18000000) | ||
27 | #define S3C64XX_PA_XM0CSN2 (0x20000000) | ||
28 | #define S3C64XX_PA_XM0CSN3 (0x28000000) | ||
29 | #define S3C64XX_PA_XM0CSN4 (0x30000000) | ||
30 | #define S3C64XX_PA_XM0CSN5 (0x38000000) | ||
31 | |||
32 | /* HSMMC units */ | ||
33 | #define S3C64XX_PA_HSMMC(x) (0x7C200000 + ((x) * 0x100000)) | ||
34 | #define S3C64XX_PA_HSMMC0 S3C64XX_PA_HSMMC(0) | ||
35 | #define S3C64XX_PA_HSMMC1 S3C64XX_PA_HSMMC(1) | ||
36 | #define S3C64XX_PA_HSMMC2 S3C64XX_PA_HSMMC(2) | ||
37 | |||
38 | #define S3C_PA_UART (0x7F005000) | ||
39 | #define S3C_PA_UART0 (S3C_PA_UART + 0x00) | ||
40 | #define S3C_PA_UART1 (S3C_PA_UART + 0x400) | ||
41 | #define S3C_PA_UART2 (S3C_PA_UART + 0x800) | ||
42 | #define S3C_PA_UART3 (S3C_PA_UART + 0xC00) | ||
43 | #define S3C_UART_OFFSET (0x400) | ||
44 | |||
45 | /* See notes on UART VA mapping in debug-macro.S */ | ||
46 | #define S3C_VA_UARTx(x) (S3C_VA_UART + (S3C_PA_UART & 0xfffff) + ((x) * S3C_UART_OFFSET)) | ||
47 | |||
48 | #define S3C_VA_UART0 S3C_VA_UARTx(0) | ||
49 | #define S3C_VA_UART1 S3C_VA_UARTx(1) | ||
50 | #define S3C_VA_UART2 S3C_VA_UARTx(2) | ||
51 | #define S3C_VA_UART3 S3C_VA_UARTx(3) | ||
52 | |||
53 | #define S3C64XX_PA_SROM (0x70000000) | ||
54 | |||
55 | #define S3C64XX_PA_NAND (0x70200000) | ||
56 | #define S3C64XX_PA_FB (0x77100000) | ||
57 | #define S3C64XX_PA_USB_HSOTG (0x7C000000) | ||
58 | #define S3C64XX_PA_WATCHDOG (0x7E004000) | ||
59 | #define S3C64XX_PA_RTC (0x7E005000) | ||
60 | #define S3C64XX_PA_ADC (0x7E00B000) | ||
61 | #define S3C64XX_PA_SYSCON (0x7E00F000) | ||
62 | #define S3C64XX_PA_AC97 (0x7F001000) | ||
63 | #define S3C64XX_PA_IIS0 (0x7F002000) | ||
64 | #define S3C64XX_PA_IIS1 (0x7F003000) | ||
65 | #define S3C64XX_PA_TIMER (0x7F006000) | ||
66 | #define S3C64XX_PA_IIC0 (0x7F004000) | ||
67 | #define S3C64XX_PA_SPI0 (0x7F00B000) | ||
68 | #define S3C64XX_PA_SPI1 (0x7F00C000) | ||
69 | #define S3C64XX_PA_PCM0 (0x7F009000) | ||
70 | #define S3C64XX_PA_PCM1 (0x7F00A000) | ||
71 | #define S3C64XX_PA_IISV4 (0x7F00D000) | ||
72 | #define S3C64XX_PA_IIC1 (0x7F00F000) | ||
73 | |||
74 | #define S3C64XX_PA_GPIO (0x7F008000) | ||
75 | #define S3C64XX_VA_GPIO S3C_ADDR_CPU(0x00000000) | ||
76 | #define S3C64XX_SZ_GPIO SZ_4K | ||
77 | |||
78 | #define S3C64XX_PA_SDRAM (0x50000000) | ||
79 | #define S3C64XX_PA_VIC0 (0x71200000) | ||
80 | #define S3C64XX_PA_VIC1 (0x71300000) | ||
81 | |||
82 | #define S3C64XX_PA_MODEM (0x74108000) | ||
83 | #define S3C64XX_VA_MODEM S3C_ADDR_CPU(0x00100000) | ||
84 | |||
85 | #define S3C64XX_PA_USBHOST (0x74300000) | ||
86 | |||
87 | #define S3C64XX_PA_USB_HSPHY (0x7C100000) | ||
88 | #define S3C64XX_VA_USB_HSPHY S3C_ADDR_CPU(0x00200000) | ||
89 | |||
90 | /* place VICs close together */ | ||
91 | #define VA_VIC0 (S3C_VA_IRQ + 0x00) | ||
92 | #define VA_VIC1 (S3C_VA_IRQ + 0x10000) | ||
93 | |||
94 | /* compatibiltiy defines. */ | ||
95 | #define S3C_PA_TIMER S3C64XX_PA_TIMER | ||
96 | #define S3C_PA_HSMMC0 S3C64XX_PA_HSMMC0 | ||
97 | #define S3C_PA_HSMMC1 S3C64XX_PA_HSMMC1 | ||
98 | #define S3C_PA_HSMMC2 S3C64XX_PA_HSMMC2 | ||
99 | #define S3C_PA_IIC S3C64XX_PA_IIC0 | ||
100 | #define S3C_PA_IIC1 S3C64XX_PA_IIC1 | ||
101 | #define S3C_PA_NAND S3C64XX_PA_NAND | ||
102 | #define S3C_PA_FB S3C64XX_PA_FB | ||
103 | #define S3C_PA_USBHOST S3C64XX_PA_USBHOST | ||
104 | #define S3C_PA_USB_HSOTG S3C64XX_PA_USB_HSOTG | ||
105 | #define S3C_VA_USB_HSPHY S3C64XX_VA_USB_HSPHY | ||
106 | |||
107 | #endif /* __ASM_ARCH_6400_MAP_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/memory.h b/arch/arm/mach-s3c64xx/include/mach/memory.h new file mode 100644 index 000000000000..a3ac84a65480 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/memory.h | |||
@@ -0,0 +1,18 @@ | |||
1 | /* arch/arm/mach-s3c6400/include/mach/memory.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 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_MEMORY_H | ||
14 | #define __ASM_ARCH_MEMORY_H | ||
15 | |||
16 | #define PHYS_OFFSET UL(0x50000000) | ||
17 | |||
18 | #endif | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/pll.h b/arch/arm/mach-s3c64xx/include/mach/pll.h new file mode 100644 index 000000000000..90bbd72fdc4e --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/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/mach-s3c64xx/include/mach/pm-core.h b/arch/arm/mach-s3c64xx/include/mach/pm-core.h new file mode 100644 index 000000000000..1e9f20f0bb7b --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/pm-core.h | |||
@@ -0,0 +1,98 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/pm-core.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 - PM core support for arch/arm/plat-s3c/pm.c | ||
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 <mach/regs-gpio.h> | ||
16 | |||
17 | static inline void s3c_pm_debug_init_uart(void) | ||
18 | { | ||
19 | u32 tmp = __raw_readl(S3C_PCLK_GATE); | ||
20 | |||
21 | /* As a note, since the S3C64XX UARTs generally have multiple | ||
22 | * clock sources, we simply enable PCLK at the moment and hope | ||
23 | * that the resume settings for the UART are suitable for the | ||
24 | * use with PCLK. | ||
25 | */ | ||
26 | |||
27 | tmp |= S3C_CLKCON_PCLK_UART0; | ||
28 | tmp |= S3C_CLKCON_PCLK_UART1; | ||
29 | tmp |= S3C_CLKCON_PCLK_UART2; | ||
30 | tmp |= S3C_CLKCON_PCLK_UART3; | ||
31 | |||
32 | __raw_writel(tmp, S3C_PCLK_GATE); | ||
33 | udelay(10); | ||
34 | } | ||
35 | |||
36 | static inline void s3c_pm_arch_prepare_irqs(void) | ||
37 | { | ||
38 | /* VIC should have already been taken care of */ | ||
39 | |||
40 | /* clear any pending EINT0 interrupts */ | ||
41 | __raw_writel(__raw_readl(S3C64XX_EINT0PEND), S3C64XX_EINT0PEND); | ||
42 | } | ||
43 | |||
44 | static inline void s3c_pm_arch_stop_clocks(void) | ||
45 | { | ||
46 | } | ||
47 | |||
48 | static inline void s3c_pm_arch_show_resume_irqs(void) | ||
49 | { | ||
50 | } | ||
51 | |||
52 | /* make these defines, we currently do not have any need to change | ||
53 | * the IRQ wake controls depending on the CPU we are running on */ | ||
54 | |||
55 | #define s3c_irqwake_eintallow ((1 << 28) - 1) | ||
56 | #define s3c_irqwake_intallow (0) | ||
57 | |||
58 | static inline void s3c_pm_arch_update_uart(void __iomem *regs, | ||
59 | struct pm_uart_save *save) | ||
60 | { | ||
61 | u32 ucon = __raw_readl(regs + S3C2410_UCON); | ||
62 | u32 ucon_clk = ucon & S3C6400_UCON_CLKMASK; | ||
63 | u32 save_clk = save->ucon & S3C6400_UCON_CLKMASK; | ||
64 | u32 new_ucon; | ||
65 | u32 delta; | ||
66 | |||
67 | /* S3C64XX UART blocks only support level interrupts, so ensure that | ||
68 | * when we restore unused UART blocks we force the level interrupt | ||
69 | * settigs. */ | ||
70 | save->ucon |= S3C2410_UCON_TXILEVEL | S3C2410_UCON_RXILEVEL; | ||
71 | |||
72 | /* We have a constraint on changing the clock type of the UART | ||
73 | * between UCLKx and PCLK, so ensure that when we restore UCON | ||
74 | * that the CLK field is correctly modified if the bootloader | ||
75 | * has changed anything. | ||
76 | */ | ||
77 | if (ucon_clk != save_clk) { | ||
78 | new_ucon = save->ucon; | ||
79 | delta = ucon_clk ^ save_clk; | ||
80 | |||
81 | /* change from UCLKx => wrong PCLK, | ||
82 | * either UCLK can be tested for by a bit-test | ||
83 | * with UCLK0 */ | ||
84 | if (ucon_clk & S3C6400_UCON_UCLK0 && | ||
85 | !(save_clk & S3C6400_UCON_UCLK0) && | ||
86 | delta & S3C6400_UCON_PCLK2) { | ||
87 | new_ucon &= ~S3C6400_UCON_UCLK0; | ||
88 | } else if (delta == S3C6400_UCON_PCLK2) { | ||
89 | /* as an precaution, don't change from | ||
90 | * PCLK2 => PCLK or vice-versa */ | ||
91 | new_ucon ^= S3C6400_UCON_PCLK2; | ||
92 | } | ||
93 | |||
94 | S3C_PMDBG("ucon change %04x => %04x (save=%04x)\n", | ||
95 | ucon, new_ucon, save->ucon); | ||
96 | save->ucon = new_ucon; | ||
97 | } | ||
98 | } | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/pwm-clock.h b/arch/arm/mach-s3c64xx/include/mach/pwm-clock.h new file mode 100644 index 000000000000..b25bedee0d52 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/pwm-clock.h | |||
@@ -0,0 +1,56 @@ | |||
1 | /* linux/arch/arm/mach-s3c6400/include/mach/pwm-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 - pwm clock and timer support | ||
9 | */ | ||
10 | |||
11 | /** | ||
12 | * pwm_cfg_src_is_tclk() - return whether the given mux config is a tclk | ||
13 | * @tcfg: The timer TCFG1 register bits shifted down to 0. | ||
14 | * | ||
15 | * Return true if the given configuration from TCFG1 is a TCLK instead | ||
16 | * any of the TDIV clocks. | ||
17 | */ | ||
18 | static inline int pwm_cfg_src_is_tclk(unsigned long tcfg) | ||
19 | { | ||
20 | return tcfg >= S3C64XX_TCFG1_MUX_TCLK; | ||
21 | } | ||
22 | |||
23 | /** | ||
24 | * tcfg_to_divisor() - convert tcfg1 setting to a divisor | ||
25 | * @tcfg1: The tcfg1 setting, shifted down. | ||
26 | * | ||
27 | * Get the divisor value for the given tcfg1 setting. We assume the | ||
28 | * caller has already checked to see if this is not a TCLK source. | ||
29 | */ | ||
30 | static inline unsigned long tcfg_to_divisor(unsigned long tcfg1) | ||
31 | { | ||
32 | return 1 << tcfg1; | ||
33 | } | ||
34 | |||
35 | /** | ||
36 | * pwm_tdiv_has_div1() - does the tdiv setting have a /1 | ||
37 | * | ||
38 | * Return true if we have a /1 in the tdiv setting. | ||
39 | */ | ||
40 | static inline unsigned int pwm_tdiv_has_div1(void) | ||
41 | { | ||
42 | return 1; | ||
43 | } | ||
44 | |||
45 | /** | ||
46 | * pwm_tdiv_div_bits() - calculate TCFG1 divisor value. | ||
47 | * @div: The divisor to calculate the bit information for. | ||
48 | * | ||
49 | * Turn a divisor into the necessary bit field for TCFG1. | ||
50 | */ | ||
51 | static inline unsigned long pwm_tdiv_div_bits(unsigned int div) | ||
52 | { | ||
53 | return ilog2(div); | ||
54 | } | ||
55 | |||
56 | #define S3C_TCFG1_MUX_TCLK S3C64XX_TCFG1_MUX_TCLK | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/regs-clock.h b/arch/arm/mach-s3c64xx/include/mach/regs-clock.h new file mode 100644 index 000000000000..3ef62741e5d1 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/regs-clock.h | |||
@@ -0,0 +1,156 @@ | |||
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 | #define S3C_MEM0_GATE S3C_CLKREG(0x3C) | ||
36 | |||
37 | /* CLKDIV0 */ | ||
38 | #define S3C6400_CLKDIV0_PCLK_MASK (0xf << 12) | ||
39 | #define S3C6400_CLKDIV0_PCLK_SHIFT (12) | ||
40 | #define S3C6400_CLKDIV0_HCLK2_MASK (0x7 << 9) | ||
41 | #define S3C6400_CLKDIV0_HCLK2_SHIFT (9) | ||
42 | #define S3C6400_CLKDIV0_HCLK_MASK (0x1 << 8) | ||
43 | #define S3C6400_CLKDIV0_HCLK_SHIFT (8) | ||
44 | #define S3C6400_CLKDIV0_MPLL_MASK (0x1 << 4) | ||
45 | #define S3C6400_CLKDIV0_MPLL_SHIFT (4) | ||
46 | |||
47 | #define S3C6400_CLKDIV0_ARM_MASK (0x7 << 0) | ||
48 | #define S3C6410_CLKDIV0_ARM_MASK (0xf << 0) | ||
49 | #define S3C6400_CLKDIV0_ARM_SHIFT (0) | ||
50 | |||
51 | /* HCLK GATE Registers */ | ||
52 | #define S3C_CLKCON_HCLK_3DSE (1<<31) | ||
53 | #define S3C_CLKCON_HCLK_UHOST (1<<29) | ||
54 | #define S3C_CLKCON_HCLK_SECUR (1<<28) | ||
55 | #define S3C_CLKCON_HCLK_SDMA1 (1<<27) | ||
56 | #define S3C_CLKCON_HCLK_SDMA0 (1<<26) | ||
57 | #define S3C_CLKCON_HCLK_IROM (1<<25) | ||
58 | #define S3C_CLKCON_HCLK_DDR1 (1<<24) | ||
59 | #define S3C_CLKCON_HCLK_DDR0 (1<<23) | ||
60 | #define S3C_CLKCON_HCLK_MEM1 (1<<22) | ||
61 | #define S3C_CLKCON_HCLK_MEM0 (1<<21) | ||
62 | #define S3C_CLKCON_HCLK_USB (1<<20) | ||
63 | #define S3C_CLKCON_HCLK_HSMMC2 (1<<19) | ||
64 | #define S3C_CLKCON_HCLK_HSMMC1 (1<<18) | ||
65 | #define S3C_CLKCON_HCLK_HSMMC0 (1<<17) | ||
66 | #define S3C_CLKCON_HCLK_MDP (1<<16) | ||
67 | #define S3C_CLKCON_HCLK_DHOST (1<<15) | ||
68 | #define S3C_CLKCON_HCLK_IHOST (1<<14) | ||
69 | #define S3C_CLKCON_HCLK_DMA1 (1<<13) | ||
70 | #define S3C_CLKCON_HCLK_DMA0 (1<<12) | ||
71 | #define S3C_CLKCON_HCLK_JPEG (1<<11) | ||
72 | #define S3C_CLKCON_HCLK_CAMIF (1<<10) | ||
73 | #define S3C_CLKCON_HCLK_SCALER (1<<9) | ||
74 | #define S3C_CLKCON_HCLK_2D (1<<8) | ||
75 | #define S3C_CLKCON_HCLK_TV (1<<7) | ||
76 | #define S3C_CLKCON_HCLK_POST0 (1<<5) | ||
77 | #define S3C_CLKCON_HCLK_ROT (1<<4) | ||
78 | #define S3C_CLKCON_HCLK_LCD (1<<3) | ||
79 | #define S3C_CLKCON_HCLK_TZIC (1<<2) | ||
80 | #define S3C_CLKCON_HCLK_INTC (1<<1) | ||
81 | #define S3C_CLKCON_HCLK_MFC (1<<0) | ||
82 | |||
83 | /* PCLK GATE Registers */ | ||
84 | #define S3C6410_CLKCON_PCLK_I2C1 (1<<27) | ||
85 | #define S3C6410_CLKCON_PCLK_IIS2 (1<<26) | ||
86 | #define S3C_CLKCON_PCLK_SKEY (1<<24) | ||
87 | #define S3C_CLKCON_PCLK_CHIPID (1<<23) | ||
88 | #define S3C_CLKCON_PCLK_SPI1 (1<<22) | ||
89 | #define S3C_CLKCON_PCLK_SPI0 (1<<21) | ||
90 | #define S3C_CLKCON_PCLK_HSIRX (1<<20) | ||
91 | #define S3C_CLKCON_PCLK_HSITX (1<<19) | ||
92 | #define S3C_CLKCON_PCLK_GPIO (1<<18) | ||
93 | #define S3C_CLKCON_PCLK_IIC (1<<17) | ||
94 | #define S3C_CLKCON_PCLK_IIS1 (1<<16) | ||
95 | #define S3C_CLKCON_PCLK_IIS0 (1<<15) | ||
96 | #define S3C_CLKCON_PCLK_AC97 (1<<14) | ||
97 | #define S3C_CLKCON_PCLK_TZPC (1<<13) | ||
98 | #define S3C_CLKCON_PCLK_TSADC (1<<12) | ||
99 | #define S3C_CLKCON_PCLK_KEYPAD (1<<11) | ||
100 | #define S3C_CLKCON_PCLK_IRDA (1<<10) | ||
101 | #define S3C_CLKCON_PCLK_PCM1 (1<<9) | ||
102 | #define S3C_CLKCON_PCLK_PCM0 (1<<8) | ||
103 | #define S3C_CLKCON_PCLK_PWM (1<<7) | ||
104 | #define S3C_CLKCON_PCLK_RTC (1<<6) | ||
105 | #define S3C_CLKCON_PCLK_WDT (1<<5) | ||
106 | #define S3C_CLKCON_PCLK_UART3 (1<<4) | ||
107 | #define S3C_CLKCON_PCLK_UART2 (1<<3) | ||
108 | #define S3C_CLKCON_PCLK_UART1 (1<<2) | ||
109 | #define S3C_CLKCON_PCLK_UART0 (1<<1) | ||
110 | #define S3C_CLKCON_PCLK_MFC (1<<0) | ||
111 | |||
112 | /* SCLK GATE Registers */ | ||
113 | #define S3C_CLKCON_SCLK_UHOST (1<<30) | ||
114 | #define S3C_CLKCON_SCLK_MMC2_48 (1<<29) | ||
115 | #define S3C_CLKCON_SCLK_MMC1_48 (1<<28) | ||
116 | #define S3C_CLKCON_SCLK_MMC0_48 (1<<27) | ||
117 | #define S3C_CLKCON_SCLK_MMC2 (1<<26) | ||
118 | #define S3C_CLKCON_SCLK_MMC1 (1<<25) | ||
119 | #define S3C_CLKCON_SCLK_MMC0 (1<<24) | ||
120 | #define S3C_CLKCON_SCLK_SPI1_48 (1<<23) | ||
121 | #define S3C_CLKCON_SCLK_SPI0_48 (1<<22) | ||
122 | #define S3C_CLKCON_SCLK_SPI1 (1<<21) | ||
123 | #define S3C_CLKCON_SCLK_SPI0 (1<<20) | ||
124 | #define S3C_CLKCON_SCLK_DAC27 (1<<19) | ||
125 | #define S3C_CLKCON_SCLK_TV27 (1<<18) | ||
126 | #define S3C_CLKCON_SCLK_SCALER27 (1<<17) | ||
127 | #define S3C_CLKCON_SCLK_SCALER (1<<16) | ||
128 | #define S3C_CLKCON_SCLK_LCD27 (1<<15) | ||
129 | #define S3C_CLKCON_SCLK_LCD (1<<14) | ||
130 | #define S3C6400_CLKCON_SCLK_POST1_27 (1<<13) | ||
131 | #define S3C6410_CLKCON_FIMC (1<<13) | ||
132 | #define S3C_CLKCON_SCLK_POST0_27 (1<<12) | ||
133 | #define S3C6400_CLKCON_SCLK_POST1 (1<<11) | ||
134 | #define S3C6410_CLKCON_SCLK_AUDIO2 (1<<11) | ||
135 | #define S3C_CLKCON_SCLK_POST0 (1<<10) | ||
136 | #define S3C_CLKCON_SCLK_AUDIO1 (1<<9) | ||
137 | #define S3C_CLKCON_SCLK_AUDIO0 (1<<8) | ||
138 | #define S3C_CLKCON_SCLK_SECUR (1<<7) | ||
139 | #define S3C_CLKCON_SCLK_IRDA (1<<6) | ||
140 | #define S3C_CLKCON_SCLK_UART (1<<5) | ||
141 | #define S3C_CLKCON_SCLK_ONENAND (1<<4) | ||
142 | #define S3C_CLKCON_SCLK_MFC (1<<3) | ||
143 | #define S3C_CLKCON_SCLK_CAM (1<<2) | ||
144 | #define S3C_CLKCON_SCLK_JPEG (1<<1) | ||
145 | |||
146 | /* CLKSRC */ | ||
147 | |||
148 | #define S3C6400_CLKSRC_APLL_MOUT (1 << 0) | ||
149 | #define S3C6400_CLKSRC_MPLL_MOUT (1 << 1) | ||
150 | #define S3C6400_CLKSRC_EPLL_MOUT (1 << 2) | ||
151 | #define S3C6400_CLKSRC_APLL_MOUT_SHIFT (0) | ||
152 | #define S3C6400_CLKSRC_MPLL_MOUT_SHIFT (1) | ||
153 | #define S3C6400_CLKSRC_EPLL_MOUT_SHIFT (2) | ||
154 | #define S3C6400_CLKSRC_MFC (1 << 4) | ||
155 | |||
156 | #endif /* _PLAT_REGS_CLOCK_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/regs-fb.h b/arch/arm/mach-s3c64xx/include/mach/regs-fb.h new file mode 100644 index 000000000000..f56611526c63 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/regs-fb.h | |||
@@ -0,0 +1,41 @@ | |||
1 | /* | ||
2 | * Copyright 2008 Openmoko, Inc. | ||
3 | * Copyright 2008 Simtec Electronics | ||
4 | * Copyright 2009 Samsung Electronics Co. | ||
5 | * | ||
6 | * Pawel Osciak <p.osciak@samsung.com> | ||
7 | * Based on plat-s3c/include/plat/regs-fb.h by Ben Dooks <ben@simtec.co.uk> | ||
8 | * | ||
9 | * Framebuffer register definitions for Samsung S3C64xx. | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify | ||
12 | * it under the terms of the GNU General Public License version 2 as | ||
13 | * published by the Free Software Foundation. | ||
14 | */ | ||
15 | |||
16 | #ifndef __ASM_ARCH_MACH_REGS_FB_H | ||
17 | #define __ASM_ARCH_MACH_REGS_FB_H __FILE__ | ||
18 | |||
19 | #include <plat/regs-fb-v4.h> | ||
20 | |||
21 | /* Palette registers */ | ||
22 | #define WIN2_PAL(_entry) (0x300 + ((_entry) * 2)) | ||
23 | #define WIN3_PAL(_entry) (0x320 + ((_entry) * 2)) | ||
24 | #define WIN4_PAL(_entry) (0x340 + ((_entry) * 2)) | ||
25 | #define WIN0_PAL(_entry) (0x400 + ((_entry) * 4)) | ||
26 | #define WIN1_PAL(_entry) (0x800 + ((_entry) * 4)) | ||
27 | |||
28 | static inline unsigned int s3c_fb_pal_reg(unsigned int window, int reg) | ||
29 | { | ||
30 | switch (window) { | ||
31 | case 0: return WIN0_PAL(reg); | ||
32 | case 1: return WIN1_PAL(reg); | ||
33 | case 2: return WIN2_PAL(reg); | ||
34 | case 3: return WIN3_PAL(reg); | ||
35 | case 4: return WIN4_PAL(reg); | ||
36 | } | ||
37 | |||
38 | BUG(); | ||
39 | } | ||
40 | |||
41 | #endif /* __ASM_ARCH_MACH_REGS_FB_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/regs-gpio-memport.h b/arch/arm/mach-s3c64xx/include/mach/regs-gpio-memport.h new file mode 100644 index 000000000000..82342f6fd27d --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/regs-gpio-memport.h | |||
@@ -0,0 +1,25 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/include/mach/regs-gpio-memport.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 memory port register definitions | ||
9 | */ | ||
10 | |||
11 | #ifndef __ASM_PLAT_S3C64XX_REGS_GPIO_MEMPORT_H | ||
12 | #define __ASM_PLAT_S3C64XX_REGS_GPIO_MEMPORT_H __FILE__ | ||
13 | |||
14 | #define S3C64XX_MEM0CONSTOP S3C64XX_GPIOREG(0x1B0) | ||
15 | #define S3C64XX_MEM1CONSTOP S3C64XX_GPIOREG(0x1B4) | ||
16 | |||
17 | #define S3C64XX_MEM0CONSLP0 S3C64XX_GPIOREG(0x1C0) | ||
18 | #define S3C64XX_MEM0CONSLP1 S3C64XX_GPIOREG(0x1C4) | ||
19 | #define S3C64XX_MEM1CONSLP S3C64XX_GPIOREG(0x1C8) | ||
20 | |||
21 | #define S3C64XX_MEM0DRVCON S3C64XX_GPIOREG(0x1D0) | ||
22 | #define S3C64XX_MEM1DRVCON S3C64XX_GPIOREG(0x1D4) | ||
23 | |||
24 | #endif /* __ASM_PLAT_S3C64XX_REGS_GPIO_MEMPORT_H */ | ||
25 | |||
diff --git a/arch/arm/mach-s3c64xx/include/mach/regs-gpio.h b/arch/arm/mach-s3c64xx/include/mach/regs-gpio.h new file mode 100644 index 000000000000..81f7f6e6832e --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/regs-gpio.h | |||
@@ -0,0 +1,187 @@ | |||
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_GPIOREG(reg) (S3C64XX_VA_GPIO + (reg)) | ||
17 | |||
18 | #define S3C64XX_GPA_BASE S3C64XX_GPIOREG(0x0000) | ||
19 | #define S3C64XX_GPB_BASE S3C64XX_GPIOREG(0x0020) | ||
20 | #define S3C64XX_GPC_BASE S3C64XX_GPIOREG(0x0040) | ||
21 | #define S3C64XX_GPD_BASE S3C64XX_GPIOREG(0x0060) | ||
22 | #define S3C64XX_GPE_BASE S3C64XX_GPIOREG(0x0080) | ||
23 | #define S3C64XX_GPF_BASE S3C64XX_GPIOREG(0x00A0) | ||
24 | #define S3C64XX_GPG_BASE S3C64XX_GPIOREG(0x00C0) | ||
25 | #define S3C64XX_GPH_BASE S3C64XX_GPIOREG(0x00E0) | ||
26 | #define S3C64XX_GPI_BASE S3C64XX_GPIOREG(0x0100) | ||
27 | #define S3C64XX_GPJ_BASE S3C64XX_GPIOREG(0x0120) | ||
28 | #define S3C64XX_GPK_BASE S3C64XX_GPIOREG(0x0800) | ||
29 | #define S3C64XX_GPL_BASE S3C64XX_GPIOREG(0x0810) | ||
30 | #define S3C64XX_GPM_BASE S3C64XX_GPIOREG(0x0820) | ||
31 | #define S3C64XX_GPN_BASE S3C64XX_GPIOREG(0x0830) | ||
32 | #define S3C64XX_GPO_BASE S3C64XX_GPIOREG(0x0140) | ||
33 | #define S3C64XX_GPP_BASE S3C64XX_GPIOREG(0x0160) | ||
34 | #define S3C64XX_GPQ_BASE S3C64XX_GPIOREG(0x0180) | ||
35 | |||
36 | /* SPCON */ | ||
37 | |||
38 | #define S3C64XX_SPCON S3C64XX_GPIOREG(0x1A0) | ||
39 | |||
40 | #define S3C64XX_SPCON_DRVCON_CAM_MASK (0x3 << 30) | ||
41 | #define S3C64XX_SPCON_DRVCON_CAM_SHIFT (30) | ||
42 | #define S3C64XX_SPCON_DRVCON_CAM_2mA (0x0 << 30) | ||
43 | #define S3C64XX_SPCON_DRVCON_CAM_4mA (0x1 << 30) | ||
44 | #define S3C64XX_SPCON_DRVCON_CAM_7mA (0x2 << 30) | ||
45 | #define S3C64XX_SPCON_DRVCON_CAM_9mA (0x3 << 30) | ||
46 | |||
47 | #define S3C64XX_SPCON_DRVCON_HSSPI_MASK (0x3 << 28) | ||
48 | #define S3C64XX_SPCON_DRVCON_HSSPI_SHIFT (28) | ||
49 | #define S3C64XX_SPCON_DRVCON_HSSPI_2mA (0x0 << 28) | ||
50 | #define S3C64XX_SPCON_DRVCON_HSSPI_4mA (0x1 << 28) | ||
51 | #define S3C64XX_SPCON_DRVCON_HSSPI_7mA (0x2 << 28) | ||
52 | #define S3C64XX_SPCON_DRVCON_HSSPI_9mA (0x3 << 28) | ||
53 | |||
54 | #define S3C64XX_SPCON_DRVCON_HSMMC_MASK (0x3 << 26) | ||
55 | #define S3C64XX_SPCON_DRVCON_HSMMC_SHIFT (26) | ||
56 | #define S3C64XX_SPCON_DRVCON_HSMMC_2mA (0x0 << 26) | ||
57 | #define S3C64XX_SPCON_DRVCON_HSMMC_4mA (0x1 << 26) | ||
58 | #define S3C64XX_SPCON_DRVCON_HSMMC_7mA (0x2 << 26) | ||
59 | #define S3C64XX_SPCON_DRVCON_HSMMC_9mA (0x3 << 26) | ||
60 | |||
61 | #define S3C64XX_SPCON_DRVCON_LCD_MASK (0x3 << 24) | ||
62 | #define S3C64XX_SPCON_DRVCON_LCD_SHIFT (24) | ||
63 | #define S3C64XX_SPCON_DRVCON_LCD_2mA (0x0 << 24) | ||
64 | #define S3C64XX_SPCON_DRVCON_LCD_4mA (0x1 << 24) | ||
65 | #define S3C64XX_SPCON_DRVCON_LCD_7mA (0x2 << 24) | ||
66 | #define S3C64XX_SPCON_DRVCON_LCD_9mA (0x3 << 24) | ||
67 | |||
68 | #define S3C64XX_SPCON_DRVCON_MODEM_MASK (0x3 << 22) | ||
69 | #define S3C64XX_SPCON_DRVCON_MODEM_SHIFT (22) | ||
70 | #define S3C64XX_SPCON_DRVCON_MODEM_2mA (0x0 << 22) | ||
71 | #define S3C64XX_SPCON_DRVCON_MODEM_4mA (0x1 << 22) | ||
72 | #define S3C64XX_SPCON_DRVCON_MODEM_7mA (0x2 << 22) | ||
73 | #define S3C64XX_SPCON_DRVCON_MODEM_9mA (0x3 << 22) | ||
74 | |||
75 | #define S3C64XX_SPCON_nRSTOUT_OEN (1 << 21) | ||
76 | |||
77 | #define S3C64XX_SPCON_DRVCON_SPICLK1_MASK (0x3 << 18) | ||
78 | #define S3C64XX_SPCON_DRVCON_SPICLK1_SHIFT (18) | ||
79 | #define S3C64XX_SPCON_DRVCON_SPICLK1_2mA (0x0 << 18) | ||
80 | #define S3C64XX_SPCON_DRVCON_SPICLK1_4mA (0x1 << 18) | ||
81 | #define S3C64XX_SPCON_DRVCON_SPICLK1_7mA (0x2 << 18) | ||
82 | #define S3C64XX_SPCON_DRVCON_SPICLK1_9mA (0x3 << 18) | ||
83 | |||
84 | #define S3C64XX_SPCON_MEM1_DQS_PUD_MASK (0x3 << 16) | ||
85 | #define S3C64XX_SPCON_MEM1_DQS_PUD_SHIFT (16) | ||
86 | #define S3C64XX_SPCON_MEM1_DQS_PUD_DISABLED (0x0 << 16) | ||
87 | #define S3C64XX_SPCON_MEM1_DQS_PUD_DOWN (0x1 << 16) | ||
88 | #define S3C64XX_SPCON_MEM1_DQS_PUD_UP (0x2 << 16) | ||
89 | |||
90 | #define S3C64XX_SPCON_MEM1_D_PUD1_MASK (0x3 << 14) | ||
91 | #define S3C64XX_SPCON_MEM1_D_PUD1_SHIFT (14) | ||
92 | #define S3C64XX_SPCON_MEM1_D_PUD1_DISABLED (0x0 << 14) | ||
93 | #define S3C64XX_SPCON_MEM1_D_PUD1_DOWN (0x1 << 14) | ||
94 | #define S3C64XX_SPCON_MEM1_D_PUD1_UP (0x2 << 14) | ||
95 | |||
96 | #define S3C64XX_SPCON_MEM1_D_PUD0_MASK (0x3 << 12) | ||
97 | #define S3C64XX_SPCON_MEM1_D_PUD0_SHIFT (12) | ||
98 | #define S3C64XX_SPCON_MEM1_D_PUD0_DISABLED (0x0 << 12) | ||
99 | #define S3C64XX_SPCON_MEM1_D_PUD0_DOWN (0x1 << 12) | ||
100 | #define S3C64XX_SPCON_MEM1_D_PUD0_UP (0x2 << 12) | ||
101 | |||
102 | #define S3C64XX_SPCON_MEM0_D_PUD_MASK (0x3 << 8) | ||
103 | #define S3C64XX_SPCON_MEM0_D_PUD_SHIFT (8) | ||
104 | #define S3C64XX_SPCON_MEM0_D_PUD_DISABLED (0x0 << 8) | ||
105 | #define S3C64XX_SPCON_MEM0_D_PUD_DOWN (0x1 << 8) | ||
106 | #define S3C64XX_SPCON_MEM0_D_PUD_UP (0x2 << 8) | ||
107 | |||
108 | #define S3C64XX_SPCON_USBH_DMPD (1 << 7) | ||
109 | #define S3C64XX_SPCON_USBH_DPPD (1 << 6) | ||
110 | #define S3C64XX_SPCON_USBH_PUSW2 (1 << 5) | ||
111 | #define S3C64XX_SPCON_USBH_PUSW1 (1 << 4) | ||
112 | #define S3C64XX_SPCON_USBH_SUSPND (1 << 3) | ||
113 | |||
114 | #define S3C64XX_SPCON_LCD_SEL_MASK (0x3 << 0) | ||
115 | #define S3C64XX_SPCON_LCD_SEL_SHIFT (0) | ||
116 | #define S3C64XX_SPCON_LCD_SEL_HOST (0x0 << 0) | ||
117 | #define S3C64XX_SPCON_LCD_SEL_RGB (0x1 << 0) | ||
118 | #define S3C64XX_SPCON_LCD_SEL_606_656 (0x2 << 0) | ||
119 | |||
120 | |||
121 | /* External interrupt registers */ | ||
122 | |||
123 | #define S3C64XX_EINT12CON S3C64XX_GPIOREG(0x200) | ||
124 | #define S3C64XX_EINT34CON S3C64XX_GPIOREG(0x204) | ||
125 | #define S3C64XX_EINT56CON S3C64XX_GPIOREG(0x208) | ||
126 | #define S3C64XX_EINT78CON S3C64XX_GPIOREG(0x20C) | ||
127 | #define S3C64XX_EINT9CON S3C64XX_GPIOREG(0x210) | ||
128 | |||
129 | #define S3C64XX_EINT12FLTCON S3C64XX_GPIOREG(0x220) | ||
130 | #define S3C64XX_EINT34FLTCON S3C64XX_GPIOREG(0x224) | ||
131 | #define S3C64XX_EINT56FLTCON S3C64XX_GPIOREG(0x228) | ||
132 | #define S3C64XX_EINT78FLTCON S3C64XX_GPIOREG(0x22C) | ||
133 | #define S3C64XX_EINT9FLTCON S3C64XX_GPIOREG(0x230) | ||
134 | |||
135 | #define S3C64XX_EINT12MASK S3C64XX_GPIOREG(0x240) | ||
136 | #define S3C64XX_EINT34MASK S3C64XX_GPIOREG(0x244) | ||
137 | #define S3C64XX_EINT56MASK S3C64XX_GPIOREG(0x248) | ||
138 | #define S3C64XX_EINT78MASK S3C64XX_GPIOREG(0x24C) | ||
139 | #define S3C64XX_EINT9MASK S3C64XX_GPIOREG(0x250) | ||
140 | |||
141 | #define S3C64XX_EINT12PEND S3C64XX_GPIOREG(0x260) | ||
142 | #define S3C64XX_EINT34PEND S3C64XX_GPIOREG(0x264) | ||
143 | #define S3C64XX_EINT56PEND S3C64XX_GPIOREG(0x268) | ||
144 | #define S3C64XX_EINT78PEND S3C64XX_GPIOREG(0x26C) | ||
145 | #define S3C64XX_EINT9PEND S3C64XX_GPIOREG(0x270) | ||
146 | |||
147 | #define S3C64XX_PRIORITY S3C64XX_GPIOREG(0x280) | ||
148 | #define S3C64XX_PRIORITY_ARB(x) (1 << (x)) | ||
149 | |||
150 | #define S3C64XX_SERVICE S3C64XX_GPIOREG(0x284) | ||
151 | #define S3C64XX_SERVICEPEND S3C64XX_GPIOREG(0x288) | ||
152 | |||
153 | #define S3C64XX_EINT0CON0 S3C64XX_GPIOREG(0x900) | ||
154 | #define S3C64XX_EINT0CON1 S3C64XX_GPIOREG(0x904) | ||
155 | #define S3C64XX_EINT0FLTCON0 S3C64XX_GPIOREG(0x910) | ||
156 | #define S3C64XX_EINT0FLTCON1 S3C64XX_GPIOREG(0x914) | ||
157 | #define S3C64XX_EINT0FLTCON2 S3C64XX_GPIOREG(0x918) | ||
158 | #define S3C64XX_EINT0FLTCON3 S3C64XX_GPIOREG(0x91C) | ||
159 | |||
160 | #define S3C64XX_EINT0MASK S3C64XX_GPIOREG(0x920) | ||
161 | #define S3C64XX_EINT0PEND S3C64XX_GPIOREG(0x924) | ||
162 | |||
163 | /* GPIO sleep configuration */ | ||
164 | |||
165 | #define S3C64XX_SPCONSLP S3C64XX_GPIOREG(0x880) | ||
166 | |||
167 | #define S3C64XX_SPCONSLP_TDO_PULLDOWN (1 << 14) | ||
168 | #define S3C64XX_SPCONSLP_CKE1INIT (1 << 5) | ||
169 | |||
170 | #define S3C64XX_SPCONSLP_RSTOUT_MASK (0x3 << 12) | ||
171 | #define S3C64XX_SPCONSLP_RSTOUT_OUT0 (0x0 << 12) | ||
172 | #define S3C64XX_SPCONSLP_RSTOUT_OUT1 (0x1 << 12) | ||
173 | #define S3C64XX_SPCONSLP_RSTOUT_HIZ (0x2 << 12) | ||
174 | |||
175 | #define S3C64XX_SPCONSLP_KPCOL_MASK (0x3 << 0) | ||
176 | #define S3C64XX_SPCONSLP_KPCOL_OUT0 (0x0 << 0) | ||
177 | #define S3C64XX_SPCONSLP_KPCOL_OUT1 (0x1 << 0) | ||
178 | #define S3C64XX_SPCONSLP_KPCOL_INP (0x2 << 0) | ||
179 | |||
180 | |||
181 | #define S3C64XX_SLPEN S3C64XX_GPIOREG(0x930) | ||
182 | |||
183 | #define S3C64XX_SLPEN_USE_xSLP (1 << 0) | ||
184 | #define S3C64XX_SLPEN_CFG_BYSLPEN (1 << 1) | ||
185 | |||
186 | #endif /* __ASM_PLAT_S3C64XX_REGS_GPIO_H */ | ||
187 | |||
diff --git a/arch/arm/mach-s3c64xx/include/mach/regs-irq.h b/arch/arm/mach-s3c64xx/include/mach/regs-irq.h new file mode 100644 index 000000000000..bcce68a0bb75 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/regs-irq.h | |||
@@ -0,0 +1,20 @@ | |||
1 | /* linux/arch/arm/mach-s3c6400/include/mach/regs-irq.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * http://armlinux.simtec.co.uk/ | ||
6 | * Ben Dooks <ben@simtec.co.uk> | ||
7 | * | ||
8 | * S3C64XX - IRQ 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 __ASM_ARCH_REGS_IRQ_H | ||
16 | #define __ASM_ARCH_REGS_IRQ_H __FILE__ | ||
17 | |||
18 | #include <asm/hardware/vic.h> | ||
19 | |||
20 | #endif /* __ASM_ARCH_6400_REGS_IRQ_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/regs-modem.h b/arch/arm/mach-s3c64xx/include/mach/regs-modem.h new file mode 100644 index 000000000000..49f7759dedfa --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/regs-modem.h | |||
@@ -0,0 +1,31 @@ | |||
1 | /* arch/arm/plat-s3c64xx/include/plat/regs-modem.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * http://armlinux.simtec.co.uk/ | ||
6 | * Ben Dooks <ben@simtec.co.uk> | ||
7 | * | ||
8 | * S3C64XX - modem block registers | ||
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_S3C64XX_REGS_MODEM_H | ||
16 | #define __PLAT_S3C64XX_REGS_MODEM_H __FILE__ | ||
17 | |||
18 | #define S3C64XX_MODEMREG(x) (S3C64XX_VA_MODEM + (x)) | ||
19 | |||
20 | #define S3C64XX_MODEM_INT2AP S3C64XX_MODEMREG(0x0) | ||
21 | #define S3C64XX_MODEM_INT2MODEM S3C64XX_MODEMREG(0x4) | ||
22 | #define S3C64XX_MODEM_MIFCON S3C64XX_MODEMREG(0x8) | ||
23 | #define S3C64XX_MODEM_MIFPCON S3C64XX_MODEMREG(0xC) | ||
24 | #define S3C64XX_MODEM_INTCLR S3C64XX_MODEMREG(0x10) | ||
25 | #define S3C64XX_MODEM_DMA_TXADDR S3C64XX_MODEMREG(0x14) | ||
26 | #define S3C64XX_MODEM_DMA_RXADDR S3C64XX_MODEMREG(0x18) | ||
27 | |||
28 | #define MIFPCON_INT2M_LEVEL (1 << 4) | ||
29 | #define MIFPCON_LCD_BYPASS (1 << 3) | ||
30 | |||
31 | #endif /* __PLAT_S3C64XX_REGS_MODEM_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/regs-srom.h b/arch/arm/mach-s3c64xx/include/mach/regs-srom.h new file mode 100644 index 000000000000..756731b36297 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/regs-srom.h | |||
@@ -0,0 +1,59 @@ | |||
1 | /* arch/arm/plat-s3c64xx/include/plat/regs-srom.h | ||
2 | * | ||
3 | * Copyright 2009 Andy Green <andy@warmcat.com> | ||
4 | * | ||
5 | * S3C64XX SROM definitions | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #ifndef __PLAT_REGS_SROM_H | ||
13 | #define __PLAT_REGS_SROM_H __FILE__ | ||
14 | |||
15 | #define S3C64XX_SROMREG(x) (S3C_VA_MEM + (x)) | ||
16 | |||
17 | #define S3C64XX_SROM_BW S3C64XX_SROMREG(0) | ||
18 | #define S3C64XX_SROM_BC0 S3C64XX_SROMREG(4) | ||
19 | #define S3C64XX_SROM_BC1 S3C64XX_SROMREG(8) | ||
20 | #define S3C64XX_SROM_BC2 S3C64XX_SROMREG(0xc) | ||
21 | #define S3C64XX_SROM_BC3 S3C64XX_SROMREG(0x10) | ||
22 | #define S3C64XX_SROM_BC4 S3C64XX_SROMREG(0x14) | ||
23 | #define S3C64XX_SROM_BC5 S3C64XX_SROMREG(0x18) | ||
24 | |||
25 | /* | ||
26 | * one register BW holds 5 x 4-bit packed settings for NCS0 - NCS4 | ||
27 | */ | ||
28 | |||
29 | #define S3C64XX_SROM_BW__DATAWIDTH__SHIFT 0 | ||
30 | #define S3C64XX_SROM_BW__WAITENABLE__SHIFT 2 | ||
31 | #define S3C64XX_SROM_BW__BYTEENABLE__SHIFT 3 | ||
32 | #define S3C64XX_SROM_BW__CS_MASK 0xf | ||
33 | |||
34 | #define S3C64XX_SROM_BW__NCS0__SHIFT 0 | ||
35 | #define S3C64XX_SROM_BW__NCS1__SHIFT 4 | ||
36 | #define S3C64XX_SROM_BW__NCS2__SHIFT 8 | ||
37 | #define S3C64XX_SROM_BW__NCS3__SHIFT 0xc | ||
38 | #define S3C64XX_SROM_BW__NCS4__SHIFT 0x10 | ||
39 | |||
40 | /* | ||
41 | * applies to same to BCS0 - BCS4 | ||
42 | */ | ||
43 | |||
44 | #define S3C64XX_SROM_BCX__PMC__SHIFT 0 | ||
45 | #define S3C64XX_SROM_BCX__PMC__MASK 3 | ||
46 | #define S3C64XX_SROM_BCX__TACP__SHIFT 4 | ||
47 | #define S3C64XX_SROM_BCX__TACP__MASK 0xf | ||
48 | #define S3C64XX_SROM_BCX__TCAH__SHIFT 8 | ||
49 | #define S3C64XX_SROM_BCX__TCAH__MASK 0xf | ||
50 | #define S3C64XX_SROM_BCX__TCOH__SHIFT 12 | ||
51 | #define S3C64XX_SROM_BCX__TCOH__MASK 0xf | ||
52 | #define S3C64XX_SROM_BCX__TACC__SHIFT 16 | ||
53 | #define S3C64XX_SROM_BCX__TACC__MASK 0x1f | ||
54 | #define S3C64XX_SROM_BCX__TCOS__SHIFT 24 | ||
55 | #define S3C64XX_SROM_BCX__TCOS__MASK 0xf | ||
56 | #define S3C64XX_SROM_BCX__TACS__SHIFT 28 | ||
57 | #define S3C64XX_SROM_BCX__TACS__MASK 0xf | ||
58 | |||
59 | #endif /* _PLAT_REGS_SROM_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/regs-sys.h b/arch/arm/mach-s3c64xx/include/mach/regs-sys.h new file mode 100644 index 000000000000..69b78d9f83b8 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/regs-sys.h | |||
@@ -0,0 +1,28 @@ | |||
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_AHB_CON0 S3C_SYSREG(0x100) | ||
21 | #define S3C64XX_AHB_CON1 S3C_SYSREG(0x104) | ||
22 | #define S3C64XX_AHB_CON2 S3C_SYSREG(0x108) | ||
23 | |||
24 | #define S3C64XX_OTHERS S3C_SYSREG(0x900) | ||
25 | |||
26 | #define S3C64XX_OTHERS_USBMASK (1 << 16) | ||
27 | |||
28 | #endif /* _PLAT_REGS_SYS_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/regs-syscon-power.h b/arch/arm/mach-s3c64xx/include/mach/regs-syscon-power.h new file mode 100644 index 000000000000..270d96ac9705 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/regs-syscon-power.h | |||
@@ -0,0 +1,116 @@ | |||
1 | /* arch/arm/plat-s3c64xx/include/plat/regs-syscon-power.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * http://armlinux.simtec.co.uk/ | ||
6 | * Ben Dooks <ben@simtec.co.uk> | ||
7 | * | ||
8 | * S3C64XX - syscon power and sleep control registers | ||
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_S3C64XX_REGS_SYSCON_POWER_H | ||
16 | #define __PLAT_S3C64XX_REGS_SYSCON_POWER_H __FILE__ | ||
17 | |||
18 | #define S3C64XX_PWR_CFG S3C_SYSREG(0x804) | ||
19 | |||
20 | #define S3C64XX_PWRCFG_OSC_OTG_DISABLE (1 << 17) | ||
21 | #define S3C64XX_PWRCFG_MMC2_DISABLE (1 << 16) | ||
22 | #define S3C64XX_PWRCFG_MMC1_DISABLE (1 << 15) | ||
23 | #define S3C64XX_PWRCFG_MMC0_DISABLE (1 << 14) | ||
24 | #define S3C64XX_PWRCFG_HSI_DISABLE (1 << 13) | ||
25 | #define S3C64XX_PWRCFG_TS_DISABLE (1 << 12) | ||
26 | #define S3C64XX_PWRCFG_RTC_TICK_DISABLE (1 << 11) | ||
27 | #define S3C64XX_PWRCFG_RTC_ALARM_DISABLE (1 << 10) | ||
28 | #define S3C64XX_PWRCFG_MSM_DISABLE (1 << 9) | ||
29 | #define S3C64XX_PWRCFG_KEY_DISABLE (1 << 8) | ||
30 | #define S3C64XX_PWRCFG_BATF_DISABLE (1 << 7) | ||
31 | |||
32 | #define S3C64XX_PWRCFG_CFG_WFI_MASK (0x3 << 5) | ||
33 | #define S3C64XX_PWRCFG_CFG_WFI_SHIFT (5) | ||
34 | #define S3C64XX_PWRCFG_CFG_WFI_IGNORE (0x0 << 5) | ||
35 | #define S3C64XX_PWRCFG_CFG_WFI_IDLE (0x1 << 5) | ||
36 | #define S3C64XX_PWRCFG_CFG_WFI_STOP (0x2 << 5) | ||
37 | #define S3C64XX_PWRCFG_CFG_WFI_SLEEP (0x3 << 5) | ||
38 | |||
39 | #define S3C64XX_PWRCFG_CFG_BATFLT_MASK (0x3 << 3) | ||
40 | #define S3C64XX_PWRCFG_CFG_BATFLT_SHIFT (3) | ||
41 | #define S3C64XX_PWRCFG_CFG_BATFLT_IGNORE (0x0 << 3) | ||
42 | #define S3C64XX_PWRCFG_CFG_BATFLT_IRQ (0x1 << 3) | ||
43 | #define S3C64XX_PWRCFG_CFG_BATFLT_SLEEP (0x3 << 3) | ||
44 | |||
45 | #define S3C64XX_PWRCFG_CFG_BAT_WAKE (1 << 2) | ||
46 | #define S3C64XX_PWRCFG_OSC27_EN (1 << 0) | ||
47 | |||
48 | #define S3C64XX_EINT_MASK S3C_SYSREG(0x808) | ||
49 | |||
50 | #define S3C64XX_NORMAL_CFG S3C_SYSREG(0x810) | ||
51 | |||
52 | #define S3C64XX_NORMALCFG_IROM_ON (1 << 30) | ||
53 | #define S3C64XX_NORMALCFG_DOMAIN_ETM_ON (1 << 16) | ||
54 | #define S3C64XX_NORMALCFG_DOMAIN_S_ON (1 << 15) | ||
55 | #define S3C64XX_NORMALCFG_DOMAIN_F_ON (1 << 14) | ||
56 | #define S3C64XX_NORMALCFG_DOMAIN_P_ON (1 << 13) | ||
57 | #define S3C64XX_NORMALCFG_DOMAIN_I_ON (1 << 12) | ||
58 | #define S3C64XX_NORMALCFG_DOMAIN_G_ON (1 << 10) | ||
59 | #define S3C64XX_NORMALCFG_DOMAIN_V_ON (1 << 9) | ||
60 | |||
61 | #define S3C64XX_STOP_CFG S3C_SYSREG(0x814) | ||
62 | |||
63 | #define S3C64XX_STOPCFG_MEMORY_ARM_ON (1 << 29) | ||
64 | #define S3C64XX_STOPCFG_TOP_MEMORY_ON (1 << 20) | ||
65 | #define S3C64XX_STOPCFG_ARM_LOGIC_ON (1 << 17) | ||
66 | #define S3C64XX_STOPCFG_TOP_LOGIC_ON (1 << 8) | ||
67 | #define S3C64XX_STOPCFG_OSC_EN (1 << 0) | ||
68 | |||
69 | #define S3C64XX_SLEEP_CFG S3C_SYSREG(0x818) | ||
70 | |||
71 | #define S3C64XX_SLEEPCFG_OSC_EN (1 << 0) | ||
72 | |||
73 | #define S3C64XX_STOP_MEM_CFG S3C_SYSREG(0x81c) | ||
74 | |||
75 | #define S3C64XX_STOPMEMCFG_MODEMIF_RETAIN (1 << 6) | ||
76 | #define S3C64XX_STOPMEMCFG_HOSTIF_RETAIN (1 << 5) | ||
77 | #define S3C64XX_STOPMEMCFG_OTG_RETAIN (1 << 4) | ||
78 | #define S3C64XX_STOPMEMCFG_HSMCC_RETAIN (1 << 3) | ||
79 | #define S3C64XX_STOPMEMCFG_IROM_RETAIN (1 << 2) | ||
80 | #define S3C64XX_STOPMEMCFG_IRDA_RETAIN (1 << 1) | ||
81 | #define S3C64XX_STOPMEMCFG_NFCON_RETAIN (1 << 0) | ||
82 | |||
83 | #define S3C64XX_OSC_STABLE S3C_SYSREG(0x824) | ||
84 | #define S3C64XX_PWR_STABLE S3C_SYSREG(0x828) | ||
85 | |||
86 | #define S3C64XX_WAKEUP_STAT S3C_SYSREG(0x908) | ||
87 | |||
88 | #define S3C64XX_WAKEUPSTAT_MMC2 (1 << 11) | ||
89 | #define S3C64XX_WAKEUPSTAT_MMC1 (1 << 10) | ||
90 | #define S3C64XX_WAKEUPSTAT_MMC0 (1 << 9) | ||
91 | #define S3C64XX_WAKEUPSTAT_HSI (1 << 8) | ||
92 | #define S3C64XX_WAKEUPSTAT_BATFLT (1 << 6) | ||
93 | #define S3C64XX_WAKEUPSTAT_MSM (1 << 5) | ||
94 | #define S3C64XX_WAKEUPSTAT_KEY (1 << 4) | ||
95 | #define S3C64XX_WAKEUPSTAT_TS (1 << 3) | ||
96 | #define S3C64XX_WAKEUPSTAT_RTC_TICK (1 << 2) | ||
97 | #define S3C64XX_WAKEUPSTAT_RTC_ALARM (1 << 1) | ||
98 | #define S3C64XX_WAKEUPSTAT_EINT (1 << 0) | ||
99 | |||
100 | #define S3C64XX_BLK_PWR_STAT S3C_SYSREG(0x90c) | ||
101 | |||
102 | #define S3C64XX_BLKPWRSTAT_G (1 << 7) | ||
103 | #define S3C64XX_BLKPWRSTAT_ETM (1 << 6) | ||
104 | #define S3C64XX_BLKPWRSTAT_S (1 << 5) | ||
105 | #define S3C64XX_BLKPWRSTAT_F (1 << 4) | ||
106 | #define S3C64XX_BLKPWRSTAT_P (1 << 3) | ||
107 | #define S3C64XX_BLKPWRSTAT_I (1 << 2) | ||
108 | #define S3C64XX_BLKPWRSTAT_V (1 << 1) | ||
109 | #define S3C64XX_BLKPWRSTAT_TOP (1 << 0) | ||
110 | |||
111 | #define S3C64XX_INFORM0 S3C_SYSREG(0xA00) | ||
112 | #define S3C64XX_INFORM1 S3C_SYSREG(0xA04) | ||
113 | #define S3C64XX_INFORM2 S3C_SYSREG(0xA08) | ||
114 | #define S3C64XX_INFORM3 S3C_SYSREG(0xA0C) | ||
115 | |||
116 | #endif /* __PLAT_S3C64XX_REGS_SYSCON_POWER_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/s3c6400.h b/arch/arm/mach-s3c64xx/include/mach/s3c6400.h new file mode 100644 index 000000000000..f86958d05352 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/s3c6400.h | |||
@@ -0,0 +1,36 @@ | |||
1 | /* arch/arm/mach-s3c64xx/include/macht/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_setup_clocks(void); | ||
19 | |||
20 | extern void s3c64xx_register_clocks(unsigned long xtal, unsigned armclk_limit); | ||
21 | |||
22 | #ifdef CONFIG_CPU_S3C6400 | ||
23 | |||
24 | extern int s3c6400_init(void); | ||
25 | extern void s3c6400_init_irq(void); | ||
26 | extern void s3c6400_map_io(void); | ||
27 | extern void s3c6400_init_clocks(int xtal); | ||
28 | |||
29 | #define s3c6400_init_uarts s3c6400_common_init_uarts | ||
30 | |||
31 | #else | ||
32 | #define s3c6400_init_clocks NULL | ||
33 | #define s3c6400_init_uarts NULL | ||
34 | #define s3c6400_map_io NULL | ||
35 | #define s3c6400_init NULL | ||
36 | #endif | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/s3c6410.h b/arch/arm/mach-s3c64xx/include/mach/s3c6410.h new file mode 100644 index 000000000000..24f1141ffcb7 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/s3c6410.h | |||
@@ -0,0 +1,29 @@ | |||
1 | /* arch/arm/mach-s3c64xx/include/mach/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/mach-s3c64xx/include/mach/spi-clocks.h b/arch/arm/mach-s3c64xx/include/mach/spi-clocks.h new file mode 100644 index 000000000000..9d0c43b4b687 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/spi-clocks.h | |||
@@ -0,0 +1,18 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/spi-clocks.h | ||
2 | * | ||
3 | * Copyright (C) 2009 Samsung Electronics Ltd. | ||
4 | * Jaswinder Singh <jassi.brar@samsung.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #ifndef __S3C64XX_PLAT_SPI_CLKS_H | ||
12 | #define __S3C64XX_PLAT_SPI_CLKS_H __FILE__ | ||
13 | |||
14 | #define S3C64XX_SPI_SRCCLK_PCLK 0 | ||
15 | #define S3C64XX_SPI_SRCCLK_SPIBUS 1 | ||
16 | #define S3C64XX_SPI_SRCCLK_48M 2 | ||
17 | |||
18 | #endif /* __S3C64XX_PLAT_SPI_CLKS_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/system.h b/arch/arm/mach-s3c64xx/include/mach/system.h new file mode 100644 index 000000000000..2e58cb7a7147 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/system.h | |||
@@ -0,0 +1,30 @@ | |||
1 | /* linux/arch/arm/mach-s3c6400/include/mach/system.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 | * S3C6400 - system implementation | ||
9 | */ | ||
10 | |||
11 | #ifndef __ASM_ARCH_SYSTEM_H | ||
12 | #define __ASM_ARCH_SYSTEM_H __FILE__ | ||
13 | |||
14 | #include <plat/watchdog-reset.h> | ||
15 | |||
16 | static void arch_idle(void) | ||
17 | { | ||
18 | /* nothing here yet */ | ||
19 | } | ||
20 | |||
21 | static void arch_reset(char mode, const char *cmd) | ||
22 | { | ||
23 | if (mode != 's') | ||
24 | arch_wdt_reset(); | ||
25 | |||
26 | /* if all else fails, or mode was for soft, jump to 0 */ | ||
27 | cpu_reset(0); | ||
28 | } | ||
29 | |||
30 | #endif /* __ASM_ARCH_IRQ_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/tick.h b/arch/arm/mach-s3c64xx/include/mach/tick.h new file mode 100644 index 000000000000..ebe18a9469b8 --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/tick.h | |||
@@ -0,0 +1,29 @@ | |||
1 | /* linux/arch/arm/mach-s3c6400/include/mach/tick.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * http://armlinux.simtec.co.uk/ | ||
6 | * Ben Dooks <ben@simtec.co.uk> | ||
7 | * | ||
8 | * S3C64XX - Timer tick support 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 __ASM_ARCH_TICK_H | ||
16 | #define __ASM_ARCH_TICK_H __FILE__ | ||
17 | |||
18 | /* note, the timer interrutps turn up in 2 places, the vic and then | ||
19 | * the timer block. We take the VIC as the base at the moment. | ||
20 | */ | ||
21 | static inline u32 s3c24xx_ostimer_pending(void) | ||
22 | { | ||
23 | u32 pend = __raw_readl(VA_VIC0 + VIC_RAW_STATUS); | ||
24 | return pend & 1 << (IRQ_TIMER4_VIC - S3C64XX_IRQ_VIC0(0)); | ||
25 | } | ||
26 | |||
27 | #define TICK_MAX (0xffffffff) | ||
28 | |||
29 | #endif /* __ASM_ARCH_6400_TICK_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/uncompress.h b/arch/arm/mach-s3c64xx/include/mach/uncompress.h new file mode 100644 index 000000000000..c6a82a20bf2a --- /dev/null +++ b/arch/arm/mach-s3c64xx/include/mach/uncompress.h | |||
@@ -0,0 +1,28 @@ | |||
1 | /* arch/arm/mach-s3c6400/include/mach/uncompress.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * http://armlinux.simtec.co.uk/ | ||
6 | * Ben Dooks <ben@simtec.co.uk> | ||
7 | * | ||
8 | * S3C6400 - uncompress 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 | #ifndef __ASM_ARCH_UNCOMPRESS_H | ||
16 | #define __ASM_ARCH_UNCOMPRESS_H | ||
17 | |||
18 | #include <mach/map.h> | ||
19 | #include <plat/uncompress.h> | ||
20 | |||
21 | static void arch_detect_cpu(void) | ||
22 | { | ||
23 | /* we do not need to do any cpu detection here at the moment. */ | ||
24 | fifo_mask = S3C2440_UFSTAT_TXMASK; | ||
25 | fifo_max = 63 << S3C2440_UFSTAT_TXSHIFT; | ||
26 | } | ||
27 | |||
28 | #endif /* __ASM_ARCH_UNCOMPRESS_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/irq-eint.c b/arch/arm/mach-s3c64xx/irq-eint.c new file mode 100644 index 000000000000..5682d6a7f4af --- /dev/null +++ b/arch/arm/mach-s3c64xx/irq-eint.c | |||
@@ -0,0 +1,213 @@ | |||
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/sysdev.h> | ||
18 | #include <linux/gpio.h> | ||
19 | #include <linux/irq.h> | ||
20 | #include <linux/io.h> | ||
21 | |||
22 | #include <asm/hardware/vic.h> | ||
23 | |||
24 | #include <plat/regs-irqtype.h> | ||
25 | #include <mach/regs-gpio.h> | ||
26 | #include <plat/gpio-cfg.h> | ||
27 | |||
28 | #include <mach/map.h> | ||
29 | #include <plat/cpu.h> | ||
30 | #include <plat/pm.h> | ||
31 | |||
32 | #define eint_offset(irq) ((irq) - IRQ_EINT(0)) | ||
33 | #define eint_irq_to_bit(irq) (1 << eint_offset(irq)) | ||
34 | |||
35 | static inline void s3c_irq_eint_mask(unsigned int irq) | ||
36 | { | ||
37 | u32 mask; | ||
38 | |||
39 | mask = __raw_readl(S3C64XX_EINT0MASK); | ||
40 | mask |= eint_irq_to_bit(irq); | ||
41 | __raw_writel(mask, S3C64XX_EINT0MASK); | ||
42 | } | ||
43 | |||
44 | static void s3c_irq_eint_unmask(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 inline void s3c_irq_eint_ack(unsigned int irq) | ||
54 | { | ||
55 | __raw_writel(eint_irq_to_bit(irq), S3C64XX_EINT0PEND); | ||
56 | } | ||
57 | |||
58 | static void s3c_irq_eint_maskack(unsigned int irq) | ||
59 | { | ||
60 | /* compiler should in-line these */ | ||
61 | s3c_irq_eint_mask(irq); | ||
62 | s3c_irq_eint_ack(irq); | ||
63 | } | ||
64 | |||
65 | static int s3c_irq_eint_set_type(unsigned int irq, unsigned int type) | ||
66 | { | ||
67 | int offs = eint_offset(irq); | ||
68 | int pin, pin_val; | ||
69 | int shift; | ||
70 | u32 ctrl, mask; | ||
71 | u32 newvalue = 0; | ||
72 | void __iomem *reg; | ||
73 | |||
74 | if (offs > 27) | ||
75 | return -EINVAL; | ||
76 | |||
77 | if (offs <= 15) | ||
78 | reg = S3C64XX_EINT0CON0; | ||
79 | else | ||
80 | reg = S3C64XX_EINT0CON1; | ||
81 | |||
82 | switch (type) { | ||
83 | case IRQ_TYPE_NONE: | ||
84 | printk(KERN_WARNING "No edge setting!\n"); | ||
85 | break; | ||
86 | |||
87 | case IRQ_TYPE_EDGE_RISING: | ||
88 | newvalue = S3C2410_EXTINT_RISEEDGE; | ||
89 | break; | ||
90 | |||
91 | case IRQ_TYPE_EDGE_FALLING: | ||
92 | newvalue = S3C2410_EXTINT_FALLEDGE; | ||
93 | break; | ||
94 | |||
95 | case IRQ_TYPE_EDGE_BOTH: | ||
96 | newvalue = S3C2410_EXTINT_BOTHEDGE; | ||
97 | break; | ||
98 | |||
99 | case IRQ_TYPE_LEVEL_LOW: | ||
100 | newvalue = S3C2410_EXTINT_LOWLEV; | ||
101 | break; | ||
102 | |||
103 | case IRQ_TYPE_LEVEL_HIGH: | ||
104 | newvalue = S3C2410_EXTINT_HILEV; | ||
105 | break; | ||
106 | |||
107 | default: | ||
108 | printk(KERN_ERR "No such irq type %d", type); | ||
109 | return -1; | ||
110 | } | ||
111 | |||
112 | if (offs <= 15) | ||
113 | shift = (offs / 2) * 4; | ||
114 | else | ||
115 | shift = ((offs - 16) / 2) * 4; | ||
116 | mask = 0x7 << shift; | ||
117 | |||
118 | ctrl = __raw_readl(reg); | ||
119 | ctrl &= ~mask; | ||
120 | ctrl |= newvalue << shift; | ||
121 | __raw_writel(ctrl, reg); | ||
122 | |||
123 | /* set the GPIO pin appropriately */ | ||
124 | |||
125 | if (offs < 16) { | ||
126 | pin = S3C64XX_GPN(offs); | ||
127 | pin_val = S3C_GPIO_SFN(2); | ||
128 | } else if (offs < 23) { | ||
129 | pin = S3C64XX_GPL(offs + 8 - 16); | ||
130 | pin_val = S3C_GPIO_SFN(3); | ||
131 | } else { | ||
132 | pin = S3C64XX_GPM(offs - 23); | ||
133 | pin_val = S3C_GPIO_SFN(3); | ||
134 | } | ||
135 | |||
136 | s3c_gpio_cfgpin(pin, pin_val); | ||
137 | |||
138 | return 0; | ||
139 | } | ||
140 | |||
141 | static struct irq_chip s3c_irq_eint = { | ||
142 | .name = "s3c-eint", | ||
143 | .mask = s3c_irq_eint_mask, | ||
144 | .unmask = s3c_irq_eint_unmask, | ||
145 | .mask_ack = s3c_irq_eint_maskack, | ||
146 | .ack = s3c_irq_eint_ack, | ||
147 | .set_type = s3c_irq_eint_set_type, | ||
148 | .set_wake = s3c_irqext_wake, | ||
149 | }; | ||
150 | |||
151 | /* s3c_irq_demux_eint | ||
152 | * | ||
153 | * This function demuxes the IRQ from the group0 external interrupts, | ||
154 | * from IRQ_EINT(0) to IRQ_EINT(27). It is designed to be inlined into | ||
155 | * the specific handlers s3c_irq_demux_eintX_Y. | ||
156 | */ | ||
157 | static inline void s3c_irq_demux_eint(unsigned int start, unsigned int end) | ||
158 | { | ||
159 | u32 status = __raw_readl(S3C64XX_EINT0PEND); | ||
160 | u32 mask = __raw_readl(S3C64XX_EINT0MASK); | ||
161 | unsigned int irq; | ||
162 | |||
163 | status &= ~mask; | ||
164 | status >>= start; | ||
165 | status &= (1 << (end - start + 1)) - 1; | ||
166 | |||
167 | for (irq = IRQ_EINT(start); irq <= IRQ_EINT(end); irq++) { | ||
168 | if (status & 1) | ||
169 | generic_handle_irq(irq); | ||
170 | |||
171 | status >>= 1; | ||
172 | } | ||
173 | } | ||
174 | |||
175 | static void s3c_irq_demux_eint0_3(unsigned int irq, struct irq_desc *desc) | ||
176 | { | ||
177 | s3c_irq_demux_eint(0, 3); | ||
178 | } | ||
179 | |||
180 | static void s3c_irq_demux_eint4_11(unsigned int irq, struct irq_desc *desc) | ||
181 | { | ||
182 | s3c_irq_demux_eint(4, 11); | ||
183 | } | ||
184 | |||
185 | static void s3c_irq_demux_eint12_19(unsigned int irq, struct irq_desc *desc) | ||
186 | { | ||
187 | s3c_irq_demux_eint(12, 19); | ||
188 | } | ||
189 | |||
190 | static void s3c_irq_demux_eint20_27(unsigned int irq, struct irq_desc *desc) | ||
191 | { | ||
192 | s3c_irq_demux_eint(20, 27); | ||
193 | } | ||
194 | |||
195 | static int __init s3c64xx_init_irq_eint(void) | ||
196 | { | ||
197 | int irq; | ||
198 | |||
199 | for (irq = IRQ_EINT(0); irq <= IRQ_EINT(27); irq++) { | ||
200 | set_irq_chip(irq, &s3c_irq_eint); | ||
201 | set_irq_handler(irq, handle_level_irq); | ||
202 | set_irq_flags(irq, IRQF_VALID); | ||
203 | } | ||
204 | |||
205 | set_irq_chained_handler(IRQ_EINT0_3, s3c_irq_demux_eint0_3); | ||
206 | set_irq_chained_handler(IRQ_EINT4_11, s3c_irq_demux_eint4_11); | ||
207 | set_irq_chained_handler(IRQ_EINT12_19, s3c_irq_demux_eint12_19); | ||
208 | set_irq_chained_handler(IRQ_EINT20_27, s3c_irq_demux_eint20_27); | ||
209 | |||
210 | return 0; | ||
211 | } | ||
212 | |||
213 | arch_initcall(s3c64xx_init_irq_eint); | ||
diff --git a/arch/arm/mach-s3c64xx/irq-pm.c b/arch/arm/mach-s3c64xx/irq-pm.c new file mode 100644 index 000000000000..da1bec64b9da --- /dev/null +++ b/arch/arm/mach-s3c64xx/irq-pm.c | |||
@@ -0,0 +1,111 @@ | |||
1 | /* arch/arm/plat-s3c64xx/irq-pm.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 Power Management | ||
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/sysdev.h> | ||
17 | #include <linux/interrupt.h> | ||
18 | #include <linux/serial_core.h> | ||
19 | #include <linux/irq.h> | ||
20 | #include <linux/io.h> | ||
21 | |||
22 | #include <mach/map.h> | ||
23 | |||
24 | #include <plat/regs-serial.h> | ||
25 | #include <plat/regs-timer.h> | ||
26 | #include <mach/regs-gpio.h> | ||
27 | #include <plat/cpu.h> | ||
28 | #include <plat/pm.h> | ||
29 | |||
30 | /* We handled all the IRQ types in this code, to save having to make several | ||
31 | * small files to handle each different type separately. Having the EINT_GRP | ||
32 | * code here shouldn't be as much bloat as the IRQ table space needed when | ||
33 | * they are enabled. The added benefit is we ensure that these registers are | ||
34 | * in the same state as we suspended. | ||
35 | */ | ||
36 | |||
37 | static struct sleep_save irq_save[] = { | ||
38 | SAVE_ITEM(S3C64XX_PRIORITY), | ||
39 | SAVE_ITEM(S3C64XX_EINT0CON0), | ||
40 | SAVE_ITEM(S3C64XX_EINT0CON1), | ||
41 | SAVE_ITEM(S3C64XX_EINT0FLTCON0), | ||
42 | SAVE_ITEM(S3C64XX_EINT0FLTCON1), | ||
43 | SAVE_ITEM(S3C64XX_EINT0FLTCON2), | ||
44 | SAVE_ITEM(S3C64XX_EINT0FLTCON3), | ||
45 | SAVE_ITEM(S3C64XX_EINT0MASK), | ||
46 | SAVE_ITEM(S3C64XX_TINT_CSTAT), | ||
47 | }; | ||
48 | |||
49 | static struct irq_grp_save { | ||
50 | u32 fltcon; | ||
51 | u32 con; | ||
52 | u32 mask; | ||
53 | } eint_grp_save[5]; | ||
54 | |||
55 | static u32 irq_uart_mask[CONFIG_SERIAL_SAMSUNG_UARTS]; | ||
56 | |||
57 | static int s3c64xx_irq_pm_suspend(struct sys_device *dev, pm_message_t state) | ||
58 | { | ||
59 | struct irq_grp_save *grp = eint_grp_save; | ||
60 | int i; | ||
61 | |||
62 | S3C_PMDBG("%s: suspending IRQs\n", __func__); | ||
63 | |||
64 | s3c_pm_do_save(irq_save, ARRAY_SIZE(irq_save)); | ||
65 | |||
66 | for (i = 0; i < CONFIG_SERIAL_SAMSUNG_UARTS; i++) | ||
67 | irq_uart_mask[i] = __raw_readl(S3C_VA_UARTx(i) + S3C64XX_UINTM); | ||
68 | |||
69 | for (i = 0; i < ARRAY_SIZE(eint_grp_save); i++, grp++) { | ||
70 | grp->con = __raw_readl(S3C64XX_EINT12CON + (i * 4)); | ||
71 | grp->mask = __raw_readl(S3C64XX_EINT12MASK + (i * 4)); | ||
72 | grp->fltcon = __raw_readl(S3C64XX_EINT12FLTCON + (i * 4)); | ||
73 | } | ||
74 | |||
75 | return 0; | ||
76 | } | ||
77 | |||
78 | static int s3c64xx_irq_pm_resume(struct sys_device *dev) | ||
79 | { | ||
80 | struct irq_grp_save *grp = eint_grp_save; | ||
81 | int i; | ||
82 | |||
83 | S3C_PMDBG("%s: resuming IRQs\n", __func__); | ||
84 | |||
85 | s3c_pm_do_restore(irq_save, ARRAY_SIZE(irq_save)); | ||
86 | |||
87 | for (i = 0; i < CONFIG_SERIAL_SAMSUNG_UARTS; i++) | ||
88 | __raw_writel(irq_uart_mask[i], S3C_VA_UARTx(i) + S3C64XX_UINTM); | ||
89 | |||
90 | for (i = 0; i < ARRAY_SIZE(eint_grp_save); i++, grp++) { | ||
91 | __raw_writel(grp->con, S3C64XX_EINT12CON + (i * 4)); | ||
92 | __raw_writel(grp->mask, S3C64XX_EINT12MASK + (i * 4)); | ||
93 | __raw_writel(grp->fltcon, S3C64XX_EINT12FLTCON + (i * 4)); | ||
94 | } | ||
95 | |||
96 | S3C_PMDBG("%s: IRQ configuration restored\n", __func__); | ||
97 | return 0; | ||
98 | } | ||
99 | |||
100 | static struct sysdev_driver s3c64xx_irq_driver = { | ||
101 | .suspend = s3c64xx_irq_pm_suspend, | ||
102 | .resume = s3c64xx_irq_pm_resume, | ||
103 | }; | ||
104 | |||
105 | static int __init s3c64xx_irq_pm_init(void) | ||
106 | { | ||
107 | return sysdev_driver_register(&s3c64xx_sysclass, &s3c64xx_irq_driver); | ||
108 | } | ||
109 | |||
110 | arch_initcall(s3c64xx_irq_pm_init); | ||
111 | |||
diff --git a/arch/arm/mach-s3c64xx/irq.c b/arch/arm/mach-s3c64xx/irq.c new file mode 100644 index 000000000000..67a145d440f3 --- /dev/null +++ b/arch/arm/mach-s3c64xx/irq.c | |||
@@ -0,0 +1,69 @@ | |||
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/serial_core.h> | ||
18 | #include <linux/irq.h> | ||
19 | #include <linux/io.h> | ||
20 | |||
21 | #include <asm/hardware/vic.h> | ||
22 | |||
23 | #include <mach/map.h> | ||
24 | #include <plat/irq-vic-timer.h> | ||
25 | #include <plat/irq-uart.h> | ||
26 | #include <plat/cpu.h> | ||
27 | |||
28 | static struct s3c_uart_irq uart_irqs[] = { | ||
29 | [0] = { | ||
30 | .regs = S3C_VA_UART0, | ||
31 | .base_irq = IRQ_S3CUART_BASE0, | ||
32 | .parent_irq = IRQ_UART0, | ||
33 | }, | ||
34 | [1] = { | ||
35 | .regs = S3C_VA_UART1, | ||
36 | .base_irq = IRQ_S3CUART_BASE1, | ||
37 | .parent_irq = IRQ_UART1, | ||
38 | }, | ||
39 | [2] = { | ||
40 | .regs = S3C_VA_UART2, | ||
41 | .base_irq = IRQ_S3CUART_BASE2, | ||
42 | .parent_irq = IRQ_UART2, | ||
43 | }, | ||
44 | [3] = { | ||
45 | .regs = S3C_VA_UART3, | ||
46 | .base_irq = IRQ_S3CUART_BASE3, | ||
47 | .parent_irq = IRQ_UART3, | ||
48 | }, | ||
49 | }; | ||
50 | |||
51 | |||
52 | void __init s3c64xx_init_irq(u32 vic0_valid, u32 vic1_valid) | ||
53 | { | ||
54 | printk(KERN_DEBUG "%s: initialising interrupts\n", __func__); | ||
55 | |||
56 | /* initialise the pair of VICs */ | ||
57 | vic_init(VA_VIC0, IRQ_VIC0_BASE, vic0_valid, 0); | ||
58 | vic_init(VA_VIC1, IRQ_VIC1_BASE, vic1_valid, 0); | ||
59 | |||
60 | /* add the timer sub-irqs */ | ||
61 | |||
62 | s3c_init_vic_timer_irq(IRQ_TIMER0_VIC, IRQ_TIMER0); | ||
63 | s3c_init_vic_timer_irq(IRQ_TIMER1_VIC, IRQ_TIMER1); | ||
64 | s3c_init_vic_timer_irq(IRQ_TIMER2_VIC, IRQ_TIMER2); | ||
65 | s3c_init_vic_timer_irq(IRQ_TIMER3_VIC, IRQ_TIMER3); | ||
66 | s3c_init_vic_timer_irq(IRQ_TIMER4_VIC, IRQ_TIMER4); | ||
67 | |||
68 | s3c_init_uart_irqs(uart_irqs, ARRAY_SIZE(uart_irqs)); | ||
69 | } | ||
diff --git a/arch/arm/mach-s3c64xx/mach-anw6410.c b/arch/arm/mach-s3c64xx/mach-anw6410.c new file mode 100644 index 000000000000..4a0bb243d14a --- /dev/null +++ b/arch/arm/mach-s3c64xx/mach-anw6410.c | |||
@@ -0,0 +1,245 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/mach-anw6410.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 | * Copyright 2009 Kwangwoo Lee | ||
8 | * Kwangwoo Lee <kwangwoo.lee@gmail.com> | ||
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/timer.h> | ||
21 | #include <linux/init.h> | ||
22 | #include <linux/serial_core.h> | ||
23 | #include <linux/platform_device.h> | ||
24 | #include <linux/io.h> | ||
25 | #include <linux/i2c.h> | ||
26 | #include <linux/fb.h> | ||
27 | #include <linux/gpio.h> | ||
28 | #include <linux/delay.h> | ||
29 | #include <linux/dm9000.h> | ||
30 | |||
31 | #include <video/platform_lcd.h> | ||
32 | |||
33 | #include <asm/mach/arch.h> | ||
34 | #include <asm/mach/map.h> | ||
35 | #include <asm/mach/irq.h> | ||
36 | |||
37 | #include <mach/hardware.h> | ||
38 | #include <mach/regs-fb.h> | ||
39 | #include <mach/map.h> | ||
40 | |||
41 | #include <asm/irq.h> | ||
42 | #include <asm/mach-types.h> | ||
43 | |||
44 | #include <plat/regs-serial.h> | ||
45 | #include <plat/iic.h> | ||
46 | #include <plat/fb.h> | ||
47 | |||
48 | #include <mach/s3c6410.h> | ||
49 | #include <plat/clock.h> | ||
50 | #include <plat/devs.h> | ||
51 | #include <plat/cpu.h> | ||
52 | #include <mach/regs-gpio.h> | ||
53 | #include <mach/regs-modem.h> | ||
54 | |||
55 | /* DM9000 */ | ||
56 | #define ANW6410_PA_DM9000 (0x18000000) | ||
57 | |||
58 | /* A hardware buffer to control external devices is mapped at 0x30000000. | ||
59 | * It can not be read. So current status must be kept in anw6410_extdev_status. | ||
60 | */ | ||
61 | #define ANW6410_VA_EXTDEV S3C_ADDR(0x02000000) | ||
62 | #define ANW6410_PA_EXTDEV (0x30000000) | ||
63 | |||
64 | #define ANW6410_EN_DM9000 (1<<11) | ||
65 | #define ANW6410_EN_LCD (1<<14) | ||
66 | |||
67 | static __u32 anw6410_extdev_status; | ||
68 | |||
69 | static struct s3c2410_uartcfg anw6410_uartcfgs[] __initdata = { | ||
70 | [0] = { | ||
71 | .hwport = 0, | ||
72 | .flags = 0, | ||
73 | .ucon = 0x3c5, | ||
74 | .ulcon = 0x03, | ||
75 | .ufcon = 0x51, | ||
76 | }, | ||
77 | [1] = { | ||
78 | .hwport = 1, | ||
79 | .flags = 0, | ||
80 | .ucon = 0x3c5, | ||
81 | .ulcon = 0x03, | ||
82 | .ufcon = 0x51, | ||
83 | }, | ||
84 | }; | ||
85 | |||
86 | /* framebuffer and LCD setup. */ | ||
87 | static void __init anw6410_lcd_mode_set(void) | ||
88 | { | ||
89 | u32 tmp; | ||
90 | |||
91 | /* set the LCD type */ | ||
92 | tmp = __raw_readl(S3C64XX_SPCON); | ||
93 | tmp &= ~S3C64XX_SPCON_LCD_SEL_MASK; | ||
94 | tmp |= S3C64XX_SPCON_LCD_SEL_RGB; | ||
95 | __raw_writel(tmp, S3C64XX_SPCON); | ||
96 | |||
97 | /* remove the LCD bypass */ | ||
98 | tmp = __raw_readl(S3C64XX_MODEM_MIFPCON); | ||
99 | tmp &= ~MIFPCON_LCD_BYPASS; | ||
100 | __raw_writel(tmp, S3C64XX_MODEM_MIFPCON); | ||
101 | } | ||
102 | |||
103 | /* GPF1 = LCD panel power | ||
104 | * GPF4 = LCD backlight control | ||
105 | */ | ||
106 | static void anw6410_lcd_power_set(struct plat_lcd_data *pd, | ||
107 | unsigned int power) | ||
108 | { | ||
109 | if (power) { | ||
110 | anw6410_extdev_status |= (ANW6410_EN_LCD << 16); | ||
111 | __raw_writel(anw6410_extdev_status, ANW6410_VA_EXTDEV); | ||
112 | |||
113 | gpio_direction_output(S3C64XX_GPF(1), 1); | ||
114 | gpio_direction_output(S3C64XX_GPF(4), 1); | ||
115 | } else { | ||
116 | anw6410_extdev_status &= ~(ANW6410_EN_LCD << 16); | ||
117 | __raw_writel(anw6410_extdev_status, ANW6410_VA_EXTDEV); | ||
118 | |||
119 | gpio_direction_output(S3C64XX_GPF(1), 0); | ||
120 | gpio_direction_output(S3C64XX_GPF(4), 0); | ||
121 | } | ||
122 | } | ||
123 | |||
124 | static struct plat_lcd_data anw6410_lcd_power_data = { | ||
125 | .set_power = anw6410_lcd_power_set, | ||
126 | }; | ||
127 | |||
128 | static struct platform_device anw6410_lcd_powerdev = { | ||
129 | .name = "platform-lcd", | ||
130 | .dev.parent = &s3c_device_fb.dev, | ||
131 | .dev.platform_data = &anw6410_lcd_power_data, | ||
132 | }; | ||
133 | |||
134 | static struct s3c_fb_pd_win anw6410_fb_win0 = { | ||
135 | /* this is to ensure we use win0 */ | ||
136 | .win_mode = { | ||
137 | .pixclock = 41094, | ||
138 | .left_margin = 8, | ||
139 | .right_margin = 13, | ||
140 | .upper_margin = 7, | ||
141 | .lower_margin = 5, | ||
142 | .hsync_len = 3, | ||
143 | .vsync_len = 1, | ||
144 | .xres = 800, | ||
145 | .yres = 480, | ||
146 | }, | ||
147 | .max_bpp = 32, | ||
148 | .default_bpp = 16, | ||
149 | }; | ||
150 | |||
151 | /* 405566 clocks per frame => 60Hz refresh requires 24333960Hz clock */ | ||
152 | static struct s3c_fb_platdata anw6410_lcd_pdata __initdata = { | ||
153 | .setup_gpio = s3c64xx_fb_gpio_setup_24bpp, | ||
154 | .win[0] = &anw6410_fb_win0, | ||
155 | .vidcon0 = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB, | ||
156 | .vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC, | ||
157 | }; | ||
158 | |||
159 | /* DM9000AEP 10/100 ethernet controller */ | ||
160 | static void __init anw6410_dm9000_enable(void) | ||
161 | { | ||
162 | anw6410_extdev_status |= (ANW6410_EN_DM9000 << 16); | ||
163 | __raw_writel(anw6410_extdev_status, ANW6410_VA_EXTDEV); | ||
164 | } | ||
165 | |||
166 | static struct resource anw6410_dm9000_resource[] = { | ||
167 | [0] = { | ||
168 | .start = ANW6410_PA_DM9000, | ||
169 | .end = ANW6410_PA_DM9000 + 3, | ||
170 | .flags = IORESOURCE_MEM, | ||
171 | }, | ||
172 | [1] = { | ||
173 | .start = ANW6410_PA_DM9000 + 4, | ||
174 | .end = ANW6410_PA_DM9000 + 4 + 500, | ||
175 | .flags = IORESOURCE_MEM, | ||
176 | }, | ||
177 | [2] = { | ||
178 | .start = IRQ_EINT(15), | ||
179 | .end = IRQ_EINT(15), | ||
180 | .flags = IORESOURCE_IRQ | IRQF_TRIGGER_HIGH, | ||
181 | }, | ||
182 | }; | ||
183 | |||
184 | static struct dm9000_plat_data anw6410_dm9000_pdata = { | ||
185 | .flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM), | ||
186 | /* dev_addr can be set to provide hwaddr. */ | ||
187 | }; | ||
188 | |||
189 | static struct platform_device anw6410_device_eth = { | ||
190 | .name = "dm9000", | ||
191 | .id = -1, | ||
192 | .num_resources = ARRAY_SIZE(anw6410_dm9000_resource), | ||
193 | .resource = anw6410_dm9000_resource, | ||
194 | .dev = { | ||
195 | .platform_data = &anw6410_dm9000_pdata, | ||
196 | }, | ||
197 | }; | ||
198 | |||
199 | static struct map_desc anw6410_iodesc[] __initdata = { | ||
200 | { | ||
201 | .virtual = (unsigned long)ANW6410_VA_EXTDEV, | ||
202 | .pfn = __phys_to_pfn(ANW6410_PA_EXTDEV), | ||
203 | .length = SZ_64K, | ||
204 | .type = MT_DEVICE, | ||
205 | }, | ||
206 | }; | ||
207 | |||
208 | static struct platform_device *anw6410_devices[] __initdata = { | ||
209 | &s3c_device_fb, | ||
210 | &anw6410_lcd_powerdev, | ||
211 | &anw6410_device_eth, | ||
212 | }; | ||
213 | |||
214 | static void __init anw6410_map_io(void) | ||
215 | { | ||
216 | s3c64xx_init_io(anw6410_iodesc, ARRAY_SIZE(anw6410_iodesc)); | ||
217 | s3c24xx_init_clocks(12000000); | ||
218 | s3c24xx_init_uarts(anw6410_uartcfgs, ARRAY_SIZE(anw6410_uartcfgs)); | ||
219 | |||
220 | anw6410_lcd_mode_set(); | ||
221 | } | ||
222 | |||
223 | static void __init anw6410_machine_init(void) | ||
224 | { | ||
225 | s3c_fb_set_platdata(&anw6410_lcd_pdata); | ||
226 | |||
227 | gpio_request(S3C64XX_GPF(1), "panel power"); | ||
228 | gpio_request(S3C64XX_GPF(4), "LCD backlight"); | ||
229 | |||
230 | anw6410_dm9000_enable(); | ||
231 | |||
232 | platform_add_devices(anw6410_devices, ARRAY_SIZE(anw6410_devices)); | ||
233 | } | ||
234 | |||
235 | MACHINE_START(ANW6410, "A&W6410") | ||
236 | /* Maintainer: Kwangwoo Lee <kwangwoo.lee@gmail.com> */ | ||
237 | .phys_io = S3C_PA_UART & 0xfff00000, | ||
238 | .io_pg_offst = (((u32)S3C_VA_UART) >> 18) & 0xfffc, | ||
239 | .boot_params = S3C64XX_PA_SDRAM + 0x100, | ||
240 | |||
241 | .init_irq = s3c6410_init_irq, | ||
242 | .map_io = anw6410_map_io, | ||
243 | .init_machine = anw6410_machine_init, | ||
244 | .timer = &s3c24xx_timer, | ||
245 | MACHINE_END | ||
diff --git a/arch/arm/mach-s3c64xx/mach-hmt.c b/arch/arm/mach-s3c64xx/mach-hmt.c new file mode 100644 index 000000000000..a6d91c39f22e --- /dev/null +++ b/arch/arm/mach-s3c64xx/mach-hmt.c | |||
@@ -0,0 +1,276 @@ | |||
1 | /* mach-hmt.c - Platform code for Airgoo HMT | ||
2 | * | ||
3 | * Copyright 2009 Peter Korsgaard <jacmet@sunsite.dk> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/serial_core.h> | ||
14 | #include <linux/platform_device.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/i2c.h> | ||
17 | #include <linux/fb.h> | ||
18 | #include <linux/gpio.h> | ||
19 | #include <linux/delay.h> | ||
20 | #include <linux/leds.h> | ||
21 | #include <linux/pwm_backlight.h> | ||
22 | #include <linux/mtd/mtd.h> | ||
23 | #include <linux/mtd/partitions.h> | ||
24 | |||
25 | #include <asm/mach/arch.h> | ||
26 | #include <asm/mach/map.h> | ||
27 | #include <asm/mach/irq.h> | ||
28 | |||
29 | #include <mach/hardware.h> | ||
30 | #include <mach/regs-fb.h> | ||
31 | #include <mach/map.h> | ||
32 | |||
33 | #include <asm/irq.h> | ||
34 | #include <asm/mach-types.h> | ||
35 | |||
36 | #include <plat/regs-serial.h> | ||
37 | #include <plat/iic.h> | ||
38 | #include <plat/fb.h> | ||
39 | #include <plat/nand.h> | ||
40 | |||
41 | #include <mach/s3c6410.h> | ||
42 | #include <plat/clock.h> | ||
43 | #include <plat/devs.h> | ||
44 | #include <plat/cpu.h> | ||
45 | |||
46 | #define UCON S3C2410_UCON_DEFAULT | ||
47 | #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE) | ||
48 | #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE) | ||
49 | |||
50 | static struct s3c2410_uartcfg hmt_uartcfgs[] __initdata = { | ||
51 | [0] = { | ||
52 | .hwport = 0, | ||
53 | .flags = 0, | ||
54 | .ucon = UCON, | ||
55 | .ulcon = ULCON, | ||
56 | .ufcon = UFCON, | ||
57 | }, | ||
58 | [1] = { | ||
59 | .hwport = 1, | ||
60 | .flags = 0, | ||
61 | .ucon = UCON, | ||
62 | .ulcon = ULCON, | ||
63 | .ufcon = UFCON, | ||
64 | }, | ||
65 | [2] = { | ||
66 | .hwport = 2, | ||
67 | .flags = 0, | ||
68 | .ucon = UCON, | ||
69 | .ulcon = ULCON, | ||
70 | .ufcon = UFCON, | ||
71 | }, | ||
72 | }; | ||
73 | |||
74 | static int hmt_bl_init(struct device *dev) | ||
75 | { | ||
76 | int ret; | ||
77 | |||
78 | ret = gpio_request(S3C64XX_GPB(4), "lcd backlight enable"); | ||
79 | if (!ret) | ||
80 | ret = gpio_direction_output(S3C64XX_GPB(4), 0); | ||
81 | |||
82 | return ret; | ||
83 | } | ||
84 | |||
85 | static int hmt_bl_notify(int brightness) | ||
86 | { | ||
87 | /* | ||
88 | * translate from CIELUV/CIELAB L*->brightness, E.G. from | ||
89 | * perceived luminance to light output. Assumes range 0..25600 | ||
90 | */ | ||
91 | if (brightness < 0x800) { | ||
92 | /* Y = Yn * L / 903.3 */ | ||
93 | brightness = (100*256 * brightness + 231245/2) / 231245; | ||
94 | } else { | ||
95 | /* Y = Yn * ((L + 16) / 116 )^3 */ | ||
96 | int t = (brightness*4 + 16*1024 + 58)/116; | ||
97 | brightness = 25 * ((t * t * t + 0x100000/2) / 0x100000); | ||
98 | } | ||
99 | |||
100 | gpio_set_value(S3C64XX_GPB(4), brightness); | ||
101 | |||
102 | return brightness; | ||
103 | } | ||
104 | |||
105 | static void hmt_bl_exit(struct device *dev) | ||
106 | { | ||
107 | gpio_free(S3C64XX_GPB(4)); | ||
108 | } | ||
109 | |||
110 | static struct platform_pwm_backlight_data hmt_backlight_data = { | ||
111 | .pwm_id = 1, | ||
112 | .max_brightness = 100 * 256, | ||
113 | .dft_brightness = 40 * 256, | ||
114 | .pwm_period_ns = 1000000000 / (100 * 256 * 20), | ||
115 | .init = hmt_bl_init, | ||
116 | .notify = hmt_bl_notify, | ||
117 | .exit = hmt_bl_exit, | ||
118 | |||
119 | }; | ||
120 | |||
121 | static struct platform_device hmt_backlight_device = { | ||
122 | .name = "pwm-backlight", | ||
123 | .dev = { | ||
124 | .parent = &s3c_device_timer[1].dev, | ||
125 | .platform_data = &hmt_backlight_data, | ||
126 | }, | ||
127 | }; | ||
128 | |||
129 | static struct s3c_fb_pd_win hmt_fb_win0 = { | ||
130 | .win_mode = { | ||
131 | .pixclock = 41094, | ||
132 | .left_margin = 8, | ||
133 | .right_margin = 13, | ||
134 | .upper_margin = 7, | ||
135 | .lower_margin = 5, | ||
136 | .hsync_len = 3, | ||
137 | .vsync_len = 1, | ||
138 | .xres = 800, | ||
139 | .yres = 480, | ||
140 | }, | ||
141 | .max_bpp = 32, | ||
142 | .default_bpp = 16, | ||
143 | }; | ||
144 | |||
145 | /* 405566 clocks per frame => 60Hz refresh requires 24333960Hz clock */ | ||
146 | static struct s3c_fb_platdata hmt_lcd_pdata __initdata = { | ||
147 | .setup_gpio = s3c64xx_fb_gpio_setup_24bpp, | ||
148 | .win[0] = &hmt_fb_win0, | ||
149 | .vidcon0 = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB, | ||
150 | .vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC, | ||
151 | }; | ||
152 | |||
153 | static struct mtd_partition hmt_nand_part[] = { | ||
154 | [0] = { | ||
155 | .name = "uboot", | ||
156 | .size = SZ_512K, | ||
157 | .offset = 0, | ||
158 | }, | ||
159 | [1] = { | ||
160 | .name = "uboot-env1", | ||
161 | .size = SZ_256K, | ||
162 | .offset = SZ_512K, | ||
163 | }, | ||
164 | [2] = { | ||
165 | .name = "uboot-env2", | ||
166 | .size = SZ_256K, | ||
167 | .offset = SZ_512K + SZ_256K, | ||
168 | }, | ||
169 | [3] = { | ||
170 | .name = "kernel", | ||
171 | .size = SZ_2M, | ||
172 | .offset = SZ_1M, | ||
173 | }, | ||
174 | [4] = { | ||
175 | .name = "rootfs", | ||
176 | .size = MTDPART_SIZ_FULL, | ||
177 | .offset = SZ_1M + SZ_2M, | ||
178 | }, | ||
179 | }; | ||
180 | |||
181 | static struct s3c2410_nand_set hmt_nand_sets[] = { | ||
182 | [0] = { | ||
183 | .name = "nand", | ||
184 | .nr_chips = 1, | ||
185 | .nr_partitions = ARRAY_SIZE(hmt_nand_part), | ||
186 | .partitions = hmt_nand_part, | ||
187 | }, | ||
188 | }; | ||
189 | |||
190 | static struct s3c2410_platform_nand hmt_nand_info = { | ||
191 | .tacls = 25, | ||
192 | .twrph0 = 55, | ||
193 | .twrph1 = 40, | ||
194 | .nr_sets = ARRAY_SIZE(hmt_nand_sets), | ||
195 | .sets = hmt_nand_sets, | ||
196 | }; | ||
197 | |||
198 | static struct gpio_led hmt_leds[] = { | ||
199 | { /* left function keys */ | ||
200 | .name = "left:blue", | ||
201 | .gpio = S3C64XX_GPO(12), | ||
202 | .default_trigger = "default-on", | ||
203 | }, | ||
204 | { /* right function keys - red */ | ||
205 | .name = "right:red", | ||
206 | .gpio = S3C64XX_GPO(13), | ||
207 | }, | ||
208 | { /* right function keys - green */ | ||
209 | .name = "right:green", | ||
210 | .gpio = S3C64XX_GPO(14), | ||
211 | }, | ||
212 | { /* right function keys - blue */ | ||
213 | .name = "right:blue", | ||
214 | .gpio = S3C64XX_GPO(15), | ||
215 | .default_trigger = "default-on", | ||
216 | }, | ||
217 | }; | ||
218 | |||
219 | static struct gpio_led_platform_data hmt_led_data = { | ||
220 | .num_leds = ARRAY_SIZE(hmt_leds), | ||
221 | .leds = hmt_leds, | ||
222 | }; | ||
223 | |||
224 | static struct platform_device hmt_leds_device = { | ||
225 | .name = "leds-gpio", | ||
226 | .id = -1, | ||
227 | .dev.platform_data = &hmt_led_data, | ||
228 | }; | ||
229 | |||
230 | static struct map_desc hmt_iodesc[] = {}; | ||
231 | |||
232 | static struct platform_device *hmt_devices[] __initdata = { | ||
233 | &s3c_device_i2c0, | ||
234 | &s3c_device_nand, | ||
235 | &s3c_device_fb, | ||
236 | &s3c_device_ohci, | ||
237 | &s3c_device_timer[1], | ||
238 | &hmt_backlight_device, | ||
239 | &hmt_leds_device, | ||
240 | }; | ||
241 | |||
242 | static void __init hmt_map_io(void) | ||
243 | { | ||
244 | s3c64xx_init_io(hmt_iodesc, ARRAY_SIZE(hmt_iodesc)); | ||
245 | s3c24xx_init_clocks(12000000); | ||
246 | s3c24xx_init_uarts(hmt_uartcfgs, ARRAY_SIZE(hmt_uartcfgs)); | ||
247 | } | ||
248 | |||
249 | static void __init hmt_machine_init(void) | ||
250 | { | ||
251 | s3c_i2c0_set_platdata(NULL); | ||
252 | s3c_fb_set_platdata(&hmt_lcd_pdata); | ||
253 | s3c_nand_set_platdata(&hmt_nand_info); | ||
254 | |||
255 | gpio_request(S3C64XX_GPC(7), "usb power"); | ||
256 | gpio_direction_output(S3C64XX_GPC(7), 0); | ||
257 | gpio_request(S3C64XX_GPM(0), "usb power"); | ||
258 | gpio_direction_output(S3C64XX_GPM(0), 1); | ||
259 | gpio_request(S3C64XX_GPK(7), "usb power"); | ||
260 | gpio_direction_output(S3C64XX_GPK(7), 1); | ||
261 | gpio_request(S3C64XX_GPF(13), "usb power"); | ||
262 | gpio_direction_output(S3C64XX_GPF(13), 1); | ||
263 | |||
264 | platform_add_devices(hmt_devices, ARRAY_SIZE(hmt_devices)); | ||
265 | } | ||
266 | |||
267 | MACHINE_START(HMT, "Airgoo-HMT") | ||
268 | /* Maintainer: Peter Korsgaard <jacmet@sunsite.dk> */ | ||
269 | .phys_io = S3C_PA_UART & 0xfff00000, | ||
270 | .io_pg_offst = (((u32)S3C_VA_UART) >> 18) & 0xfffc, | ||
271 | .boot_params = S3C64XX_PA_SDRAM + 0x100, | ||
272 | .init_irq = s3c6410_init_irq, | ||
273 | .map_io = hmt_map_io, | ||
274 | .init_machine = hmt_machine_init, | ||
275 | .timer = &s3c24xx_timer, | ||
276 | MACHINE_END | ||
diff --git a/arch/arm/mach-s3c64xx/mach-ncp.c b/arch/arm/mach-s3c64xx/mach-ncp.c new file mode 100644 index 000000000000..bf65747ea68e --- /dev/null +++ b/arch/arm/mach-s3c64xx/mach-ncp.c | |||
@@ -0,0 +1,107 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-s3c64xx/mach-ncp.c | ||
3 | * | ||
4 | * Copyright (C) 2008-2009 Samsung Electronics | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/types.h> | ||
14 | #include <linux/interrupt.h> | ||
15 | #include <linux/list.h> | ||
16 | #include <linux/timer.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/serial_core.h> | ||
19 | #include <linux/platform_device.h> | ||
20 | #include <linux/io.h> | ||
21 | #include <linux/i2c.h> | ||
22 | #include <linux/fb.h> | ||
23 | #include <linux/gpio.h> | ||
24 | #include <linux/delay.h> | ||
25 | |||
26 | #include <video/platform_lcd.h> | ||
27 | |||
28 | #include <asm/mach/arch.h> | ||
29 | #include <asm/mach/map.h> | ||
30 | #include <asm/mach/irq.h> | ||
31 | |||
32 | #include <mach/hardware.h> | ||
33 | #include <mach/regs-fb.h> | ||
34 | #include <mach/map.h> | ||
35 | |||
36 | #include <asm/irq.h> | ||
37 | #include <asm/mach-types.h> | ||
38 | |||
39 | #include <plat/regs-serial.h> | ||
40 | #include <plat/iic.h> | ||
41 | #include <plat/fb.h> | ||
42 | |||
43 | #include <mach/s3c6410.h> | ||
44 | #include <plat/clock.h> | ||
45 | #include <plat/devs.h> | ||
46 | #include <plat/cpu.h> | ||
47 | |||
48 | #define UCON S3C2410_UCON_DEFAULT | ||
49 | #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | ||
50 | #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE | ||
51 | |||
52 | static struct s3c2410_uartcfg ncp_uartcfgs[] __initdata = { | ||
53 | /* REVISIT: NCP uses only serial 1, 2 */ | ||
54 | [0] = { | ||
55 | .hwport = 0, | ||
56 | .flags = 0, | ||
57 | .ucon = UCON, | ||
58 | .ulcon = ULCON, | ||
59 | .ufcon = UFCON, | ||
60 | }, | ||
61 | [1] = { | ||
62 | .hwport = 1, | ||
63 | .flags = 0, | ||
64 | .ucon = UCON, | ||
65 | .ulcon = ULCON, | ||
66 | .ufcon = UFCON, | ||
67 | }, | ||
68 | [2] = { | ||
69 | .hwport = 2, | ||
70 | .flags = 0, | ||
71 | .ucon = UCON, | ||
72 | .ulcon = ULCON, | ||
73 | .ufcon = UFCON, | ||
74 | }, | ||
75 | }; | ||
76 | |||
77 | static struct platform_device *ncp_devices[] __initdata = { | ||
78 | &s3c_device_hsmmc1, | ||
79 | &s3c_device_i2c0, | ||
80 | }; | ||
81 | |||
82 | static struct map_desc ncp_iodesc[] __initdata = {}; | ||
83 | |||
84 | static void __init ncp_map_io(void) | ||
85 | { | ||
86 | s3c64xx_init_io(ncp_iodesc, ARRAY_SIZE(ncp_iodesc)); | ||
87 | s3c24xx_init_clocks(12000000); | ||
88 | s3c24xx_init_uarts(ncp_uartcfgs, ARRAY_SIZE(ncp_uartcfgs)); | ||
89 | } | ||
90 | |||
91 | static void __init ncp_machine_init(void) | ||
92 | { | ||
93 | s3c_i2c0_set_platdata(NULL); | ||
94 | |||
95 | platform_add_devices(ncp_devices, ARRAY_SIZE(ncp_devices)); | ||
96 | } | ||
97 | |||
98 | MACHINE_START(NCP, "NCP") | ||
99 | /* Maintainer: Samsung Electronics */ | ||
100 | .phys_io = S3C_PA_UART & 0xfff00000, | ||
101 | .io_pg_offst = (((u32)S3C_VA_UART) >> 18) & 0xfffc, | ||
102 | .boot_params = S3C64XX_PA_SDRAM + 0x100, | ||
103 | .init_irq = s3c6410_init_irq, | ||
104 | .map_io = ncp_map_io, | ||
105 | .init_machine = ncp_machine_init, | ||
106 | .timer = &s3c24xx_timer, | ||
107 | MACHINE_END | ||
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6400.c b/arch/arm/mach-s3c64xx/mach-smdk6400.c new file mode 100644 index 000000000000..f7b18983950c --- /dev/null +++ b/arch/arm/mach-s3c64xx/mach-smdk6400.c | |||
@@ -0,0 +1,96 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/mach-smdk6400.c | ||
2 | * | ||
3 | * Copyright 2008 Simtec Electronics | ||
4 | * Ben Dooks <ben@simtec.co.uk> | ||
5 | * http://armlinux.simtec.co.uk/ | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/types.h> | ||
14 | #include <linux/interrupt.h> | ||
15 | #include <linux/list.h> | ||
16 | #include <linux/timer.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/serial_core.h> | ||
19 | #include <linux/platform_device.h> | ||
20 | #include <linux/i2c.h> | ||
21 | #include <linux/io.h> | ||
22 | |||
23 | #include <asm/mach-types.h> | ||
24 | |||
25 | #include <asm/mach/arch.h> | ||
26 | #include <asm/mach/map.h> | ||
27 | #include <asm/mach/irq.h> | ||
28 | |||
29 | #include <mach/hardware.h> | ||
30 | #include <mach/map.h> | ||
31 | |||
32 | #include <plat/regs-serial.h> | ||
33 | |||
34 | #include <mach/s3c6400.h> | ||
35 | #include <plat/clock.h> | ||
36 | #include <plat/devs.h> | ||
37 | #include <plat/cpu.h> | ||
38 | #include <plat/iic.h> | ||
39 | |||
40 | #define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK | ||
41 | #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB | ||
42 | #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE | ||
43 | |||
44 | static struct s3c2410_uartcfg smdk6400_uartcfgs[] __initdata = { | ||
45 | [0] = { | ||
46 | .hwport = 0, | ||
47 | .flags = 0, | ||
48 | .ucon = 0x3c5, | ||
49 | .ulcon = 0x03, | ||
50 | .ufcon = 0x51, | ||
51 | }, | ||
52 | [1] = { | ||
53 | .hwport = 1, | ||
54 | .flags = 0, | ||
55 | .ucon = 0x3c5, | ||
56 | .ulcon = 0x03, | ||
57 | .ufcon = 0x51, | ||
58 | }, | ||
59 | }; | ||
60 | |||
61 | static struct map_desc smdk6400_iodesc[] = {}; | ||
62 | |||
63 | static void __init smdk6400_map_io(void) | ||
64 | { | ||
65 | s3c64xx_init_io(smdk6400_iodesc, ARRAY_SIZE(smdk6400_iodesc)); | ||
66 | s3c24xx_init_clocks(12000000); | ||
67 | s3c24xx_init_uarts(smdk6400_uartcfgs, ARRAY_SIZE(smdk6400_uartcfgs)); | ||
68 | } | ||
69 | |||
70 | static struct platform_device *smdk6400_devices[] __initdata = { | ||
71 | &s3c_device_hsmmc1, | ||
72 | &s3c_device_i2c0, | ||
73 | }; | ||
74 | |||
75 | static struct i2c_board_info i2c_devs[] __initdata = { | ||
76 | { I2C_BOARD_INFO("wm8753", 0x1A), }, | ||
77 | { I2C_BOARD_INFO("24c08", 0x50), }, | ||
78 | }; | ||
79 | |||
80 | static void __init smdk6400_machine_init(void) | ||
81 | { | ||
82 | i2c_register_board_info(0, i2c_devs, ARRAY_SIZE(i2c_devs)); | ||
83 | platform_add_devices(smdk6400_devices, ARRAY_SIZE(smdk6400_devices)); | ||
84 | } | ||
85 | |||
86 | MACHINE_START(SMDK6400, "SMDK6400") | ||
87 | /* Maintainer: Ben Dooks <ben@fluff.org> */ | ||
88 | .phys_io = S3C_PA_UART & 0xfff00000, | ||
89 | .io_pg_offst = (((u32)S3C_VA_UART) >> 18) & 0xfffc, | ||
90 | .boot_params = S3C64XX_PA_SDRAM + 0x100, | ||
91 | |||
92 | .init_irq = s3c6400_init_irq, | ||
93 | .map_io = smdk6400_map_io, | ||
94 | .init_machine = smdk6400_machine_init, | ||
95 | .timer = &s3c24xx_timer, | ||
96 | MACHINE_END | ||
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c new file mode 100644 index 000000000000..fdf8f7539a12 --- /dev/null +++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c | |||
@@ -0,0 +1,491 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/mach-smdk6410.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 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | * | ||
12 | */ | ||
13 | |||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/types.h> | ||
16 | #include <linux/interrupt.h> | ||
17 | #include <linux/list.h> | ||
18 | #include <linux/timer.h> | ||
19 | #include <linux/init.h> | ||
20 | #include <linux/serial_core.h> | ||
21 | #include <linux/platform_device.h> | ||
22 | #include <linux/io.h> | ||
23 | #include <linux/i2c.h> | ||
24 | #include <linux/fb.h> | ||
25 | #include <linux/gpio.h> | ||
26 | #include <linux/delay.h> | ||
27 | #include <linux/smsc911x.h> | ||
28 | #include <linux/regulator/fixed.h> | ||
29 | |||
30 | #ifdef CONFIG_SMDK6410_WM1190_EV1 | ||
31 | #include <linux/mfd/wm8350/core.h> | ||
32 | #include <linux/mfd/wm8350/pmic.h> | ||
33 | #endif | ||
34 | |||
35 | #include <video/platform_lcd.h> | ||
36 | |||
37 | #include <asm/mach/arch.h> | ||
38 | #include <asm/mach/map.h> | ||
39 | #include <asm/mach/irq.h> | ||
40 | |||
41 | #include <mach/hardware.h> | ||
42 | #include <mach/regs-fb.h> | ||
43 | #include <mach/map.h> | ||
44 | |||
45 | #include <asm/irq.h> | ||
46 | #include <asm/mach-types.h> | ||
47 | |||
48 | #include <plat/regs-serial.h> | ||
49 | #include <mach/regs-modem.h> | ||
50 | #include <mach/regs-gpio.h> | ||
51 | #include <mach/regs-sys.h> | ||
52 | #include <mach/regs-srom.h> | ||
53 | #include <plat/iic.h> | ||
54 | #include <plat/fb.h> | ||
55 | #include <plat/gpio-cfg.h> | ||
56 | |||
57 | #include <mach/s3c6410.h> | ||
58 | #include <plat/clock.h> | ||
59 | #include <plat/devs.h> | ||
60 | #include <plat/cpu.h> | ||
61 | |||
62 | #define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK | ||
63 | #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB | ||
64 | #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE | ||
65 | |||
66 | static struct s3c2410_uartcfg smdk6410_uartcfgs[] __initdata = { | ||
67 | [0] = { | ||
68 | .hwport = 0, | ||
69 | .flags = 0, | ||
70 | .ucon = UCON, | ||
71 | .ulcon = ULCON, | ||
72 | .ufcon = UFCON, | ||
73 | }, | ||
74 | [1] = { | ||
75 | .hwport = 1, | ||
76 | .flags = 0, | ||
77 | .ucon = UCON, | ||
78 | .ulcon = ULCON, | ||
79 | .ufcon = UFCON, | ||
80 | }, | ||
81 | [2] = { | ||
82 | .hwport = 2, | ||
83 | .flags = 0, | ||
84 | .ucon = UCON, | ||
85 | .ulcon = ULCON, | ||
86 | .ufcon = UFCON, | ||
87 | }, | ||
88 | [3] = { | ||
89 | .hwport = 3, | ||
90 | .flags = 0, | ||
91 | .ucon = UCON, | ||
92 | .ulcon = ULCON, | ||
93 | .ufcon = UFCON, | ||
94 | }, | ||
95 | }; | ||
96 | |||
97 | /* framebuffer and LCD setup. */ | ||
98 | |||
99 | /* GPF15 = LCD backlight control | ||
100 | * GPF13 => Panel power | ||
101 | * GPN5 = LCD nRESET signal | ||
102 | * PWM_TOUT1 => backlight brightness | ||
103 | */ | ||
104 | |||
105 | static void smdk6410_lcd_power_set(struct plat_lcd_data *pd, | ||
106 | unsigned int power) | ||
107 | { | ||
108 | if (power) { | ||
109 | gpio_direction_output(S3C64XX_GPF(13), 1); | ||
110 | gpio_direction_output(S3C64XX_GPF(15), 1); | ||
111 | |||
112 | /* fire nRESET on power up */ | ||
113 | gpio_direction_output(S3C64XX_GPN(5), 0); | ||
114 | msleep(10); | ||
115 | gpio_direction_output(S3C64XX_GPN(5), 1); | ||
116 | msleep(1); | ||
117 | } else { | ||
118 | gpio_direction_output(S3C64XX_GPF(15), 0); | ||
119 | gpio_direction_output(S3C64XX_GPF(13), 0); | ||
120 | } | ||
121 | } | ||
122 | |||
123 | static struct plat_lcd_data smdk6410_lcd_power_data = { | ||
124 | .set_power = smdk6410_lcd_power_set, | ||
125 | }; | ||
126 | |||
127 | static struct platform_device smdk6410_lcd_powerdev = { | ||
128 | .name = "platform-lcd", | ||
129 | .dev.parent = &s3c_device_fb.dev, | ||
130 | .dev.platform_data = &smdk6410_lcd_power_data, | ||
131 | }; | ||
132 | |||
133 | static struct s3c_fb_pd_win smdk6410_fb_win0 = { | ||
134 | /* this is to ensure we use win0 */ | ||
135 | .win_mode = { | ||
136 | .pixclock = 41094, | ||
137 | .left_margin = 8, | ||
138 | .right_margin = 13, | ||
139 | .upper_margin = 7, | ||
140 | .lower_margin = 5, | ||
141 | .hsync_len = 3, | ||
142 | .vsync_len = 1, | ||
143 | .xres = 800, | ||
144 | .yres = 480, | ||
145 | }, | ||
146 | .max_bpp = 32, | ||
147 | .default_bpp = 16, | ||
148 | }; | ||
149 | |||
150 | /* 405566 clocks per frame => 60Hz refresh requires 24333960Hz clock */ | ||
151 | static struct s3c_fb_platdata smdk6410_lcd_pdata __initdata = { | ||
152 | .setup_gpio = s3c64xx_fb_gpio_setup_24bpp, | ||
153 | .win[0] = &smdk6410_fb_win0, | ||
154 | .vidcon0 = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB, | ||
155 | .vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC, | ||
156 | }; | ||
157 | |||
158 | /* | ||
159 | * Configuring Ethernet on SMDK6410 | ||
160 | * | ||
161 | * Both CS8900A and LAN9115 chips share one chip select mediated by CFG6. | ||
162 | * The constant address below corresponds to nCS1 | ||
163 | * | ||
164 | * 1) Set CFGB2 p3 ON others off, no other CFGB selects "ethernet" | ||
165 | * 2) CFG6 needs to be switched to "LAN9115" side | ||
166 | */ | ||
167 | |||
168 | static struct resource smdk6410_smsc911x_resources[] = { | ||
169 | [0] = { | ||
170 | .start = S3C64XX_PA_XM0CSN1, | ||
171 | .end = S3C64XX_PA_XM0CSN1 + SZ_64K - 1, | ||
172 | .flags = IORESOURCE_MEM, | ||
173 | }, | ||
174 | [1] = { | ||
175 | .start = S3C_EINT(10), | ||
176 | .end = S3C_EINT(10), | ||
177 | .flags = IORESOURCE_IRQ | IRQ_TYPE_LEVEL_LOW, | ||
178 | }, | ||
179 | }; | ||
180 | |||
181 | static struct smsc911x_platform_config smdk6410_smsc911x_pdata = { | ||
182 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, | ||
183 | .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, | ||
184 | .flags = SMSC911X_USE_32BIT | SMSC911X_FORCE_INTERNAL_PHY, | ||
185 | .phy_interface = PHY_INTERFACE_MODE_MII, | ||
186 | }; | ||
187 | |||
188 | |||
189 | static struct platform_device smdk6410_smsc911x = { | ||
190 | .name = "smsc911x", | ||
191 | .id = -1, | ||
192 | .num_resources = ARRAY_SIZE(smdk6410_smsc911x_resources), | ||
193 | .resource = &smdk6410_smsc911x_resources[0], | ||
194 | .dev = { | ||
195 | .platform_data = &smdk6410_smsc911x_pdata, | ||
196 | }, | ||
197 | }; | ||
198 | |||
199 | #ifdef CONFIG_REGULATOR | ||
200 | static struct regulator_consumer_supply smdk6410_b_pwr_5v_consumers[] = { | ||
201 | { | ||
202 | /* WM8580 */ | ||
203 | .supply = "PVDD", | ||
204 | .dev_name = "0-001b", | ||
205 | }, | ||
206 | { | ||
207 | /* WM8580 */ | ||
208 | .supply = "AVDD", | ||
209 | .dev_name = "0-001b", | ||
210 | }, | ||
211 | }; | ||
212 | |||
213 | static struct regulator_init_data smdk6410_b_pwr_5v_data = { | ||
214 | .constraints = { | ||
215 | .always_on = 1, | ||
216 | }, | ||
217 | .num_consumer_supplies = ARRAY_SIZE(smdk6410_b_pwr_5v_consumers), | ||
218 | .consumer_supplies = smdk6410_b_pwr_5v_consumers, | ||
219 | }; | ||
220 | |||
221 | static struct fixed_voltage_config smdk6410_b_pwr_5v_pdata = { | ||
222 | .supply_name = "B_PWR_5V", | ||
223 | .microvolts = 5000000, | ||
224 | .init_data = &smdk6410_b_pwr_5v_data, | ||
225 | .gpio = -EINVAL, | ||
226 | }; | ||
227 | |||
228 | static struct platform_device smdk6410_b_pwr_5v = { | ||
229 | .name = "reg-fixed-voltage", | ||
230 | .id = -1, | ||
231 | .dev = { | ||
232 | .platform_data = &smdk6410_b_pwr_5v_pdata, | ||
233 | }, | ||
234 | }; | ||
235 | #endif | ||
236 | |||
237 | static struct map_desc smdk6410_iodesc[] = {}; | ||
238 | |||
239 | static struct platform_device *smdk6410_devices[] __initdata = { | ||
240 | #ifdef CONFIG_SMDK6410_SD_CH0 | ||
241 | &s3c_device_hsmmc0, | ||
242 | #endif | ||
243 | #ifdef CONFIG_SMDK6410_SD_CH1 | ||
244 | &s3c_device_hsmmc1, | ||
245 | #endif | ||
246 | &s3c_device_i2c0, | ||
247 | &s3c_device_i2c1, | ||
248 | &s3c_device_fb, | ||
249 | &s3c_device_ohci, | ||
250 | &s3c_device_usb_hsotg, | ||
251 | |||
252 | #ifdef CONFIG_REGULATOR | ||
253 | &smdk6410_b_pwr_5v, | ||
254 | #endif | ||
255 | &smdk6410_lcd_powerdev, | ||
256 | |||
257 | &smdk6410_smsc911x, | ||
258 | }; | ||
259 | |||
260 | #ifdef CONFIG_SMDK6410_WM1190_EV1 | ||
261 | /* S3C64xx internal logic & PLL */ | ||
262 | static struct regulator_init_data wm8350_dcdc1_data = { | ||
263 | .constraints = { | ||
264 | .name = "PVDD_INT/PVDD_PLL", | ||
265 | .min_uV = 1200000, | ||
266 | .max_uV = 1200000, | ||
267 | .always_on = 1, | ||
268 | .apply_uV = 1, | ||
269 | }, | ||
270 | }; | ||
271 | |||
272 | /* Memory */ | ||
273 | static struct regulator_init_data wm8350_dcdc3_data = { | ||
274 | .constraints = { | ||
275 | .name = "PVDD_MEM", | ||
276 | .min_uV = 1800000, | ||
277 | .max_uV = 1800000, | ||
278 | .always_on = 1, | ||
279 | .state_mem = { | ||
280 | .uV = 1800000, | ||
281 | .mode = REGULATOR_MODE_NORMAL, | ||
282 | .enabled = 1, | ||
283 | }, | ||
284 | .initial_state = PM_SUSPEND_MEM, | ||
285 | }, | ||
286 | }; | ||
287 | |||
288 | /* USB, EXT, PCM, ADC/DAC, USB, MMC */ | ||
289 | static struct regulator_consumer_supply wm8350_dcdc4_consumers[] = { | ||
290 | { | ||
291 | /* WM8580 */ | ||
292 | .supply = "DVDD", | ||
293 | .dev_name = "0-001b", | ||
294 | }, | ||
295 | }; | ||
296 | |||
297 | static struct regulator_init_data wm8350_dcdc4_data = { | ||
298 | .constraints = { | ||
299 | .name = "PVDD_HI/PVDD_EXT/PVDD_SYS/PVCCM2MTV", | ||
300 | .min_uV = 3000000, | ||
301 | .max_uV = 3000000, | ||
302 | .always_on = 1, | ||
303 | }, | ||
304 | .num_consumer_supplies = ARRAY_SIZE(wm8350_dcdc4_consumers), | ||
305 | .consumer_supplies = wm8350_dcdc4_consumers, | ||
306 | }; | ||
307 | |||
308 | /* ARM core */ | ||
309 | static struct regulator_consumer_supply dcdc6_consumers[] = { | ||
310 | { | ||
311 | .supply = "vddarm", | ||
312 | } | ||
313 | }; | ||
314 | |||
315 | static struct regulator_init_data wm8350_dcdc6_data = { | ||
316 | .constraints = { | ||
317 | .name = "PVDD_ARM", | ||
318 | .min_uV = 1000000, | ||
319 | .max_uV = 1300000, | ||
320 | .always_on = 1, | ||
321 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE, | ||
322 | }, | ||
323 | .num_consumer_supplies = ARRAY_SIZE(dcdc6_consumers), | ||
324 | .consumer_supplies = dcdc6_consumers, | ||
325 | }; | ||
326 | |||
327 | /* Alive */ | ||
328 | static struct regulator_init_data wm8350_ldo1_data = { | ||
329 | .constraints = { | ||
330 | .name = "PVDD_ALIVE", | ||
331 | .min_uV = 1200000, | ||
332 | .max_uV = 1200000, | ||
333 | .always_on = 1, | ||
334 | .apply_uV = 1, | ||
335 | }, | ||
336 | }; | ||
337 | |||
338 | /* OTG */ | ||
339 | static struct regulator_init_data wm8350_ldo2_data = { | ||
340 | .constraints = { | ||
341 | .name = "PVDD_OTG", | ||
342 | .min_uV = 3300000, | ||
343 | .max_uV = 3300000, | ||
344 | .always_on = 1, | ||
345 | }, | ||
346 | }; | ||
347 | |||
348 | /* LCD */ | ||
349 | static struct regulator_init_data wm8350_ldo3_data = { | ||
350 | .constraints = { | ||
351 | .name = "PVDD_LCD", | ||
352 | .min_uV = 3000000, | ||
353 | .max_uV = 3000000, | ||
354 | .always_on = 1, | ||
355 | }, | ||
356 | }; | ||
357 | |||
358 | /* OTGi/1190-EV1 HPVDD & AVDD */ | ||
359 | static struct regulator_init_data wm8350_ldo4_data = { | ||
360 | .constraints = { | ||
361 | .name = "PVDD_OTGI/HPVDD/AVDD", | ||
362 | .min_uV = 1200000, | ||
363 | .max_uV = 1200000, | ||
364 | .apply_uV = 1, | ||
365 | .always_on = 1, | ||
366 | }, | ||
367 | }; | ||
368 | |||
369 | static struct { | ||
370 | int regulator; | ||
371 | struct regulator_init_data *initdata; | ||
372 | } wm1190_regulators[] = { | ||
373 | { WM8350_DCDC_1, &wm8350_dcdc1_data }, | ||
374 | { WM8350_DCDC_3, &wm8350_dcdc3_data }, | ||
375 | { WM8350_DCDC_4, &wm8350_dcdc4_data }, | ||
376 | { WM8350_DCDC_6, &wm8350_dcdc6_data }, | ||
377 | { WM8350_LDO_1, &wm8350_ldo1_data }, | ||
378 | { WM8350_LDO_2, &wm8350_ldo2_data }, | ||
379 | { WM8350_LDO_3, &wm8350_ldo3_data }, | ||
380 | { WM8350_LDO_4, &wm8350_ldo4_data }, | ||
381 | }; | ||
382 | |||
383 | static int __init smdk6410_wm8350_init(struct wm8350 *wm8350) | ||
384 | { | ||
385 | int i; | ||
386 | |||
387 | /* Configure the IRQ line */ | ||
388 | s3c_gpio_setpull(S3C64XX_GPN(12), S3C_GPIO_PULL_UP); | ||
389 | |||
390 | /* Instantiate the regulators */ | ||
391 | for (i = 0; i < ARRAY_SIZE(wm1190_regulators); i++) | ||
392 | wm8350_register_regulator(wm8350, | ||
393 | wm1190_regulators[i].regulator, | ||
394 | wm1190_regulators[i].initdata); | ||
395 | |||
396 | return 0; | ||
397 | } | ||
398 | |||
399 | static struct wm8350_platform_data __initdata smdk6410_wm8350_pdata = { | ||
400 | .init = smdk6410_wm8350_init, | ||
401 | .irq_high = 1, | ||
402 | .irq_base = IRQ_BOARD_START, | ||
403 | }; | ||
404 | #endif | ||
405 | |||
406 | static struct i2c_board_info i2c_devs0[] __initdata = { | ||
407 | { I2C_BOARD_INFO("24c08", 0x50), }, | ||
408 | { I2C_BOARD_INFO("wm8580", 0x1b), }, | ||
409 | |||
410 | #ifdef CONFIG_SMDK6410_WM1190_EV1 | ||
411 | { I2C_BOARD_INFO("wm8350", 0x1a), | ||
412 | .platform_data = &smdk6410_wm8350_pdata, | ||
413 | .irq = S3C_EINT(12), | ||
414 | }, | ||
415 | #endif | ||
416 | }; | ||
417 | |||
418 | static struct i2c_board_info i2c_devs1[] __initdata = { | ||
419 | { I2C_BOARD_INFO("24c128", 0x57), }, /* Samsung S524AD0XD1 */ | ||
420 | }; | ||
421 | |||
422 | static void __init smdk6410_map_io(void) | ||
423 | { | ||
424 | u32 tmp; | ||
425 | |||
426 | s3c64xx_init_io(smdk6410_iodesc, ARRAY_SIZE(smdk6410_iodesc)); | ||
427 | s3c24xx_init_clocks(12000000); | ||
428 | s3c24xx_init_uarts(smdk6410_uartcfgs, ARRAY_SIZE(smdk6410_uartcfgs)); | ||
429 | |||
430 | /* set the LCD type */ | ||
431 | |||
432 | tmp = __raw_readl(S3C64XX_SPCON); | ||
433 | tmp &= ~S3C64XX_SPCON_LCD_SEL_MASK; | ||
434 | tmp |= S3C64XX_SPCON_LCD_SEL_RGB; | ||
435 | __raw_writel(tmp, S3C64XX_SPCON); | ||
436 | |||
437 | /* remove the lcd bypass */ | ||
438 | tmp = __raw_readl(S3C64XX_MODEM_MIFPCON); | ||
439 | tmp &= ~MIFPCON_LCD_BYPASS; | ||
440 | __raw_writel(tmp, S3C64XX_MODEM_MIFPCON); | ||
441 | } | ||
442 | |||
443 | static void __init smdk6410_machine_init(void) | ||
444 | { | ||
445 | u32 cs1; | ||
446 | |||
447 | s3c_i2c0_set_platdata(NULL); | ||
448 | s3c_i2c1_set_platdata(NULL); | ||
449 | s3c_fb_set_platdata(&smdk6410_lcd_pdata); | ||
450 | |||
451 | /* configure nCS1 width to 16 bits */ | ||
452 | |||
453 | cs1 = __raw_readl(S3C64XX_SROM_BW) & | ||
454 | ~(S3C64XX_SROM_BW__CS_MASK << S3C64XX_SROM_BW__NCS1__SHIFT); | ||
455 | cs1 |= ((1 << S3C64XX_SROM_BW__DATAWIDTH__SHIFT) | | ||
456 | (1 << S3C64XX_SROM_BW__WAITENABLE__SHIFT) | | ||
457 | (1 << S3C64XX_SROM_BW__BYTEENABLE__SHIFT)) << | ||
458 | S3C64XX_SROM_BW__NCS1__SHIFT; | ||
459 | __raw_writel(cs1, S3C64XX_SROM_BW); | ||
460 | |||
461 | /* set timing for nCS1 suitable for ethernet chip */ | ||
462 | |||
463 | __raw_writel((0 << S3C64XX_SROM_BCX__PMC__SHIFT) | | ||
464 | (6 << S3C64XX_SROM_BCX__TACP__SHIFT) | | ||
465 | (4 << S3C64XX_SROM_BCX__TCAH__SHIFT) | | ||
466 | (1 << S3C64XX_SROM_BCX__TCOH__SHIFT) | | ||
467 | (0xe << S3C64XX_SROM_BCX__TACC__SHIFT) | | ||
468 | (4 << S3C64XX_SROM_BCX__TCOS__SHIFT) | | ||
469 | (0 << S3C64XX_SROM_BCX__TACS__SHIFT), S3C64XX_SROM_BC1); | ||
470 | |||
471 | gpio_request(S3C64XX_GPN(5), "LCD power"); | ||
472 | gpio_request(S3C64XX_GPF(13), "LCD power"); | ||
473 | gpio_request(S3C64XX_GPF(15), "LCD power"); | ||
474 | |||
475 | i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0)); | ||
476 | i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1)); | ||
477 | |||
478 | platform_add_devices(smdk6410_devices, ARRAY_SIZE(smdk6410_devices)); | ||
479 | } | ||
480 | |||
481 | MACHINE_START(SMDK6410, "SMDK6410") | ||
482 | /* Maintainer: Ben Dooks <ben@fluff.org> */ | ||
483 | .phys_io = S3C_PA_UART & 0xfff00000, | ||
484 | .io_pg_offst = (((u32)S3C_VA_UART) >> 18) & 0xfffc, | ||
485 | .boot_params = S3C64XX_PA_SDRAM + 0x100, | ||
486 | |||
487 | .init_irq = s3c6410_init_irq, | ||
488 | .map_io = smdk6410_map_io, | ||
489 | .init_machine = smdk6410_machine_init, | ||
490 | .timer = &s3c24xx_timer, | ||
491 | MACHINE_END | ||
diff --git a/arch/arm/mach-s3c64xx/pm.c b/arch/arm/mach-s3c64xx/pm.c new file mode 100644 index 000000000000..b8ac4597fad7 --- /dev/null +++ b/arch/arm/mach-s3c64xx/pm.c | |||
@@ -0,0 +1,173 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/pm.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 PM 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/suspend.h> | ||
17 | #include <linux/serial_core.h> | ||
18 | #include <linux/io.h> | ||
19 | |||
20 | #include <mach/map.h> | ||
21 | |||
22 | #include <plat/pm.h> | ||
23 | #include <mach/regs-sys.h> | ||
24 | #include <mach/regs-gpio.h> | ||
25 | #include <mach/regs-clock.h> | ||
26 | #include <mach/regs-syscon-power.h> | ||
27 | #include <mach/regs-gpio-memport.h> | ||
28 | |||
29 | #ifdef CONFIG_S3C_PM_DEBUG_LED_SMDK | ||
30 | #include <mach/gpio-bank-n.h> | ||
31 | |||
32 | void s3c_pm_debug_smdkled(u32 set, u32 clear) | ||
33 | { | ||
34 | unsigned long flags; | ||
35 | u32 reg; | ||
36 | |||
37 | local_irq_save(flags); | ||
38 | reg = __raw_readl(S3C64XX_GPNCON); | ||
39 | reg &= ~(S3C64XX_GPN_CONMASK(12) | S3C64XX_GPN_CONMASK(13) | | ||
40 | S3C64XX_GPN_CONMASK(14) | S3C64XX_GPN_CONMASK(15)); | ||
41 | reg |= S3C64XX_GPN_OUTPUT(12) | S3C64XX_GPN_OUTPUT(13) | | ||
42 | S3C64XX_GPN_OUTPUT(14) | S3C64XX_GPN_OUTPUT(15); | ||
43 | __raw_writel(reg, S3C64XX_GPNCON); | ||
44 | |||
45 | reg = __raw_readl(S3C64XX_GPNDAT); | ||
46 | reg &= ~(clear << 12); | ||
47 | reg |= set << 12; | ||
48 | __raw_writel(reg, S3C64XX_GPNDAT); | ||
49 | |||
50 | local_irq_restore(flags); | ||
51 | } | ||
52 | #endif | ||
53 | |||
54 | static struct sleep_save core_save[] = { | ||
55 | SAVE_ITEM(S3C_APLL_LOCK), | ||
56 | SAVE_ITEM(S3C_MPLL_LOCK), | ||
57 | SAVE_ITEM(S3C_EPLL_LOCK), | ||
58 | SAVE_ITEM(S3C_CLK_SRC), | ||
59 | SAVE_ITEM(S3C_CLK_DIV0), | ||
60 | SAVE_ITEM(S3C_CLK_DIV1), | ||
61 | SAVE_ITEM(S3C_CLK_DIV2), | ||
62 | SAVE_ITEM(S3C_CLK_OUT), | ||
63 | SAVE_ITEM(S3C_HCLK_GATE), | ||
64 | SAVE_ITEM(S3C_PCLK_GATE), | ||
65 | SAVE_ITEM(S3C_SCLK_GATE), | ||
66 | SAVE_ITEM(S3C_MEM0_GATE), | ||
67 | |||
68 | SAVE_ITEM(S3C_EPLL_CON1), | ||
69 | SAVE_ITEM(S3C_EPLL_CON0), | ||
70 | |||
71 | SAVE_ITEM(S3C64XX_MEM0DRVCON), | ||
72 | SAVE_ITEM(S3C64XX_MEM1DRVCON), | ||
73 | |||
74 | #ifndef CONFIG_CPU_FREQ | ||
75 | SAVE_ITEM(S3C_APLL_CON), | ||
76 | SAVE_ITEM(S3C_MPLL_CON), | ||
77 | #endif | ||
78 | }; | ||
79 | |||
80 | static struct sleep_save misc_save[] = { | ||
81 | SAVE_ITEM(S3C64XX_AHB_CON0), | ||
82 | SAVE_ITEM(S3C64XX_AHB_CON1), | ||
83 | SAVE_ITEM(S3C64XX_AHB_CON2), | ||
84 | |||
85 | SAVE_ITEM(S3C64XX_SPCON), | ||
86 | |||
87 | SAVE_ITEM(S3C64XX_MEM0CONSTOP), | ||
88 | SAVE_ITEM(S3C64XX_MEM1CONSTOP), | ||
89 | SAVE_ITEM(S3C64XX_MEM0CONSLP0), | ||
90 | SAVE_ITEM(S3C64XX_MEM0CONSLP1), | ||
91 | SAVE_ITEM(S3C64XX_MEM1CONSLP), | ||
92 | }; | ||
93 | |||
94 | void s3c_pm_configure_extint(void) | ||
95 | { | ||
96 | __raw_writel(s3c_irqwake_eintmask, S3C64XX_EINT_MASK); | ||
97 | } | ||
98 | |||
99 | void s3c_pm_restore_core(void) | ||
100 | { | ||
101 | __raw_writel(0, S3C64XX_EINT_MASK); | ||
102 | |||
103 | s3c_pm_debug_smdkled(1 << 2, 0); | ||
104 | |||
105 | s3c_pm_do_restore_core(core_save, ARRAY_SIZE(core_save)); | ||
106 | s3c_pm_do_restore(misc_save, ARRAY_SIZE(misc_save)); | ||
107 | } | ||
108 | |||
109 | void s3c_pm_save_core(void) | ||
110 | { | ||
111 | s3c_pm_do_save(misc_save, ARRAY_SIZE(misc_save)); | ||
112 | s3c_pm_do_save(core_save, ARRAY_SIZE(core_save)); | ||
113 | } | ||
114 | |||
115 | /* since both s3c6400 and s3c6410 share the same sleep pm calls, we | ||
116 | * put the per-cpu code in here until any new cpu comes along and changes | ||
117 | * this. | ||
118 | */ | ||
119 | |||
120 | static void s3c64xx_cpu_suspend(void) | ||
121 | { | ||
122 | unsigned long tmp; | ||
123 | |||
124 | /* set our standby method to sleep */ | ||
125 | |||
126 | tmp = __raw_readl(S3C64XX_PWR_CFG); | ||
127 | tmp &= ~S3C64XX_PWRCFG_CFG_WFI_MASK; | ||
128 | tmp |= S3C64XX_PWRCFG_CFG_WFI_SLEEP; | ||
129 | __raw_writel(tmp, S3C64XX_PWR_CFG); | ||
130 | |||
131 | /* clear any old wakeup */ | ||
132 | |||
133 | __raw_writel(__raw_readl(S3C64XX_WAKEUP_STAT), | ||
134 | S3C64XX_WAKEUP_STAT); | ||
135 | |||
136 | /* set the LED state to 0110 over sleep */ | ||
137 | s3c_pm_debug_smdkled(3 << 1, 0xf); | ||
138 | |||
139 | /* issue the standby signal into the pm unit. Note, we | ||
140 | * issue a write-buffer drain just in case */ | ||
141 | |||
142 | tmp = 0; | ||
143 | |||
144 | asm("b 1f\n\t" | ||
145 | ".align 5\n\t" | ||
146 | "1:\n\t" | ||
147 | "mcr p15, 0, %0, c7, c10, 5\n\t" | ||
148 | "mcr p15, 0, %0, c7, c10, 4\n\t" | ||
149 | "mcr p15, 0, %0, c7, c0, 4" :: "r" (tmp)); | ||
150 | |||
151 | /* we should never get past here */ | ||
152 | |||
153 | panic("sleep resumed to originator?"); | ||
154 | } | ||
155 | |||
156 | static void s3c64xx_pm_prepare(void) | ||
157 | { | ||
158 | /* store address of resume. */ | ||
159 | __raw_writel(virt_to_phys(s3c_cpu_resume), S3C64XX_INFORM0); | ||
160 | |||
161 | /* ensure previous wakeup state is cleared before sleeping */ | ||
162 | __raw_writel(__raw_readl(S3C64XX_WAKEUP_STAT), S3C64XX_WAKEUP_STAT); | ||
163 | } | ||
164 | |||
165 | static int s3c64xx_pm_init(void) | ||
166 | { | ||
167 | pm_cpu_prep = s3c64xx_pm_prepare; | ||
168 | pm_cpu_sleep = s3c64xx_cpu_suspend; | ||
169 | pm_uart_udivslot = 1; | ||
170 | return 0; | ||
171 | } | ||
172 | |||
173 | arch_initcall(s3c64xx_pm_init); | ||
diff --git a/arch/arm/mach-s3c64xx/s3c6400.c b/arch/arm/mach-s3c64xx/s3c6400.c new file mode 100644 index 000000000000..707e34e3afd1 --- /dev/null +++ b/arch/arm/mach-s3c64xx/s3c6400.c | |||
@@ -0,0 +1,89 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/cpu.c | ||
2 | * | ||
3 | * Copyright 2009 Simtec Electronics | ||
4 | * Ben Dooks <ben@simtec.co.uk> | ||
5 | * http://armlinux.simtec.co.uk/ | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/types.h> | ||
14 | #include <linux/interrupt.h> | ||
15 | #include <linux/list.h> | ||
16 | #include <linux/timer.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/clk.h> | ||
19 | #include <linux/io.h> | ||
20 | #include <linux/sysdev.h> | ||
21 | #include <linux/serial_core.h> | ||
22 | #include <linux/platform_device.h> | ||
23 | |||
24 | #include <asm/mach/arch.h> | ||
25 | #include <asm/mach/map.h> | ||
26 | #include <asm/mach/irq.h> | ||
27 | |||
28 | #include <mach/hardware.h> | ||
29 | #include <asm/irq.h> | ||
30 | |||
31 | #include <plat/cpu-freq.h> | ||
32 | #include <plat/regs-serial.h> | ||
33 | #include <mach/regs-clock.h> | ||
34 | |||
35 | #include <plat/cpu.h> | ||
36 | #include <plat/devs.h> | ||
37 | #include <plat/clock.h> | ||
38 | #include <plat/sdhci.h> | ||
39 | #include <plat/iic-core.h> | ||
40 | #include <mach/s3c6400.h> | ||
41 | |||
42 | void __init s3c6400_map_io(void) | ||
43 | { | ||
44 | /* setup SDHCI */ | ||
45 | |||
46 | s3c6400_default_sdhci0(); | ||
47 | s3c6400_default_sdhci1(); | ||
48 | s3c6400_default_sdhci2(); | ||
49 | |||
50 | /* the i2c devices are directly compatible with s3c2440 */ | ||
51 | s3c_i2c0_setname("s3c2440-i2c"); | ||
52 | |||
53 | s3c_device_nand.name = "s3c6400-nand"; | ||
54 | } | ||
55 | |||
56 | void __init s3c6400_init_clocks(int xtal) | ||
57 | { | ||
58 | s3c64xx_register_clocks(xtal, S3C6400_CLKDIV0_ARM_MASK); | ||
59 | s3c6400_setup_clocks(); | ||
60 | } | ||
61 | |||
62 | void __init s3c6400_init_irq(void) | ||
63 | { | ||
64 | /* VIC0 does not have IRQS 5..7, | ||
65 | * VIC1 is fully populated. */ | ||
66 | s3c64xx_init_irq(~0 & ~(0xf << 5), ~0); | ||
67 | } | ||
68 | |||
69 | struct sysdev_class s3c6400_sysclass = { | ||
70 | .name = "s3c6400-core", | ||
71 | }; | ||
72 | |||
73 | static struct sys_device s3c6400_sysdev = { | ||
74 | .cls = &s3c6400_sysclass, | ||
75 | }; | ||
76 | |||
77 | static int __init s3c6400_core_init(void) | ||
78 | { | ||
79 | return sysdev_class_register(&s3c6400_sysclass); | ||
80 | } | ||
81 | |||
82 | core_initcall(s3c6400_core_init); | ||
83 | |||
84 | int __init s3c6400_init(void) | ||
85 | { | ||
86 | printk("S3C6400: Initialising architecture\n"); | ||
87 | |||
88 | return sysdev_register(&s3c6400_sysdev); | ||
89 | } | ||
diff --git a/arch/arm/mach-s3c64xx/s3c6410.c b/arch/arm/mach-s3c64xx/s3c6410.c new file mode 100644 index 000000000000..59635d19466a --- /dev/null +++ b/arch/arm/mach-s3c64xx/s3c6410.c | |||
@@ -0,0 +1,91 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/s3c6410.c | ||
2 | * | ||
3 | * Copyright 2008 Simtec Electronics | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/types.h> | ||
15 | #include <linux/interrupt.h> | ||
16 | #include <linux/list.h> | ||
17 | #include <linux/timer.h> | ||
18 | #include <linux/init.h> | ||
19 | #include <linux/clk.h> | ||
20 | #include <linux/io.h> | ||
21 | #include <linux/sysdev.h> | ||
22 | #include <linux/serial_core.h> | ||
23 | #include <linux/platform_device.h> | ||
24 | |||
25 | #include <asm/mach/arch.h> | ||
26 | #include <asm/mach/map.h> | ||
27 | #include <asm/mach/irq.h> | ||
28 | |||
29 | #include <mach/hardware.h> | ||
30 | #include <asm/irq.h> | ||
31 | |||
32 | #include <plat/cpu-freq.h> | ||
33 | #include <plat/regs-serial.h> | ||
34 | #include <mach/regs-clock.h> | ||
35 | |||
36 | #include <plat/cpu.h> | ||
37 | #include <plat/devs.h> | ||
38 | #include <plat/clock.h> | ||
39 | #include <plat/sdhci.h> | ||
40 | #include <plat/iic-core.h> | ||
41 | #include <mach/s3c6400.h> | ||
42 | #include <mach/s3c6410.h> | ||
43 | |||
44 | void __init s3c6410_map_io(void) | ||
45 | { | ||
46 | /* initialise device information early */ | ||
47 | s3c6410_default_sdhci0(); | ||
48 | s3c6410_default_sdhci1(); | ||
49 | s3c6410_default_sdhci2(); | ||
50 | |||
51 | /* the i2c devices are directly compatible with s3c2440 */ | ||
52 | s3c_i2c0_setname("s3c2440-i2c"); | ||
53 | s3c_i2c1_setname("s3c2440-i2c"); | ||
54 | |||
55 | s3c_device_nand.name = "s3c6400-nand"; | ||
56 | } | ||
57 | |||
58 | void __init s3c6410_init_clocks(int xtal) | ||
59 | { | ||
60 | printk(KERN_DEBUG "%s: initialising clocks\n", __func__); | ||
61 | s3c64xx_register_clocks(xtal, S3C6410_CLKDIV0_ARM_MASK); | ||
62 | s3c6400_setup_clocks(); | ||
63 | } | ||
64 | |||
65 | void __init s3c6410_init_irq(void) | ||
66 | { | ||
67 | /* VIC0 is missing IRQ7, VIC1 is fully populated. */ | ||
68 | s3c64xx_init_irq(~0 & ~(1 << 7), ~0); | ||
69 | } | ||
70 | |||
71 | struct sysdev_class s3c6410_sysclass = { | ||
72 | .name = "s3c6410-core", | ||
73 | }; | ||
74 | |||
75 | static struct sys_device s3c6410_sysdev = { | ||
76 | .cls = &s3c6410_sysclass, | ||
77 | }; | ||
78 | |||
79 | static int __init s3c6410_core_init(void) | ||
80 | { | ||
81 | return sysdev_class_register(&s3c6410_sysclass); | ||
82 | } | ||
83 | |||
84 | core_initcall(s3c6410_core_init); | ||
85 | |||
86 | int __init s3c6410_init(void) | ||
87 | { | ||
88 | printk("S3C6410: Initialising architecture\n"); | ||
89 | |||
90 | return sysdev_register(&s3c6410_sysdev); | ||
91 | } | ||
diff --git a/arch/arm/mach-s3c64xx/setup-fb-24bpp.c b/arch/arm/mach-s3c64xx/setup-fb-24bpp.c new file mode 100644 index 000000000000..8e28e448dd20 --- /dev/null +++ b/arch/arm/mach-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/mach-s3c64xx/setup-i2c0.c b/arch/arm/mach-s3c64xx/setup-i2c0.c new file mode 100644 index 000000000000..d1b11e6e77e8 --- /dev/null +++ b/arch/arm/mach-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 <mach/gpio-bank-b.h> | ||
22 | #include <plat/iic.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/mach-s3c64xx/setup-i2c1.c b/arch/arm/mach-s3c64xx/setup-i2c1.c new file mode 100644 index 000000000000..2dce57d8c6f8 --- /dev/null +++ b/arch/arm/mach-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 <mach/gpio-bank-b.h> | ||
22 | #include <plat/iic.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 | } | ||
diff --git a/arch/arm/mach-s3c64xx/setup-sdhci-gpio.c b/arch/arm/mach-s3c64xx/setup-sdhci-gpio.c new file mode 100644 index 000000000000..a58c0cc7ba5e --- /dev/null +++ b/arch/arm/mach-s3c64xx/setup-sdhci-gpio.c | |||
@@ -0,0 +1,75 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/setup-sdhci-gpio.c | ||
2 | * | ||
3 | * Copyright 2008 Simtec Electronics | ||
4 | * Ben Dooks <ben@simtec.co.uk> | ||
5 | * http://armlinux.simtec.co.uk/ | ||
6 | * | ||
7 | * S3C64XX - Helper functions for setting up SDHCI device(s) GPIO (HSMMC) | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | */ | ||
13 | |||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/types.h> | ||
16 | #include <linux/interrupt.h> | ||
17 | #include <linux/platform_device.h> | ||
18 | #include <linux/io.h> | ||
19 | |||
20 | #include <mach/gpio.h> | ||
21 | #include <plat/gpio-cfg.h> | ||
22 | |||
23 | void s3c64xx_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) | ||
24 | { | ||
25 | unsigned int gpio; | ||
26 | unsigned int end; | ||
27 | |||
28 | end = S3C64XX_GPG(2 + width); | ||
29 | |||
30 | /* Set all the necessary GPG pins to special-function 0 */ | ||
31 | for (gpio = S3C64XX_GPG(0); gpio < end; gpio++) { | ||
32 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
33 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
34 | } | ||
35 | |||
36 | s3c_gpio_setpull(S3C64XX_GPG(6), S3C_GPIO_PULL_UP); | ||
37 | s3c_gpio_cfgpin(S3C64XX_GPG(6), S3C_GPIO_SFN(2)); | ||
38 | } | ||
39 | |||
40 | void s3c64xx_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width) | ||
41 | { | ||
42 | unsigned int gpio; | ||
43 | unsigned int end; | ||
44 | |||
45 | end = S3C64XX_GPH(2 + width); | ||
46 | |||
47 | /* Set all the necessary GPG pins to special-function 0 */ | ||
48 | for (gpio = S3C64XX_GPH(0); gpio < end; gpio++) { | ||
49 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
50 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
51 | } | ||
52 | |||
53 | s3c_gpio_setpull(S3C64XX_GPG(6), S3C_GPIO_PULL_UP); | ||
54 | s3c_gpio_cfgpin(S3C64XX_GPG(6), S3C_GPIO_SFN(3)); | ||
55 | } | ||
56 | |||
57 | void s3c64xx_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width) | ||
58 | { | ||
59 | unsigned int gpio; | ||
60 | unsigned int end; | ||
61 | |||
62 | end = S3C64XX_GPH(6 + width); | ||
63 | |||
64 | /* Set all the necessary GPH pins to special-function 1 */ | ||
65 | for (gpio = S3C64XX_GPH(6); gpio < end; gpio++) { | ||
66 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); | ||
67 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
68 | } | ||
69 | |||
70 | /* Set all the necessary GPC pins to special-function 1 */ | ||
71 | for (gpio = S3C64XX_GPC(4); gpio < S3C64XX_GPC(6); gpio++) { | ||
72 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); | ||
73 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
74 | } | ||
75 | } | ||
diff --git a/arch/arm/mach-s3c64xx/setup-sdhci.c b/arch/arm/mach-s3c64xx/setup-sdhci.c new file mode 100644 index 000000000000..1a942037c4ef --- /dev/null +++ b/arch/arm/mach-s3c64xx/setup-sdhci.c | |||
@@ -0,0 +1,72 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/setup-sdhci.c | ||
2 | * | ||
3 | * Copyright 2008 Simtec Electronics | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * S3C6400/S3C6410 - Helper functions for settign up SDHCI device(s) (HSMMC) | ||
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/interrupt.h> | ||
18 | #include <linux/platform_device.h> | ||
19 | #include <linux/io.h> | ||
20 | |||
21 | #include <linux/mmc/card.h> | ||
22 | #include <linux/mmc/host.h> | ||
23 | |||
24 | #include <plat/regs-sdhci.h> | ||
25 | #include <plat/sdhci.h> | ||
26 | |||
27 | /* clock sources for the mmc bus clock, order as for the ctrl2[5..4] */ | ||
28 | |||
29 | char *s3c64xx_hsmmc_clksrcs[4] = { | ||
30 | [0] = "hsmmc", | ||
31 | [1] = "hsmmc", | ||
32 | [2] = "mmc_bus", | ||
33 | /* [3] = "48m", - note not successfully used yet */ | ||
34 | }; | ||
35 | |||
36 | void s3c6400_setup_sdhci_cfg_card(struct platform_device *dev, | ||
37 | void __iomem *r, | ||
38 | struct mmc_ios *ios, | ||
39 | struct mmc_card *card) | ||
40 | { | ||
41 | u32 ctrl2, ctrl3; | ||
42 | |||
43 | ctrl2 = readl(r + S3C_SDHCI_CONTROL2); | ||
44 | ctrl2 &= S3C_SDHCI_CTRL2_SELBASECLK_MASK; | ||
45 | ctrl2 |= (S3C64XX_SDHCI_CTRL2_ENSTAASYNCCLR | | ||
46 | S3C64XX_SDHCI_CTRL2_ENCMDCNFMSK | | ||
47 | S3C_SDHCI_CTRL2_ENFBCLKRX | | ||
48 | S3C_SDHCI_CTRL2_DFCNT_NONE | | ||
49 | S3C_SDHCI_CTRL2_ENCLKOUTHOLD); | ||
50 | |||
51 | if (ios->clock < 25 * 1000000) | ||
52 | ctrl3 = (S3C_SDHCI_CTRL3_FCSEL3 | | ||
53 | S3C_SDHCI_CTRL3_FCSEL2 | | ||
54 | S3C_SDHCI_CTRL3_FCSEL1 | | ||
55 | S3C_SDHCI_CTRL3_FCSEL0); | ||
56 | else | ||
57 | ctrl3 = (S3C_SDHCI_CTRL3_FCSEL1 | S3C_SDHCI_CTRL3_FCSEL0); | ||
58 | |||
59 | printk(KERN_INFO "%s: CTRL 2=%08x, 3=%08x\n", __func__, ctrl2, ctrl3); | ||
60 | writel(ctrl2, r + S3C_SDHCI_CONTROL2); | ||
61 | writel(ctrl3, r + S3C_SDHCI_CONTROL3); | ||
62 | } | ||
63 | |||
64 | void s3c6410_setup_sdhci_cfg_card(struct platform_device *dev, | ||
65 | void __iomem *r, | ||
66 | struct mmc_ios *ios, | ||
67 | struct mmc_card *card) | ||
68 | { | ||
69 | writel(S3C64XX_SDHCI_CONTROL4_DRIVE_9mA, r + S3C64XX_SDHCI_CONTROL4); | ||
70 | |||
71 | s3c6400_setup_sdhci_cfg_card(dev, r, ios, card); | ||
72 | } | ||
diff --git a/arch/arm/mach-s3c64xx/sleep.S b/arch/arm/mach-s3c64xx/sleep.S new file mode 100644 index 000000000000..b2ef44317368 --- /dev/null +++ b/arch/arm/mach-s3c64xx/sleep.S | |||
@@ -0,0 +1,144 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/sleep.S | ||
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 sleep 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 | #include <linux/linkage.h> | ||
16 | #include <asm/assembler.h> | ||
17 | #include <mach/map.h> | ||
18 | |||
19 | #undef S3C64XX_VA_GPIO | ||
20 | #define S3C64XX_VA_GPIO (0x0) | ||
21 | |||
22 | #include <mach/regs-gpio.h> | ||
23 | #include <mach/gpio-bank-n.h> | ||
24 | |||
25 | #define LL_UART (S3C_PA_UART + (0x400 * CONFIG_S3C_LOWLEVEL_UART_PORT)) | ||
26 | |||
27 | .text | ||
28 | |||
29 | /* s3c_cpu_save | ||
30 | * | ||
31 | * Save enough processor state to allow the restart of the pm.c | ||
32 | * code after resume. | ||
33 | * | ||
34 | * entry: | ||
35 | * r0 = pointer to the save block | ||
36 | */ | ||
37 | |||
38 | ENTRY(s3c_cpu_save) | ||
39 | stmfd sp!, { r4 - r12, lr } | ||
40 | |||
41 | mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID | ||
42 | mrc p15, 0, r5, c3, c0, 0 @ Domain ID | ||
43 | mrc p15, 0, r6, c2, c0, 0 @ Translation Table BASE0 | ||
44 | mrc p15, 0, r7, c2, c0, 1 @ Translation Table BASE1 | ||
45 | mrc p15, 0, r8, c2, c0, 2 @ Translation Table Control | ||
46 | mrc p15, 0, r9, c1, c0, 0 @ Control register | ||
47 | mrc p15, 0, r10, c1, c0, 1 @ Auxiliary control register | ||
48 | mrc p15, 0, r11, c1, c0, 2 @ Co-processor access controls | ||
49 | |||
50 | stmia r0, { r4 - r13 } @ Save CP registers and SP | ||
51 | |||
52 | @@ save our state to ram | ||
53 | bl s3c_pm_cb_flushcache | ||
54 | |||
55 | @@ call final suspend code | ||
56 | ldr r0, =pm_cpu_sleep | ||
57 | ldr pc, [r0] | ||
58 | |||
59 | @@ return to the caller, after the MMU is turned on. | ||
60 | @@ restore the last bits of the stack and return. | ||
61 | resume_with_mmu: | ||
62 | ldmfd sp!, { r4 - r12, pc } @ return, from sp from s3c_cpu_save | ||
63 | |||
64 | .data | ||
65 | |||
66 | /* the next bit is code, but it requires easy access to the | ||
67 | * s3c_sleep_save_phys data before the MMU is switched on, so | ||
68 | * we store the code that needs this variable in the .data where | ||
69 | * the value can be written to (the .text segment is RO). | ||
70 | */ | ||
71 | |||
72 | .global s3c_sleep_save_phys | ||
73 | s3c_sleep_save_phys: | ||
74 | .word 0 | ||
75 | |||
76 | /* Sleep magic, the word before the resume entry point so that the | ||
77 | * bootloader can check for a resumeable image. */ | ||
78 | |||
79 | .word 0x2bedf00d | ||
80 | |||
81 | /* s3c_cpu_reusme | ||
82 | * | ||
83 | * This is the entry point, stored by whatever method the bootloader | ||
84 | * requires to get the kernel runnign again. This code expects to be | ||
85 | * entered with no caches live and the MMU disabled. It will then | ||
86 | * restore the MMU and other basic CP registers saved and restart | ||
87 | * the kernel C code to finish the resume code. | ||
88 | */ | ||
89 | |||
90 | ENTRY(s3c_cpu_resume) | ||
91 | msr cpsr_c, #PSR_I_BIT | PSR_F_BIT | SVC_MODE | ||
92 | ldr r2, =LL_UART /* for debug */ | ||
93 | |||
94 | #ifdef CONFIG_S3C_PM_DEBUG_LED_SMDK | ||
95 | /* Initialise the GPIO state if we are debugging via the SMDK LEDs, | ||
96 | * as the uboot version supplied resets these to inputs during the | ||
97 | * resume checks. | ||
98 | */ | ||
99 | |||
100 | ldr r3, =S3C64XX_PA_GPIO | ||
101 | ldr r0, [ r3, #S3C64XX_GPNCON ] | ||
102 | bic r0, r0, #(S3C64XX_GPN_CONMASK(12) | S3C64XX_GPN_CONMASK(13) | \ | ||
103 | S3C64XX_GPN_CONMASK(14) | S3C64XX_GPN_CONMASK(15)) | ||
104 | orr r0, r0, #(S3C64XX_GPN_OUTPUT(12) | S3C64XX_GPN_OUTPUT(13) | \ | ||
105 | S3C64XX_GPN_OUTPUT(14) | S3C64XX_GPN_OUTPUT(15)) | ||
106 | str r0, [ r3, #S3C64XX_GPNCON ] | ||
107 | |||
108 | ldr r0, [ r3, #S3C64XX_GPNDAT ] | ||
109 | bic r0, r0, #0xf << 12 @ GPN12..15 | ||
110 | orr r0, r0, #1 << 15 @ GPN15 | ||
111 | str r0, [ r3, #S3C64XX_GPNDAT ] | ||
112 | #endif | ||
113 | |||
114 | /* __v6_setup from arch/arm/mm/proc-v6.S, ensure that the caches | ||
115 | * are thoroughly cleaned just in case the bootloader didn't do it | ||
116 | * for us. */ | ||
117 | mov r0, #0 | ||
118 | mcr p15, 0, r0, c7, c14, 0 @ clean+invalidate D cache | ||
119 | mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache | ||
120 | mcr p15, 0, r0, c7, c15, 0 @ clean+invalidate cache | ||
121 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer | ||
122 | @@mcr p15, 0, r0, c8, c7, 0 @ invalidate I + D TLBs | ||
123 | @@mcr p15, 0, r0, c7, c7, 0 @ Invalidate I + D caches | ||
124 | |||
125 | ldr r0, s3c_sleep_save_phys | ||
126 | ldmia r0, { r4 - r13 } | ||
127 | |||
128 | mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID | ||
129 | mcr p15, 0, r5, c3, c0, 0 @ Domain ID | ||
130 | mcr p15, 0, r6, c2, c0, 0 @ Translation Table BASE0 | ||
131 | mcr p15, 0, r7, c2, c0, 1 @ Translation Table BASE1 | ||
132 | mcr p15, 0, r8, c2, c0, 2 @ Translation Table Control | ||
133 | mcr p15, 0, r10, c1, c0, 1 @ Auxiliary control register | ||
134 | |||
135 | mov r0, #0 @ restore copro access controls | ||
136 | mcr p15, 0, r11, c1, c0, 2 @ Co-processor access controls | ||
137 | mcr p15, 0, r0, c7, c5, 4 | ||
138 | |||
139 | ldr r2, =resume_with_mmu | ||
140 | mcr p15, 0, r9, c1, c0, 0 /* turn mmu back on */ | ||
141 | nop | ||
142 | mov pc, r2 /* jump back */ | ||
143 | |||
144 | .end | ||