diff options
author | Steffen Trumtrar <s.trumtrar@pengutronix.de> | 2014-02-26 11:42:33 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2014-02-27 09:52:43 +0100 |
commit | 2950db40e9d5eba965d42f662bf6a33792a896a6 (patch) | |
tree | 1ce9954857a308f7b8766bd08c3edc62e254b468 /src/libdt.c | |
parent | 8f0ce9db681bef2dbe11ba651fae60665a058b9f (diff) | |
download | dt-utils-2950db40e9d5eba965d42f662bf6a33792a896a6.tar.gz dt-utils-2950db40e9d5eba965d42f662bf6a33792a896a6.tar.xz |
libdt: refactor partition parsing
Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'src/libdt.c')
-rw-r--r-- | src/libdt.c | 57 |
1 files changed, 34 insertions, 23 deletions
diff --git a/src/libdt.c b/src/libdt.c index 7fa9479..c133941 100644 --- a/src/libdt.c +++ b/src/libdt.c @@ -1983,6 +1983,36 @@ out: return dev; } +int of_parse_partition_from_path(struct of_path *op, const char *name) +{ + struct device_node *node; + + for_each_child_of_node(op->node, node) { + const char *partname; + int len; + + partname = of_get_property(node, "label", &len); + if (!strcmp(partname, name)) { + const __be32 *reg; + int a_cells, s_cells; + + reg = of_get_property(node, "reg", &len); + if (!reg) + continue; + + a_cells = of_n_addr_cells(node); + s_cells = of_n_size_cells(node); + + op->offset = of_read_number(reg, a_cells); + op->size = of_read_number(reg + a_cells, s_cells); + + return 0; + } + } + + return -EINVAL; +} + struct udev_device *device_find_partition(struct udev_device *dev, const char *name) { struct udev *udev; @@ -2078,10 +2108,12 @@ static int of_path_type_partname(struct of_path *op, const char *name) if (udev_device_get_devnode(part) != NULL) { op->devpath = strdup(udev_device_get_devnode(part)); pr_debug("%s: found part '%s'\n", __func__, name); + ret = of_parse_partition_from_path(op, name); } else { pr_debug("%s: '%s' not found\n", __func__, name); + ret = -EINVAL; } - return 0; + return ret; } part = device_find_devnode(op->dev); @@ -2112,28 +2144,7 @@ static int of_path_type_partname(struct of_path *op, const char *name) if (ret) return -errno; - for_each_child_of_node(op->node, node) { - const char *partname; - int len; - - partname = of_get_property(node, "label", &len); - if (!strcmp(partname, name)) { - const __be32 *reg; - int a_cells, s_cells; - - reg = of_get_property(node, "reg", &len); - if (!reg) - continue; - - a_cells = of_n_addr_cells(node); - s_cells = of_n_size_cells(node); - - op->offset = of_read_number(reg, a_cells); - op->size = of_read_number(reg + a_cells, s_cells); - - break; - } - } + of_parse_partition_from_path(op, name); return 0; } |