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>
This commit is contained in:
parent
08f007c897
commit
0c76b7e377
|
@ -409,7 +409,7 @@ int add_mtd_device(struct mtd_info *mtd, char *devname, int device_id)
|
||||||
|
|
||||||
devfs_create(&mtd->cdev);
|
devfs_create(&mtd->cdev);
|
||||||
|
|
||||||
if (mtd->parent)
|
if (mtd->parent && !mtd->master)
|
||||||
of_parse_partitions(&mtd->cdev, mtd->parent->device_node);
|
of_parse_partitions(&mtd->cdev, mtd->parent->device_node);
|
||||||
|
|
||||||
list_for_each_entry(hook, &mtd_register_hooks, hook)
|
list_for_each_entry(hook, &mtd_register_hooks, hook)
|
||||||
|
|
|
@ -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_offset = offset;
|
||||||
part->master = mtd;
|
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;
|
return part;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,6 +138,9 @@ int mtd_del_partition(struct mtd_info *part)
|
||||||
if (!part->master)
|
if (!part->master)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
del_mtd_device(part);
|
||||||
|
|
||||||
|
free(part->cdev.partname);
|
||||||
free(part->name);
|
free(part->name);
|
||||||
free(part);
|
free(part);
|
||||||
|
|
||||||
|
|
|
@ -276,6 +276,15 @@ struct cdev *devfs_add_partition(const char *devname, loff_t offset, loff_t size
|
||||||
if (offset + size > cdev->size)
|
if (offset + size > cdev->size)
|
||||||
return ERR_PTR(-EINVAL);
|
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 = xzalloc(sizeof (*new));
|
||||||
new->name = strdup(name);
|
new->name = strdup(name);
|
||||||
if (!strncmp(devname, name, strlen(devname)))
|
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->dev = cdev->dev;
|
||||||
new->flags = flags | DEVFS_IS_PARTITION;
|
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);
|
devfs_create(new);
|
||||||
|
|
||||||
return new;
|
return new;
|
||||||
|
@ -312,16 +310,16 @@ int devfs_del_partition(const char *name)
|
||||||
if (!cdev)
|
if (!cdev)
|
||||||
return -ENOENT;
|
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))
|
if (!(cdev->flags & DEVFS_IS_PARTITION))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (cdev->flags & DEVFS_PARTITION_FIXED)
|
if (cdev->flags & DEVFS_PARTITION_FIXED)
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
|
|
||||||
#ifdef CONFIG_PARTITION_NEED_MTD
|
|
||||||
if (cdev->mtd)
|
|
||||||
mtd_del_partition(cdev->mtd);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ret = devfs_remove(cdev);
|
ret = devfs_remove(cdev);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue