On 26/08/19 5:38 PM, Tudor.Ambarus@xxxxxxxxxxxxx wrote: > From: Boris Brezillon <boris.brezillon@xxxxxxxxxxx> > > Add a spansion_post_sfdp_fixups() function to fix the erase opcode, > erase sector size and set the SNOR_F_4B_OPCODES flag. > This way, all spansion related quirks are placed in the > spansion_post_sfdp_fixups() function. > > Signed-off-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxx> > Signed-off-by: Tudor Ambarus <tudor.ambarus@xxxxxxxxxxxxx> > --- Reviewed-by: Vignesh Raghavendra <vigneshr@xxxxxx> Regards Vignesh > v3: no changes, rebase on previous commits > > drivers/mtd/spi-nor/spi-nor.c | 37 +++++++++++++++++++++++-------------- > 1 file changed, 23 insertions(+), 14 deletions(-) > > diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c > index b8caf5171ff5..c862a59ce9df 100644 > --- a/drivers/mtd/spi-nor/spi-nor.c > +++ b/drivers/mtd/spi-nor/spi-nor.c > @@ -591,18 +591,6 @@ static u8 spi_nor_convert_3to4_erase(u8 opcode) > > static void spi_nor_set_4byte_opcodes(struct spi_nor *nor) > { > - /* Do some manufacturer fixups first */ > - switch (JEDEC_MFR(nor->info)) { > - case SNOR_MFR_SPANSION: > - /* No small sector erase for 4-byte command set */ > - nor->erase_opcode = SPINOR_OP_SE; > - nor->mtd.erasesize = nor->info->sector_size; > - break; > - > - default: > - break; > - } > - > nor->read_opcode = spi_nor_convert_3to4_read(nor->read_opcode); > nor->program_opcode = spi_nor_convert_3to4_program(nor->program_opcode); > nor->erase_opcode = spi_nor_convert_3to4_erase(nor->erase_opcode); > @@ -4304,6 +4292,19 @@ static void spi_nor_info_init_params(struct spi_nor *nor) > spi_nor_init_uniform_erase_map(map, erase_mask, params->size); > } > > +static void spansion_post_sfdp_fixups(struct spi_nor *nor) > +{ > + struct mtd_info *mtd = &nor->mtd; > + > + if (mtd->size <= SZ_16M) > + return; > + > + nor->flags |= SNOR_F_4B_OPCODES; > + /* No small sector erase for 4-byte command set */ > + nor->erase_opcode = SPINOR_OP_SE; > + nor->mtd.erasesize = nor->info->sector_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 > @@ -4316,6 +4317,15 @@ static void spi_nor_info_init_params(struct spi_nor *nor) > */ > static void spi_nor_post_sfdp_fixups(struct spi_nor *nor) > { > + switch (JEDEC_MFR(nor->info)) { > + case SNOR_MFR_SPANSION: > + spansion_post_sfdp_fixups(nor); > + break; > + > + default: > + break; > + } > + > if (nor->info->fixups && nor->info->fixups->post_sfdp) > nor->info->fixups->post_sfdp(nor); > } > @@ -4862,8 +4872,7 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, > nor->addr_width = 3; > } > > - if (info->flags & SPI_NOR_4B_OPCODES || > - (JEDEC_MFR(info) == SNOR_MFR_SPANSION && mtd->size > SZ_16M)) > + if (info->flags & SPI_NOR_4B_OPCODES) > nor->flags |= SNOR_F_4B_OPCODES; > > if (nor->addr_width == 4 && nor->flags & SNOR_F_4B_OPCODES && > -- Regards Vignesh ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/