Commit ef9256d2 authored by Mike Frysinger's avatar Mike Frysinger Committed by Linus Torvalds

Blackfin arch: issue reset via SWRST so we dont clobber the watchdog state

Signed-off-by: default avatarMike Frysinger <michael.frysinger@analog.com>
Signed-off-by: default avatarBryan Wu <bryan.wu@analog.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent c0fc525d
...@@ -481,66 +481,30 @@ ENTRY(_bfin_reset) ...@@ -481,66 +481,30 @@ ENTRY(_bfin_reset)
[p0] = r0; [p0] = r0;
SSYNC; SSYNC;
/* Disable the WDOG TIMER */ /* make sure SYSCR is set to use BMODE */
p0.h = hi(WDOG_CTL); P0.h = hi(SYSCR);
p0.l = lo(WDOG_CTL); P0.l = lo(SYSCR);
r0.l = 0xAD6; R0.l = 0x0;
w[p0] = r0.l; W[P0] = R0.l;
SSYNC;
/* Clear the sticky bit incase it is already set */
p0.h = hi(WDOG_CTL);
p0.l = lo(WDOG_CTL);
r0.l = 0x8AD6;
w[p0] = r0.l;
SSYNC; SSYNC;
/* Program the count value */ /* issue a system soft reset */
R0.l = 0x100; P1.h = hi(SWRST);
R0.h = 0x0; P1.l = lo(SWRST);
P0.h = hi(WDOG_CNT); R1.l = 0x0007;
P0.l = lo(WDOG_CNT); W[P1] = R1;
[P0] = R0;
SSYNC; SSYNC;
/* Program WDOG_STAT if necessary */ /* clear system soft reset */
P0.h = hi(WDOG_CTL); R0.l = 0x0000;
P0.l = lo(WDOG_CTL); W[P0] = R0;
R0 = W[P0](Z);
CC = BITTST(R0,1);
if !CC JUMP .LWRITESTAT;
CC = BITTST(R0,2);
if !CC JUMP .LWRITESTAT;
JUMP .LSKIP_WRITE;
.LWRITESTAT:
/* When watch dog timer is enabled, a write to STAT will load the contents of CNT to STAT */
R0 = 0x0000(z);
P0.h = hi(WDOG_STAT);
P0.l = lo(WDOG_STAT)
[P0] = R0;
SSYNC;
.LSKIP_WRITE:
/* Enable the reset event */
P0.h = hi(WDOG_CTL);
P0.l = lo(WDOG_CTL);
R0 = W[P0](Z);
BITCLR(R0,1);
BITCLR(R0,2);
W[P0] = R0.L;
SSYNC;
NOP;
/* Enable the wdog counter */
R0 = W[P0](Z);
BITCLR(R0,4);
W[P0] = R0.L;
SSYNC; SSYNC;
IDLE; /* issue core reset */
raise 1;
RTS; RTS;
ENDPROC(_bfin_reset)
#if CONFIG_DEBUG_KERNEL_START #if CONFIG_DEBUG_KERNEL_START
debug_kernel_start_trap: debug_kernel_start_trap:
......
...@@ -517,68 +517,30 @@ _delay_lab1_end: ...@@ -517,68 +517,30 @@ _delay_lab1_end:
[p0] = r0; [p0] = r0;
SSYNC; SSYNC;
/* Disable the WDOG TIMER */ /* make sure SYSCR is set to use BMODE */
p0.h = hi(WDOG_CTL); P0.h = hi(SYSCR);
p0.l = lo(WDOG_CTL); P0.l = lo(SYSCR);
r0.l = 0xAD6; R0.l = 0x0;
w[p0] = r0.l; W[P0] = R0.l;
SSYNC; SSYNC;
/* Clear the sticky bit incase it is already set */ /* issue a system soft reset */
p0.h = hi(WDOG_CTL); P1.h = hi(SWRST);
p0.l = lo(WDOG_CTL); P1.l = lo(SWRST);
r0.l = 0x8AD6; R1.l = 0x0007;
w[p0] = r0.l; W[P1] = R1;
SSYNC; SSYNC;
/* Program the count value */ /* clear system soft reset */
R0.l = 0x100; R0.l = 0x0000;
R0.h = 0x0; W[P0] = R0;
P0.h = hi(WDOG_CNT);
P0.l = lo(WDOG_CNT);
[P0] = R0;
SSYNC;
/* Program WDOG_STAT if necessary */
P0.h = hi(WDOG_CTL);
P0.l = lo(WDOG_CTL);
R0 = W[P0](Z);
CC = BITTST(R0,1);
if !CC JUMP .LWRITESTAT;
CC = BITTST(R0,2);
if !CC JUMP .LWRITESTAT;
JUMP .LSKIP_WRITE;
.LWRITESTAT:
/* When watch dog timer is enabled,
* a write to STAT will load the contents of CNT to STAT
*/
R0 = 0x0000(z);
P0.h = hi(WDOG_STAT);
P0.l = lo(WDOG_STAT)
[P0] = R0;
SSYNC;
.LSKIP_WRITE:
/* Enable the reset event */
P0.h = hi(WDOG_CTL);
P0.l = lo(WDOG_CTL);
R0 = W[P0](Z);
BITCLR(R0,1);
BITCLR(R0,2);
W[P0] = R0.L;
SSYNC;
NOP;
/* Enable the wdog counter */
R0 = W[P0](Z);
BITCLR(R0,4);
W[P0] = R0.L;
SSYNC; SSYNC;
IDLE; /* issue core reset */
raise 1;
RTS; RTS;
ENDPROC(_bfin_reset)
.data .data
......
...@@ -427,68 +427,30 @@ ENTRY(_bfin_reset) ...@@ -427,68 +427,30 @@ ENTRY(_bfin_reset)
[p0] = r0; [p0] = r0;
SSYNC; SSYNC;
/* Disable the WDOG TIMER */ /* make sure SYSCR is set to use BMODE */
p0.h = hi(WDOGA_CTL); P0.h = hi(SICA_SYSCR);
p0.l = lo(WDOGA_CTL); P0.l = lo(SICA_SYSCR);
r0.l = 0xAD6; R0.l = 0x0;
w[p0] = r0.l; W[P0] = R0.l;
SSYNC; SSYNC;
/* Clear the sticky bit incase it is already set */ /* issue a system soft reset */
p0.h = hi(WDOGA_CTL); P1.h = hi(SICA_SWRST);
p0.l = lo(WDOGA_CTL); P1.l = lo(SICA_SWRST);
r0.l = 0x8AD6; R1.l = 0x0007;
w[p0] = r0.l; W[P1] = R1;
SSYNC;
/* Program the count value */
R0.l = 0x100;
R0.h = 0x0;
P0.h = hi(WDOGA_CNT);
P0.l = lo(WDOGA_CNT);
[P0] = R0;
SSYNC; SSYNC;
/* Program WDOG_STAT if necessary */ /* clear system soft reset */
P0.h = hi(WDOGA_CTL); R0.l = 0x0000;
P0.l = lo(WDOGA_CTL); W[P0] = R0;
R0 = W[P0](Z);
CC = BITTST(R0,1);
if !CC JUMP .LWRITESTAT;
CC = BITTST(R0,2);
if !CC JUMP .LWRITESTAT;
JUMP .LSKIP_WRITE;
.LWRITESTAT:
/* When watch dog timer is enabled,
* a write to STAT will load the contents of CNT to STAT
*/
R0 = 0x0000(z);
P0.h = hi(WDOGA_STAT);
P0.l = lo(WDOGA_STAT)
[P0] = R0;
SSYNC;
.LSKIP_WRITE:
/* Enable the reset event */
P0.h = hi(WDOGA_CTL);
P0.l = lo(WDOGA_CTL);
R0 = W[P0](Z);
BITCLR(R0,1);
BITCLR(R0,2);
W[P0] = R0.L;
SSYNC;
NOP;
/* Enable the wdog counter */
R0 = W[P0](Z);
BITCLR(R0,4);
W[P0] = R0.L;
SSYNC; SSYNC;
IDLE; /* issue core reset */
raise 1;
RTS; RTS;
ENDPROC(_bfin_reset)
.data .data
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment