Skip to content

Commit f74de39

Browse files
Kuwano-sanprati0100
authored andcommitted
mtd: spi-nor: sfdp: introduce smpt_map_id fixup hook
Certain chips have inconsistent Sector Map Parameter Table (SMPT) data, which leads to the wrong map ID being identified, causing failures to detect the correct sector map. To fix this, introduce smpt_map_id() into the struct spi_nor_fixups. This function will be called after the initial SMPT-based detection, allowing chip-specific logic to correct the map ID. Infineon S25FS512S needs this fixup as it has inconsistency between map ID definition and configuration register value actually obtained. Co-developed-by: Marek Vasut <marek.vasut+renesas@mailbox.org> Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org> Reviewed-by: Tudor Ambarus <tudor.ambarus@linaro.org> Tested-by: Marek Vasut <marek.vasut+renesas@mailbox.org> # S25FS512S Signed-off-by: Takahiro Kuwano <Takahiro.Kuwano@infineon.com> Reviewed-by: Tudor Ambarus <tudor.ambarus@linaro.org>> Signed-off-by: Pratyush Yadav <pratyush@kernel.org>
1 parent 653f6de commit f74de39

2 files changed

Lines changed: 15 additions & 0 deletions

File tree

drivers/mtd/spi-nor/core.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,8 @@ struct spi_nor_flash_parameter {
411411
* @post_bfpt: called after the BFPT table has been parsed
412412
* @smpt_read_dummy: called during SMPT table is being parsed. Used to fix the
413413
* number of dummy cycles in read register ops.
414+
* @smpt_map_id: called after map ID in SMPT table has been determined for the
415+
* case the map ID is wrong and needs to be fixed.
414416
* @post_sfdp: called after SFDP has been parsed (is also called for SPI NORs
415417
* that do not support RDSFDP). Typically used to tweak various
416418
* parameters that could not be extracted by other means (i.e.
@@ -429,6 +431,7 @@ struct spi_nor_fixups {
429431
const struct sfdp_parameter_header *bfpt_header,
430432
const struct sfdp_bfpt *bfpt);
431433
void (*smpt_read_dummy)(const struct spi_nor *nor, u8 *read_dummy);
434+
void (*smpt_map_id)(const struct spi_nor *nor, u8 *map_id);
432435
int (*post_sfdp)(struct spi_nor *nor);
433436
int (*late_init)(struct spi_nor *nor);
434437
};

drivers/mtd/spi-nor/sfdp.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,16 @@ static u8 spi_nor_smpt_read_dummy(const struct spi_nor *nor, const u32 settings)
730730
return read_dummy;
731731
}
732732

733+
static void spi_nor_smpt_map_id_fixups(const struct spi_nor *nor, u8 *map_id)
734+
{
735+
if (nor->manufacturer && nor->manufacturer->fixups &&
736+
nor->manufacturer->fixups->smpt_map_id)
737+
nor->manufacturer->fixups->smpt_map_id(nor, map_id);
738+
739+
if (nor->info->fixups && nor->info->fixups->smpt_map_id)
740+
nor->info->fixups->smpt_map_id(nor, map_id);
741+
}
742+
733743
/**
734744
* spi_nor_get_map_in_use() - get the configuration map in use
735745
* @nor: pointer to a 'struct spi_nor'
@@ -783,6 +793,8 @@ static const u32 *spi_nor_get_map_in_use(struct spi_nor *nor, const u32 *smpt,
783793
map_id = map_id << 1 | !!(*buf & read_data_mask);
784794
}
785795

796+
spi_nor_smpt_map_id_fixups(nor, &map_id);
797+
786798
/*
787799
* If command descriptors are provided, they always precede map
788800
* descriptors in the table. There is no need to start the iteration

0 commit comments

Comments
 (0)