diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2017-03-30 15:04:32 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2017-03-30 23:46:27 +0200 |
commit | bd28ade42a334d7102cd3999331d9320f169bcbf (patch) | |
tree | 1d54e8f6a56cb63e0553b470c00cec6d7c414e9e /drivers/mtd | |
parent | b6089182316d831c3bfe0d96994df7e372a43c1b (diff) | |
download | barebox-bd28ade42a334d7102cd3999331d9320f169bcbf.tar.gz barebox-bd28ade42a334d7102cd3999331d9320f169bcbf.tar.xz |
of: partition: Move of_mtd_fixup to drivers/of/
Move the fixup code where the parser code is already.
Since the code will not only be used for mtd in the future
drivers/of/ is a better place than drivers/mtd/.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/mtd')
-rw-r--r-- | drivers/mtd/core.c | 65 |
1 files changed, 3 insertions, 62 deletions
diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c index 4e7bfdb3da..1eb8dd36d8 100644 --- a/drivers/mtd/core.c +++ b/drivers/mtd/core.c @@ -556,67 +556,6 @@ static int mtd_part_compare(struct list_head *a, struct list_head *b) return 0; } -static int of_mtd_fixup(struct device_node *root, void *ctx) -{ - struct mtd_info *mtd = ctx, *partmtd; - struct device_node *np, *part, *tmp; - int ret; - - np = of_find_node_by_path_from(root, mtd->of_path); - if (!np) { - dev_err(&mtd->class_dev, "Cannot find nodepath %s, cannot fixup\n", - mtd->of_path); - return -EINVAL; - } - - for_each_child_of_node_safe(np, tmp, part) { - if (of_get_property(part, "compatible", NULL)) - continue; - of_delete_node(part); - } - - list_for_each_entry(partmtd, &mtd->partitions, partitions_entry) { - int na, ns, len = 0; - char *name = basprintf("partition@%0llx", - partmtd->master_offset); - void *p; - u8 tmp[16 * 16]; /* Up to 64-bit address + 64-bit size */ - - if (!name) - return -ENOMEM; - - part = of_new_node(np, name); - free(name); - if (!part) - return -ENOMEM; - - p = of_new_property(part, "label", partmtd->cdev.partname, - strlen(partmtd->cdev.partname) + 1); - if (!p) - return -ENOMEM; - - na = of_n_addr_cells(part); - ns = of_n_size_cells(part); - - of_write_number(tmp + len, partmtd->master_offset, na); - len += na * 4; - of_write_number(tmp + len, partmtd->size, ns); - len += ns * 4; - - ret = of_set_property(part, "reg", tmp, len, 1); - if (ret) - return ret; - - if (partmtd->cdev.flags & DEVFS_PARTITION_READONLY) { - ret = of_set_property(part, "read-only", NULL, 0, 1); - if (ret) - return ret; - } - } - - return 0; -} - static int mtd_detect(struct device_d *dev) { struct mtd_info *mtd = container_of(dev, struct mtd_info, class_dev); @@ -732,7 +671,9 @@ int add_mtd_device(struct mtd_info *mtd, const char *devname, int device_id) of_parse_partitions(&mtd->cdev, mtd->parent->device_node); if (IS_ENABLED(CONFIG_OFDEVICE) && mtd->parent->device_node) { mtd->of_path = xstrdup(mtd->parent->device_node->full_name); - of_register_fixup(of_mtd_fixup, mtd); + ret = of_partitions_register_fixup(&mtd->cdev); + if (ret) + goto err1; } } |