diff options
author | Michael Hennerich <michael.hennerich@analog.com> | 2007-05-21 06:09:09 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-21 12:50:21 -0400 |
commit | 8af10b79877ff5dfd5c7b1928d57cf38483e819d (patch) | |
tree | 764cb92a90fd2853044a9edb1c1eb575b0bce6ed /arch/blackfin | |
parent | e8edc6e03a5c8562dc70a6d969f732bdb355a7e7 (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>
Diffstat (limited to 'arch/blackfin')
-rw-r--r-- | arch/blackfin/lib/ins.S | 20 | ||||
-rw-r--r-- | arch/blackfin/mach-common/entry.S | 6 |
2 files changed, 20 insertions, 6 deletions
diff --git a/arch/blackfin/lib/ins.S b/arch/blackfin/lib/ins.S index 730d2b427538..7d5e9846311d 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 | |||
47 | ENTRY(_insw) | 51 | ENTRY(_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 8eb0a9023482..e463733f5c77 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; |