lantiq: update to 3.14
[openwrt.git] / target / linux / lantiq / patches-3.14 / 0015-MTD-lantiq-xway-remove-endless-loop.patch
1 From 836c433cec22555d81bf02bb205dee5772b8df08 Mon Sep 17 00:00:00 2001
2 From: John Crispin <blogic@openwrt.org>
3 Date: Sun, 28 Jul 2013 18:02:06 +0200
4 Subject: [PATCH 15/31] MTD: lantiq: xway: remove endless loop
5
6 The reset loop logic could run into a endless loop. Lets fix it as requested.
7
8 --> http://lists.infradead.org/pipermail/linux-mtd/2012-September/044240.html
9
10 Signed-off-by: John Crispin <blogic@openwrt.org>
11 ---
12  drivers/mtd/nand/xway_nand.c |   10 ++++++++--
13  1 file changed, 8 insertions(+), 2 deletions(-)
14
15 diff --git a/drivers/mtd/nand/xway_nand.c b/drivers/mtd/nand/xway_nand.c
16 index 7f2bdd1..8d14f1b 100644
17 --- a/drivers/mtd/nand/xway_nand.c
18 +++ b/drivers/mtd/nand/xway_nand.c
19 @@ -59,16 +59,22 @@ static u32 xway_latchcmd;
20  static void xway_reset_chip(struct nand_chip *chip)
21  {
22         unsigned long nandaddr = (unsigned long) chip->IO_ADDR_W;
23 +       unsigned long timeout;
24         unsigned long flags;
25  
26         nandaddr &= ~NAND_WRITE_ADDR;
27         nandaddr |= NAND_WRITE_CMD;
28  
29         /* finish with a reset */
30 +       timeout = jiffies + msecs_to_jiffies(20);
31 +
32         spin_lock_irqsave(&ebu_lock, flags);
33         writeb(NAND_WRITE_CMD_RESET, (void __iomem *) nandaddr);
34 -       while ((ltq_ebu_r32(EBU_NAND_WAIT) & NAND_WAIT_WR_C) == 0)
35 -               ;
36 +       do {
37 +               if ((ltq_ebu_r32(EBU_NAND_WAIT) & NAND_WAIT_WR_C) == 0)
38 +                       break;
39 +               cond_resched();
40 +       } while (!time_after_eq(jiffies, timeout));
41         spin_unlock_irqrestore(&ebu_lock, flags);
42  }
43  
44 -- 
45 1.7.10.4
46