mtd: rawnand: denali_dt: insert udelay() after reset deassert
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Wed, 29 Jan 2020 15:55:54 +0000 (00:55 +0900)
committerMasahiro Yamada <yamada.masahiro@socionext.com>
Fri, 31 Jan 2020 16:14:32 +0000 (01:14 +0900)
When the reset signal is de-asserted, the HW-controlled bootstrap
starts running unless it is disabled in the SoC integration.
It issues some commands to detect a NAND chip, and sets up registers
automatically. Until this process finishes, software should avoid
any register access.

Without this delay function, some of UniPhier boards hangs up while
executing nand_scan_ident(). (denali_read_byte() is blocked)

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
drivers/mtd/nand/raw/denali_dt.c

index 91d0f20..1afc61f 100644 (file)
@@ -136,11 +136,19 @@ static int denali_dt_probe(struct udevice *dev)
        }
 
        ret = reset_get_bulk(dev, &resets);
-       if (ret)
+       if (ret) {
                dev_warn(dev, "Can't get reset: %d\n", ret);
-       else
+       } else {
                reset_deassert_bulk(&resets);
 
+               /*
+                * When the reset is deasserted, the initialization sequence is
+                * kicked (bootstrap process). The driver must wait until it is
+                * finished. Otherwise, it will result in unpredictable behavior.
+                */
+               udelay(200);
+       }
+
        return denali_init(denali);
 }