Re: [PATCH 12/15] nand: Allow reinitialization

Dario Binacchi
2023-11-02T11:08:29Z

Sean, All

On Sun, Oct 29, 2023 at 4:49 AM Sean Anderson <seanga2@gmail.com> wrote:
>
> 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
>

Reviewed-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>

Thanks and regards,
Dario

--

Dario Binacchi

Senior Embedded Linux Developer

dario.binacchi@amarulasolutions.com

__________________________________

Amarula Solutions SRL

Via Le Canevare 30, 31100 Treviso, Veneto, IT

T. +39 042 243 5310
info@amarulasolutions.com