Commit 2f575fcf authored by Geert Uytterhoeven's avatar Geert Uytterhoeven Committed by Simon Horman

ARM: shmobile: R-Car: Break infinite loop

rcar_sysc_update() loops (with interrupts disabled and while holding a
spinlock) until submitting a power shutoff or resume request fails, or
until the submitted request was accepted.
If none of these conditions becomes true, this forms an infinite loop.

Put a limit on the maximum number of loop iterations, and add a small
delay to each iteration, to fix this.
Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: default avatarSimon Horman <horms+renesas@verge.net.au>
parent 6fd2242e
...@@ -42,6 +42,9 @@ ...@@ -42,6 +42,9 @@
#define SYSCSR_RETRIES 100 #define SYSCSR_RETRIES 100
#define SYSCSR_DELAY_US 1 #define SYSCSR_DELAY_US 1
#define PWRER_RETRIES 100
#define PWRER_DELAY_US 1
#define SYSCISR_RETRIES 1000 #define SYSCISR_RETRIES 1000
#define SYSCISR_DELAY_US 1 #define SYSCISR_DELAY_US 1
...@@ -95,14 +98,23 @@ static int rcar_sysc_update(struct rcar_sysc_ch *sysc_ch, ...@@ -95,14 +98,23 @@ static int rcar_sysc_update(struct rcar_sysc_ch *sysc_ch,
iowrite32(isr_mask, rcar_sysc_base + SYSCISCR); iowrite32(isr_mask, rcar_sysc_base + SYSCISCR);
/* Submit power shutoff or resume request until it was accepted */ /* Submit power shutoff or resume request until it was accepted */
do { for (k = 0; k < PWRER_RETRIES; k++) {
ret = on_off_fn(sysc_ch); ret = on_off_fn(sysc_ch);
if (ret) if (ret)
goto out; goto out;
status = ioread32(rcar_sysc_base + status = ioread32(rcar_sysc_base +
sysc_ch->chan_offs + PWRER_OFFS); sysc_ch->chan_offs + PWRER_OFFS);
} while (status & chan_mask); if (!(status & chan_mask))
break;
udelay(PWRER_DELAY_US);
}
if (k == PWRER_RETRIES) {
ret = -EIO;
goto out;
}
/* Wait until the power shutoff or resume request has completed * */ /* Wait until the power shutoff or resume request has completed * */
for (k = 0; k < SYSCISR_RETRIES; k++) { for (k = 0; k < SYSCISR_RETRIES; k++) {
......
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