mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Sascha Hauer <s.hauer@pengutronix.de>
To: Trent Piepho <tpiepho@kymetacorp.com>
Cc: Barebox List <barebox@lists.infradead.org>
Subject: Re: [PATCH] of_path: Make partition names work again
Date: Fri, 8 Jan 2016 08:34:46 +0100	[thread overview]
Message-ID: <20160108073446.GX13058@pengutronix.de> (raw)
In-Reply-To: <1452191516.4474.81.camel@rtred1test09.kymeta.local>

On Thu, Jan 07, 2016 at 06:31:45PM +0000, Trent Piepho wrote:
> There's already a patch in barebox-next that fixes this bug, 985e773.
> It doesn't delete the patname: parsing code, but does add a number of
> comments that this patch doesn't.

Indeed, it's not tool long ago, I should habe remembered that. In that
case I added your patch to the master branch to get that issue fixed for
the upcoming release.
The remaining removal of of_path_parse_one() can then go into -next with
the following cleanup patch.

Sascha

-------------------------------8<--------------------------------

From ae172dd2d06f16c413f0a472e1f6afbd6f6ab92b Mon Sep 17 00:00:00 2001
From: Sascha Hauer <s.hauer@pengutronix.de>
Date: Thu, 7 Jan 2016 12:13:08 +0100
Subject: [PATCH] of_path: Drop possible further extensions of device-path
 property

Originally it was intended to further extend the multi string property
device-path further with more elements, like for example a filename. It
turned out though that this is too complex and instead of further
extending the property we should instead create additional properties,
so this mechanism is removed with this patch to make the code simpler.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 drivers/of/of_path.c | 123 ++++++++++++---------------------------------------
 1 file changed, 28 insertions(+), 95 deletions(-)

diff --git a/drivers/of/of_path.c b/drivers/of/of_path.c
index 9016147..ed620f1 100644
--- a/drivers/of/of_path.c
+++ b/drivers/of/of_path.c
@@ -23,16 +23,6 @@
 
 #include <linux/mtd/mtd.h>
 
-struct of_path {
-	struct cdev *cdev;
-	struct device_d *dev;
-};
-
-struct of_path_type {
-	const char *name;
-	int (*parse)(struct of_path *op, const char *str);
-};
-
 struct device_d *of_find_device_by_node_path(const char *path)
 {
 	struct device_d *dev;
@@ -48,65 +38,6 @@ struct device_d *of_find_device_by_node_path(const char *path)
 }
 
 /**
- * of_path_type_partname - find a partition based on physical device and
- *                         partition name
- * @op: of_path context
- * @name: the partition name to find
- */
-static int of_path_type_partname(struct of_path *op, const char *name)
-{
-	if (!op->dev)
-		return -EINVAL;
-
-	op->cdev = device_find_partition(op->dev, name);
-	if (op->cdev) {
-		pr_debug("%s: found part '%s'\n", __func__, name);
-		return 0;
-	} else {
-		pr_debug("%s: cannot find part '%s'\n", __func__, name);
-		return -ENODEV;
-	}
-}
-
-static struct of_path_type of_path_types[] = {
-	{
-		.name = "partname",
-		.parse = of_path_type_partname,
-	},
-};
-
-static int of_path_parse_one(struct of_path *op, const char *str)
-{
-	int i, ret;
-	char *name, *desc;
-
-	pr_debug("parsing: %s\n", str);
-
-	name = xstrdup(str);
-	desc = strchr(name, ':');
-	if (!desc) {
-		free(name);
-		return -EINVAL;
-	}
-
-	*desc = 0;
-	desc++;
-
-	for (i = 0; i < ARRAY_SIZE(of_path_types); i++) {
-		if (!strcmp(of_path_types[i].name, name)) {
-			ret = of_path_types[i].parse(op, desc);
-			goto out;
-		}
-	}
-
-	ret = -EINVAL;
-out:
-	free(name);
-
-	return ret;
-}
-
-/**
  * __of_find_path
  *
  * @node: The node to find the cdev for, can be the device or a
@@ -119,36 +50,32 @@ out:
  */
 static int __of_find_path(struct device_node *node, const char *part, char **outpath, unsigned flags)
 {
-	struct of_path op;
+	struct device_d *dev;
+	struct cdev *cdev;
 	bool add_bb = false;
-	int ret;
 
-	op.dev = of_find_device_by_node_path(node->full_name);
-	if (!op.dev) {
-		op.dev = of_find_device_by_node_path(node->parent->full_name);
-		if (!op.dev)
+	dev = of_find_device_by_node_path(node->full_name);
+	if (!dev) {
+		dev = of_find_device_by_node_path(node->parent->full_name);
+		if (!dev)
 			return -ENODEV;
 	}
 
-	device_detect(op.dev);
+	device_detect(dev);
 
-	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 (part)
+		cdev = device_find_partition(dev, part);
+	else
+		cdev = cdev_by_device_node(node);
 
-	if ((flags & OF_FIND_PATH_FLAGS_BB) && op.cdev->mtd &&
-	    mtd_can_have_bb(op.cdev->mtd))
+	if (!cdev)
+		return -ENOENT;
+
+	if ((flags & OF_FIND_PATH_FLAGS_BB) && cdev->mtd &&
+	    mtd_can_have_bb(cdev->mtd))
 		add_bb = true;
 
-	*outpath = asprintf("/dev/%s%s", op.cdev->name, add_bb ? ".bb" : "");
+	*outpath = asprintf("/dev/%s%s", cdev->name, add_bb ? ".bb" : "");
 
 	return 0;
 }
@@ -198,8 +125,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;
+	const char *part = NULL;
+	const char partnamestr[] = "partname:";
 
 	path = of_get_property(node, propname, NULL);
 	if (!path)
@@ -209,9 +136,15 @@ int of_find_path(struct device_node *node, const char *propname, char **outpath,
 	if (!rnode)
 		return -ENODEV;
 
-	ret = of_property_read_string_index(node, propname, 1, &part);
-	if (ret)
-		part = NULL;
+	of_property_read_string_index(node, propname, 1, &part);
+	if (part) {
+		if (!strncmp(part, partnamestr, sizeof(partnamestr) - 1)) {
+			part += sizeof(partnamestr) - 1;
+		} else {
+			pr_err("Invalid device-path: %s\n", part);
+			return -EINVAL;
+		}
+	}
 
 	return __of_find_path(rnode, part, outpath, flags);
 }
-- 
2.6.4

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

      reply	other threads:[~2016-01-08  7:35 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-07 11:27 Sascha Hauer
2016-01-07 18:31 ` Trent Piepho
2016-01-08  7:34   ` Sascha Hauer [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160108073446.GX13058@pengutronix.de \
    --to=s.hauer@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    --cc=tpiepho@kymetacorp.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox