summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2014-01-14 11:51:35 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2014-02-26 08:33:18 +0100
commit0c76b7e3779d1d38b8b70596b122bab076d9f26e (patch)
tree7395d66ada33e993c8eda4730b1fa8d6b9dbcf6e
parent08f007c8977ec15663de6d6f3d403d09423a2762 (diff)
downloadbarebox-0c76b7e3779d1d38b8b70596b122bab076d9f26e.tar.gz
barebox-0c76b7e3779d1d38b8b70596b122bab076d9f26e.tar.xz
mtd: register mtd partitions as real mtd devices
So far mtd partitions were mtd devices, but these were not registered. This patch changes this. mtd partitions are now registered like real mtd devices. This makes them part of the device hierarchy. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--drivers/mtd/core.c2
-rw-r--r--drivers/mtd/partition.c8
-rw-r--r--fs/devfs-core.c30
3 files changed, 23 insertions, 17 deletions
diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c
index 95044d57de..36a363fa37 100644
--- a/drivers/mtd/core.c
+++ b/drivers/mtd/core.c
@@ -409,7 +409,7 @@ int add_mtd_device(struct mtd_info *mtd, char *devname, int device_id)
devfs_create(&mtd->cdev);
- if (mtd->parent)
+ if (mtd->parent && !mtd->master)
of_parse_partitions(&mtd->cdev, mtd->parent->device_node);
list_for_each_entry(hook, &mtd_register_hooks, hook)
diff --git a/drivers/mtd/partition.c b/drivers/mtd/partition.c
index 3d2fac6855..351c5831b0 100644
--- a/drivers/mtd/partition.c
+++ b/drivers/mtd/partition.c
@@ -125,6 +125,11 @@ struct mtd_info *mtd_add_partition(struct mtd_info *mtd, off_t offset, size_t si
part->master_offset = offset;
part->master = mtd;
+ if (!strncmp(mtd->cdev.name, name, strlen(mtd->cdev.name)))
+ part->cdev.partname = xstrdup(name + strlen(mtd->cdev.name) + 1);
+
+ add_mtd_device(part, part->name, DEVICE_ID_SINGLE);
+
return part;
}
@@ -133,6 +138,9 @@ int mtd_del_partition(struct mtd_info *part)
if (!part->master)
return -EINVAL;
+ del_mtd_device(part);
+
+ free(part->cdev.partname);
free(part->name);
free(part);
diff --git a/fs/devfs-core.c b/fs/devfs-core.c
index 44f0169e63..bd6d482867 100644
--- a/fs/devfs-core.c
+++ b/fs/devfs-core.c
@@ -276,6 +276,15 @@ struct cdev *devfs_add_partition(const char *devname, loff_t offset, loff_t size
if (offset + size > cdev->size)
return ERR_PTR(-EINVAL);
+ if (IS_ENABLED(CONFIG_PARTITION_NEED_MTD) && cdev->mtd) {
+ struct mtd_info *mtd;
+
+ mtd = mtd_add_partition(cdev->mtd, offset, size, flags, name);
+ if (IS_ERR(mtd))
+ return (void *)mtd;
+ return 0;
+ }
+
new = xzalloc(sizeof (*new));
new->name = strdup(name);
if (!strncmp(devname, name, strlen(devname)))
@@ -287,17 +296,6 @@ struct cdev *devfs_add_partition(const char *devname, loff_t offset, loff_t size
new->dev = cdev->dev;
new->flags = flags | DEVFS_IS_PARTITION;
-#ifdef CONFIG_PARTITION_NEED_MTD
- if (cdev->mtd) {
- new->mtd = mtd_add_partition(cdev->mtd, offset, size, flags, name);
- if (IS_ERR(new->mtd)) {
- int ret = PTR_ERR(new->mtd);
- free(new);
- return ERR_PTR(ret);
- }
- }
-#endif
-
devfs_create(new);
return new;
@@ -312,16 +310,16 @@ int devfs_del_partition(const char *name)
if (!cdev)
return -ENOENT;
+ if (IS_ENABLED(CONFIG_PARTITION_NEED_MTD) && cdev->mtd) {
+ ret = mtd_del_partition(cdev->mtd);
+ return ret;
+ }
+
if (!(cdev->flags & DEVFS_IS_PARTITION))
return -EINVAL;
if (cdev->flags & DEVFS_PARTITION_FIXED)
return -EPERM;
-#ifdef CONFIG_PARTITION_NEED_MTD
- if (cdev->mtd)
- mtd_del_partition(cdev->mtd);
-#endif
-
ret = devfs_remove(cdev);
if (ret)
return ret;