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

Masahiro Yamada yamada.masahiro at socionext.com
Mon Jan 27 17:54:52 CET 2020


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 --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);
 }
 
-- 
2.17.1



More information about the U-Boot mailing list