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
|
@ -4740,6 +4740,33 @@ static const struct flash_info *spi_nor_match_id(const char *name)
|
||||||
return NULL;
|
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,
|
int spi_nor_scan(struct spi_nor *nor, const char *name,
|
||||||
const struct spi_nor_hwcaps *hwcaps)
|
const struct spi_nor_hwcaps *hwcaps)
|
||||||
{
|
{
|
||||||
|
@ -4886,29 +4913,12 @@ int spi_nor_scan(struct spi_nor *nor, const char *name,
|
||||||
if (ret)
|
if (ret)
|
||||||
return 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)
|
if (info->flags & SPI_NOR_4B_OPCODES)
|
||||||
nor->flags |= SNOR_F_4B_OPCODES;
|
nor->flags |= SNOR_F_4B_OPCODES;
|
||||||
|
|
||||||
if (nor->addr_width == 4 && nor->flags & SNOR_F_4B_OPCODES &&
|
ret = spi_nor_set_addr_width(nor);
|
||||||
!(nor->flags & SNOR_F_HAS_4BAIT))
|
if (ret)
|
||||||
spi_nor_set_4byte_opcodes(nor);
|
return ret;
|
||||||
|
|
||||||
if (nor->addr_width > SPI_NOR_MAX_ADDR_WIDTH) {
|
|
||||||
dev_err(dev, "address width is too large: %u\n",
|
|
||||||
nor->addr_width);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Send all the required SPI flash commands to initialize device */
|
/* Send all the required SPI flash commands to initialize device */
|
||||||
ret = spi_nor_init(nor);
|
ret = spi_nor_init(nor);
|
||||||
|
|
Loading…
Reference in New Issue