summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2012-04-19 20:22:00 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2013-02-14 23:37:53 +0100
commit2749fbac48374b5f5cedda31aa85cca5f199536c (patch)
tree332a305b39d27b1d5717be2cd12c02ef597b452b /drivers
parent1bd90ff5a11fdb79eb865173d2bf4b5e25d95679 (diff)
downloadbarebox-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/Kconfig1
-rw-r--r--drivers/Makefile1
-rw-r--r--drivers/mtd/Kconfig1
-rw-r--r--drivers/mtd/Makefile1
-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