Message ID | 20211029172633.886453-13-tudor.ambarus@microchip.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | mtd: spi-nor: Clean params init | expand |
Am 2021-10-29 19:26, schrieb Tudor Ambarus: > spi_nor_post_sfdp_fixups() was called even when there were no SFDP > tables defined. late_init() should be instead used for flashes that > do not define SFDP tables. > > Use spi_nor_post_sfdp_fixups() just to fix SFDP data. post_sfdp() > hook is as of now used just by s28hs512t, mt35xu512aba, and both > support SFDP, there's no functional change with this patch. > > Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com> > --- > drivers/mtd/spi-nor/core.c | 56 ++++++++++++++++++-------------------- > 1 file changed, 26 insertions(+), 30 deletions(-) > > diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c > index 4679298c5301..82cc56c9d09e 100644 > --- a/drivers/mtd/spi-nor/core.c > +++ b/drivers/mtd/spi-nor/core.c > @@ -2508,6 +2508,25 @@ static void > spi_nor_manufacturer_init_params(struct spi_nor *nor) > nor->info->fixups->default_init(nor); > } > > +/** > + * spi_nor_post_sfdp_fixups() - Updates the flash's parameters and > settings > + * after SFDP has been parsed. Called only for flashes that define > JESD216 SFDP > + * tables. > + * @nor: pointer to a 'struct spi_nor' > + * > + * Used to tweak various flash parameters when information provided by > the SFDP > + * tables are wrong. > + */ > +static void spi_nor_post_sfdp_fixups(struct spi_nor *nor) > +{ > + if (nor->manufacturer && nor->manufacturer->fixups && > + nor->manufacturer->fixups->post_sfdp) > + nor->manufacturer->fixups->post_sfdp(nor); > + > + if (nor->info->fixups && nor->info->fixups->post_sfdp) > + nor->info->fixups->post_sfdp(nor); > +} > + > /** > * spi_nor_sfdp_init_params() - Initialize the flash's parameters and > settings > * based on JESD216 SFDP standard. > @@ -2522,7 +2541,9 @@ static void spi_nor_sfdp_init_params(struct > spi_nor *nor) > > memcpy(&sfdp_params, nor->params, sizeof(sfdp_params)); > > - if (spi_nor_parse_sfdp(nor)) { > + if (!spi_nor_parse_sfdp(nor)) { > + spi_nor_post_sfdp_fixups(nor); I find this function particulary confusing. Why is it copying the params around? I know the function doc says rollback, but can't we make this better? Either make spi_nor_parse_sfdp() commit the nor->params update atomically, or pass a second parameter sfdp_params, which are copied to nor->params here if spi_nor_parse_sfdp() was successful. Also the control flow could be better. ret = spi_nor_parse_sfdp(nor, &sfdp_params); if (!ret) { /* clever comment, why is addr_width = 0 here */ nor->addr_width = 0; nor->flags &= ~SNOR_F_4B_OPCODES; return 0; } memcpy(nor->params, &sfdp_params, sizeof(*nor->params)); spi_nor_post_sfdp_fixups(nor); Having an even closer look, addr_width is set to 0 because spi_nor_parse_sfdp() is also changing that. nor->flags is also changed and not only the SNOR_F_4B_OPCODES bit. But only that one is cleared?! I think this deserves another cleanup series. Having the rollback here makes no sense. You'd have to keep both in sync. IMHO best would be a second parameter and make sure all code in sfdp.c don't change anything else. Which would probably mean that addr_width and flags will move to nor->params. Anyway, for now: Reviewed-by: Michael Walle <michael@walle.cc> -michael
diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c index 4679298c5301..82cc56c9d09e 100644 --- a/drivers/mtd/spi-nor/core.c +++ b/drivers/mtd/spi-nor/core.c @@ -2508,6 +2508,25 @@ static void spi_nor_manufacturer_init_params(struct spi_nor *nor) nor->info->fixups->default_init(nor); } +/** + * spi_nor_post_sfdp_fixups() - Updates the flash's parameters and settings + * after SFDP has been parsed. Called only for flashes that define JESD216 SFDP + * tables. + * @nor: pointer to a 'struct spi_nor' + * + * Used to tweak various flash parameters when information provided by the SFDP + * tables are wrong. + */ +static void spi_nor_post_sfdp_fixups(struct spi_nor *nor) +{ + if (nor->manufacturer && nor->manufacturer->fixups && + nor->manufacturer->fixups->post_sfdp) + nor->manufacturer->fixups->post_sfdp(nor); + + if (nor->info->fixups && nor->info->fixups->post_sfdp) + nor->info->fixups->post_sfdp(nor); +} + /** * spi_nor_sfdp_init_params() - Initialize the flash's parameters and settings * based on JESD216 SFDP standard. @@ -2522,7 +2541,9 @@ static void spi_nor_sfdp_init_params(struct spi_nor *nor) memcpy(&sfdp_params, nor->params, sizeof(sfdp_params)); - if (spi_nor_parse_sfdp(nor)) { + if (!spi_nor_parse_sfdp(nor)) { + spi_nor_post_sfdp_fixups(nor); + } else { memcpy(nor->params, &sfdp_params, sizeof(*nor->params)); nor->addr_width = 0; nor->flags &= ~SNOR_F_4B_OPCODES; @@ -2642,26 +2663,6 @@ static void spi_nor_info_init_params(struct spi_nor *nor) spi_nor_init_uniform_erase_map(map, erase_mask, params->size); } -/** - * spi_nor_post_sfdp_fixups() - Updates the flash's parameters and settings - * after SFDP has been parsed (is also called for SPI NORs that do not - * support RDSFDP). - * @nor: pointer to a 'struct spi_nor' - * - * Typically used to tweak various parameters that could not be extracted by - * other means (i.e. when information provided by the SFDP/flash_info tables - * are incomplete or wrong). - */ -static void spi_nor_post_sfdp_fixups(struct spi_nor *nor) -{ - if (nor->manufacturer && nor->manufacturer->fixups && - nor->manufacturer->fixups->post_sfdp) - nor->manufacturer->fixups->post_sfdp(nor); - - if (nor->info->fixups && nor->info->fixups->post_sfdp) - nor->info->fixups->post_sfdp(nor); -} - /** * spi_nor_late_init_params() - Late initialization of default flash parameters. * @nor: pointer to a 'struct spi_nor' @@ -2712,15 +2713,12 @@ static void spi_nor_late_init_params(struct spi_nor *nor) * Please note that there is a ->post_bfpt() fixup hook that can overwrite * the flash parameters and settings immediately after parsing the Basic * Flash Parameter Table. + * spi_nor_post_sfdp_fixups() is called after the SFDP tables are parsed. + * It is used to tweak various flash parameters when information provided + * by the SFDP tables are wrong. * * which can be overwritten by: - * 4/ Post SFDP flash parameters initialization. Used to tweak various - * parameters that could not be extracted by other means (i.e. when - * information provided by the SFDP/flash_info tables are incomplete or - * wrong). - * spi_nor_post_sfdp_fixups() - * - * 5/ Late flash parameters initialization, used to initialize flash + * 4/ Late flash parameters initialization, used to initialize flash * parameters that are not declared in the JESD216 SFDP standard, or where SFDP * tables are not defined at all. * spi_nor_late_init_params() @@ -2740,8 +2738,6 @@ static int spi_nor_init_params(struct spi_nor *nor) !(nor->info->flags & SPI_NOR_SKIP_SFDP)) spi_nor_sfdp_init_params(nor); - spi_nor_post_sfdp_fixups(nor); - spi_nor_late_init_params(nor); return 0;
spi_nor_post_sfdp_fixups() was called even when there were no SFDP tables defined. late_init() should be instead used for flashes that do not define SFDP tables. Use spi_nor_post_sfdp_fixups() just to fix SFDP data. post_sfdp() hook is as of now used just by s28hs512t, mt35xu512aba, and both support SFDP, there's no functional change with this patch. Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com> --- drivers/mtd/spi-nor/core.c | 56 ++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 30 deletions(-)