2022-03-01 19:37:36

by Michael Walle

[permalink] [raw]
Subject: [PATCH RFC] mtd: spi-nor: unset quad_enable if SFDP doesn't specify it

For flashes which use the first JESD216 revision, we don't know
which enable method for quad mode we can use. The default one in
spi_nor_init_default_params() is wrong for at least the Macronix
MX25L12835F, thus clear the enable method. Flashes with such an
SFDP revision will have to use a flash (and SFDP revision)
specific fixup.

Signed-off-by: Michael Walle <[email protected]>
---
Please note, completely, untested. Heiko, could you test this without
having the second series from Tudor applied? Then you should have at
least a working flash without quad mode.

drivers/mtd/spi-nor/sfdp.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/mtd/spi-nor/sfdp.c b/drivers/mtd/spi-nor/sfdp.c
index a5211543d30d..c23e85274ff2 100644
--- a/drivers/mtd/spi-nor/sfdp.c
+++ b/drivers/mtd/spi-nor/sfdp.c
@@ -549,6 +549,14 @@ static int spi_nor_parse_bfpt(struct spi_nor *nor,
map->uniform_erase_type = map->uniform_region.offset &
SNOR_ERASE_TYPE_MASK;

+ /*
+ * The first JESD216 revision doesn't specify a method to enable
+ * quad mode. spi_nor_init_default_params() will set a legacy
+ * default method to enable quad mode. We have to disable it
+ * again.
+ */
+ params->quad_enable = NULL;
+
/* Stop here if not JESD216 rev A or later. */
if (bfpt_header->length == BFPT_DWORD_MAX_JESD216)
return spi_nor_post_bfpt_fixups(nor, bfpt_header, &bfpt);
@@ -562,7 +570,6 @@ static int spi_nor_parse_bfpt(struct spi_nor *nor,
/* Quad Enable Requirements. */
switch (bfpt.dwords[BFPT_DWORD(15)] & BFPT_DWORD15_QER_MASK) {
case BFPT_DWORD15_QER_NONE:
- params->quad_enable = NULL;
break;

case BFPT_DWORD15_QER_SR2_BIT1_BUGGY:
--
2.30.2


2022-03-02 21:11:58

by Heiko Thiery

[permalink] [raw]
Subject: Re: [PATCH RFC] mtd: spi-nor: unset quad_enable if SFDP doesn't specify it

Hi Michael,

Am Di., 1. März 2022 um 13:49 Uhr schrieb Michael Walle <[email protected]>:
>
> For flashes which use the first JESD216 revision, we don't know
> which enable method for quad mode we can use. The default one in
> spi_nor_init_default_params() is wrong for at least the Macronix
> MX25L12835F, thus clear the enable method. Flashes with such an
> SFDP revision will have to use a flash (and SFDP revision)
> specific fixup.
>
> Signed-off-by: Michael Walle <[email protected]>

Tested-by: Heiko Thiery <[email protected]>

> ---
> Please note, completely, untested. Heiko, could you test this without
> having the second series from Tudor applied? Then you should have at
> least a working flash without quad mode.

I removed the second series and applied yours. With that it works.


--
Heiko

>
> drivers/mtd/spi-nor/sfdp.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mtd/spi-nor/sfdp.c b/drivers/mtd/spi-nor/sfdp.c
> index a5211543d30d..c23e85274ff2 100644
> --- a/drivers/mtd/spi-nor/sfdp.c
> +++ b/drivers/mtd/spi-nor/sfdp.c
> @@ -549,6 +549,14 @@ static int spi_nor_parse_bfpt(struct spi_nor *nor,
> map->uniform_erase_type = map->uniform_region.offset &
> SNOR_ERASE_TYPE_MASK;
>
> + /*
> + * The first JESD216 revision doesn't specify a method to enable
> + * quad mode. spi_nor_init_default_params() will set a legacy
> + * default method to enable quad mode. We have to disable it
> + * again.
> + */
> + params->quad_enable = NULL;
> +
> /* Stop here if not JESD216 rev A or later. */
> if (bfpt_header->length == BFPT_DWORD_MAX_JESD216)
> return spi_nor_post_bfpt_fixups(nor, bfpt_header, &bfpt);
> @@ -562,7 +570,6 @@ static int spi_nor_parse_bfpt(struct spi_nor *nor,
> /* Quad Enable Requirements. */
> switch (bfpt.dwords[BFPT_DWORD(15)] & BFPT_DWORD15_QER_MASK) {
> case BFPT_DWORD15_QER_NONE:
> - params->quad_enable = NULL;
> break;
>
> case BFPT_DWORD15_QER_SR2_BIT1_BUGGY:
> --
> 2.30.2
>