mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 14:12:06 +00:00
mtd: spi-nor: Allow post_sfdp hook to return errors
Multi die flashes like s25hl02gt need to determine the page_size at run-time by querying a configuration register for each die. Since the number of dice is determined in an optional SFDP table, SCCR MC, the page size configuration must be done in the post_sfdp hook. Allow post_sfdp to return errors, as reading the configuration register might return errors. Link: https://lore.kernel.org/r/924ab710f128448ec62537cfbb377336e390043c.1680849425.git.Takahiro.Kuwano@infineon.com Signed-off-by: Tudor Ambarus <tudor.ambarus@linaro.org>
This commit is contained in:
parent
120c94a67b
commit
e570f7872a
@ -426,7 +426,7 @@ struct spi_nor_fixups {
|
||||
int (*post_bfpt)(struct spi_nor *nor,
|
||||
const struct sfdp_parameter_header *bfpt_header,
|
||||
const struct sfdp_bfpt *bfpt);
|
||||
void (*post_sfdp)(struct spi_nor *nor);
|
||||
int (*post_sfdp)(struct spi_nor *nor);
|
||||
void (*late_init)(struct spi_nor *nor);
|
||||
};
|
||||
|
||||
|
@ -131,7 +131,7 @@ static void mt35xu512aba_default_init(struct spi_nor *nor)
|
||||
nor->params->octal_dtr_enable = micron_st_nor_octal_dtr_enable;
|
||||
}
|
||||
|
||||
static void mt35xu512aba_post_sfdp_fixup(struct spi_nor *nor)
|
||||
static int mt35xu512aba_post_sfdp_fixup(struct spi_nor *nor)
|
||||
{
|
||||
/* Set the Fast Read settings. */
|
||||
nor->params->hwcaps.mask |= SNOR_HWCAPS_READ_8_8_8_DTR;
|
||||
@ -149,6 +149,8 @@ static void mt35xu512aba_post_sfdp_fixup(struct spi_nor *nor)
|
||||
* disable it.
|
||||
*/
|
||||
nor->params->quad_enable = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct spi_nor_fixups mt35xu512aba_fixups = {
|
||||
|
@ -1260,14 +1260,21 @@ out:
|
||||
* 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)
|
||||
static int spi_nor_post_sfdp_fixups(struct spi_nor *nor)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (nor->manufacturer && nor->manufacturer->fixups &&
|
||||
nor->manufacturer->fixups->post_sfdp)
|
||||
nor->manufacturer->fixups->post_sfdp(nor);
|
||||
nor->manufacturer->fixups->post_sfdp) {
|
||||
ret = nor->manufacturer->fixups->post_sfdp(nor);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (nor->info->fixups && nor->info->fixups->post_sfdp)
|
||||
nor->info->fixups->post_sfdp(nor);
|
||||
return nor->info->fixups->post_sfdp(nor);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1477,7 +1484,7 @@ int spi_nor_parse_sfdp(struct spi_nor *nor)
|
||||
}
|
||||
}
|
||||
|
||||
spi_nor_post_sfdp_fixups(nor);
|
||||
err = spi_nor_post_sfdp_fixups(nor);
|
||||
exit:
|
||||
kfree(param_headers);
|
||||
return err;
|
||||
|
@ -370,7 +370,7 @@ s25fs256t_post_bfpt_fixup(struct spi_nor *nor,
|
||||
return cypress_nor_get_page_size(nor);
|
||||
}
|
||||
|
||||
static void s25fs256t_post_sfdp_fixup(struct spi_nor *nor)
|
||||
static int s25fs256t_post_sfdp_fixup(struct spi_nor *nor)
|
||||
{
|
||||
struct spi_nor_flash_parameter *params = nor->params;
|
||||
|
||||
@ -379,6 +379,8 @@ static void s25fs256t_post_sfdp_fixup(struct spi_nor *nor)
|
||||
spi_nor_set_pp_settings(¶ms->page_programs[SNOR_CMD_PP_1_1_4],
|
||||
SPINOR_OP_PP_1_1_4_4B,
|
||||
SNOR_PROTO_1_1_4);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void s25fs256t_late_init(struct spi_nor *nor)
|
||||
@ -409,7 +411,7 @@ s25hx_t_post_bfpt_fixup(struct spi_nor *nor,
|
||||
return cypress_nor_get_page_size(nor);
|
||||
}
|
||||
|
||||
static void s25hx_t_post_sfdp_fixup(struct spi_nor *nor)
|
||||
static int s25hx_t_post_sfdp_fixup(struct spi_nor *nor)
|
||||
{
|
||||
struct spi_nor_erase_type *erase_type =
|
||||
nor->params->erase_map.erase_type;
|
||||
@ -431,6 +433,8 @@ static void s25hx_t_post_sfdp_fixup(struct spi_nor *nor)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void s25hx_t_late_init(struct spi_nor *nor)
|
||||
@ -463,7 +467,7 @@ static int cypress_nor_octal_dtr_enable(struct spi_nor *nor, bool enable)
|
||||
cypress_nor_octal_dtr_dis(nor);
|
||||
}
|
||||
|
||||
static void s28hx_t_post_sfdp_fixup(struct spi_nor *nor)
|
||||
static int s28hx_t_post_sfdp_fixup(struct spi_nor *nor)
|
||||
{
|
||||
/*
|
||||
* On older versions of the flash the xSPI Profile 1.0 table has the
|
||||
@ -489,6 +493,8 @@ static void s28hx_t_post_sfdp_fixup(struct spi_nor *nor)
|
||||
* actual value for that is 4.
|
||||
*/
|
||||
nor->params->rdsr_addr_nbytes = 4;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int s28hx_t_post_bfpt_fixup(struct spi_nor *nor,
|
||||
|
Loading…
Reference in New Issue
Block a user