diff options
| -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 . | ||
