diff mbox series

[1/4] mtd: rawnand: denali_dt: insert udelay() after reset deassert

Message ID 20200127165455.31753-1-yamada.masahiro@socionext.com
State Superseded
Headers show
Series [1/4] mtd: rawnand: denali_dt: insert udelay() after reset deassert | expand

Commit Message

Masahiro Yamada Jan. 27, 2020, 4:54 p.m. UTC
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 during
the probe.

Signed-off-by: Masahiro Yamada <yamada.masahiro at socionext.com>
---

 drivers/mtd/nand/raw/denali_dt.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/drivers/mtd/nand/raw/denali_dt.c b/drivers/mtd/nand/raw/denali_dt.c
index 91d0f20aae..1afc61f876 100644
--- a/drivers/mtd/nand/raw/denali_dt.c
+++ b/drivers/mtd/nand/raw/denali_dt.c
@@ -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);
 }