summaryrefslogtreecommitdiffstats
path: root/src/libdt.c
diff options
context:
space:
mode:
authorSteffen Trumtrar <s.trumtrar@pengutronix.de>2014-02-26 11:42:33 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2014-02-27 09:52:43 +0100
commit2950db40e9d5eba965d42f662bf6a33792a896a6 (patch)
tree1ce9954857a308f7b8766bd08c3edc62e254b468 /src/libdt.c
parent8f0ce9db681bef2dbe11ba651fae60665a058b9f (diff)
downloaddt-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.c57
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;
}