diff options
author | Mike Frysinger <vapier@gentoo.org> | 2011-05-02 00:00:35 -0400 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2011-05-25 08:13:43 -0400 |
commit | 803103925b1f23fe0edf91348be3e5a8fd352d5e (patch) | |
tree | 40b84f804c9ba8178b60b3e742cd2a4d193b2be6 /arch/blackfin/kernel | |
parent | f91c69168a218fb7ab7a5ce09fa1ccd20a904119 (diff) |
Blackfin: use on-chip reset func with newer parts
Turns out the documentation is wrong and doing "RAISE 1" does not result
in a software reset, only a core reset. So when the on-chip rom has a
functioning reset helper, use it.
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'arch/blackfin/kernel')
-rw-r--r-- | arch/blackfin/kernel/reboot.c | 65 |
1 files changed, 31 insertions, 34 deletions
diff --git a/arch/blackfin/kernel/reboot.c b/arch/blackfin/kernel/reboot.c index 53d08dee8531..488bdc51aaa5 100644 --- a/arch/blackfin/kernel/reboot.c +++ b/arch/blackfin/kernel/reboot.c | |||
@@ -23,6 +23,9 @@ | |||
23 | __attribute__ ((__l1_text__, __noreturn__)) | 23 | __attribute__ ((__l1_text__, __noreturn__)) |
24 | static void bfin_reset(void) | 24 | static void bfin_reset(void) |
25 | { | 25 | { |
26 | if (!ANOMALY_05000353 && !ANOMALY_05000386) | ||
27 | bfrom_SoftReset((void *)(L1_SCRATCH_START + L1_SCRATCH_LENGTH - 20)); | ||
28 | |||
26 | /* Wait for completion of "system" events such as cache line | 29 | /* Wait for completion of "system" events such as cache line |
27 | * line fills so that we avoid infinite stalls later on as | 30 | * line fills so that we avoid infinite stalls later on as |
28 | * much as possible. This code is in L1, so it won't trigger | 31 | * much as possible. This code is in L1, so it won't trigger |
@@ -30,46 +33,40 @@ static void bfin_reset(void) | |||
30 | */ | 33 | */ |
31 | __builtin_bfin_ssync(); | 34 | __builtin_bfin_ssync(); |
32 | 35 | ||
33 | /* The bootrom checks to see how it was reset and will | 36 | /* Initiate System software reset. */ |
34 | * automatically perform a software reset for us when | 37 | bfin_write_SWRST(0x7); |
35 | * it starts executing after the core reset. | ||
36 | */ | ||
37 | if (ANOMALY_05000353 || ANOMALY_05000386) { | ||
38 | /* Initiate System software reset. */ | ||
39 | bfin_write_SWRST(0x7); | ||
40 | 38 | ||
41 | /* Due to the way reset is handled in the hardware, we need | 39 | /* Due to the way reset is handled in the hardware, we need |
42 | * to delay for 10 SCLKS. The only reliable way to do this is | 40 | * to delay for 10 SCLKS. The only reliable way to do this is |
43 | * to calculate the CCLK/SCLK ratio and multiply 10. For now, | 41 | * to calculate the CCLK/SCLK ratio and multiply 10. For now, |
44 | * we'll assume worse case which is a 1:15 ratio. | 42 | * we'll assume worse case which is a 1:15 ratio. |
45 | */ | 43 | */ |
46 | asm( | 44 | asm( |
47 | "LSETUP (1f, 1f) LC0 = %0\n" | 45 | "LSETUP (1f, 1f) LC0 = %0\n" |
48 | "1: nop;" | 46 | "1: nop;" |
49 | : | 47 | : |
50 | : "a" (15 * 10) | 48 | : "a" (15 * 10) |
51 | : "LC0", "LB0", "LT0" | 49 | : "LC0", "LB0", "LT0" |
52 | ); | 50 | ); |
53 | 51 | ||
54 | /* Clear System software reset */ | 52 | /* Clear System software reset */ |
55 | bfin_write_SWRST(0); | 53 | bfin_write_SWRST(0); |
56 | 54 | ||
57 | /* The BF526 ROM will crash during reset */ | 55 | /* The BF526 ROM will crash during reset */ |
58 | #if defined(__ADSPBF522__) || defined(__ADSPBF524__) || defined(__ADSPBF526__) | 56 | #if defined(__ADSPBF522__) || defined(__ADSPBF524__) || defined(__ADSPBF526__) |
59 | bfin_read_SWRST(); | 57 | bfin_read_SWRST(); |
60 | #endif | 58 | #endif |
61 | 59 | ||
62 | /* Wait for the SWRST write to complete. Cannot rely on SSYNC | 60 | /* Wait for the SWRST write to complete. Cannot rely on SSYNC |
63 | * though as the System state is all reset now. | 61 | * though as the System state is all reset now. |
64 | */ | 62 | */ |
65 | asm( | 63 | asm( |
66 | "LSETUP (1f, 1f) LC1 = %0\n" | 64 | "LSETUP (1f, 1f) LC1 = %0\n" |
67 | "1: nop;" | 65 | "1: nop;" |
68 | : | 66 | : |
69 | : "a" (15 * 1) | 67 | : "a" (15 * 1) |
70 | : "LC1", "LB1", "LT1" | 68 | : "LC1", "LB1", "LT1" |
71 | ); | 69 | ); |
72 | } | ||
73 | 70 | ||
74 | while (1) | 71 | while (1) |
75 | /* Issue core reset */ | 72 | /* Issue core reset */ |