From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail.kymetacorp.com ([192.81.58.21]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1a7BGM-0004IO-Mz for barebox@lists.infradead.org; Fri, 11 Dec 2015 00:08:43 +0000 From: Trent Piepho Date: Fri, 11 Dec 2015 00:07:34 +0000 Message-ID: <1449792460.26955.91.camel@rtred1test09.kymeta.local> References: <1445330352-30153-1-git-send-email-mkl@pengutronix.de> <1445330352-30153-2-git-send-email-mkl@pengutronix.de> <1449787121.26955.89.camel@rtred1test09.kymeta.local> In-Reply-To: <1449787121.26955.89.camel@rtred1test09.kymeta.local> Content-Language: en-US Content-ID: <476E8AD9FBFF7140B7DF53C8E9237399@kymetacorp.com> MIME-Version: 1.0 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "barebox" Errors-To: barebox-bounces+u.kleine-koenig=pengutronix.de@lists.infradead.org Subject: [PATCH] of_path: Fix bug with partitions, simply code To: Marc Kleine-Budde Cc: "barebox@lists.infradead.org" In commit f72b64815619b41e026dd3eb9d53bf9855f84628 using a path that has a partition description broke. Fix this and simplify the code some. There is no need to loop over each string in the path property: it's defined to have at most one partition description, no extant dts has more than one, and how it would handle more than one didn't make sense anyway. Once not looping, __of_find_path() just needs the partition description text, not both the original node and property name to look it up from. When using a partition description, don't lookup the cdev of the node just to replace it with the partition's cdev. Signed-off-by: Trent Piepho --- drivers/of/of_path.c | 47 +++++++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/drivers/of/of_path.c b/drivers/of/of_path.c index 6903905..9016147 100644 --- a/drivers/of/of_path.c +++ b/drivers/of/of_path.c @@ -106,12 +106,22 @@ out: return ret; } -static int __of_find_path(struct device_node *node, const char *propname, char **outpath, unsigned flags) +/** + * __of_find_path + * + * @node: The node to find the cdev for, can be the device or a + * partition in the device + * @part: Optionally, a description of a parition of @node. See of_find_path + * @outpath: if this function returns 0 outpath will contain the path belonging + * to the input path description. Must be freed with free(). + * @flags: use OF_FIND_PATH_FLAGS_BB to return the .bb device if available + * + */ +static int __of_find_path(struct device_node *node, const char *part, char **outpath, unsigned flags) { - struct of_path op = {}; - const char *str; + struct of_path op; bool add_bb = false; - int i, ret; + int ret; op.dev = of_find_device_by_node_path(node->full_name); if (!op.dev) { @@ -122,23 +132,18 @@ static int __of_find_path(struct device_node *node, const char *propname, char * device_detect(op.dev); - op.cdev = cdev_by_device_node(node); - - i = 1; - - while (propname) { - ret = of_property_read_string_index(node, propname, i++, &str); - if (ret) - break; - - ret = of_path_parse_one(&op, str); + if (part) { + /* Find a partition inside op.dev */ + ret = of_path_parse_one(&op, part); if (ret) return ret; + } else { + /* node points directly to device */ + op.cdev = cdev_by_device_node(node); + if (!op.cdev) + return -ENOENT; } - if (!op.cdev) - return -ENOENT; - if ((flags & OF_FIND_PATH_FLAGS_BB) && op.cdev->mtd && mtd_can_have_bb(op.cdev->mtd)) add_bb = true; @@ -193,6 +198,8 @@ int of_find_path(struct device_node *node, const char *propname, char **outpath, { struct device_node *rnode; const char *path; + const char *part; + int ret; path = of_get_property(node, propname, NULL); if (!path) @@ -202,5 +209,9 @@ int of_find_path(struct device_node *node, const char *propname, char **outpath, if (!rnode) return -ENODEV; - return __of_find_path(rnode, propname, outpath, flags); + ret = of_property_read_string_index(node, propname, 1, &part); + if (ret) + part = NULL; + + return __of_find_path(rnode, part, outpath, flags); } -- 1.8.3.1 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox