diff options
Diffstat (limited to 'arch/arm/mach-at91/at91sam9g45.c')
-rw-r--r-- | arch/arm/mach-at91/at91sam9g45.c | 48 |
1 files changed, 25 insertions, 23 deletions
diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index 318b0407ea0..7032dd32cdf 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c | |||
@@ -11,7 +11,6 @@ | |||
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/pm.h> | ||
15 | #include <linux/dma-mapping.h> | 14 | #include <linux/dma-mapping.h> |
16 | 15 | ||
17 | #include <asm/irq.h> | 16 | #include <asm/irq.h> |
@@ -20,12 +19,12 @@ | |||
20 | #include <mach/at91sam9g45.h> | 19 | #include <mach/at91sam9g45.h> |
21 | #include <mach/at91_pmc.h> | 20 | #include <mach/at91_pmc.h> |
22 | #include <mach/at91_rstc.h> | 21 | #include <mach/at91_rstc.h> |
23 | #include <mach/at91_shdwc.h> | ||
24 | #include <mach/cpu.h> | 22 | #include <mach/cpu.h> |
25 | 23 | ||
26 | #include "soc.h" | 24 | #include "soc.h" |
27 | #include "generic.h" | 25 | #include "generic.h" |
28 | #include "clock.h" | 26 | #include "clock.h" |
27 | #include "sam9_smc.h" | ||
29 | 28 | ||
30 | /* -------------------------------------------------------------------- | 29 | /* -------------------------------------------------------------------- |
31 | * Clocks | 30 | * Clocks |
@@ -150,7 +149,7 @@ static struct clk ac97_clk = { | |||
150 | .type = CLK_TYPE_PERIPHERAL, | 149 | .type = CLK_TYPE_PERIPHERAL, |
151 | }; | 150 | }; |
152 | static struct clk macb_clk = { | 151 | static struct clk macb_clk = { |
153 | .name = "macb_clk", | 152 | .name = "pclk", |
154 | .pmc_mask = 1 << AT91SAM9G45_ID_EMAC, | 153 | .pmc_mask = 1 << AT91SAM9G45_ID_EMAC, |
155 | .type = CLK_TYPE_PERIPHERAL, | 154 | .type = CLK_TYPE_PERIPHERAL, |
156 | }; | 155 | }; |
@@ -209,6 +208,8 @@ static struct clk *periph_clocks[] __initdata = { | |||
209 | }; | 208 | }; |
210 | 209 | ||
211 | static struct clk_lookup periph_clocks_lookups[] = { | 210 | static struct clk_lookup periph_clocks_lookups[] = { |
211 | /* One additional fake clock for macb_hclk */ | ||
212 | CLKDEV_CON_ID("hclk", &macb_clk), | ||
212 | /* One additional fake clock for ohci */ | 213 | /* One additional fake clock for ohci */ |
213 | CLKDEV_CON_ID("ohci_clk", &uhphs_clk), | 214 | CLKDEV_CON_ID("ohci_clk", &uhphs_clk), |
214 | CLKDEV_CON_DEV_ID("ehci_clk", "atmel-ehci", &uhphs_clk), | 215 | CLKDEV_CON_DEV_ID("ehci_clk", "atmel-ehci", &uhphs_clk), |
@@ -231,6 +232,11 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
231 | CLKDEV_CON_DEV_ID("usart", "fff98000.serial", &usart3_clk), | 232 | CLKDEV_CON_DEV_ID("usart", "fff98000.serial", &usart3_clk), |
232 | /* fake hclk clock */ | 233 | /* fake hclk clock */ |
233 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk), | 234 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk), |
235 | CLKDEV_CON_ID("pioA", &pioA_clk), | ||
236 | CLKDEV_CON_ID("pioB", &pioB_clk), | ||
237 | CLKDEV_CON_ID("pioC", &pioC_clk), | ||
238 | CLKDEV_CON_ID("pioD", &pioDE_clk), | ||
239 | CLKDEV_CON_ID("pioE", &pioDE_clk), | ||
234 | }; | 240 | }; |
235 | 241 | ||
236 | static struct clk_lookup usart_clocks_lookups[] = { | 242 | static struct clk_lookup usart_clocks_lookups[] = { |
@@ -293,41 +299,30 @@ void __init at91sam9g45_set_console_clock(int id) | |||
293 | * GPIO | 299 | * GPIO |
294 | * -------------------------------------------------------------------- */ | 300 | * -------------------------------------------------------------------- */ |
295 | 301 | ||
296 | static struct at91_gpio_bank at91sam9g45_gpio[] = { | 302 | static struct at91_gpio_bank at91sam9g45_gpio[] __initdata = { |
297 | { | 303 | { |
298 | .id = AT91SAM9G45_ID_PIOA, | 304 | .id = AT91SAM9G45_ID_PIOA, |
299 | .offset = AT91_PIOA, | 305 | .regbase = AT91SAM9G45_BASE_PIOA, |
300 | .clock = &pioA_clk, | ||
301 | }, { | 306 | }, { |
302 | .id = AT91SAM9G45_ID_PIOB, | 307 | .id = AT91SAM9G45_ID_PIOB, |
303 | .offset = AT91_PIOB, | 308 | .regbase = AT91SAM9G45_BASE_PIOB, |
304 | .clock = &pioB_clk, | ||
305 | }, { | 309 | }, { |
306 | .id = AT91SAM9G45_ID_PIOC, | 310 | .id = AT91SAM9G45_ID_PIOC, |
307 | .offset = AT91_PIOC, | 311 | .regbase = AT91SAM9G45_BASE_PIOC, |
308 | .clock = &pioC_clk, | ||
309 | }, { | 312 | }, { |
310 | .id = AT91SAM9G45_ID_PIODE, | 313 | .id = AT91SAM9G45_ID_PIODE, |
311 | .offset = AT91_PIOD, | 314 | .regbase = AT91SAM9G45_BASE_PIOD, |
312 | .clock = &pioDE_clk, | ||
313 | }, { | 315 | }, { |
314 | .id = AT91SAM9G45_ID_PIODE, | 316 | .id = AT91SAM9G45_ID_PIODE, |
315 | .offset = AT91_PIOE, | 317 | .regbase = AT91SAM9G45_BASE_PIOE, |
316 | .clock = &pioDE_clk, | ||
317 | } | 318 | } |
318 | }; | 319 | }; |
319 | 320 | ||
320 | static void at91sam9g45_reset(void) | 321 | static void at91sam9g45_restart(char mode, const char *cmd) |
321 | { | 322 | { |
322 | at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); | 323 | at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); |
323 | } | 324 | } |
324 | 325 | ||
325 | static void at91sam9g45_poweroff(void) | ||
326 | { | ||
327 | at91_sys_write(AT91_SHDW_CR, AT91_SHDW_KEY | AT91_SHDW_SHDW); | ||
328 | } | ||
329 | |||
330 | |||
331 | /* -------------------------------------------------------------------- | 326 | /* -------------------------------------------------------------------- |
332 | * AT91SAM9G45 processor initialization | 327 | * AT91SAM9G45 processor initialization |
333 | * -------------------------------------------------------------------- */ | 328 | * -------------------------------------------------------------------- */ |
@@ -338,10 +333,16 @@ static void __init at91sam9g45_map_io(void) | |||
338 | init_consistent_dma_size(SZ_4M); | 333 | init_consistent_dma_size(SZ_4M); |
339 | } | 334 | } |
340 | 335 | ||
336 | static void __init at91sam9g45_ioremap_registers(void) | ||
337 | { | ||
338 | at91_ioremap_shdwc(AT91SAM9G45_BASE_SHDWC); | ||
339 | at91sam926x_ioremap_pit(AT91SAM9G45_BASE_PIT); | ||
340 | at91sam9_ioremap_smc(0, AT91SAM9G45_BASE_SMC); | ||
341 | } | ||
342 | |||
341 | static void __init at91sam9g45_initialize(void) | 343 | static void __init at91sam9g45_initialize(void) |
342 | { | 344 | { |
343 | at91_arch_reset = at91sam9g45_reset; | 345 | arm_pm_restart = at91sam9g45_restart; |
344 | pm_power_off = at91sam9g45_poweroff; | ||
345 | at91_extern_irq = (1 << AT91SAM9G45_ID_IRQ0); | 346 | at91_extern_irq = (1 << AT91SAM9G45_ID_IRQ0); |
346 | 347 | ||
347 | /* Register GPIO subsystem */ | 348 | /* Register GPIO subsystem */ |
@@ -393,6 +394,7 @@ static unsigned int at91sam9g45_default_irq_priority[NR_AIC_IRQS] __initdata = { | |||
393 | struct at91_init_soc __initdata at91sam9g45_soc = { | 394 | struct at91_init_soc __initdata at91sam9g45_soc = { |
394 | .map_io = at91sam9g45_map_io, | 395 | .map_io = at91sam9g45_map_io, |
395 | .default_irq_priority = at91sam9g45_default_irq_priority, | 396 | .default_irq_priority = at91sam9g45_default_irq_priority, |
397 | .ioremap_registers = at91sam9g45_ioremap_registers, | ||
396 | .register_clocks = at91sam9g45_register_clocks, | 398 | .register_clocks = at91sam9g45_register_clocks, |
397 | .init = at91sam9g45_initialize, | 399 | .init = at91sam9g45_initialize, |
398 | }; | 400 | }; |