diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2012-04-19 20:22:00 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2013-02-14 23:37:53 +0100 |
commit | 2749fbac48374b5f5cedda31aa85cca5f199536c (patch) | |
tree | 332a305b39d27b1d5717be2cd12c02ef597b452b /drivers | |
parent | 1bd90ff5a11fdb79eb865173d2bf4b5e25d95679 (diff) | |
download | barebox-2749fbac48374b5f5cedda31aa85cca5f199536c.tar.gz barebox-2749fbac48374b5f5cedda31aa85cca5f199536c.tar.xz |
nor flash: integrate into mtd
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@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/Kconfig | 1 | ||||
-rw-r--r-- | drivers/Makefile | 1 | ||||
-rw-r--r-- | drivers/mtd/Kconfig | 1 | ||||
-rw-r--r-- | drivers/mtd/Makefile | 1 | ||||
-rw-r--r-- | drivers/mtd/nor/Kconfig (renamed from drivers/nor/Kconfig) | 6 | ||||
-rw-r--r-- | drivers/mtd/nor/Makefile (renamed from drivers/nor/Makefile) | 0 | ||||
-rw-r--r-- | drivers/mtd/nor/cfi_flash.c (renamed from drivers/nor/cfi_flash.c) | 82 | ||||
-rw-r--r-- | drivers/mtd/nor/cfi_flash.h (renamed from drivers/nor/cfi_flash.h) | 1 | ||||
-rw-r--r-- | drivers/mtd/nor/cfi_flash_amd.c (renamed from drivers/nor/cfi_flash_amd.c) | 0 | ||||
-rw-r--r-- | drivers/mtd/nor/cfi_flash_intel.c (renamed from drivers/nor/cfi_flash_intel.c) | 0 |
10 files changed, 22 insertions, 71 deletions
diff --git a/drivers/Kconfig b/drivers/Kconfig index 988ec9ee06..2ae05c2ddc 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 1fddee0dd4..f81bf99ac4 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 9450f5de8b..e94e6b1f63 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 4f97d9a6f3..82b2cc9e68 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 index c8ce24ff03..591d1ac702 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 index d2550436d2..d2550436d2 100644 --- a/drivers/nor/Makefile +++ b/drivers/mtd/nor/Makefile diff --git a/drivers/nor/cfi_flash.c b/drivers/mtd/nor/cfi_flash.c index 637f98b10a..76fed02023 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 index 944cdde660..bcf5c40c73 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 index 45c59b9d01..45c59b9d01 100644 --- a/drivers/nor/cfi_flash_amd.c +++ b/drivers/mtd/nor/cfi_flash_amd.c diff --git a/drivers/nor/cfi_flash_intel.c b/drivers/mtd/nor/cfi_flash_intel.c index 32e581a395..32e581a395 100644 --- a/drivers/nor/cfi_flash_intel.c +++ b/drivers/mtd/nor/cfi_flash_intel.c |