Commit dacc8cfe authored by Tudor Ambarus's avatar Tudor Ambarus

mtd: spi-nor: core: Introduce the late_init() hook

Flash parameters init is done in a spaghetti way right now.
There is the init based on the flash_info data, then there is the
default_init() hook, then SFDP init, an intermediary post_bft(),
then post_sfdp() and a spi_nor_late_init_params(). Each method can
overwrite previuosly initialized parameters.

We want to separate what is SFDP and non-SFDP specific. late_init()
will replace the default_init() hook and will be used only to initialize
flash parameters that are not declared in the JESD216 SFDP standard, or
where SFDP tables are not defined at all.
We cut a member in the chain of initializing parameters by getting rid
of the default_init() hook, and we make it clear that everything that is
in late_init() is not covered by the SFDP tables defined by the flash.
Signed-off-by: default avatarTudor Ambarus <tudor.ambarus@microchip.com>
Reviewed-by: default avatarMichael Walle <michael@walle.cc>
Reviewed-by: default avatarPratyush Yadav <p.yadav@ti.com>
Link: https://lore.kernel.org/r/20211029172633.886453-6-tudor.ambarus@microchip.com
parent 5854d4a6
...@@ -2666,11 +2666,19 @@ static void spi_nor_post_sfdp_fixups(struct spi_nor *nor) ...@@ -2666,11 +2666,19 @@ static void spi_nor_post_sfdp_fixups(struct spi_nor *nor)
* spi_nor_late_init_params() - Late initialization of default flash parameters. * spi_nor_late_init_params() - Late initialization of default flash parameters.
* @nor: pointer to a 'struct spi_nor' * @nor: pointer to a 'struct spi_nor'
* *
* Used to set default flash parameters and settings when the ->default_init() * Used to initialize flash parameters that are not declared in the JESD216
* hook or the SFDP parser let voids. * SFDP standard, or where SFDP tables are not defined at all.
* Will replace the spi_nor_manufacturer_init_params() method.
*/ */
static void spi_nor_late_init_params(struct spi_nor *nor) static void spi_nor_late_init_params(struct spi_nor *nor)
{ {
if (nor->manufacturer && nor->manufacturer->fixups &&
nor->manufacturer->fixups->late_init)
nor->manufacturer->fixups->late_init(nor);
if (nor->info->fixups && nor->info->fixups->late_init)
nor->info->fixups->late_init(nor);
/* /*
* NOR protection support. When locking_ops are not provided, we pick * NOR protection support. When locking_ops are not provided, we pick
* the default ones. * the default ones.
...@@ -2712,8 +2720,9 @@ static void spi_nor_late_init_params(struct spi_nor *nor) ...@@ -2712,8 +2720,9 @@ static void spi_nor_late_init_params(struct spi_nor *nor)
* wrong). * wrong).
* spi_nor_post_sfdp_fixups() * spi_nor_post_sfdp_fixups()
* *
* 5/ Late default flash parameters initialization, used when the * 5/ Late flash parameters initialization, used to initialize flash
* ->default_init() hook or the SFDP parser do not set specific params. * parameters that are not declared in the JESD216 SFDP standard, or where SFDP
* tables are not defined at all.
* spi_nor_late_init_params() * spi_nor_late_init_params()
*/ */
static int spi_nor_init_params(struct spi_nor *nor) static int spi_nor_init_params(struct spi_nor *nor)
......
...@@ -297,6 +297,9 @@ struct spi_nor_flash_parameter { ...@@ -297,6 +297,9 @@ struct spi_nor_flash_parameter {
* parameters that could not be extracted by other means (i.e. * parameters that could not be extracted by other means (i.e.
* when information provided by the SFDP/flash_info tables are * when information provided by the SFDP/flash_info tables are
* incomplete or wrong). * incomplete or wrong).
* @late_init: used to initialize flash parameters that are not declared in the
* JESD216 SFDP standard, or where SFDP tables not defined at all.
* Will replace the default_init() hook.
* *
* Those hooks can be used to tweak the SPI NOR configuration when the SFDP * Those hooks can be used to tweak the SPI NOR configuration when the SFDP
* table is broken or not available. * table is broken or not available.
...@@ -307,6 +310,7 @@ struct spi_nor_fixups { ...@@ -307,6 +310,7 @@ struct spi_nor_fixups {
const struct sfdp_parameter_header *bfpt_header, const struct sfdp_parameter_header *bfpt_header,
const struct sfdp_bfpt *bfpt); const struct sfdp_bfpt *bfpt);
void (*post_sfdp)(struct spi_nor *nor); void (*post_sfdp)(struct spi_nor *nor);
void (*late_init)(struct spi_nor *nor);
}; };
struct flash_info { struct flash_info {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment