[PATCH 12/15] nand: Allow reinitialization

Sean Anderson
2023-10-29T03:51:23Z

NAND devices are destroyed in between unit tests. Provide a function to
reinitialize the subsystem at the beginning of each test.

Signed-off-by: Sean Anderson <seanga2@gmail.com>
---

drivers/mtd/nand/raw/nand.c | 40 ++++++++++++++++++++++++++++++-------
include/nand.h | 1 +
2 files changed, 34 insertions(+), 7 deletions(-)

diff --git a/drivers/mtd/nand/raw/nand.c b/drivers/mtd/nand/raw/nand.c
index 80017b3dddd..4c18861aa25 100644
--- a/drivers/mtd/nand/raw/nand.c
+++ b/drivers/mtd/nand/raw/nand.c
@@ -115,6 +115,8 @@ static void nand_init_chip(int i)
#endif

#ifdef CONFIG_MTD_CONCAT
+struct mtd_info *concat_mtd;
+
static void create_mtd_concat(void)
{
struct mtd_info *nand_info_list[CONFIG_SYS_MAX_NAND_DEVICE];
@@ -129,28 +131,40 @@ static void create_mtd_concat(void)
}
}
if (nand_devices_found > 1) {
- struct mtd_info *mtd;
char c_mtd_name[16];

/*
* We detected multiple devices. Concatenate them together.
*/
sprintf(c_mtd_name, "nand%d", nand_devices_found);
- mtd = mtd_concat_create(nand_info_list, nand_devices_found,
- c_mtd_name);
+ concat_mtd = mtd_concat_create(nand_info_list,
+ nand_devices_found, c_mtd_name);

- if (mtd == NULL)
+ if (!concat_mtd)
return;

- nand_register(nand_devices_found, mtd);
+ nand_register(nand_devices_found, concat_mtd);
}

return;
}
+
+static void destroy_mtd_concat(void)
+{
+ if (!concat_mtd)
+ return;
+
+ mtd_concat_destroy(concat_mtd);
+ concat_mtd = NULL;
+}
#else
static void create_mtd_concat(void)
{
}
+
+static void destroy_mtd_concat(void)
+{
+}
#endif

unsigned long nand_size(void)
@@ -158,10 +172,10 @@ unsigned long nand_size(void)
return total_nand_size;
}

+static int initialized;
+
void nand_init(void)
{
- static int initialized;
-
/*
* Avoid initializing NAND Flash multiple times,
* otherwise it will calculate a wrong total size.
@@ -190,6 +204,18 @@ void nand_init(void)
create_mtd_concat();
}

+void nand_reinit(void)
+{
+ int i;
+
+ destroy_mtd_concat();
+ for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
+ assert(!nand_info[i]);
+
+ initialized = 0;
+ nand_init();
+}
+
unsigned int nand_page_size(void)
{
struct mtd_info *mtd = get_nand_dev_by_index(nand_curr_device);
diff --git a/include/nand.h b/include/nand.h
index fc584f5ef7a..220ffa202ef 100644
--- a/include/nand.h
+++ b/include/nand.h
@@ -11,6 +11,7 @@
#include <config.h>

extern void nand_init(void);
+void nand_reinit(void);
unsigned long nand_size(void);
unsigned int nand_page_size(void);

--
2.37.1