[PATCH] nor flash: integrate into mtd

Sascha Hauer s.hauer at pengutronix.de
Fri Feb 15 03:11:40 EST 2013


CFI Flash is currently handled outside the mtd layer which makes it
a special case. Integrate it into mtd so that we get rid of this
special status.

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 arch/arm/configs/edb93xx_defconfig                |    1 +
 arch/arm/configs/eukrea_cpuimx27_defconfig        |    1 +
 arch/arm/configs/freescale_mx51_babbage_defconfig |    1 +
 arch/arm/configs/mmccpu_defconfig                 |    1 +
 arch/arm/configs/mx21ads_defconfig                |    1 +
 arch/arm/configs/mx27ads_defconfig                |    1 +
 arch/arm/configs/netx_nxdb500_defconfig           |    1 +
 arch/arm/configs/pcm027_defconfig                 |    1 +
 arch/arm/configs/pm9263_defconfig                 |    1 +
 arch/arm/configs/scb9328_defconfig                |    1 +
 arch/blackfin/configs/ipe337_defconfig            |    1 +
 arch/nios2/configs/generic_defconfig              |    1 +
 arch/ppc/configs/pcm030_defconfig                 |    1 +
 drivers/Kconfig                                   |    1 -
 drivers/Makefile                                  |    1 -
 drivers/mtd/Kconfig                               |    1 +
 drivers/mtd/Makefile                              |    1 +
 drivers/{ => mtd}/nor/Kconfig                     |    6 +-
 drivers/{ => mtd}/nor/Makefile                    |    0
 drivers/{ => mtd}/nor/cfi_flash.c                 |   82 +++++----------------
 drivers/{ => mtd}/nor/cfi_flash.h                 |    1 -
 drivers/{ => mtd}/nor/cfi_flash_amd.c             |    0
 drivers/{ => mtd}/nor/cfi_flash_intel.c           |    0
 23 files changed, 35 insertions(+), 71 deletions(-)
 rename drivers/{ => mtd}/nor/Kconfig (96%)
 rename drivers/{ => mtd}/nor/Makefile (100%)
 rename drivers/{ => mtd}/nor/cfi_flash.c (93%)
 rename drivers/{ => mtd}/nor/cfi_flash.h (99%)
 rename drivers/{ => mtd}/nor/cfi_flash_amd.c (100%)
 rename drivers/{ => mtd}/nor/cfi_flash_intel.c (100%)

diff --git a/arch/arm/configs/edb93xx_defconfig b/arch/arm/configs/edb93xx_defconfig
index 363e511..86b1040 100644
--- a/arch/arm/configs/edb93xx_defconfig
+++ b/arch/arm/configs/edb93xx_defconfig
@@ -30,4 +30,5 @@ CONFIG_CMD_TFTP=y
 CONFIG_FS_TFTP=y
 CONFIG_DRIVER_NET_EP93XX=y
 # CONFIG_SPI is not set
+CONFIG_MTD=y
 CONFIG_DRIVER_CFI=y
diff --git a/arch/arm/configs/eukrea_cpuimx27_defconfig b/arch/arm/configs/eukrea_cpuimx27_defconfig
index 880941d..bd0c470 100644
--- a/arch/arm/configs/eukrea_cpuimx27_defconfig
+++ b/arch/arm/configs/eukrea_cpuimx27_defconfig
@@ -46,6 +46,7 @@ CONFIG_DRIVER_NET_FEC_IMX=y
 CONFIG_I2C=y
 CONFIG_I2C_IMX=y
 CONFIG_I2C_LP3972=y
+CONFIG_MTD=y
 CONFIG_DRIVER_CFI=y
 # CONFIG_DRIVER_CFI_AMD is not set
 # CONFIG_DRIVER_CFI_BANK_WIDTH_1 is not set
diff --git a/arch/arm/configs/freescale_mx51_babbage_defconfig b/arch/arm/configs/freescale_mx51_babbage_defconfig
index 0817cfa..97963c1 100644
--- a/arch/arm/configs/freescale_mx51_babbage_defconfig
+++ b/arch/arm/configs/freescale_mx51_babbage_defconfig
@@ -55,6 +55,7 @@ CONFIG_NET_PING=y
 CONFIG_NET_RESOLV=y
 CONFIG_DRIVER_NET_FEC_IMX=y
 CONFIG_DRIVER_SPI_IMX=y
+CONFIG_MTD=y
 CONFIG_DRIVER_CFI=y
 CONFIG_CFI_BUFFER_WRITE=y
 CONFIG_MCI=y
diff --git a/arch/arm/configs/mmccpu_defconfig b/arch/arm/configs/mmccpu_defconfig
index 334c5e8..0e6914f 100644
--- a/arch/arm/configs/mmccpu_defconfig
+++ b/arch/arm/configs/mmccpu_defconfig
@@ -34,5 +34,6 @@ CONFIG_FS_TFTP=y
 CONFIG_DRIVER_NET_MACB=y
 # CONFIG_SPI is not set
 CONFIG_I2C=y
+CONFIG_MTD=y
 CONFIG_DRIVER_CFI=y
 CONFIG_CFI_BUFFER_WRITE=y
diff --git a/arch/arm/configs/mx21ads_defconfig b/arch/arm/configs/mx21ads_defconfig
index 28ad013..dbc2962 100644
--- a/arch/arm/configs/mx21ads_defconfig
+++ b/arch/arm/configs/mx21ads_defconfig
@@ -35,6 +35,7 @@ CONFIG_CMD_TFTP=y
 CONFIG_FS_TFTP=y
 CONFIG_DRIVER_NET_CS8900=y
 # CONFIG_SPI is not set
+CONFIG_MTD=y
 CONFIG_DRIVER_CFI=y
 # CONFIG_DRIVER_CFI_INTEL is not set
 CONFIG_CFI_BUFFER_WRITE=y
diff --git a/arch/arm/configs/mx27ads_defconfig b/arch/arm/configs/mx27ads_defconfig
index 077e799..b3fdf84 100644
--- a/arch/arm/configs/mx27ads_defconfig
+++ b/arch/arm/configs/mx27ads_defconfig
@@ -33,6 +33,7 @@ CONFIG_NET_PING=y
 CONFIG_CMD_TFTP=y
 CONFIG_FS_TFTP=y
 CONFIG_DRIVER_SPI_IMX=y
+CONFIG_MTD=y
 CONFIG_DRIVER_CFI=y
 # CONFIG_DRIVER_CFI_INTEL is not set
 CONFIG_CFI_BUFFER_WRITE=y
diff --git a/arch/arm/configs/netx_nxdb500_defconfig b/arch/arm/configs/netx_nxdb500_defconfig
index 6d32c56..8e7a0b3 100644
--- a/arch/arm/configs/netx_nxdb500_defconfig
+++ b/arch/arm/configs/netx_nxdb500_defconfig
@@ -26,5 +26,6 @@ CONFIG_NET_PING=y
 CONFIG_CMD_TFTP=y
 CONFIG_FS_TFTP=y
 CONFIG_DRIVER_NET_NETX=y
+CONFIG_MTD=y
 CONFIG_DRIVER_CFI=y
 CONFIG_CFI_BUFFER_WRITE=y
diff --git a/arch/arm/configs/pcm027_defconfig b/arch/arm/configs/pcm027_defconfig
index ac9269d..f911951 100644
--- a/arch/arm/configs/pcm027_defconfig
+++ b/arch/arm/configs/pcm027_defconfig
@@ -54,6 +54,7 @@ CONFIG_FS_TFTP=y
 CONFIG_DRIVER_SERIAL_PXA=y
 CONFIG_DRIVER_NET_SMC91111=y
 # CONFIG_SPI is not set
+CONFIG_MTD=y
 CONFIG_DRIVER_CFI=y
 CONFIG_VIDEO=y
 CONFIG_DRIVER_VIDEO_PXA=y
diff --git a/arch/arm/configs/pm9263_defconfig b/arch/arm/configs/pm9263_defconfig
index e223e77..c9a7141 100644
--- a/arch/arm/configs/pm9263_defconfig
+++ b/arch/arm/configs/pm9263_defconfig
@@ -33,6 +33,7 @@ CONFIG_CMD_TFTP=y
 CONFIG_FS_TFTP=y
 CONFIG_DRIVER_NET_MACB=y
 # CONFIG_SPI is not set
+CONFIG_MTD=y
 CONFIG_DRIVER_CFI=y
 CONFIG_CFI_BUFFER_WRITE=y
 CONFIG_W1=y
diff --git a/arch/arm/configs/scb9328_defconfig b/arch/arm/configs/scb9328_defconfig
index 818bbd0..21a2571 100644
--- a/arch/arm/configs/scb9328_defconfig
+++ b/arch/arm/configs/scb9328_defconfig
@@ -52,6 +52,7 @@ CONFIG_FS_TFTP=y
 CONFIG_NET_NETCONSOLE=y
 CONFIG_NET_RESOLV=y
 CONFIG_DRIVER_NET_DM9K=y
+CONFIG_MTD=y
 CONFIG_DRIVER_CFI=y
 # CONFIG_DRIVER_CFI_BANK_WIDTH_4 is not set
 CONFIG_CFI_BUFFER_WRITE=y
diff --git a/arch/blackfin/configs/ipe337_defconfig b/arch/blackfin/configs/ipe337_defconfig
index d01c7e7..086a971 100644
--- a/arch/blackfin/configs/ipe337_defconfig
+++ b/arch/blackfin/configs/ipe337_defconfig
@@ -25,5 +25,6 @@ CONFIG_NET_PING=y
 CONFIG_CMD_TFTP=y
 CONFIG_FS_TFTP=y
 CONFIG_DRIVER_NET_SMC911X=y
+CONFIG_MTD=y
 CONFIG_DRIVER_CFI=y
 CONFIG_CFI_BUFFER_WRITE=y
diff --git a/arch/nios2/configs/generic_defconfig b/arch/nios2/configs/generic_defconfig
index 5e27cc8..4189990 100644
--- a/arch/nios2/configs/generic_defconfig
+++ b/arch/nios2/configs/generic_defconfig
@@ -27,6 +27,7 @@ CONFIG_CMD_PARTITION=y
 CONFIG_NET=y
 CONFIG_NET_PING=y
 CONFIG_DRIVER_NET_TSE=y
+CONFIG_MTD=y
 CONFIG_DRIVER_CFI=y
 CONFIG_FS_TFTP=y
 CONFIG_ZLIB=y
diff --git a/arch/ppc/configs/pcm030_defconfig b/arch/ppc/configs/pcm030_defconfig
index d2ff16c..9743841 100644
--- a/arch/ppc/configs/pcm030_defconfig
+++ b/arch/ppc/configs/pcm030_defconfig
@@ -36,6 +36,7 @@ CONFIG_FS_TFTP=y
 CONFIG_ARCH_MPC5XXX=y
 CONFIG_MACH_PHYCORE_MPC5200B_TINY=y
 CONFIG_DRIVER_NET_MPC5200=y
+CONFIG_MTD=y
 CONFIG_DRIVER_CFI=y
 CONFIG_CFI_BUFFER_WRITE=y
 CONFIG_ZLIB=y
diff --git a/drivers/Kconfig b/drivers/Kconfig
index 988ec9e..2ae05c2 100644
--- a/drivers/Kconfig
+++ b/drivers/Kconfig
@@ -4,7 +4,6 @@ source "drivers/serial/Kconfig"
 source "drivers/net/Kconfig"
 source "drivers/spi/Kconfig"
 source "drivers/i2c/Kconfig"
-source "drivers/nor/Kconfig"
 source "drivers/mtd/Kconfig"
 source "drivers/ata/Kconfig"
 source "drivers/usb/Kconfig"
diff --git a/drivers/Makefile b/drivers/Makefile
index 1fddee0..f81bf99 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -3,7 +3,6 @@ obj-$(CONFIG_ARM_AMBA) += amba/
 obj-y	+= net/
 obj-y	+= serial/
 obj-y	+= mtd/
-obj-y	+= nor/
 obj-y	+= usb/
 obj-$(CONFIG_DISK) += ata/
 obj-$(CONFIG_SPI) += spi/
diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
index 9450f5d..e94e6b1 100644
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
@@ -21,6 +21,7 @@ config MTD_RAW_DEVICE
 	prompt "mtdraw device to read/write both data+oob"
 
 source "drivers/mtd/devices/Kconfig"
+source "drivers/mtd/nor/Kconfig"
 source "drivers/mtd/nand/Kconfig"
 source "drivers/mtd/ubi/Kconfig"
 
diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile
index 4f97d9a..82b2cc9 100644
--- a/drivers/mtd/Makefile
+++ b/drivers/mtd/Makefile
@@ -1,4 +1,5 @@
 obj-$(CONFIG_NAND)			+= nand/
+obj-$(CONFIG_DRIVER_CFI)		+= nor/
 obj-$(CONFIG_UBI)			+= ubi/
 obj-y					+= devices/
 obj-$(CONFIG_PARTITION_NEED_MTD)	+= partition.o
diff --git a/drivers/nor/Kconfig b/drivers/mtd/nor/Kconfig
similarity index 96%
rename from drivers/nor/Kconfig
rename to drivers/mtd/nor/Kconfig
index c8ce24f..591d1ac 100644
--- a/drivers/nor/Kconfig
+++ b/drivers/mtd/nor/Kconfig
@@ -1,7 +1,5 @@
-menu "flash drivers"
-
 menuconfig DRIVER_CFI
-	bool "CFI"
+	bool "CFI NOR flash support"
 	help
 	  If you have NOR Flash devices connected to your system and wish
 	  to use them say yes here.
@@ -55,5 +53,3 @@ config CFI_BUFFER_WRITE
 	depends on DRIVER_CFI || DRIVER_CFI
 
 endif
-
-endmenu
diff --git a/drivers/nor/Makefile b/drivers/mtd/nor/Makefile
similarity index 100%
rename from drivers/nor/Makefile
rename to drivers/mtd/nor/Makefile
diff --git a/drivers/nor/cfi_flash.c b/drivers/mtd/nor/cfi_flash.c
similarity index 93%
rename from drivers/nor/cfi_flash.c
rename to drivers/mtd/nor/cfi_flash.c
index 637f98b..76fed02 100644
--- a/drivers/nor/cfi_flash.c
+++ b/drivers/mtd/nor/cfi_flash.c
@@ -454,10 +454,8 @@ flash_sect_t find_sector (struct flash_info *info, ulong addr)
 	return sector;
 }
 
-static int __cfi_erase(struct cdev *cdev, size_t count, loff_t offset,
-		int verbose)
+static int cfi_erase(struct flash_info *finfo, size_t count, loff_t offset)
 {
-        struct flash_info *finfo = (struct flash_info *)cdev->priv;
         unsigned long start, end;
         int i, ret = 0;
 
@@ -467,9 +465,6 @@ static int __cfi_erase(struct cdev *cdev, size_t count, loff_t offset,
         end   = find_sector(finfo, (unsigned long)finfo->base + offset +
 			count - 1);
 
-	if (verbose)
-		init_progression_bar(end - start);
-
         for (i = start; i <= end; i++) {
                 ret = finfo->cfi_cmd_set->flash_erase_one(finfo, i);
                 if (ret)
@@ -479,21 +474,11 @@ static int __cfi_erase(struct cdev *cdev, size_t count, loff_t offset,
 			ret = -EINTR;
 			goto out;
 		}
-
-		if (verbose)
-			show_progress(i - start);
         }
 out:
-	if (verbose)
-	        putchar('\n');
         return ret;
 }
 
-static int cfi_erase(struct cdev *cdev, size_t count, loff_t offset)
-{
-	return __cfi_erase(cdev, count, offset, 1);
-}
-
 /*
  * Copy memory to flash, returns:
  * 0 - OK
@@ -626,18 +611,13 @@ static int flash_real_protect (struct flash_info *info, long sector, int prot)
 	return retcode;
 }
 
-static int cfi_protect(struct cdev *cdev, size_t count, loff_t offset, int prot)
+static int cfi_mtd_protect(struct flash_info *finfo, loff_t offset, size_t len, int prot)
 {
-	struct flash_info *finfo = (struct flash_info *)cdev->priv;
 	unsigned long start, end;
 	int i, ret = 0;
-	const char *action = (prot? "protect" : "unprotect");
-
-	printf("%s: %s 0x%p (size %zu)\n", __func__,
-	       action, finfo->base + offset, count);
 
 	start = find_sector(finfo, (unsigned long)finfo->base + offset);
-	end   = find_sector(finfo, (unsigned long)finfo->base + offset + count - 1);
+	end   = find_sector(finfo, (unsigned long)finfo->base + offset + len - 1);
 
 	for (i = start; i <= end; i++) {
 		ret = flash_real_protect (finfo, i, prot);
@@ -645,20 +625,21 @@ static int cfi_protect(struct cdev *cdev, size_t count, loff_t offset, int prot)
 			goto out;
 	}
 out:
-	putchar('\n');
 	return ret;
 }
 
-static ssize_t cfi_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags)
+static int cfi_mtd_lock(struct mtd_info *mtd, loff_t offset, size_t len)
 {
-        struct flash_info *finfo = (struct flash_info *)cdev->priv;
-        int ret;
+	struct flash_info *finfo = container_of(mtd, struct flash_info, mtd);
+
+	return cfi_mtd_protect(finfo, offset, len, 1);
+}
 
-	debug("cfi_write: buf=0x%p addr=0x%p count=0x%08zx\n",
-			buf, finfo->base + offset, count);
+static int cfi_mtd_unlock(struct mtd_info *mtd, loff_t offset, size_t len)
+{
+	struct flash_info *finfo = container_of(mtd, struct flash_info, mtd);
 
-	ret = write_buff(finfo, buf, (unsigned long)finfo->base + offset, count);
-	return ret == 0 ? count : -1;
+	return cfi_mtd_protect(finfo, offset, len, 0);
 }
 
 static void cfi_info (struct device_d* dev)
@@ -908,15 +889,6 @@ int flash_isset(struct flash_info *info, flash_sect_t sect,
 	return retval;
 }
 
-struct file_operations cfi_ops = {
-	.read    = mem_read,
-	.write   = cfi_write,
-	.lseek  = dev_lseek_default,
-	.erase   = cfi_erase,
-	.protect = cfi_protect,
-	.memmap  = generic_memmap_ro,
-};
-
 static int cfi_mtd_read(struct mtd_info *mtd, loff_t from, size_t len,
 		size_t *retlen, u_char *buf)
 {
@@ -943,10 +915,9 @@ static int cfi_mtd_write(struct mtd_info *mtd, loff_t to, size_t len,
 static int cfi_mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
 {
 	struct flash_info *info = container_of(mtd, struct flash_info, mtd);
-	struct cdev *cdev = &info->cdev;
 	int ret;
 
-	ret = __cfi_erase(cdev, instr->len, instr->addr, 0);
+	ret = cfi_erase(info, instr->len, instr->addr);
 
 	if (ret) {
 		instr->state = MTD_ERASE_FAILED;
@@ -966,21 +937,23 @@ static void cfi_init_mtd(struct flash_info *info)
 	mtd->read = cfi_mtd_read;
 	mtd->write = cfi_mtd_write;
 	mtd->erase = cfi_mtd_erase;
+	mtd->lock = cfi_mtd_lock;
+	mtd->unlock = cfi_mtd_unlock;
 	mtd->size = info->size;
-	mtd->name = info->cdev.name;
 	mtd->erasesize = info->eraseregions[1].erasesize; /* FIXME */
 	mtd->writesize = 1;
 	mtd->subpage_sft = 0;
 	mtd->eraseregions = info->eraseregions;
 	mtd->numeraseregions = info->numeraseregions;
 	mtd->flags = MTD_CAP_NORFLASH;
-	info->cdev.mtd = mtd;
+	mtd->type = MTD_NORFLASH;
+
+	add_mtd_device(mtd, "nor");
 }
 
 static int cfi_probe (struct device_d *dev)
 {
 	struct flash_info *info = xzalloc(sizeof(*info));
-	int cfinum;
 
 	dev->priv = (void *)info;
 
@@ -999,24 +972,7 @@ static int cfi_probe (struct device_d *dev)
 	dev_info(dev, "found cfi flash at %p, size %ld\n",
 			info->base, info->size);
 
-	if (dev->id < 0)
-		cfinum = cdev_find_free_index("nor");
-	else
-		cfinum = dev->id;
-
-	info->cdev.name = asprintf("nor%d", cfinum);
-	info->cdev.size = info->size;
-	info->cdev.dev = dev;
-	info->cdev.ops = &cfi_ops;
-	info->cdev.priv = info;
-
-	if (IS_ENABLED(CONFIG_PARTITION_NEED_MTD))
-		cfi_init_mtd(info);
-
-	devfs_create(&info->cdev);
-
-	if (dev->device_node)
-		of_parse_partitions(info->cdev.name, dev->device_node);
+	cfi_init_mtd(info);
 
 	return 0;
 }
diff --git a/drivers/nor/cfi_flash.h b/drivers/mtd/nor/cfi_flash.h
similarity index 99%
rename from drivers/nor/cfi_flash.h
rename to drivers/mtd/nor/cfi_flash.h
index 944cdde..bcf5c40 100644
--- a/drivers/nor/cfi_flash.h
+++ b/drivers/mtd/nor/cfi_flash.h
@@ -74,7 +74,6 @@ struct flash_info {
 	ulong	addr_unlock1;		/* unlock address 1 for AMD flash roms	*/
 	ulong	addr_unlock2;		/* unlock address 2 for AMD flash roms	*/
 	struct cfi_cmd_set *cfi_cmd_set;
-	struct cdev cdev;
 	struct mtd_info mtd;
 	int numeraseregions;
 	struct mtd_erase_region_info *eraseregions;
diff --git a/drivers/nor/cfi_flash_amd.c b/drivers/mtd/nor/cfi_flash_amd.c
similarity index 100%
rename from drivers/nor/cfi_flash_amd.c
rename to drivers/mtd/nor/cfi_flash_amd.c
diff --git a/drivers/nor/cfi_flash_intel.c b/drivers/mtd/nor/cfi_flash_intel.c
similarity index 100%
rename from drivers/nor/cfi_flash_intel.c
rename to drivers/mtd/nor/cfi_flash_intel.c
-- 
1.7.10.4




More information about the barebox mailing list