aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Hennerich <michael.hennerich@analog.com>2007-05-21 06:09:09 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-21 12:50:21 -0400
commit8af10b79877ff5dfd5c7b1928d57cf38483e819d (patch)
tree764cb92a90fd2853044a9edb1c1eb575b0bce6ed
parente8edc6e03a5c8562dc70a6d969f732bdb355a7e7 (diff)
Blackfin arch: Add Workaround for ANOMALY 05000257
Signed-off-by: Michael Hennerich <michael.hennerich@analog.com> Signed-off-by: Bryan Wu <bryan.wu@analog.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--arch/blackfin/lib/ins.S20
-rw-r--r--arch/blackfin/mach-common/entry.S6
2 files changed, 20 insertions, 6 deletions
diff --git a/arch/blackfin/lib/ins.S b/arch/blackfin/lib/ins.S
index 730d2b42753..7d5e9846311 100644
--- a/arch/blackfin/lib/ins.S
+++ b/arch/blackfin/lib/ins.S
@@ -29,6 +29,7 @@
29 */ 29 */
30 30
31#include <linux/linkage.h> 31#include <linux/linkage.h>
32#include <asm/blackfin.h>
32 33
33.align 2 34.align 2
34 35
@@ -39,11 +40,14 @@ ENTRY(_insl)
39 P2 = R2; /* P2 = count */ 40 P2 = R2; /* P2 = count */
40 SSYNC; 41 SSYNC;
41 LSETUP( .Llong_loop_s, .Llong_loop_e) LC0 = P2; 42 LSETUP( .Llong_loop_s, .Llong_loop_e) LC0 = P2;
42.Llong_loop_s: R0 = [P0]; 43.Llong_loop_s: R0 = [P0];
43.Llong_loop_e: [P1++] = R0; 44 [P1++] = R0;
45 NOP;
46.Llong_loop_e: NOP;
44 sti R3; 47 sti R3;
45 RTS; 48 RTS;
46 49
50
47ENTRY(_insw) 51ENTRY(_insw)
48 P0 = R0; /* P0 = port */ 52 P0 = R0; /* P0 = port */
49 cli R3; 53 cli R3;
@@ -51,8 +55,10 @@ ENTRY(_insw)
51 P2 = R2; /* P2 = count */ 55 P2 = R2; /* P2 = count */
52 SSYNC; 56 SSYNC;
53 LSETUP( .Lword_loop_s, .Lword_loop_e) LC0 = P2; 57 LSETUP( .Lword_loop_s, .Lword_loop_e) LC0 = P2;
54.Lword_loop_s: R0 = W[P0]; 58.Lword_loop_s: R0 = W[P0];
55.Lword_loop_e: W[P1++] = R0; 59 W[P1++] = R0;
60 NOP;
61.Lword_loop_e: NOP;
56 sti R3; 62 sti R3;
57 RTS; 63 RTS;
58 64
@@ -63,7 +69,9 @@ ENTRY(_insb)
63 P2 = R2; /* P2 = count */ 69 P2 = R2; /* P2 = count */
64 SSYNC; 70 SSYNC;
65 LSETUP( .Lbyte_loop_s, .Lbyte_loop_e) LC0 = P2; 71 LSETUP( .Lbyte_loop_s, .Lbyte_loop_e) LC0 = P2;
66.Lbyte_loop_s: R0 = B[P0]; 72.Lbyte_loop_s: R0 = B[P0];
67.Lbyte_loop_e: B[P1++] = R0; 73 B[P1++] = R0;
74 NOP;
75.Lbyte_loop_e: NOP;
68 sti R3; 76 sti R3;
69 RTS; 77 RTS;
diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S
index 8eb0a902348..e463733f5c7 100644
--- a/arch/blackfin/mach-common/entry.S
+++ b/arch/blackfin/mach-common/entry.S
@@ -181,6 +181,12 @@ ENTRY(_ex_single_step)
181 181
182_return_from_exception: 182_return_from_exception:
183 DEBUG_START_HWTRACE 183 DEBUG_START_HWTRACE
184#ifdef ANOMALY_05000257
185 R7=LC0;
186 LC0=R7;
187 R7=LC1;
188 LC1=R7;
189#endif
184 (R7:6,P5:4) = [sp++]; 190 (R7:6,P5:4) = [sp++];
185 ASTAT = [sp++]; 191 ASTAT = [sp++];
186 sp = retn; 192 sp = retn;