summaryrefslogtreecommitdiff
path: root/arch/arm/mach-uniphier/nand-reset.c
diff options
context:
space:
mode:
authorMasahiro Yamada <yamada.masahiro@socionext.com>2020-02-14 20:54:40 +0900
committerMasahiro Yamada <yamada.masahiro@socionext.com>2020-02-28 02:38:55 +0900
commitce4e9ff4d2366f7f55815305161ecdc444f5c010 (patch)
treebc1d5ab5ae02d0a4d0c6bb18bcd3be0d256e180e /arch/arm/mach-uniphier/nand-reset.c
parentef5c7d6d5c5cfe146c848e67e042bab6ba150d43 (diff)
ARM: uniphier: move NAND reset assertion to U-Boot proper from SPL
The comment /* deassert reset */ is wrong. It asserts the reset. It no longer needs to stay in SPL. The NAND controller reset is handled in the driver. So, this assert can be moved to the board_init() of U-Boot proper. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Diffstat (limited to 'arch/arm/mach-uniphier/nand-reset.c')
-rw-r--r--arch/arm/mach-uniphier/nand-reset.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/arch/arm/mach-uniphier/nand-reset.c b/arch/arm/mach-uniphier/nand-reset.c
new file mode 100644
index 0000000000..11cadaabd8
--- /dev/null
+++ b/arch/arm/mach-uniphier/nand-reset.c
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: GPL-2.0 or later
+/*
+ * Copyright (C) 2020 Socionext Inc.
+ * Author: Masahiro Yamada <yamada.masahiro@socionext.com>
+ */
+
+#include <linux/errno.h>
+#include <dm.h>
+#include <dm/uclass-internal.h>
+#include <reset.h>
+
+#include "init.h"
+
+/*
+ * Assert the Denali NAND controller reset if found.
+ *
+ * On LD4, the bootstrap process starts running after power-on reset regardless
+ * of the boot mode, here the pin-mux is not necessarily set up for NAND, then
+ * the controller is stuck. Assert the controller reset here, and should be
+ * deasserted in the driver after the pin-mux is correctly handled. For other
+ * SoCs, the bootstrap runs only when the boot mode selects ONFi, but it is yet
+ * effective when the boot swap is on. So, the reset should be asserted anyway.
+ */
+void uniphier_nand_reset_assert(void)
+{
+ struct udevice *dev;
+ struct reset_ctl_bulk resets;
+ int ret;
+
+ ret = uclass_find_first_device(UCLASS_MTD, &dev);
+ if (ret || !dev)
+ return;
+
+ /* make sure this is the Denali NAND controller */
+ if (strcmp(dev->driver->name, "denali-nand-dt"))
+ return;
+
+ ret = reset_get_bulk(dev, &resets);
+ if (ret)
+ return;
+
+ reset_assert_bulk(&resets);
+}