mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
mtd: spi-nor: Introduce spi_nor_set_addr_width()
Parsing of flash parameters were interleaved with setting of the nor addr width. Dedicate a function for setting nor addr width. Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com> Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> Reviewed-by: Vignesh Raghavendra <vigneshr@ti.com>
This commit is contained in:
parent
07920dfcf0
commit
696ce50f4e
1 changed files with 30 additions and 20 deletions
|
@ -4740,6 +4740,33 @@ static const struct flash_info *spi_nor_match_id(const char *name)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static int spi_nor_set_addr_width(struct spi_nor *nor)
|
||||
{
|
||||
if (nor->addr_width) {
|
||||
/* already configured from SFDP */
|
||||
} else if (nor->info->addr_width) {
|
||||
nor->addr_width = nor->info->addr_width;
|
||||
} else if (nor->mtd.size > 0x1000000) {
|
||||
/* enable 4-byte addressing if the device exceeds 16MiB */
|
||||
nor->addr_width = 4;
|
||||
} else {
|
||||
nor->addr_width = 3;
|
||||
}
|
||||
|
||||
if (nor->addr_width > SPI_NOR_MAX_ADDR_WIDTH) {
|
||||
dev_err(nor->dev, "address width is too large: %u\n",
|
||||
nor->addr_width);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Set 4byte opcodes when possible. */
|
||||
if (nor->addr_width == 4 && nor->flags & SNOR_F_4B_OPCODES &&
|
||||
!(nor->flags & SNOR_F_HAS_4BAIT))
|
||||
spi_nor_set_4byte_opcodes(nor);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int spi_nor_scan(struct spi_nor *nor, const char *name,
|
||||
const struct spi_nor_hwcaps *hwcaps)
|
||||
{
|
||||
|
@ -4886,29 +4913,12 @@ int spi_nor_scan(struct spi_nor *nor, const char *name,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (nor->addr_width) {
|
||||
/* already configured from SFDP */
|
||||
} else if (info->addr_width) {
|
||||
nor->addr_width = info->addr_width;
|
||||
} else if (mtd->size > 0x1000000) {
|
||||
/* enable 4-byte addressing if the device exceeds 16MiB */
|
||||
nor->addr_width = 4;
|
||||
} else {
|
||||
nor->addr_width = 3;
|
||||
}
|
||||
|
||||
if (info->flags & SPI_NOR_4B_OPCODES)
|
||||
nor->flags |= SNOR_F_4B_OPCODES;
|
||||
|
||||
if (nor->addr_width == 4 && nor->flags & SNOR_F_4B_OPCODES &&
|
||||
!(nor->flags & SNOR_F_HAS_4BAIT))
|
||||
spi_nor_set_4byte_opcodes(nor);
|
||||
|
||||
if (nor->addr_width > SPI_NOR_MAX_ADDR_WIDTH) {
|
||||
dev_err(dev, "address width is too large: %u\n",
|
||||
nor->addr_width);
|
||||
return -EINVAL;
|
||||
}
|
||||
ret = spi_nor_set_addr_width(nor);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Send all the required SPI flash commands to initialize device */
|
||||
ret = spi_nor_init(nor);
|
||||
|
|
Loading…
Reference in a new issue