[PATCH 12/15] nand: Allow reinitialization

Dario Binacchi dario.binacchi at amarulasolutions.com
Thu Nov 2 12:08:10 CET 2023


Sean, All

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

Thanks and regards,
Dario

-- 

Dario Binacchi

Senior Embedded Linux Developer

dario.binacchi at amarulasolutions.com

__________________________________


Amarula Solutions SRL

Via Le Canevare 30, 31100 Treviso, Veneto, IT

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

www.amarulasolutions.com


More information about the U-Boot mailing list