aboutsummaryrefslogtreecommitdiffstats
path: root/patches.renesas/0173-ARM-shmobile-R-Car-Break-infinite-loop.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches.renesas/0173-ARM-shmobile-R-Car-Break-infinite-loop.patch')
-rw-r--r--patches.renesas/0173-ARM-shmobile-R-Car-Break-infinite-loop.patch64
1 files changed, 64 insertions, 0 deletions
diff --git a/patches.renesas/0173-ARM-shmobile-R-Car-Break-infinite-loop.patch b/patches.renesas/0173-ARM-shmobile-R-Car-Break-infinite-loop.patch
new file mode 100644
index 00000000000000..78d0b349c04c72
--- /dev/null
+++ b/patches.renesas/0173-ARM-shmobile-R-Car-Break-infinite-loop.patch
@@ -0,0 +1,64 @@
+From c0ed352b2786ae5da793bdbb8c33f8a44ee216b2 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Thu, 4 Jun 2015 20:22:29 +0200
+Subject: [PATCH 173/326] 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: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 2f575fcff1fad24e97b8e7d793ad9af9ae5b8a17)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/mach-shmobile/pm-rcar.c | 16 ++++++++++++++--
+ 1 file changed, 14 insertions(+), 2 deletions(-)
+
+diff --git a/arch/arm/mach-shmobile/pm-rcar.c b/arch/arm/mach-shmobile/pm-rcar.c
+index 56ea82a851cb..a5e4c3a88ec4 100644
+--- a/arch/arm/mach-shmobile/pm-rcar.c
++++ b/arch/arm/mach-shmobile/pm-rcar.c
+@@ -42,6 +42,9 @@
+ #define SYSCSR_RETRIES 100
+ #define SYSCSR_DELAY_US 1
+
++#define PWRER_RETRIES 100
++#define PWRER_DELAY_US 1
++
+ #define SYSCISR_RETRIES 1000
+ #define SYSCISR_DELAY_US 1
+
+@@ -95,14 +98,23 @@ static int rcar_sysc_update(struct rcar_sysc_ch *sysc_ch,
+ iowrite32(isr_mask, rcar_sysc_base + SYSCISCR);
+
+ /* Submit power shutoff or resume request until it was accepted */
+- do {
++ for (k = 0; k < PWRER_RETRIES; k++) {
+ ret = on_off_fn(sysc_ch);
+ if (ret)
+ goto out;
+
+ status = ioread32(rcar_sysc_base +
+ 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 * */
+ for (k = 0; k < SYSCISR_RETRIES; k++) {
+--
+2.6.2
+