All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/5] mtd: rawnand: fsl_elbc: Device tree support
@ 2022-04-04 16:17 Pali Rohár
  2022-04-04 16:17 ` [PATCH 1/5] mtd: rawnand: fsl_elbc: Implement RNDOUT command Pali Rohár
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Pali Rohár @ 2022-04-04 16:17 UTC (permalink / raw)
  To: Priyanka Jain, Wolfgang Denk; +Cc: Michal Simek, Simon Glass, u-boot

This patch series adds device tree support for P2020 NAND controller in
SW ECC mode.

Pali Rohár (5):
  mtd: rawnand: fsl_elbc: Implement RNDOUT command
  mtd: rawnand: fsl_elbc: Add device tree support
  mtd: rawnand: fsl_elbc: Use ECC configuration from device tree
  mtd: nand: raw: Add support for DT property nand-ecc-algo=bch
  powerpc: dts: p2020: Add localbus node

 arch/powerpc/dts/p2020-post.dtsi     |  7 ++
 arch/powerpc/dts/p2020rdb-pc.dts     |  4 ++
 arch/powerpc/dts/p2020rdb-pc_36b.dts |  4 ++
 drivers/mtd/nand/raw/Kconfig         |  4 ++
 drivers/mtd/nand/raw/fsl_elbc_nand.c | 99 +++++++++++++++++++++-------
 drivers/mtd/nand/raw/nand_base.c     |  6 ++
 6 files changed, 99 insertions(+), 25 deletions(-)

-- 
2.20.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/5] mtd: rawnand: fsl_elbc: Implement RNDOUT command
  2022-04-04 16:17 [PATCH 0/5] mtd: rawnand: fsl_elbc: Device tree support Pali Rohár
@ 2022-04-04 16:17 ` Pali Rohár
  2022-04-04 16:17 ` [PATCH 2/5] mtd: rawnand: fsl_elbc: Add device tree support Pali Rohár
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Pali Rohár @ 2022-04-04 16:17 UTC (permalink / raw)
  To: Priyanka Jain, Wolfgang Denk; +Cc: Michal Simek, Simon Glass, u-boot

This is needed for SW ECC.

Signed-off-by: Pali Rohár <pali@kernel.org>
---
 drivers/mtd/nand/raw/fsl_elbc_nand.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/mtd/nand/raw/fsl_elbc_nand.c b/drivers/mtd/nand/raw/fsl_elbc_nand.c
index ddfd75d32d06..f8698ec0158a 100644
--- a/drivers/mtd/nand/raw/fsl_elbc_nand.c
+++ b/drivers/mtd/nand/raw/fsl_elbc_nand.c
@@ -312,6 +312,14 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command,
 		fsl_elbc_run_command(mtd);
 		return;
 
+	/* RNDOUT moves the pointer inside the page */
+	case NAND_CMD_RNDOUT:
+		vdbg("fsl_elbc_cmdfunc: NAND_CMD_RNDOUT, column: 0x%x.\n",
+		     column);
+
+		ctrl->index = column;
+		return;
+
 	/* READOOB reads only the OOB because no ECC is performed. */
 	case NAND_CMD_READOOB:
 		vdbg("fsl_elbc_cmdfunc: NAND_CMD_READOOB, page_addr:"
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/5] mtd: rawnand: fsl_elbc: Add device tree support
  2022-04-04 16:17 [PATCH 0/5] mtd: rawnand: fsl_elbc: Device tree support Pali Rohár
  2022-04-04 16:17 ` [PATCH 1/5] mtd: rawnand: fsl_elbc: Implement RNDOUT command Pali Rohár
@ 2022-04-04 16:17 ` Pali Rohár
  2022-04-04 16:17 ` [PATCH 3/5] mtd: rawnand: fsl_elbc: Use ECC configuration from device tree Pali Rohár
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Pali Rohár @ 2022-04-04 16:17 UTC (permalink / raw)
  To: Priyanka Jain, Wolfgang Denk; +Cc: Michal Simek, Simon Glass, u-boot

This allows boards to specify NAND settings via standard DT properties.

Signed-off-by: Pali Rohár <pali@kernel.org>
---
 drivers/mtd/nand/raw/Kconfig         |  4 +++
 drivers/mtd/nand/raw/fsl_elbc_nand.c | 42 ++++++++++++++++++++++++++--
 2 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/drivers/mtd/nand/raw/Kconfig b/drivers/mtd/nand/raw/Kconfig
index 0e826c192986..fb71a759591b 100644
--- a/drivers/mtd/nand/raw/Kconfig
+++ b/drivers/mtd/nand/raw/Kconfig
@@ -152,6 +152,10 @@ config NAND_FSL_ELBC
 	help
 	  Enable the Freescale Enhanced Local Bus Controller FCM NAND driver.
 
+config NAND_FSL_ELBC_DT
+	bool "Support Freescale Enhanced Local Bus Controller FCM NAND driver (DT mode)"
+	depends on NAND_FSL_ELBC
+
 config NAND_FSL_IFC
 	bool "Support Freescale Integrated Flash Controller NAND driver"
 	select TPL_SYS_NAND_SELF_INIT if TPL_NAND_SUPPORT
diff --git a/drivers/mtd/nand/raw/fsl_elbc_nand.c b/drivers/mtd/nand/raw/fsl_elbc_nand.c
index f8698ec0158a..f8d2bdfb1309 100644
--- a/drivers/mtd/nand/raw/fsl_elbc_nand.c
+++ b/drivers/mtd/nand/raw/fsl_elbc_nand.c
@@ -20,6 +20,10 @@
 #include <asm/io.h>
 #include <linux/errno.h>
 
+#ifdef CONFIG_NAND_FSL_ELBC_DT
+#include <dm/read.h>
+#endif
+
 #ifdef VERBOSE_DEBUG
 #define DEBUG_ELBC
 #define vdbg(format, arg...) printf("DEBUG: " format, ##arg)
@@ -664,7 +668,7 @@ static void fsl_elbc_ctrl_init(void)
 	elbc_ctrl->addr = NULL;
 }
 
-static int fsl_elbc_chip_init(int devnum, u8 *addr)
+static int fsl_elbc_chip_init(int devnum, u8 *addr, ofnode flash_node)
 {
 	struct mtd_info *mtd;
 	struct nand_chip *nand;
@@ -712,6 +716,8 @@ static int fsl_elbc_chip_init(int devnum, u8 *addr)
 	elbc_ctrl->chips[priv->bank] = priv;
 
 	/* fill in nand_chip structure */
+	nand->flash_node = flash_node;
+
 	/* set up function call table */
 	nand->read_byte = fsl_elbc_read_byte;
 	nand->write_buf = fsl_elbc_write_buf;
@@ -804,6 +810,8 @@ static int fsl_elbc_chip_init(int devnum, u8 *addr)
 	return 0;
 }
 
+#ifndef CONFIG_NAND_FSL_ELBC_DT
+
 #ifndef CONFIG_SYS_NAND_BASE_LIST
 #define CONFIG_SYS_NAND_BASE_LIST { CONFIG_SYS_NAND_BASE }
 #endif
@@ -816,5 +824,35 @@ void board_nand_init(void)
 	int i;
 
 	for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
-		fsl_elbc_chip_init(i, (u8 *)base_address[i]);
+		fsl_elbc_chip_init(i, (u8 *)base_address[i], ofnode_null());
+}
+
+#else
+
+static int fsl_elbc_nand_probe(struct udevice *dev)
+{
+	return fsl_elbc_chip_init(0, (void *)dev_read_addr(dev), dev_ofnode(dev));
+}
+
+static const struct udevice_id fsl_elbc_nand_dt_ids[] = {
+	{ .compatible = "fsl,elbc-fcm-nand", },
+	{}
+};
+
+U_BOOT_DRIVER(fsl_elbc_nand) = {
+	.name = "fsl_elbc_nand",
+	.id = UCLASS_MTD,
+	.of_match = fsl_elbc_nand_dt_ids,
+	.probe = fsl_elbc_nand_probe,
+};
+
+void board_nand_init(void)
+{
+	struct udevice *dev;
+	int ret;
+
+	ret = uclass_get_device_by_driver(UCLASS_MTD, DM_DRIVER_GET(fsl_elbc_nand), &dev);
+	if (ret && ret != -ENODEV)
+		printf("Failed to initialize fsl_elbc_nand NAND controller. (error %d)\n", ret);
 }
+#endif
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/5] mtd: rawnand: fsl_elbc: Use ECC configuration from device tree
  2022-04-04 16:17 [PATCH 0/5] mtd: rawnand: fsl_elbc: Device tree support Pali Rohár
  2022-04-04 16:17 ` [PATCH 1/5] mtd: rawnand: fsl_elbc: Implement RNDOUT command Pali Rohár
  2022-04-04 16:17 ` [PATCH 2/5] mtd: rawnand: fsl_elbc: Add device tree support Pali Rohár
@ 2022-04-04 16:17 ` Pali Rohár
  2022-04-04 16:17 ` [PATCH 4/5] mtd: nand: raw: Add support for DT property nand-ecc-algo=bch Pali Rohár
  2022-04-04 16:17 ` [PATCH 5/5] powerpc: dts: p2020: Add localbus node Pali Rohár
  4 siblings, 0 replies; 7+ messages in thread
From: Pali Rohár @ 2022-04-04 16:17 UTC (permalink / raw)
  To: Priyanka Jain, Wolfgang Denk; +Cc: Michal Simek, Simon Glass, u-boot

Initialize ECC configuration after nand_scan_ident() call and only in case
nand_scan_ident() have not done it. nand_scan_ident() fills ECC
configuration from device tree.

Fixes usage of NAND_ECC_SOFT_BCH when it is specified in device tree.

Signed-off-by: Pali Rohár <pali@kernel.org>
---
 drivers/mtd/nand/raw/fsl_elbc_nand.c | 49 +++++++++++++++-------------
 1 file changed, 26 insertions(+), 23 deletions(-)

diff --git a/drivers/mtd/nand/raw/fsl_elbc_nand.c b/drivers/mtd/nand/raw/fsl_elbc_nand.c
index f8d2bdfb1309..e734139b5ea5 100644
--- a/drivers/mtd/nand/raw/fsl_elbc_nand.c
+++ b/drivers/mtd/nand/raw/fsl_elbc_nand.c
@@ -737,36 +737,39 @@ static int fsl_elbc_chip_init(int devnum, u8 *addr, ofnode flash_node)
 	nand->controller = &elbc_ctrl->controller;
 	nand_set_controller_data(nand, priv);
 
-	nand->ecc.read_page = fsl_elbc_read_page;
-	nand->ecc.write_page = fsl_elbc_write_page;
-	nand->ecc.write_subpage = fsl_elbc_write_subpage;
-
 	priv->fmr = (15 << FMR_CWTO_SHIFT) | (2 << FMR_AL_SHIFT);
 
-	/* If CS Base Register selects full hardware ECC then use it */
-	if ((br & BR_DECC) == BR_DECC_CHK_GEN) {
-		nand->ecc.mode = NAND_ECC_HW;
-
-		nand->ecc.layout = (priv->fmr & FMR_ECCM) ?
-				   &fsl_elbc_oob_sp_eccm1 :
-				   &fsl_elbc_oob_sp_eccm0;
+	ret = nand_scan_ident(mtd, 1, NULL);
+	if (ret)
+		return ret;
 
-		nand->ecc.size = 512;
-		nand->ecc.bytes = 3;
-		nand->ecc.steps = 1;
-		nand->ecc.strength = 1;
-	} else {
-		/* otherwise fall back to software ECC */
+	/* If nand_scan_ident() has not selected ecc.mode, do it now */
+	if (nand->ecc.mode == NAND_ECC_NONE) {
+		/* If CS Base Register selects full hardware ECC then use it */
+		if ((br & BR_DECC) == BR_DECC_CHK_GEN) {
+			nand->ecc.mode = NAND_ECC_HW;
+			nand->ecc.layout = (priv->fmr & FMR_ECCM) ?
+					   &fsl_elbc_oob_sp_eccm1 :
+					   &fsl_elbc_oob_sp_eccm0;
+			nand->ecc.size = 512;
+			nand->ecc.bytes = 3;
+			nand->ecc.steps = 1;
+			nand->ecc.strength = 1;
+		} else {
+			/* otherwise fall back to software ECC */
 #if defined(CONFIG_NAND_ECC_BCH)
-		nand->ecc.mode = NAND_ECC_SOFT_BCH;
+			nand->ecc.mode = NAND_ECC_SOFT_BCH;
 #else
-		nand->ecc.mode = NAND_ECC_SOFT;
+			nand->ecc.mode = NAND_ECC_SOFT;
 #endif
+		}
 	}
 
-	ret = nand_scan_ident(mtd, 1, NULL);
-	if (ret)
-		return ret;
+	if (nand->ecc.mode == NAND_ECC_HW) {
+		nand->ecc.read_page = fsl_elbc_read_page;
+		nand->ecc.write_page = fsl_elbc_write_page;
+		nand->ecc.write_subpage = fsl_elbc_write_subpage;
+	}
 
 	/* Large-page-specific setup */
 	if (mtd->writesize == 2048) {
@@ -785,7 +788,7 @@ static int fsl_elbc_chip_init(int devnum, u8 *addr, ofnode flash_node)
 		priv->fmr |= FMR_ECCM;
 
 		/* adjust ecc setup if needed */
-		if ((br & BR_DECC) == BR_DECC_CHK_GEN) {
+		if (nand->ecc.mode == NAND_ECC_HW) {
 			nand->ecc.steps = 4;
 			nand->ecc.layout = (priv->fmr & FMR_ECCM) ?
 					   &fsl_elbc_oob_lp_eccm1 :
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 4/5] mtd: nand: raw: Add support for DT property nand-ecc-algo=bch
  2022-04-04 16:17 [PATCH 0/5] mtd: rawnand: fsl_elbc: Device tree support Pali Rohár
                   ` (2 preceding siblings ...)
  2022-04-04 16:17 ` [PATCH 3/5] mtd: rawnand: fsl_elbc: Use ECC configuration from device tree Pali Rohár
@ 2022-04-04 16:17 ` Pali Rohár
  2022-04-04 16:17 ` [PATCH 5/5] powerpc: dts: p2020: Add localbus node Pali Rohár
  4 siblings, 0 replies; 7+ messages in thread
From: Pali Rohár @ 2022-04-04 16:17 UTC (permalink / raw)
  To: Priyanka Jain, Wolfgang Denk; +Cc: Michal Simek, Simon Glass, u-boot

According to Linux kernel DT schema nand-controller.yaml, using DT property
nand-ecc-algo=bch is the correct way for specifying BCH as ECC algorithm.

Signed-off-by: Pali Rohár <pali@kernel.org>
---
 drivers/mtd/nand/raw/nand_base.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index f7616985d95e..e0c087f0ebaf 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -4598,6 +4598,12 @@ static int nand_dt_init(struct mtd_info *mtd, struct nand_chip *chip, ofnode nod
 			ecc_mode = NAND_ECC_SOFT_BCH;
 	}
 
+	if (ecc_mode == NAND_ECC_SOFT) {
+		str = ofnode_read_string(node, "nand-ecc-algo");
+		if (str && !strcmp(str, "bch"))
+			ecc_mode = NAND_ECC_SOFT_BCH;
+	}
+
 	ecc_strength = ofnode_read_s32_default(node,
 					       "nand-ecc-strength", -1);
 	ecc_step = ofnode_read_s32_default(node,
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 5/5] powerpc: dts: p2020: Add localbus node
  2022-04-04 16:17 [PATCH 0/5] mtd: rawnand: fsl_elbc: Device tree support Pali Rohár
                   ` (3 preceding siblings ...)
  2022-04-04 16:17 ` [PATCH 4/5] mtd: nand: raw: Add support for DT property nand-ecc-algo=bch Pali Rohár
@ 2022-04-04 16:17 ` Pali Rohár
  2022-04-05  9:15   ` [PATCH v2] " Pali Rohár
  4 siblings, 1 reply; 7+ messages in thread
From: Pali Rohár @ 2022-04-04 16:17 UTC (permalink / raw)
  To: Priyanka Jain, Wolfgang Denk; +Cc: Michal Simek, Simon Glass, u-boot

This node is required for NAND and NOR support. Node is taken from the
upstream Linux kernel DTS file.

Signed-off-by: Pali Rohár <pali@kernel.org>
---
 arch/powerpc/dts/p2020-post.dtsi     | 7 +++++++
 arch/powerpc/dts/p2020rdb-pc.dts     | 4 ++++
 arch/powerpc/dts/p2020rdb-pc_36b.dts | 4 ++++
 3 files changed, 15 insertions(+)

diff --git a/arch/powerpc/dts/p2020-post.dtsi b/arch/powerpc/dts/p2020-post.dtsi
index 8d30fa212c43..0a9e81a4248c 100644
--- a/arch/powerpc/dts/p2020-post.dtsi
+++ b/arch/powerpc/dts/p2020-post.dtsi
@@ -85,3 +85,10 @@
 	device_type = "pci";
 	bus-range = <0x0 0xff>;
 };
+
+&lbc {
+	#address-cells = <2>;
+	#size-cells = <1>;
+	compatible = "fsl,p2020-elbc", "fsl,elbc", "simple-bus";
+	interrupts = <19 2 0 0>;
+};
diff --git a/arch/powerpc/dts/p2020rdb-pc.dts b/arch/powerpc/dts/p2020rdb-pc.dts
index b37931ac4491..67fa340d09d0 100644
--- a/arch/powerpc/dts/p2020rdb-pc.dts
+++ b/arch/powerpc/dts/p2020rdb-pc.dts
@@ -15,6 +15,10 @@
 	#size-cells = <2>;
 	interrupt-parent = <&mpic>;
 
+	lbc: localbus@ffe05000 {
+		reg = <0 0xffe05000 0 0x1000>;
+	};
+
 	soc: soc@ffe00000 {
 		ranges = <0x0 0x0 0xffe00000 0x100000>;
 	};
diff --git a/arch/powerpc/dts/p2020rdb-pc_36b.dts b/arch/powerpc/dts/p2020rdb-pc_36b.dts
index ecdc022d9974..2e8d352ecfb8 100644
--- a/arch/powerpc/dts/p2020rdb-pc_36b.dts
+++ b/arch/powerpc/dts/p2020rdb-pc_36b.dts
@@ -15,6 +15,10 @@
 	#size-cells = <2>;
 	interrupt-parent = <&mpic>;
 
+	lbc: localbus@fffe05000 {
+		reg = <0 0xfffe05000 0 0x1000>;
+	};
+
 	soc: soc@fffe00000 {
 		ranges = <0x0 0xf 0xffe00000 0x100000>;
 	};
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2] powerpc: dts: p2020: Add localbus node
  2022-04-04 16:17 ` [PATCH 5/5] powerpc: dts: p2020: Add localbus node Pali Rohár
@ 2022-04-05  9:15   ` Pali Rohár
  0 siblings, 0 replies; 7+ messages in thread
From: Pali Rohár @ 2022-04-05  9:15 UTC (permalink / raw)
  To: Priyanka Jain, Wolfgang Denk
  Cc: Michal Simek, Simon Glass, u-boot, Sinan Akman

This node is required for NAND and NOR support. Node is taken from the
upstream Linux kernel DTS file.

Signed-off-by: Pali Rohár <pali@kernel.org>

---
Changes in v2:
* Fix copy/paste definition error in p2020rdb-pc_36b.dts
---
 arch/powerpc/dts/p2020-post.dtsi     | 7 +++++++
 arch/powerpc/dts/p2020rdb-pc.dts     | 4 ++++
 arch/powerpc/dts/p2020rdb-pc_36b.dts | 4 ++++
 3 files changed, 15 insertions(+)

diff --git a/arch/powerpc/dts/p2020-post.dtsi b/arch/powerpc/dts/p2020-post.dtsi
index 8d30fa212c43..0a9e81a4248c 100644
--- a/arch/powerpc/dts/p2020-post.dtsi
+++ b/arch/powerpc/dts/p2020-post.dtsi
@@ -85,3 +85,10 @@
 	device_type = "pci";
 	bus-range = <0x0 0xff>;
 };
+
+&lbc {
+	#address-cells = <2>;
+	#size-cells = <1>;
+	compatible = "fsl,p2020-elbc", "fsl,elbc", "simple-bus";
+	interrupts = <19 2 0 0>;
+};
diff --git a/arch/powerpc/dts/p2020rdb-pc.dts b/arch/powerpc/dts/p2020rdb-pc.dts
index b37931ac4491..67fa340d09d0 100644
--- a/arch/powerpc/dts/p2020rdb-pc.dts
+++ b/arch/powerpc/dts/p2020rdb-pc.dts
@@ -15,6 +15,10 @@
 	#size-cells = <2>;
 	interrupt-parent = <&mpic>;
 
+	lbc: localbus@ffe05000 {
+		reg = <0 0xffe05000 0 0x1000>;
+	};
+
 	soc: soc@ffe00000 {
 		ranges = <0x0 0x0 0xffe00000 0x100000>;
 	};
diff --git a/arch/powerpc/dts/p2020rdb-pc_36b.dts b/arch/powerpc/dts/p2020rdb-pc_36b.dts
index ecdc022d9974..6f2519600313 100644
--- a/arch/powerpc/dts/p2020rdb-pc_36b.dts
+++ b/arch/powerpc/dts/p2020rdb-pc_36b.dts
@@ -15,6 +15,10 @@
 	#size-cells = <2>;
 	interrupt-parent = <&mpic>;
 
+	lbc: localbus@fffe05000 {
+		reg = <0xf 0xffe05000 0 0x1000>;
+	};
+
 	soc: soc@fffe00000 {
 		ranges = <0x0 0xf 0xffe00000 0x100000>;
 	};
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2022-04-05  9:16 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-04 16:17 [PATCH 0/5] mtd: rawnand: fsl_elbc: Device tree support Pali Rohár
2022-04-04 16:17 ` [PATCH 1/5] mtd: rawnand: fsl_elbc: Implement RNDOUT command Pali Rohár
2022-04-04 16:17 ` [PATCH 2/5] mtd: rawnand: fsl_elbc: Add device tree support Pali Rohár
2022-04-04 16:17 ` [PATCH 3/5] mtd: rawnand: fsl_elbc: Use ECC configuration from device tree Pali Rohár
2022-04-04 16:17 ` [PATCH 4/5] mtd: nand: raw: Add support for DT property nand-ecc-algo=bch Pali Rohár
2022-04-04 16:17 ` [PATCH 5/5] powerpc: dts: p2020: Add localbus node Pali Rohár
2022-04-05  9:15   ` [PATCH v2] " Pali Rohár

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.