[PATCH] mtd: rawnand: fsmc: Default to autodetect buswidth

Miquel Raynal miquel.raynal at bootlin.com
Tue Sep 16 02:32:58 PDT 2025


Hi Linus,

On 14/09/2025 at 00:35:37 +02, Linus Walleij <linus.walleij at linaro.org> wrote:

> If you don't specify buswidth 2 (16 bits) in the device
> tree, FSMC doesn't even probe anymore:
>
> fsmc-nand 10100000.flash: FSMC device partno 090,
>   manufacturer 80, revision 00, config 00
> nand: device found, Manufacturer ID: 0x20, Chip ID: 0xb1
> nand: ST Micro 10100000.flash
> nand: bus width 8 instead of 16 bits
> nand: No NAND device found
> fsmc-nand 10100000.flash: probe with driver fsmc-nand failed
>   with error -22
>
> With this patch to use autodetection unless buswidth is
> specified, the device is properly detected again:
>
> fsmc-nand 10100000.flash: FSMC device partno 090,
>   manufacturer 80, revision 00, config 00
> nand: device found, Manufacturer ID: 0x20, Chip ID: 0xb1
> nand: ST Micro NAND 128MiB 1,8V 16-bit
> nand: 128 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 64
> fsmc-nand 10100000.flash: Using 1-bit HW ECC scheme
> Scanning device for bad blocks
>
> I don't know where or how this happened, I think some change
> in the nand core.

I had a look and honnestly could not find where we broke this. Could it
be possible that it never worked with DT probing and only with platform
data? Any idea of what was the previously working base?

Anyhow, this is just curiosity, patch is relevant (just a little nit
below?).

> Cc: stable at vger.kernel.org
> Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
> ---
>  drivers/mtd/nand/raw/fsmc_nand.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mtd/nand/raw/fsmc_nand.c b/drivers/mtd/nand/raw/fsmc_nand.c
> index df61db8ce466593d533e617c141a8d2498b3a180..154fd9bea3016b2fa7fa720a41ef9eeed6063fd5 100644
> --- a/drivers/mtd/nand/raw/fsmc_nand.c
> +++ b/drivers/mtd/nand/raw/fsmc_nand.c
> @@ -879,7 +879,9 @@ static int fsmc_nand_probe_config_dt(struct platform_device *pdev,
>  		} else if (val != 1) {
>  			dev_err(&pdev->dev, "invalid bank-width %u\n", val);
>  			return -EINVAL;
> -		}
> +		};

                 ^
There is a spurious ';' here, no?

> +	} else {
> +		nand->options |= NAND_BUSWIDTH_AUTO;
>  	}

Thanks,
Miquèl



More information about the linux-mtd mailing list