mtd: spi-nor: add Kconfig option to disable 4K sectors

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Wed Oct 15 23:59:09 PDT 2014


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=57cf26c1b28572976c57f6dec9818be38bf37cbb
Commit:     57cf26c1b28572976c57f6dec9818be38bf37cbb
Parent:     6d178ef2fd5e4a7f601874a6e641090e706da3c8
Author:     Rafał Miłecki <zajec5 at gmail.com>
AuthorDate: Sun Aug 17 11:27:26 2014 +0200
Committer:  Brian Norris <computersforpeace at gmail.com>
CommitDate: Sun Sep 28 14:14:52 2014 -0700

    mtd: spi-nor: add Kconfig option to disable 4K sectors
    
    Current situation with 4K sectors is quite messy. First of all, some
    MTD "users" don't work with such small size. An example may be UBIFS
    which requires 15 KiB erase blocks as a minimum. In theory spi-nor
    should provide multiple erase regions and MTD "users" should use the
    one they need. Unforunately that is not implemented.
    
    In the result our flashes database in spi-nor is hackish. For some
    flashes we pretend they don't support 4K sectors just because some
    distribution uses UBIFS on it. This ofc leads to conflicts, like
    Samsung using w25q128 with 4K sectors vs. OpenWrt requiring it to
    pretend it's 64 KiB blocks only.
    
    My idea (plan?) for fixing this situation:
    1) Use real hw info (this requires a way for disabling 4K for now)
    2) Provide detailed info about erase regions
    3) Make UBIFS work with devices that support 4K sectors
    
    Signed-off-by: Rafał Miłecki <zajec5 at gmail.com>
    Signed-off-by: Brian Norris <computersforpeace at gmail.com>
---
 drivers/mtd/spi-nor/Kconfig   | 14 ++++++++++++++
 drivers/mtd/spi-nor/spi-nor.c |  5 ++++-
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/drivers/mtd/spi-nor/Kconfig b/drivers/mtd/spi-nor/Kconfig
index f8acfa4..64a4f0e 100644
--- a/drivers/mtd/spi-nor/Kconfig
+++ b/drivers/mtd/spi-nor/Kconfig
@@ -7,6 +7,20 @@ menuconfig MTD_SPI_NOR
 
 if MTD_SPI_NOR
 
+config MTD_SPI_NOR_USE_4K_SECTORS
+	bool "Use small 4096 B erase sectors"
+	default y
+	help
+	  Many flash memories support erasing small (4096 B) sectors. Depending
+	  on the usage this feature may provide performance gain in comparison
+	  to erasing whole blocks (32/64 KiB).
+	  Changing a small part of the flash's contents is usually faster with
+	  small sectors. On the other hand erasing should be faster when using
+	  64 KiB block instead of 16 × 4 KiB sectors.
+
+	  Please note that some tools/drivers/filesystems may not work with
+	  4096 B erase size (e.g. UBIFS requires 15 KiB as a minimum).
+
 config SPI_FSL_QUADSPI
 	tristate "Freescale Quad SPI controller"
 	depends on ARCH_MXC
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
index 03e0ab8..11459f6 100644
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
@@ -1013,6 +1013,7 @@ int spi_nor_scan(struct spi_nor *nor, const struct spi_device_id *id,
 	    nor->wait_till_ready == spi_nor_wait_till_ready)
 		nor->wait_till_ready = spi_nor_wait_till_fsr_ready;
 
+#ifdef CONFIG_MTD_SPI_NOR_USE_4K_SECTORS
 	/* prefer "small sector" erase if possible */
 	if (info->flags & SECT_4K) {
 		nor->erase_opcode = SPINOR_OP_BE_4K;
@@ -1020,7 +1021,9 @@ int spi_nor_scan(struct spi_nor *nor, const struct spi_device_id *id,
 	} else if (info->flags & SECT_4K_PMC) {
 		nor->erase_opcode = SPINOR_OP_BE_4K_PMC;
 		mtd->erasesize = 4096;
-	} else {
+	} else
+#endif
+	{
 		nor->erase_opcode = SPINOR_OP_SE;
 		mtd->erasesize = info->sector_size;
 	}



More information about the linux-mtd-cvs mailing list