diff options
Diffstat (limited to 'arch/arm/mach-pxa/pxa25x.c')
-rw-r--r-- | arch/arm/mach-pxa/pxa25x.c | 74 |
1 files changed, 68 insertions, 6 deletions
diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index e5b417d14bb0..c5b845b935bb 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <asm/hardware.h> | 26 | #include <asm/hardware.h> |
27 | #include <asm/arch/irqs.h> | 27 | #include <asm/arch/irqs.h> |
28 | #include <asm/arch/pxa-regs.h> | 28 | #include <asm/arch/pxa-regs.h> |
29 | #include <asm/arch/pxa2xx-regs.h> | ||
29 | #include <asm/arch/mfp-pxa25x.h> | 30 | #include <asm/arch/mfp-pxa25x.h> |
30 | #include <asm/arch/pm.h> | 31 | #include <asm/arch/pm.h> |
31 | #include <asm/arch/dma.h> | 32 | #include <asm/arch/dma.h> |
@@ -108,6 +109,52 @@ static const struct clkops clk_pxa25x_lcd_ops = { | |||
108 | .getrate = clk_pxa25x_lcd_getrate, | 109 | .getrate = clk_pxa25x_lcd_getrate, |
109 | }; | 110 | }; |
110 | 111 | ||
112 | static unsigned long gpio12_config_32k[] = { | ||
113 | GPIO12_32KHz, | ||
114 | }; | ||
115 | |||
116 | static unsigned long gpio12_config_gpio[] = { | ||
117 | GPIO12_GPIO, | ||
118 | }; | ||
119 | |||
120 | static void clk_gpio12_enable(struct clk *clk) | ||
121 | { | ||
122 | pxa2xx_mfp_config(gpio12_config_32k, 1); | ||
123 | } | ||
124 | |||
125 | static void clk_gpio12_disable(struct clk *clk) | ||
126 | { | ||
127 | pxa2xx_mfp_config(gpio12_config_gpio, 1); | ||
128 | } | ||
129 | |||
130 | static const struct clkops clk_pxa25x_gpio12_ops = { | ||
131 | .enable = clk_gpio12_enable, | ||
132 | .disable = clk_gpio12_disable, | ||
133 | }; | ||
134 | |||
135 | static unsigned long gpio11_config_3m6[] = { | ||
136 | GPIO11_3_6MHz, | ||
137 | }; | ||
138 | |||
139 | static unsigned long gpio11_config_gpio[] = { | ||
140 | GPIO11_GPIO, | ||
141 | }; | ||
142 | |||
143 | static void clk_gpio11_enable(struct clk *clk) | ||
144 | { | ||
145 | pxa2xx_mfp_config(gpio11_config_3m6, 1); | ||
146 | } | ||
147 | |||
148 | static void clk_gpio11_disable(struct clk *clk) | ||
149 | { | ||
150 | pxa2xx_mfp_config(gpio11_config_gpio, 1); | ||
151 | } | ||
152 | |||
153 | static const struct clkops clk_pxa25x_gpio11_ops = { | ||
154 | .enable = clk_gpio11_enable, | ||
155 | .disable = clk_gpio11_disable, | ||
156 | }; | ||
157 | |||
111 | /* | 158 | /* |
112 | * 3.6864MHz -> OST, GPIO, SSP, PWM, PLLs (95.842MHz, 147.456MHz) | 159 | * 3.6864MHz -> OST, GPIO, SSP, PWM, PLLs (95.842MHz, 147.456MHz) |
113 | * 95.842MHz -> MMC 19.169MHz, I2C 31.949MHz, FICP 47.923MHz, USB 47.923MHz | 160 | * 95.842MHz -> MMC 19.169MHz, I2C 31.949MHz, FICP 47.923MHz, USB 47.923MHz |
@@ -117,29 +164,40 @@ static struct clk pxa25x_hwuart_clk = | |||
117 | INIT_CKEN("UARTCLK", HWUART, 14745600, 1, &pxa_device_hwuart.dev) | 164 | INIT_CKEN("UARTCLK", HWUART, 14745600, 1, &pxa_device_hwuart.dev) |
118 | ; | 165 | ; |
119 | 166 | ||
167 | /* | ||
168 | * PXA 2xx clock declarations. Order is important (see aliases below) | ||
169 | * Please be careful not to disrupt the ordering. | ||
170 | */ | ||
120 | static struct clk pxa25x_clks[] = { | 171 | static struct clk pxa25x_clks[] = { |
121 | INIT_CK("LCDCLK", LCD, &clk_pxa25x_lcd_ops, &pxa_device_fb.dev), | 172 | INIT_CK("LCDCLK", LCD, &clk_pxa25x_lcd_ops, &pxa_device_fb.dev), |
122 | INIT_CKEN("UARTCLK", FFUART, 14745600, 1, &pxa_device_ffuart.dev), | 173 | INIT_CKEN("UARTCLK", FFUART, 14745600, 1, &pxa_device_ffuart.dev), |
123 | INIT_CKEN("UARTCLK", BTUART, 14745600, 1, &pxa_device_btuart.dev), | 174 | INIT_CKEN("UARTCLK", BTUART, 14745600, 1, &pxa_device_btuart.dev), |
124 | INIT_CKEN("UARTCLK", STUART, 14745600, 1, NULL), | 175 | INIT_CKEN("UARTCLK", STUART, 14745600, 1, NULL), |
125 | INIT_CKEN("UDCCLK", USB, 47923000, 5, &pxa_device_udc.dev), | 176 | INIT_CKEN("UDCCLK", USB, 47923000, 5, &pxa25x_device_udc.dev), |
177 | INIT_CLK("GPIO11_CLK", &clk_pxa25x_gpio11_ops, 3686400, 0, NULL), | ||
178 | INIT_CLK("GPIO12_CLK", &clk_pxa25x_gpio12_ops, 32768, 0, NULL), | ||
126 | INIT_CKEN("MMCCLK", MMC, 19169000, 0, &pxa_device_mci.dev), | 179 | INIT_CKEN("MMCCLK", MMC, 19169000, 0, &pxa_device_mci.dev), |
127 | INIT_CKEN("I2CCLK", I2C, 31949000, 0, &pxa_device_i2c.dev), | 180 | INIT_CKEN("I2CCLK", I2C, 31949000, 0, &pxa_device_i2c.dev), |
128 | 181 | ||
129 | INIT_CKEN("SSPCLK", SSP, 3686400, 0, &pxa25x_device_ssp.dev), | 182 | INIT_CKEN("SSPCLK", SSP, 3686400, 0, &pxa25x_device_ssp.dev), |
130 | INIT_CKEN("SSPCLK", NSSP, 3686400, 0, &pxa25x_device_nssp.dev), | 183 | INIT_CKEN("SSPCLK", NSSP, 3686400, 0, &pxa25x_device_nssp.dev), |
131 | INIT_CKEN("SSPCLK", ASSP, 3686400, 0, &pxa25x_device_assp.dev), | 184 | INIT_CKEN("SSPCLK", ASSP, 3686400, 0, &pxa25x_device_assp.dev), |
185 | INIT_CKEN("PWMCLK", PWM0, 3686400, 0, &pxa25x_device_pwm0.dev), | ||
186 | INIT_CKEN("PWMCLK", PWM1, 3686400, 0, &pxa25x_device_pwm1.dev), | ||
132 | 187 | ||
133 | INIT_CKEN("AC97CLK", AC97, 24576000, 0, NULL), | 188 | INIT_CKEN("AC97CLK", AC97, 24576000, 0, NULL), |
134 | 189 | ||
135 | /* | 190 | /* |
136 | INIT_CKEN("PWMCLK", PWM0, 3686400, 0, NULL), | ||
137 | INIT_CKEN("PWMCLK", PWM0, 3686400, 0, NULL), | ||
138 | INIT_CKEN("I2SCLK", I2S, 14745600, 0, NULL), | 191 | INIT_CKEN("I2SCLK", I2S, 14745600, 0, NULL), |
139 | */ | 192 | */ |
140 | INIT_CKEN("FICPCLK", FICP, 47923000, 0, NULL), | 193 | INIT_CKEN("FICPCLK", FICP, 47923000, 0, NULL), |
141 | }; | 194 | }; |
142 | 195 | ||
196 | static struct clk pxa2xx_clk_aliases[] = { | ||
197 | INIT_CKOTHER("GPIO7_CLK", &pxa25x_clks[4], NULL), | ||
198 | INIT_CKOTHER("SA1111_CLK", &pxa25x_clks[5], NULL), | ||
199 | }; | ||
200 | |||
143 | #ifdef CONFIG_PM | 201 | #ifdef CONFIG_PM |
144 | 202 | ||
145 | #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x | 203 | #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x |
@@ -260,7 +318,7 @@ void __init pxa25x_init_irq(void) | |||
260 | } | 318 | } |
261 | 319 | ||
262 | static struct platform_device *pxa25x_devices[] __initdata = { | 320 | static struct platform_device *pxa25x_devices[] __initdata = { |
263 | &pxa_device_udc, | 321 | &pxa25x_device_udc, |
264 | &pxa_device_ffuart, | 322 | &pxa_device_ffuart, |
265 | &pxa_device_btuart, | 323 | &pxa_device_btuart, |
266 | &pxa_device_stuart, | 324 | &pxa_device_stuart, |
@@ -269,6 +327,8 @@ static struct platform_device *pxa25x_devices[] __initdata = { | |||
269 | &pxa25x_device_ssp, | 327 | &pxa25x_device_ssp, |
270 | &pxa25x_device_nssp, | 328 | &pxa25x_device_nssp, |
271 | &pxa25x_device_assp, | 329 | &pxa25x_device_assp, |
330 | &pxa25x_device_pwm0, | ||
331 | &pxa25x_device_pwm1, | ||
272 | }; | 332 | }; |
273 | 333 | ||
274 | static struct sys_device pxa25x_sysdev[] = { | 334 | static struct sys_device pxa25x_sysdev[] = { |
@@ -284,7 +344,7 @@ static int __init pxa25x_init(void) | |||
284 | int i, ret = 0; | 344 | int i, ret = 0; |
285 | 345 | ||
286 | /* Only add HWUART for PXA255/26x; PXA210/250/27x do not have it. */ | 346 | /* Only add HWUART for PXA255/26x; PXA210/250/27x do not have it. */ |
287 | if (cpu_is_pxa25x()) | 347 | if (cpu_is_pxa255()) |
288 | clks_register(&pxa25x_hwuart_clk, 1); | 348 | clks_register(&pxa25x_hwuart_clk, 1); |
289 | 349 | ||
290 | if (cpu_is_pxa21x() || cpu_is_pxa25x()) { | 350 | if (cpu_is_pxa21x() || cpu_is_pxa25x()) { |
@@ -308,9 +368,11 @@ static int __init pxa25x_init(void) | |||
308 | } | 368 | } |
309 | 369 | ||
310 | /* Only add HWUART for PXA255/26x; PXA210/250/27x do not have it. */ | 370 | /* Only add HWUART for PXA255/26x; PXA210/250/27x do not have it. */ |
311 | if (cpu_is_pxa25x()) | 371 | if (cpu_is_pxa255()) |
312 | ret = platform_device_register(&pxa_device_hwuart); | 372 | ret = platform_device_register(&pxa_device_hwuart); |
313 | 373 | ||
374 | clks_register(pxa2xx_clk_aliases, ARRAY_SIZE(pxa2xx_clk_aliases)); | ||
375 | |||
314 | return ret; | 376 | return ret; |
315 | } | 377 | } |
316 | 378 | ||