diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2013-05-24 23:31:29 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2013-07-15 11:15:59 +0200 |
commit | abf95154f5d139f2e54559955e80e1752989cc88 (patch) | |
tree | d2776f963b019c0eb7376208f43dcc32fb889a04 /drivers | |
parent | f57a85985b7ece8824c1dc2232962cbc8f96cb38 (diff) | |
download | barebox-abf95154f5d139f2e54559955e80e1752989cc88.tar.gz barebox-abf95154f5d139f2e54559955e80e1752989cc88.tar.xz |
of: partitions: factor out function to parse a single partition
To make it usable for other code.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/of/partition.c | 58 |
1 files changed, 33 insertions, 25 deletions
diff --git a/drivers/of/partition.c b/drivers/of/partition.c index e4b7d1e66b..d69251e666 100644 --- a/drivers/of/partition.c +++ b/drivers/of/partition.c @@ -23,44 +23,52 @@ #include <linux/mtd/mtd.h> #include <nand.h> -int of_parse_partitions(struct cdev *cdev, struct device_node *node) +struct cdev *of_parse_partition(struct cdev *cdev, struct device_node *node) { - struct device_node *n; const char *partname; char *filename; + struct cdev *new; + const __be32 *reg; + unsigned long offset, size; + const char *name; + int len; + unsigned long flags = 0; - for_each_child_of_node(node, n) { - const __be32 *reg; - unsigned long offset, size; - const char *name; - int len; - unsigned long flags = 0; + reg = of_get_property(node, "reg", &len); + if (!reg) + return NULL; + + offset = be32_to_cpu(reg[0]); + size = be32_to_cpu(reg[1]); + + partname = of_get_property(node, "label", &len); + if (!partname) + partname = of_get_property(node, "name", &len); + name = (char *)partname; - reg = of_get_property(n, "reg", &len); - if (!reg) - continue; + debug("add partition: %s.%s 0x%08lx 0x%08lx\n", cdev->name, partname, offset, size); - offset = be32_to_cpu(reg[0]); - size = be32_to_cpu(reg[1]); + if (of_get_property(node, "read-only", &len)) + flags = DEVFS_PARTITION_READONLY; - partname = of_get_property(n, "label", &len); - if (!partname) - partname = of_get_property(n, "name", &len); - name = (char *)partname; + filename = asprintf("%s.%s", cdev->name, partname); - debug("add partition: %s.%s 0x%08lx 0x%08lx\n", cdev->name, partname, offset, size); + new = devfs_add_partition(cdev->name, offset, size, flags, filename); - if (of_get_property(n, "read-only", &len)) - flags = DEVFS_PARTITION_READONLY; + if (cdev->mtd && cdev->mtd->type == MTD_NANDFLASH) + dev_add_bb_dev(filename, NULL); - filename = asprintf("%s.%s", cdev->name, partname); + free(filename); - devfs_add_partition(cdev->name, offset, size, flags, filename); + return new; +} - if (cdev->mtd && cdev->mtd->type == MTD_NANDFLASH) - dev_add_bb_dev(filename, NULL); +int of_parse_partitions(struct cdev *cdev, struct device_node *node) +{ + struct device_node *n; - free(filename); + for_each_child_of_node(node, n) { + of_parse_partition(cdev, n); } return 0; |