aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorPeter Horton <phorton@bitbox.co.uk>2010-05-28 11:37:26 -0400
committerNicolas Ferre <nicolas.ferre@atmel.com>2010-10-26 05:32:47 -0400
commit184c82e853704ee98e729af0f36a8539355c0e2e (patch)
tree927e9c1a4ab1a339b842619709fa852ae1926003 /arch
parentabf0c1bc94cb16f9eed331ea98ac151d08adf4fe (diff)
AT91: Fix AT91SAM9G20 reset as per the errata in the data sheet
If the SDRAM is not cleanly shutdown before reset it can be left driving the bus, which then stops the bootloader booting from NAND. Signed-off-by: Peter Horton <phorton@bitbox.co.uk> [nicolas.ferre@atmel.com: change file header line order] Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-at91/Makefile2
-rw-r--r--arch/arm/mach-at91/at91sam9260.c8
-rw-r--r--arch/arm/mach-at91/at91sam9g20_reset.S55
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
16obj-$(CONFIG_ARCH_AT91SAM9G10) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o 16obj-$(CONFIG_ARCH_AT91SAM9G10) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o
17obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam926x_time.o at91sam9263_devices.o sam9_smc.o 17obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam926x_time.o at91sam9263_devices.o sam9_smc.o
18obj-$(CONFIG_ARCH_AT91SAM9RL) += at91sam9rl.o at91sam926x_time.o at91sam9rl_devices.o sam9_smc.o 18obj-$(CONFIG_ARCH_AT91SAM9RL) += at91sam9rl.o at91sam926x_time.o at91sam9rl_devices.o sam9_smc.o
19obj-$(CONFIG_ARCH_AT91SAM9G20) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o 19obj-$(CONFIG_ARCH_AT91SAM9G20) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o at91sam9g20_reset.o
20obj-$(CONFIG_ARCH_AT91SAM9G45) += at91sam9g45.o at91sam926x_time.o at91sam9g45_devices.o sam9_smc.o 20obj-$(CONFIG_ARCH_AT91SAM9G45) += at91sam9g45.o at91sam926x_time.o at91sam9g45_devices.o sam9_smc.o
21obj-$(CONFIG_ARCH_AT91CAP9) += at91cap9.o at91sam926x_time.o at91cap9_devices.o sam9_smc.o 21obj-$(CONFIG_ARCH_AT91CAP9) += at91cap9.o at91sam926x_time.o at91cap9_devices.o sam9_smc.o
22obj-$(CONFIG_ARCH_AT572D940HF) += at572d940hf.o at91sam926x_time.o at572d940hf_devices.o sam9_smc.o 22obj-$(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
28extern void at91sam9g20_reset(void);
29
28static struct map_desc at91sam9260_io_desc[] __initdata = { 30static 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
35at91sam9g20_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 .