diff options
Diffstat (limited to 'arch/arm/mach-at91')
-rw-r--r-- | arch/arm/mach-at91/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/mach-at91/at91sam9260.c | 8 | ||||
-rw-r--r-- | arch/arm/mach-at91/at91sam9g20_reset.S | 55 |
3 files changed, 63 insertions, 2 deletions
diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile index 72b6b1b1722a..6e97edd47c5f 100644 --- a/arch/arm/mach-at91/Makefile +++ b/arch/arm/mach-at91/Makefile | |||
@@ -16,7 +16,7 @@ obj-$(CONFIG_ARCH_AT91SAM9261) += at91sam9261.o at91sam926x_time.o at91sam9261_d | |||
16 | obj-$(CONFIG_ARCH_AT91SAM9G10) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o | 16 | obj-$(CONFIG_ARCH_AT91SAM9G10) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o |
17 | obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam926x_time.o at91sam9263_devices.o sam9_smc.o | 17 | obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam926x_time.o at91sam9263_devices.o sam9_smc.o |
18 | obj-$(CONFIG_ARCH_AT91SAM9RL) += at91sam9rl.o at91sam926x_time.o at91sam9rl_devices.o sam9_smc.o | 18 | obj-$(CONFIG_ARCH_AT91SAM9RL) += at91sam9rl.o at91sam926x_time.o at91sam9rl_devices.o sam9_smc.o |
19 | obj-$(CONFIG_ARCH_AT91SAM9G20) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o | 19 | obj-$(CONFIG_ARCH_AT91SAM9G20) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o at91sam9g20_reset.o |
20 | obj-$(CONFIG_ARCH_AT91SAM9G45) += at91sam9g45.o at91sam926x_time.o at91sam9g45_devices.o sam9_smc.o | 20 | obj-$(CONFIG_ARCH_AT91SAM9G45) += at91sam9g45.o at91sam926x_time.o at91sam9g45_devices.o sam9_smc.o |
21 | obj-$(CONFIG_ARCH_AT91CAP9) += at91cap9.o at91sam926x_time.o at91cap9_devices.o sam9_smc.o | 21 | obj-$(CONFIG_ARCH_AT91CAP9) += at91cap9.o at91sam926x_time.o at91cap9_devices.o sam9_smc.o |
22 | obj-$(CONFIG_ARCH_AT572D940HF) += at572d940hf.o at91sam926x_time.o at572d940hf_devices.o sam9_smc.o | 22 | obj-$(CONFIG_ARCH_AT572D940HF) += at572d940hf.o at91sam926x_time.o at572d940hf_devices.o sam9_smc.o |
diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c index 0894f1077be7..f8844506eabb 100644 --- a/arch/arm/mach-at91/at91sam9260.c +++ b/arch/arm/mach-at91/at91sam9260.c | |||
@@ -25,6 +25,8 @@ | |||
25 | #include "generic.h" | 25 | #include "generic.h" |
26 | #include "clock.h" | 26 | #include "clock.h" |
27 | 27 | ||
28 | extern void at91sam9g20_reset(void); | ||
29 | |||
28 | static struct map_desc at91sam9260_io_desc[] __initdata = { | 30 | static struct map_desc at91sam9260_io_desc[] __initdata = { |
29 | { | 31 | { |
30 | .virtual = AT91_VA_BASE_SYS, | 32 | .virtual = AT91_VA_BASE_SYS, |
@@ -327,7 +329,11 @@ void __init at91sam9260_initialize(unsigned long main_clock) | |||
327 | else | 329 | else |
328 | iotable_init(at91sam9260_sram_desc, ARRAY_SIZE(at91sam9260_sram_desc)); | 330 | iotable_init(at91sam9260_sram_desc, ARRAY_SIZE(at91sam9260_sram_desc)); |
329 | 331 | ||
330 | at91_arch_reset = at91sam9260_reset; | 332 | if (cpu_is_at91sam9g20()) |
333 | at91_arch_reset = at91sam9g20_reset; | ||
334 | else | ||
335 | at91_arch_reset = at91sam9260_reset; | ||
336 | |||
331 | pm_power_off = at91sam9260_poweroff; | 337 | pm_power_off = at91sam9260_poweroff; |
332 | at91_extern_irq = (1 << AT91SAM9260_ID_IRQ0) | (1 << AT91SAM9260_ID_IRQ1) | 338 | at91_extern_irq = (1 << AT91SAM9260_ID_IRQ0) | (1 << AT91SAM9260_ID_IRQ1) |
333 | | (1 << AT91SAM9260_ID_IRQ2); | 339 | | (1 << AT91SAM9260_ID_IRQ2); |
diff --git a/arch/arm/mach-at91/at91sam9g20_reset.S b/arch/arm/mach-at91/at91sam9g20_reset.S new file mode 100644 index 000000000000..f6e9b037f73c --- /dev/null +++ b/arch/arm/mach-at91/at91sam9g20_reset.S | |||
@@ -0,0 +1,55 @@ | |||
1 | /* | ||
2 | * reset AT91SAM9G20 as per errata | ||
3 | * | ||
4 | * (C) BitBox Ltd 2010 | ||
5 | * | ||
6 | * unless the SDRAM is cleanly shutdown before we hit the | ||
7 | * reset register it can be left driving the data bus and | ||
8 | * killing the chance of a subsequent boot from NAND | ||
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 as published by | ||
12 | * the Free Software Foundation; either version 2 of the License, or | ||
13 | * (at your option) any later version. | ||
14 | */ | ||
15 | |||
16 | #define CP15_CR_I (1 << 12) | ||
17 | |||
18 | #define SYS_VIRT_OFS (-0x01000000) | ||
19 | |||
20 | #define SDRAMC_BASE (SYS_VIRT_OFS + 0xffffea00) | ||
21 | #define SDRAMC_TR 0x0004 | ||
22 | #define SDRAMC_LPR 0x0010 | ||
23 | #define SDRAMC_LPCB_POWER_DOWN 2 | ||
24 | |||
25 | #define RSTC_BASE (SYS_VIRT_OFS + 0xfffffd00) | ||
26 | #define RSTC_CR 0x0000 | ||
27 | #define RSTC_PROCRST (1 << 0) | ||
28 | #define RSTC_PERRST (1 << 2) | ||
29 | #define RSTC_KEY (0xa5 << 24) | ||
30 | |||
31 | .arm | ||
32 | |||
33 | .globl at91sam9g20_reset | ||
34 | |||
35 | at91sam9g20_reset: mov r0, #0 | ||
36 | mcr p15, 0, r0, c7, c5, 0 @ flush I-cache | ||
37 | |||
38 | mrc p15, 0, r0, c1, c0, 0 | ||
39 | orr r0, r0, #CP15_CR_I | ||
40 | mcr p15, 0, r0, c1, c0, 0 @ enable I-cache | ||
41 | |||
42 | ldr r0, =SDRAMC_BASE @ preload constants | ||
43 | ldr r1, =RSTC_BASE | ||
44 | |||
45 | mov r2, #1 | ||
46 | mov r3, #SDRAMC_LPCB_POWER_DOWN | ||
47 | ldr r4, =RSTC_KEY | RSTC_PERRST | RSTC_PROCRST | ||
48 | |||
49 | .balign 32 @ align to cache line | ||
50 | |||
51 | str r2, [r0, #SDRAMC_TR] @ disable SDRAM access | ||
52 | str r3, [r0, #SDRAMC_LPR] @ power down SDRAM | ||
53 | str r4, [r1, #RSTC_CR] @ reset processor | ||
54 | |||
55 | b . | ||