diff mbox series

[U-Boot,v2,3/9] mtd: nand: mxs_nand: separate board/controller init

Message ID 20180622160620.20277-4-stefan@agner.ch
State Accepted
Commit 3b1328a0ad7624f7e7bd803d0709c7c2fd13fc46
Delegated to: Stefano Babic
Headers show
Series mtd: nand: mxs_nand: add device tree support | expand

Commit Message

Stefan Agner June 22, 2018, 4:06 p.m. UTC
From: Stefan Agner <stefan.agner@toradex.com>

In preparation for device tree support separate board init
from controller init similar to other raw NAND drivers.

Signed-off-by: Stefan Agner <stefan.agner@toradex.com>
---

Changes in v2:
- Move free of nand_info to board_nand_init

 drivers/mtd/nand/mxs_nand.c | 54 ++++++++++++++++++++++---------------
 1 file changed, 33 insertions(+), 21 deletions(-)
diff mbox series

Patch

diff --git a/drivers/mtd/nand/mxs_nand.c b/drivers/mtd/nand/mxs_nand.c
index 6bd3cb12f9..bb40237362 100644
--- a/drivers/mtd/nand/mxs_nand.c
+++ b/drivers/mtd/nand/mxs_nand.c
@@ -1237,31 +1237,21 @@  int mxs_nand_init_spl(struct nand_chip *nand)
 	return 0;
 }
 
-void board_nand_init(void)
+int mxs_nand_init(struct mxs_nand_info *nand_info)
 {
 	struct mtd_info *mtd;
-	struct mxs_nand_info *nand_info;
 	struct nand_chip *nand;
 	int err;
 
-	nand_info = malloc(sizeof(struct mxs_nand_info));
-	if (!nand_info) {
-		printf("MXS NAND: Failed to allocate private data\n");
-			return;
-	}
-	memset(nand_info, 0, sizeof(struct mxs_nand_info));
-
-	nand_info->gpmi_regs = (struct mxs_gpmi_regs *)MXS_GPMI_BASE;
-	nand_info->bch_regs = (struct mxs_bch_regs *)MXS_BCH_BASE;
 	nand = &nand_info->chip;
 	mtd = nand_to_mtd(nand);
 	err = mxs_nand_alloc_buffers(nand_info);
 	if (err)
-		goto err1;
+		return err;
 
 	err = mxs_nand_init_dma(nand_info);
 	if (err)
-		goto err2;
+		goto err_free_buffers;
 
 	memset(&fake_ecc_layout, 0, sizeof(fake_ecc_layout));
 
@@ -1285,10 +1275,10 @@  void board_nand_init(void)
 
 	/* first scan to find the device and get the page size */
 	if (nand_scan_ident(mtd, CONFIG_SYS_MAX_NAND_DEVICE, NULL))
-		goto err2;
+		goto err_free_buffers;
 
 	if (mxs_nand_setup_ecc(mtd))
-		goto err2;
+		goto err_free_buffers;
 
 	nand->ecc.read_page	= mxs_nand_ecc_read_page;
 	nand->ecc.write_page	= mxs_nand_ecc_write_page;
@@ -1303,18 +1293,40 @@  void board_nand_init(void)
 	/* second phase scan */
 	err = nand_scan_tail(mtd);
 	if (err)
-		goto err2;
+		goto err_free_buffers;
 
 	err = nand_register(0, mtd);
 	if (err)
-		goto err2;
+		goto err_free_buffers;
 
-	return;
+	return 0;
 
-err2:
+err_free_buffers:
 	free(nand_info->data_buf);
 	free(nand_info->cmd_buf);
-err1:
-	free(nand_info);
+
+	return err;
+}
+
+void board_nand_init(void)
+{
+	struct mxs_nand_info *nand_info;
+
+	nand_info = malloc(sizeof(struct mxs_nand_info));
+	if (!nand_info) {
+		printf("MXS NAND: Failed to allocate private data\n");
+			return;
+	}
+	memset(nand_info, 0, sizeof(struct mxs_nand_info));
+
+	nand_info->gpmi_regs = (struct mxs_gpmi_regs *)MXS_GPMI_BASE;
+	nand_info->bch_regs = (struct mxs_bch_regs *)MXS_BCH_BASE;
+
+	if (mxs_nand_init(nand_info) < 0)
+		goto err;
+
 	return;
+
+err:
+	free(nand_info);
 }