1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- From: Felix Fietkau <nbd@nbd.name>
- Date: Sat, 4 Nov 2017 07:40:23 +0100
- Subject: [PATCH] mtd: spi-nor: support limiting 4K sectors support based on
- flash size
- Some devices need 4K sectors to be able to deal with small flash chips.
- For instance, w25x05 is 64 KiB in size, and without 4K sectors, the
- entire chip is just one erase block.
- On bigger flash chip sizes, using 4K sectors can significantly slow down
- many operations, including using a writable filesystem. There are several
- platforms where it makes sense to use a single kernel on both kinds of
- devices.
- To support this properly, allow configuring an upper flash chip size
- limit for 4K sectors support.
- Signed-off-by: Felix Fietkau <nbd@nbd.name>
- ---
- --- a/drivers/mtd/spi-nor/Kconfig
- +++ b/drivers/mtd/spi-nor/Kconfig
- @@ -39,6 +39,17 @@ config SPI_ASPEED_SMC
- and support for the SPI flash memory controller (SPI) for
- the host firmware. The implementation only supports SPI NOR.
-
- +config MTD_SPI_NOR_USE_4K_SECTORS_LIMIT
- + int "Maximum flash chip size to use 4K sectors on (in KiB)"
- + depends on MTD_SPI_NOR_USE_4K_SECTORS
- + default "4096"
- + help
- + There are many flash chips that support 4K sectors, but are so large
- + that using them significantly slows down writing large amounts of
- + data or using a writable filesystem.
- + Any flash chip larger than the size specified in this option will
- + not use 4K sectors.
- +
- config SPI_ATMEL_QUADSPI
- tristate "Atmel Quad SPI Controller"
- depends on ARCH_AT91 || (ARM && COMPILE_TEST)
- --- a/drivers/mtd/spi-nor/spi-nor.c
- +++ b/drivers/mtd/spi-nor/spi-nor.c
- @@ -2561,10 +2561,12 @@ static int spi_nor_select_erase(struct s
-
- #ifdef CONFIG_MTD_SPI_NOR_USE_4K_SECTORS
- /* prefer "small sector" erase if possible */
- - if (info->flags & SECT_4K) {
- + if ((info->flags & SECT_4K) && (mtd->size <=
- + CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT * 1024)) {
- nor->erase_opcode = SPINOR_OP_BE_4K;
- mtd->erasesize = 4096;
- - } else if (info->flags & SECT_4K_PMC) {
- + } else if ((info->flags & SECT_4K_PMC) && (mtd->size <=
- + CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT * 1024)) {
- nor->erase_opcode = SPINOR_OP_BE_4K_PMC;
- mtd->erasesize = 4096;
- } else
|