[PATCH 3/3] mtd: rawnand: denali: Do not reset the block before booting the kernel

Masahiro Yamada masahiroy at kernel.org
Fri Jan 10 04:33:30 CET 2020


On Fri, Jan 10, 2020 at 9:14 AM Marek Vasut <marex at denx.de> wrote:
>
> The Denali NAND block loses configuration when put in reset.
> Specifically, RB_PIN_ENABLED, CHIP_ENABLE_DONT_CARE,
> SPARE_AREA_SKIP_BYTES and SPARE_AREA_MARKER are lost.
> Since mainline Linux depends on the configuration programmed
> into the Denali NAND controller by the bootloader, do not
> reset the controller before starting the kernel, otherwise
> the kernel will read bogus values and fail to use the NAND.
>
> Fixes: ed784ac3822b ("mtd: rawnand: denali: add reset handling")
> Signed-off-by: Marek Vasut <marex at denx.de>
> Cc: Masahiro Yamada <yamada.masahiro at socionext.com>
> Cc: Simon Goldschmidt <simon.k.r.goldschmidt at gmail.com>
> ---
>  drivers/mtd/nand/raw/denali_dt.c | 9 ---------
>  1 file changed, 9 deletions(-)
>
> diff --git a/drivers/mtd/nand/raw/denali_dt.c b/drivers/mtd/nand/raw/denali_dt.c
> index b1e14982c4..03c97dbc05 100644
> --- a/drivers/mtd/nand/raw/denali_dt.c
> +++ b/drivers/mtd/nand/raw/denali_dt.c
> @@ -142,21 +142,12 @@ static int denali_dt_probe(struct udevice *dev)
>         return denali_init(denali);
>  }
>
> -static int denali_dt_remove(struct udevice *dev)
> -{
> -       struct denali_nand_info *denali = dev_get_priv(dev);
> -
> -       return reset_release_bulk(&denali->resets);
> -}
> -
>  U_BOOT_DRIVER(denali_nand_dt) = {
>         .name = "denali-nand-dt",
>         .id = UCLASS_MISC,
>         .of_match = denali_nand_dt_ids,
>         .probe = denali_dt_probe,
>         .priv_auto_alloc_size = sizeof(struct denali_nand_info),
> -       .remove = denali_dt_remove,
> -       .flags = DM_FLAG_OS_PREPARE,
>  };
>
>  void board_nand_init(void)
> --
> 2.24.1
>


One more thing:

The struct reset can be a local variable.



diff --git a/drivers/mtd/nand/raw/denali.h b/drivers/mtd/nand/raw/denali.h
index 63ae828768c9..019deda094e5 100644
--- a/drivers/mtd/nand/raw/denali.h
+++ b/drivers/mtd/nand/raw/denali.h
@@ -10,7 +10,6 @@
 #include <linux/bitops.h>
 #include <linux/mtd/rawnand.h>
 #include <linux/types.h>
-#include <reset.h>

 #define DEVICE_RESET                           0x0
 #define     DEVICE_RESET__BANK(bank)                   BIT(bank)
@@ -316,7 +315,6 @@ struct denali_nand_info {
        void (*host_write)(struct denali_nand_info *denali, u32 addr, u32 data);
        void (*setup_dma)(struct denali_nand_info *denali, dma_addr_t dma_addr,
                          int page, int write);
-       struct reset_ctl_bulk resets;
 };

 #define DENALI_CAP_HW_ECC_FIXUP                        BIT(0)
diff --git a/drivers/mtd/nand/raw/denali_dt.c b/drivers/mtd/nand/raw/denali_dt.c
index b1e14982c443..9d5a01b076e9 100644
--- a/drivers/mtd/nand/raw/denali_dt.c
+++ b/drivers/mtd/nand/raw/denali_dt.c
@@ -6,6 +6,7 @@

 #include <clk.h>
 #include <dm.h>
+#include <reset.h>
 #include <linux/io.h>
 #include <linux/ioport.h>
 #include <linux/printk.h>
@@ -63,6 +64,7 @@ static int denali_dt_probe(struct udevice *dev)
        struct denali_nand_info *denali = dev_get_priv(dev);
        const struct denali_dt_data *data;
        struct clk clk, clk_x, clk_ecc;
+       struct reset_ctl_bulk resets;
        struct resource res;
        int ret;

@@ -133,11 +135,11 @@ static int denali_dt_probe(struct udevice *dev)
                denali->clk_x_rate = 200000000;
        }

-       ret = reset_get_bulk(dev, &denali->resets);
+       ret = reset_get_bulk(dev, &resets);
        if (ret)
                dev_warn(dev, "Can't get reset: %d\n", ret);
        else
-               reset_deassert_bulk(&denali->resets);
+               reset_deassert_bulk(&resets);

        return denali_init(denali);
 }




-- 
Best Regards
Masahiro Yamada


More information about the U-Boot mailing list