devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V5 1/2] mtd: partitions: add of_match_table parser matching
@ 2018-01-02 13:04 Rafał Miłecki
       [not found] ` <20180102130458.16226-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  0 siblings, 1 reply; 13+ messages in thread
From: Rafał Miłecki @ 2018-01-02 13:04 UTC (permalink / raw)
  To: Brian Norris, David Woodhouse, Boris Brezillon, Marek Vasut,
	Richard Weinberger, Cyrille Pitchen, Rob Herring
  Cc: Mark Rutland, Frank Rowand, Linus Walleij,
	linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA, Geert Uytterhoeven,
	Jonas Gorski, Florian Fainelli, John Crispin,
	Rafał Miłecki

From: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

Partition parsers can now provide an of_match_table to enable
flash<-->parser matching via device tree as documented in the
mtd/partition.txt.

It works by looking for a matching parser for every string in the
"compatibility" property (starting with the most specific one).

This support is currently limited to built-in parsers as it uses
request_module() and friends. This should be sufficient for most cases
though as compiling parsers as modules isn't a common choice.

Signed-off-by: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Signed-off-by: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
---
This is based on Brian's patches:
[RFC PATCH 4/7] mtd: add of_match_mtd_parser() and of_mtd_match_mtd_parser() helpers
[RFC PATCH 6/7] RFC: mtd: partitions: enable of_match_table matching

V1: Put helpers in mtdpart.c instead of drivers/of/of_mtd.c
    Merge helpers into a single of_mtd_match_mtd_parser
V3: Add a simple comment to note we will need the best match in the future
V4: Rework new functions to pick parser with the best match
    Move new code in parse_mtd_partitions up so it has precedence over flash
    driver defaults and MTD defaults
V5: Rework matching code to start checking with the most specific string in the
    "compatibility" property.
---
 drivers/mtd/mtdpart.c          | 64 ++++++++++++++++++++++++++++++++++++++++++
 include/linux/mtd/partitions.h |  1 +
 2 files changed, 65 insertions(+)

diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
index be088bccd593..a3aaaa4af992 100644
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
@@ -30,6 +30,7 @@
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
 #include <linux/err.h>
+#include <linux/of.h>
 
 #include "mtdcore.h"
 
@@ -880,6 +881,48 @@ static int mtd_part_do_parse(struct mtd_part_parser *parser,
 }
 
 /**
+ * mtd_part_get_parser_by_cp - find MTD parser by a compatible string
+ *
+ * @cp: compatible string describing partitions in a device tree
+ *
+ * MTD parsers can specify supported partitions by providing a table of
+ * compatibility strings. This function finds a parser that advertises support
+ * for a passed value of "compatible".
+ */
+static struct mtd_part_parser *mtd_part_get_parser_by_cp(const char *cp)
+{
+	struct mtd_part_parser *p, *ret;
+
+	spin_lock(&part_parser_lock);
+
+	list_for_each_entry(p, &part_parsers, list) {
+		const struct of_device_id *matches;
+
+		matches = p->of_match_table;
+		if (!matches)
+			continue;
+
+		for (; matches->name[0] || matches->type[0] || matches->compatible[0];
+		     matches++) {
+			if (!matches->compatible[0])
+				continue;
+			if (!strcmp(matches->compatible, cp) &&
+			    try_module_get(p->owner)) {
+				ret = p;
+				break;
+			}
+		}
+
+		if (ret)
+			break;
+	}
+
+	spin_unlock(&part_parser_lock);
+
+	return ret;
+}
+
+/**
  * parse_mtd_partitions - parse MTD partitions
  * @master: the master partition (describes whole MTD device)
  * @types: names of partition parsers to try or %NULL
@@ -905,8 +948,29 @@ int parse_mtd_partitions(struct mtd_info *master, const char *const *types,
 			 struct mtd_part_parser_data *data)
 {
 	struct mtd_part_parser *parser;
+	struct device_node *np;
+	struct property *prop;
+	const char *cp;
 	int ret, err = 0;
 
+	np = of_get_child_by_name(mtd_get_of_node(master), "partitions");
+	if (np) {
+		of_property_for_each_string(np, "compatible", prop, cp) {
+			parser = mtd_part_get_parser_by_cp(cp);
+			if (!parser)
+				continue;
+			ret = mtd_part_do_parse(parser, master, pparts, data);
+			if (ret > 0) {
+				of_node_put(np);
+				return 0;
+			}
+			mtd_part_parser_put(parser);
+			if (ret < 0 && !err)
+				err = ret;
+		}
+		of_node_put(np);
+	}
+
 	if (!types)
 		types = default_mtd_part_types;
 
diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h
index c4beb70dacbd..11cb0c50cd84 100644
--- a/include/linux/mtd/partitions.h
+++ b/include/linux/mtd/partitions.h
@@ -77,6 +77,7 @@ struct mtd_part_parser {
 	struct list_head list;
 	struct module *owner;
 	const char *name;
+	const struct of_device_id *of_match_table;
 	int (*parse_fn)(struct mtd_info *, const struct mtd_partition **,
 			struct mtd_part_parser_data *);
 	void (*cleanup)(const struct mtd_partition *pparts, int nr_parts);
-- 
2.11.0

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH V5 2/2] mtd: ofpart: add of_match_table with "fixed-partitions"
       [not found] ` <20180102130458.16226-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2018-01-02 13:04   ` Rafał Miłecki
  2018-01-03 10:55   ` [PATCH V6 1/2] mtd: partitions: add of_match_table parser matching Rafał Miłecki
  1 sibling, 0 replies; 13+ messages in thread
From: Rafał Miłecki @ 2018-01-02 13:04 UTC (permalink / raw)
  To: Brian Norris, David Woodhouse, Boris Brezillon, Marek Vasut,
	Richard Weinberger, Cyrille Pitchen, Rob Herring
  Cc: Mark Rutland, Frank Rowand, Linus Walleij,
	linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA, Geert Uytterhoeven,
	Jonas Gorski, Florian Fainelli, John Crispin,
	Rafał Miłecki

From: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>

This allows using this parser with any flash driver that takes care of
setting of_node (using mtd_set_of_node helper) correctly. Up to now
support for "fixed-partitions" DT compatibility string was working only
with flash drivers that were specifying "ofpart" (manually or by letting
mtd use the default set of parsers).

This matches existing bindings documentation.

Signed-off-by: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
Reviewed-by: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Tested-by: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
 drivers/mtd/ofpart.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/mtd/ofpart.c b/drivers/mtd/ofpart.c
index 6bdf4e525677..92fcbac046d9 100644
--- a/drivers/mtd/ofpart.c
+++ b/drivers/mtd/ofpart.c
@@ -140,9 +140,16 @@ static int parse_ofpart_partitions(struct mtd_info *master,
 	return ret;
 }
 
+static const struct of_device_id parse_ofpart_match_table[] = {
+	{ .compatible = "fixed-partitions" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, parse_ofpart_match_table);
+
 static struct mtd_part_parser ofpart_parser = {
 	.parse_fn = parse_ofpart_partitions,
 	.name = "ofpart",
+	.of_match_table = parse_ofpart_match_table,
 };
 
 static int parse_ofoldpart_partitions(struct mtd_info *master,
-- 
2.11.0

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH V6 1/2] mtd: partitions: add of_match_table parser matching
       [not found] ` <20180102130458.16226-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2018-01-02 13:04   ` [PATCH V5 2/2] mtd: ofpart: add of_match_table with "fixed-partitions" Rafał Miłecki
@ 2018-01-03 10:55   ` Rafał Miłecki
       [not found]     ` <20180103105543.17897-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  1 sibling, 1 reply; 13+ messages in thread
From: Rafał Miłecki @ 2018-01-03 10:55 UTC (permalink / raw)
  To: Brian Norris, David Woodhouse, Boris Brezillon, Marek Vasut,
	Richard Weinberger, Cyrille Pitchen, Rob Herring
  Cc: Mark Rutland, Frank Rowand, Linus Walleij,
	linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA, Geert Uytterhoeven,
	Jonas Gorski, Florian Fainelli, John Crispin,
	Rafał Miłecki

From: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

Partition parsers can now provide an of_match_table to enable
flash<-->parser matching via device tree as documented in the
mtd/partition.txt.

It works by looking for a matching parser for every string in the
"compatibility" property (starting with the most specific one).

This support is currently limited to built-in parsers as it uses
request_module() and friends. This should be sufficient for most cases
though as compiling parsers as modules isn't a common choice.

Signed-off-by: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Signed-off-by: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
---
This is based on Brian's patches:
[RFC PATCH 4/7] mtd: add of_match_mtd_parser() and of_mtd_match_mtd_parser() helpers
[RFC PATCH 6/7] RFC: mtd: partitions: enable of_match_table matching

V1: Put helpers in mtdpart.c instead of drivers/of/of_mtd.c
    Merge helpers into a single of_mtd_match_mtd_parser
V3: Add a simple comment to note we will need the best match in the future
V4: Rework new functions to pick parser with the best match
    Move new code in parse_mtd_partitions up so it has precedence over flash
    driver defaults and MTD defaults
V5: Rework matching code to start checking with the most specific string in the
    "compatibility" property.
V6: Initialize "ret" variable in mtd_part_get_parser_by_cp to NULL
---
 drivers/mtd/mtdpart.c          | 64 ++++++++++++++++++++++++++++++++++++++++++
 include/linux/mtd/partitions.h |  1 +
 2 files changed, 65 insertions(+)

diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
index be088bccd593..b11958adcf45 100644
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
@@ -30,6 +30,7 @@
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
 #include <linux/err.h>
+#include <linux/of.h>
 
 #include "mtdcore.h"
 
@@ -880,6 +881,48 @@ static int mtd_part_do_parse(struct mtd_part_parser *parser,
 }
 
 /**
+ * mtd_part_get_parser_by_cp - find MTD parser by a compatible string
+ *
+ * @cp: compatible string describing partitions in a device tree
+ *
+ * MTD parsers can specify supported partitions by providing a table of
+ * compatibility strings. This function finds a parser that advertises support
+ * for a passed value of "compatible".
+ */
+static struct mtd_part_parser *mtd_part_get_parser_by_cp(const char *cp)
+{
+	struct mtd_part_parser *p, *ret = NULL;
+
+	spin_lock(&part_parser_lock);
+
+	list_for_each_entry(p, &part_parsers, list) {
+		const struct of_device_id *matches;
+
+		matches = p->of_match_table;
+		if (!matches)
+			continue;
+
+		for (; matches->name[0] || matches->type[0] || matches->compatible[0];
+		     matches++) {
+			if (!matches->compatible[0])
+				continue;
+			if (!strcmp(matches->compatible, cp) &&
+			    try_module_get(p->owner)) {
+				ret = p;
+				break;
+			}
+		}
+
+		if (ret)
+			break;
+	}
+
+	spin_unlock(&part_parser_lock);
+
+	return ret;
+}
+
+/**
  * parse_mtd_partitions - parse MTD partitions
  * @master: the master partition (describes whole MTD device)
  * @types: names of partition parsers to try or %NULL
@@ -905,8 +948,29 @@ int parse_mtd_partitions(struct mtd_info *master, const char *const *types,
 			 struct mtd_part_parser_data *data)
 {
 	struct mtd_part_parser *parser;
+	struct device_node *np;
+	struct property *prop;
+	const char *cp;
 	int ret, err = 0;
 
+	np = of_get_child_by_name(mtd_get_of_node(master), "partitions");
+	if (np) {
+		of_property_for_each_string(np, "compatible", prop, cp) {
+			parser = mtd_part_get_parser_by_cp(cp);
+			if (!parser)
+				continue;
+			ret = mtd_part_do_parse(parser, master, pparts, data);
+			if (ret > 0) {
+				of_node_put(np);
+				return 0;
+			}
+			mtd_part_parser_put(parser);
+			if (ret < 0 && !err)
+				err = ret;
+		}
+		of_node_put(np);
+	}
+
 	if (!types)
 		types = default_mtd_part_types;
 
diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h
index c4beb70dacbd..11cb0c50cd84 100644
--- a/include/linux/mtd/partitions.h
+++ b/include/linux/mtd/partitions.h
@@ -77,6 +77,7 @@ struct mtd_part_parser {
 	struct list_head list;
 	struct module *owner;
 	const char *name;
+	const struct of_device_id *of_match_table;
 	int (*parse_fn)(struct mtd_info *, const struct mtd_partition **,
 			struct mtd_part_parser_data *);
 	void (*cleanup)(const struct mtd_partition *pparts, int nr_parts);
-- 
2.11.0

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH V6 2/2] mtd: ofpart: add of_match_table with "fixed-partitions"
       [not found]     ` <20180103105543.17897-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2018-01-03 10:55       ` Rafał Miłecki
  2018-01-03 18:28       ` [PATCH V6 1/2] mtd: partitions: add of_match_table parser matching Rob Herring
  2018-01-04  7:05       ` [PATCH V7 " Rafał Miłecki
  2 siblings, 0 replies; 13+ messages in thread
From: Rafał Miłecki @ 2018-01-03 10:55 UTC (permalink / raw)
  To: Brian Norris, David Woodhouse, Boris Brezillon, Marek Vasut,
	Richard Weinberger, Cyrille Pitchen, Rob Herring
  Cc: Mark Rutland, Frank Rowand, Linus Walleij,
	linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA, Geert Uytterhoeven,
	Jonas Gorski, Florian Fainelli, John Crispin,
	Rafał Miłecki

From: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>

This allows using this parser with any flash driver that takes care of
setting of_node (using mtd_set_of_node helper) correctly. Up to now
support for "fixed-partitions" DT compatibility string was working only
with flash drivers that were specifying "ofpart" (manually or by letting
mtd use the default set of parsers).

This matches existing bindings documentation.

Signed-off-by: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
Reviewed-by: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Tested-by: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
 drivers/mtd/ofpart.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/mtd/ofpart.c b/drivers/mtd/ofpart.c
index 6bdf4e525677..92fcbac046d9 100644
--- a/drivers/mtd/ofpart.c
+++ b/drivers/mtd/ofpart.c
@@ -140,9 +140,16 @@ static int parse_ofpart_partitions(struct mtd_info *master,
 	return ret;
 }
 
+static const struct of_device_id parse_ofpart_match_table[] = {
+	{ .compatible = "fixed-partitions" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, parse_ofpart_match_table);
+
 static struct mtd_part_parser ofpart_parser = {
 	.parse_fn = parse_ofpart_partitions,
 	.name = "ofpart",
+	.of_match_table = parse_ofpart_match_table,
 };
 
 static int parse_ofoldpart_partitions(struct mtd_info *master,
-- 
2.11.0

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH V6 1/2] mtd: partitions: add of_match_table parser matching
       [not found]     ` <20180103105543.17897-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2018-01-03 10:55       ` [PATCH V6 2/2] mtd: ofpart: add of_match_table with "fixed-partitions" Rafał Miłecki
@ 2018-01-03 18:28       ` Rob Herring
  2018-01-04  6:32         ` Rafał Miłecki
  2018-01-04  7:05       ` [PATCH V7 " Rafał Miłecki
  2 siblings, 1 reply; 13+ messages in thread
From: Rob Herring @ 2018-01-03 18:28 UTC (permalink / raw)
  To: Rafał Miłecki
  Cc: Brian Norris, David Woodhouse, Boris Brezillon, Marek Vasut,
	Richard Weinberger, Cyrille Pitchen, Mark Rutland, Frank Rowand,
	Linus Walleij, linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	Geert Uytterhoeven, Jonas Gorski, Florian Fainelli, John Crispin,
	Rafał Miłecki

On Wed, Jan 3, 2018 at 4:55 AM, Rafał Miłecki <zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
> From: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
>
> Partition parsers can now provide an of_match_table to enable
> flash<-->parser matching via device tree as documented in the
> mtd/partition.txt.
>
> It works by looking for a matching parser for every string in the
> "compatibility" property (starting with the most specific one).
>
> This support is currently limited to built-in parsers as it uses
> request_module() and friends. This should be sufficient for most cases
> though as compiling parsers as modules isn't a common choice.
>
> Signed-off-by: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> Signed-off-by: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
> ---
> This is based on Brian's patches:
> [RFC PATCH 4/7] mtd: add of_match_mtd_parser() and of_mtd_match_mtd_parser() helpers
> [RFC PATCH 6/7] RFC: mtd: partitions: enable of_match_table matching
>
> V1: Put helpers in mtdpart.c instead of drivers/of/of_mtd.c
>     Merge helpers into a single of_mtd_match_mtd_parser
> V3: Add a simple comment to note we will need the best match in the future
> V4: Rework new functions to pick parser with the best match
>     Move new code in parse_mtd_partitions up so it has precedence over flash
>     driver defaults and MTD defaults
> V5: Rework matching code to start checking with the most specific string in the
>     "compatibility" property.
> V6: Initialize "ret" variable in mtd_part_get_parser_by_cp to NULL
> ---
>  drivers/mtd/mtdpart.c          | 64 ++++++++++++++++++++++++++++++++++++++++++
>  include/linux/mtd/partitions.h |  1 +
>  2 files changed, 65 insertions(+)
>
> diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
> index be088bccd593..b11958adcf45 100644
> --- a/drivers/mtd/mtdpart.c
> +++ b/drivers/mtd/mtdpart.c
> @@ -30,6 +30,7 @@
>  #include <linux/mtd/mtd.h>
>  #include <linux/mtd/partitions.h>
>  #include <linux/err.h>
> +#include <linux/of.h>
>
>  #include "mtdcore.h"
>
> @@ -880,6 +881,48 @@ static int mtd_part_do_parse(struct mtd_part_parser *parser,
>  }
>
>  /**
> + * mtd_part_get_parser_by_cp - find MTD parser by a compatible string

What's "cp"? Perhaps mtd_part_get_compatible_parser.

> + *
> + * @cp: compatible string describing partitions in a device tree

"compat" would be clearer IMO

> + *
> + * MTD parsers can specify supported partitions by providing a table of
> + * compatibility strings. This function finds a parser that advertises support
> + * for a passed value of "compatible".
> + */
> +static struct mtd_part_parser *mtd_part_get_parser_by_cp(const char *cp)
> +{
> +       struct mtd_part_parser *p, *ret = NULL;
> +
> +       spin_lock(&part_parser_lock);
> +
> +       list_for_each_entry(p, &part_parsers, list) {
> +               const struct of_device_id *matches;
> +
> +               matches = p->of_match_table;
> +               if (!matches)
> +                       continue;
> +
> +               for (; matches->name[0] || matches->type[0] || matches->compatible[0];
> +                    matches++) {
> +                       if (!matches->compatible[0])
> +                               continue;

It would be simpler to just ignore name and type. Having either of
those would be an error and the only consequence if there are entries
without compatible is returning early.

> +                       if (!strcmp(matches->compatible, cp) &&
> +                           try_module_get(p->owner)) {
> +                               ret = p;
> +                               break;
> +                       }
> +               }
> +
> +               if (ret)
> +                       break;
> +       }
> +
> +       spin_unlock(&part_parser_lock);
> +
> +       return ret;
> +}
> +
> +/**
>   * parse_mtd_partitions - parse MTD partitions
>   * @master: the master partition (describes whole MTD device)
>   * @types: names of partition parsers to try or %NULL
> @@ -905,8 +948,29 @@ int parse_mtd_partitions(struct mtd_info *master, const char *const *types,
>                          struct mtd_part_parser_data *data)
>  {
>         struct mtd_part_parser *parser;
> +       struct device_node *np;
> +       struct property *prop;
> +       const char *cp;
>         int ret, err = 0;
>
> +       np = of_get_child_by_name(mtd_get_of_node(master), "partitions");
> +       if (np) {

You can drop this. of_property_for_each_string and of_node_put will
work if np is NULL.

> +               of_property_for_each_string(np, "compatible", prop, cp) {
> +                       parser = mtd_part_get_parser_by_cp(cp);
> +                       if (!parser)
> +                               continue;
> +                       ret = mtd_part_do_parse(parser, master, pparts, data);
> +                       if (ret > 0) {
> +                               of_node_put(np);
> +                               return 0;
> +                       }
> +                       mtd_part_parser_put(parser);
> +                       if (ret < 0 && !err)
> +                               err = ret;
> +               }
> +               of_node_put(np);
> +       }
> +
>         if (!types)
>                 types = default_mtd_part_types;
>
> diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h
> index c4beb70dacbd..11cb0c50cd84 100644
> --- a/include/linux/mtd/partitions.h
> +++ b/include/linux/mtd/partitions.h
> @@ -77,6 +77,7 @@ struct mtd_part_parser {
>         struct list_head list;
>         struct module *owner;
>         const char *name;
> +       const struct of_device_id *of_match_table;

I generally like using of_device_id over just an array of strings, but
I'm wondering if there's really cases where you have multiple
compatible strings for a single parser? Perhaps a single string here
would be sufficient. And if you did have multiple matches, how would
you distinguish them later on in the parsing functions? Normally we'd
use the matched data ptr, but that's not provided here.

>         int (*parse_fn)(struct mtd_info *, const struct mtd_partition **,
>                         struct mtd_part_parser_data *);
>         void (*cleanup)(const struct mtd_partition *pparts, int nr_parts);
> --
> 2.11.0
>
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V6 1/2] mtd: partitions: add of_match_table parser matching
  2018-01-03 18:28       ` [PATCH V6 1/2] mtd: partitions: add of_match_table parser matching Rob Herring
@ 2018-01-04  6:32         ` Rafał Miłecki
       [not found]           ` <9a799300a0730a0103fe744878fb1a9f-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
  0 siblings, 1 reply; 13+ messages in thread
From: Rafał Miłecki @ 2018-01-04  6:32 UTC (permalink / raw)
  To: Rob Herring
  Cc: Mark Rutland, Boris Brezillon, Florian Fainelli, Jonas Gorski,
	Geert Uytterhoeven, Frank Rowand,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	Richard Weinberger, Linus Walleij, Rafał Miłecki,
	Marek Vasut, John Crispin, linux-mtd, Cyrille Pitchen,
	Brian Norris, David Woodhouse

On 2018-01-03 19:28, Rob Herring wrote:
> On Wed, Jan 3, 2018 at 4:55 AM, Rafał Miłecki <zajec5@gmail.com> wrote:
>> From: Brian Norris <computersforpeace@gmail.com>
>> 
>> Partition parsers can now provide an of_match_table to enable
>> flash<-->parser matching via device tree as documented in the
>> mtd/partition.txt.
>> 
>> It works by looking for a matching parser for every string in the
>> "compatibility" property (starting with the most specific one).
>> 
>> This support is currently limited to built-in parsers as it uses
>> request_module() and friends. This should be sufficient for most cases
>> though as compiling parsers as modules isn't a common choice.
>> 
>> Signed-off-by: Brian Norris <computersforpeace@gmail.com>
>> Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
>> ---
>> This is based on Brian's patches:
>> [RFC PATCH 4/7] mtd: add of_match_mtd_parser() and 
>> of_mtd_match_mtd_parser() helpers
>> [RFC PATCH 6/7] RFC: mtd: partitions: enable of_match_table matching
>> 
>> V1: Put helpers in mtdpart.c instead of drivers/of/of_mtd.c
>>     Merge helpers into a single of_mtd_match_mtd_parser
>> V3: Add a simple comment to note we will need the best match in the 
>> future
>> V4: Rework new functions to pick parser with the best match
>>     Move new code in parse_mtd_partitions up so it has precedence over 
>> flash
>>     driver defaults and MTD defaults
>> V5: Rework matching code to start checking with the most specific 
>> string in the
>>     "compatibility" property.
>> V6: Initialize "ret" variable in mtd_part_get_parser_by_cp to NULL
>> ---
>>  drivers/mtd/mtdpart.c          | 64 
>> ++++++++++++++++++++++++++++++++++++++++++
>>  include/linux/mtd/partitions.h |  1 +
>>  2 files changed, 65 insertions(+)
>> 
>> diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
>> index be088bccd593..b11958adcf45 100644
>> --- a/drivers/mtd/mtdpart.c
>> +++ b/drivers/mtd/mtdpart.c
>> @@ -30,6 +30,7 @@
>>  #include <linux/mtd/mtd.h>
>>  #include <linux/mtd/partitions.h>
>>  #include <linux/err.h>
>> +#include <linux/of.h>
>> 
>>  #include "mtdcore.h"
>> 
>> @@ -880,6 +881,48 @@ static int mtd_part_do_parse(struct 
>> mtd_part_parser *parser,
>>  }
>> 
>>  /**
>> + * mtd_part_get_parser_by_cp - find MTD parser by a compatible string
> 
> What's "cp"? Perhaps mtd_part_get_compatible_parser.

That's what some base of functions use internally, like
__of_device_is_compatible (cp)
of_modalias_node (cplen)
but using "compatible" for the function name sounds better.


>> + *
>> + * @cp: compatible string describing partitions in a device tree
> 
> "compat" would be clearer IMO
> 
>> + *
>> + * MTD parsers can specify supported partitions by providing a table 
>> of
>> + * compatibility strings. This function finds a parser that 
>> advertises support
>> + * for a passed value of "compatible".
>> + */
>> +static struct mtd_part_parser *mtd_part_get_parser_by_cp(const char 
>> *cp)
>> +{
>> +       struct mtd_part_parser *p, *ret = NULL;
>> +
>> +       spin_lock(&part_parser_lock);
>> +
>> +       list_for_each_entry(p, &part_parsers, list) {
>> +               const struct of_device_id *matches;
>> +
>> +               matches = p->of_match_table;
>> +               if (!matches)
>> +                       continue;
>> +
>> +               for (; matches->name[0] || matches->type[0] || 
>> matches->compatible[0];
>> +                    matches++) {
>> +                       if (!matches->compatible[0])
>> +                               continue;
> 
> It would be simpler to just ignore name and type. Having either of
> those would be an error and the only consequence if there are entries
> without compatible is returning early.

OK, thanks. I guess I misused pattern I saw in the __of_match_node.


>> +                       if (!strcmp(matches->compatible, cp) &&
>> +                           try_module_get(p->owner)) {
>> +                               ret = p;
>> +                               break;
>> +                       }
>> +               }
>> +
>> +               if (ret)
>> +                       break;
>> +       }
>> +
>> +       spin_unlock(&part_parser_lock);
>> +
>> +       return ret;
>> +}
>> +
>> +/**
>>   * parse_mtd_partitions - parse MTD partitions
>>   * @master: the master partition (describes whole MTD device)
>>   * @types: names of partition parsers to try or %NULL
>> @@ -905,8 +948,29 @@ int parse_mtd_partitions(struct mtd_info *master, 
>> const char *const *types,
>>                          struct mtd_part_parser_data *data)
>>  {
>>         struct mtd_part_parser *parser;
>> +       struct device_node *np;
>> +       struct property *prop;
>> +       const char *cp;
>>         int ret, err = 0;
>> 
>> +       np = of_get_child_by_name(mtd_get_of_node(master), 
>> "partitions");
>> +       if (np) {
> 
> You can drop this. of_property_for_each_string and of_node_put will
> work if np is NULL.
> 
>> +               of_property_for_each_string(np, "compatible", prop, 
>> cp) {
>> +                       parser = mtd_part_get_parser_by_cp(cp);
>> +                       if (!parser)
>> +                               continue;
>> +                       ret = mtd_part_do_parse(parser, master, 
>> pparts, data);
>> +                       if (ret > 0) {
>> +                               of_node_put(np);
>> +                               return 0;
>> +                       }
>> +                       mtd_part_parser_put(parser);
>> +                       if (ret < 0 && !err)
>> +                               err = ret;
>> +               }
>> +               of_node_put(np);
>> +       }
>> +
>>         if (!types)
>>                 types = default_mtd_part_types;
>> 
>> diff --git a/include/linux/mtd/partitions.h 
>> b/include/linux/mtd/partitions.h
>> index c4beb70dacbd..11cb0c50cd84 100644
>> --- a/include/linux/mtd/partitions.h
>> +++ b/include/linux/mtd/partitions.h
>> @@ -77,6 +77,7 @@ struct mtd_part_parser {
>>         struct list_head list;
>>         struct module *owner;
>>         const char *name;
>> +       const struct of_device_id *of_match_table;
> 
> I generally like using of_device_id over just an array of strings, but
> I'm wondering if there's really cases where you have multiple
> compatible strings for a single parser? Perhaps a single string here
> would be sufficient. And if you did have multiple matches, how would
> you distinguish them later on in the parsing functions? Normally we'd
> use the matched data ptr, but that's not provided here.

I think we may need some flash parsers to support multiple strings in
the future. For example image tag parser (bcm63xxpart.c) handles
Broadcom's tag that has few versions (see struct bcm_tag and its
version field).

Later we may want to add support for matching partitions parsers (like
trx) which also can have multple versions support. For example TRX v1
and TRX v2 differ by a single field in the header and it makes sense to
use the same parser for them.

While this may be not a perfect solution with data ptr, we can always do
of_device_is_compatible(&mtd->dev, "foo")


>>         int (*parse_fn)(struct mtd_info *, const struct mtd_partition 
>> **,
>>                         struct mtd_part_parser_data *);
>>         void (*cleanup)(const struct mtd_partition *pparts, int 
>> nr_parts);
>> --
>> 2.11.0
>> 

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH V7 1/2] mtd: partitions: add of_match_table parser matching
       [not found]     ` <20180103105543.17897-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2018-01-03 10:55       ` [PATCH V6 2/2] mtd: ofpart: add of_match_table with "fixed-partitions" Rafał Miłecki
  2018-01-03 18:28       ` [PATCH V6 1/2] mtd: partitions: add of_match_table parser matching Rob Herring
@ 2018-01-04  7:05       ` Rafał Miłecki
       [not found]         ` <20180104070534.16248-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2 siblings, 1 reply; 13+ messages in thread
From: Rafał Miłecki @ 2018-01-04  7:05 UTC (permalink / raw)
  To: Brian Norris, David Woodhouse, Boris Brezillon, Marek Vasut,
	Richard Weinberger, Cyrille Pitchen, Rob Herring
  Cc: Mark Rutland, Frank Rowand, Linus Walleij,
	linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA, Geert Uytterhoeven,
	Jonas Gorski, Florian Fainelli, John Crispin,
	Rafał Miłecki

From: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

Partition parsers can now provide an of_match_table to enable
flash<-->parser matching via device tree as documented in the
mtd/partition.txt.

It works by looking for a matching parser for every string in the
"compatibility" property (starting with the most specific one).

This support is currently limited to built-in parsers as it uses
request_module() and friends. This should be sufficient for most cases
though as compiling parsers as modules isn't a common choice.

Signed-off-by: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Signed-off-by: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
---
This is based on Brian's patches:
[RFC PATCH 4/7] mtd: add of_match_mtd_parser() and of_mtd_match_mtd_parser() helpers
[RFC PATCH 6/7] RFC: mtd: partitions: enable of_match_table matching

V1: Put helpers in mtdpart.c instead of drivers/of/of_mtd.c
    Merge helpers into a single of_mtd_match_mtd_parser
V3: Add a simple comment to note we will need the best match in the future
V4: Rework new functions to pick parser with the best match
    Move new code in parse_mtd_partitions up so it has precedence over flash
    driver defaults and MTD defaults
V5: Rework matching code to start checking with the most specific string in the
    "compatibility" property.
V6: Initialize "ret" variable in mtd_part_get_parser_by_cp to NULL
V7: Rename function "mtd_part_get_parser_by_cp" to use "_compatible_"
    Rename "cp" variable to "compat"
    Drop unneeded if (np) check from the parse_mtd_partitions
---
 drivers/mtd/mtdpart.c          | 59 ++++++++++++++++++++++++++++++++++++++++++
 include/linux/mtd/partitions.h |  1 +
 2 files changed, 60 insertions(+)

diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
index be088bccd593..76e12fb81563 100644
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
@@ -30,6 +30,7 @@
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
 #include <linux/err.h>
+#include <linux/of.h>
 
 #include "mtdcore.h"
 
@@ -880,6 +881,45 @@ static int mtd_part_do_parse(struct mtd_part_parser *parser,
 }
 
 /**
+ * mtd_part_get_compatible_parser - find MTD parser by a compatible string
+ *
+ * @compat: compatible string describing partitions in a device tree
+ *
+ * MTD parsers can specify supported partitions by providing a table of
+ * compatibility strings. This function finds a parser that advertises support
+ * for a passed value of "compatible".
+ */
+static struct mtd_part_parser *mtd_part_get_compatible_parser(const char *compat)
+{
+	struct mtd_part_parser *p, *ret = NULL;
+
+	spin_lock(&part_parser_lock);
+
+	list_for_each_entry(p, &part_parsers, list) {
+		const struct of_device_id *matches;
+
+		matches = p->of_match_table;
+		if (!matches)
+			continue;
+
+		for (; matches->compatible[0]; matches++) {
+			if (!strcmp(matches->compatible, compat) &&
+			    try_module_get(p->owner)) {
+				ret = p;
+				break;
+			}
+		}
+
+		if (ret)
+			break;
+	}
+
+	spin_unlock(&part_parser_lock);
+
+	return ret;
+}
+
+/**
  * parse_mtd_partitions - parse MTD partitions
  * @master: the master partition (describes whole MTD device)
  * @types: names of partition parsers to try or %NULL
@@ -905,8 +945,27 @@ int parse_mtd_partitions(struct mtd_info *master, const char *const *types,
 			 struct mtd_part_parser_data *data)
 {
 	struct mtd_part_parser *parser;
+	struct device_node *np;
+	struct property *prop;
+	const char *compat;
 	int ret, err = 0;
 
+	np = of_get_child_by_name(mtd_get_of_node(master), "partitions");
+	of_property_for_each_string(np, "compatible", prop, compat) {
+		parser = mtd_part_get_compatible_parser(compat);
+		if (!parser)
+			continue;
+		ret = mtd_part_do_parse(parser, master, pparts, data);
+		if (ret > 0) {
+			of_node_put(np);
+			return 0;
+		}
+		mtd_part_parser_put(parser);
+		if (ret < 0 && !err)
+			err = ret;
+	}
+	of_node_put(np);
+
 	if (!types)
 		types = default_mtd_part_types;
 
diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h
index c4beb70dacbd..11cb0c50cd84 100644
--- a/include/linux/mtd/partitions.h
+++ b/include/linux/mtd/partitions.h
@@ -77,6 +77,7 @@ struct mtd_part_parser {
 	struct list_head list;
 	struct module *owner;
 	const char *name;
+	const struct of_device_id *of_match_table;
 	int (*parse_fn)(struct mtd_info *, const struct mtd_partition **,
 			struct mtd_part_parser_data *);
 	void (*cleanup)(const struct mtd_partition *pparts, int nr_parts);
-- 
2.11.0

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH V7 2/2] mtd: ofpart: add of_match_table with "fixed-partitions"
       [not found]         ` <20180104070534.16248-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2018-01-04  7:05           ` Rafał Miłecki
  2018-01-11  9:04           ` [PATCH V7 1/2] mtd: partitions: add of_match_table parser matching Boris Brezillon
  2018-01-17  8:15           ` [PATCH V8 " Rafał Miłecki
  2 siblings, 0 replies; 13+ messages in thread
From: Rafał Miłecki @ 2018-01-04  7:05 UTC (permalink / raw)
  To: Brian Norris, David Woodhouse, Boris Brezillon, Marek Vasut,
	Richard Weinberger, Cyrille Pitchen, Rob Herring
  Cc: Mark Rutland, Frank Rowand, Linus Walleij,
	linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA, Geert Uytterhoeven,
	Jonas Gorski, Florian Fainelli, John Crispin,
	Rafał Miłecki

From: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>

This allows using this parser with any flash driver that takes care of
setting of_node (using mtd_set_of_node helper) correctly. Up to now
support for "fixed-partitions" DT compatibility string was working only
with flash drivers that were specifying "ofpart" (manually or by letting
mtd use the default set of parsers).

This matches existing bindings documentation.

Signed-off-by: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
Reviewed-by: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Tested-by: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
 drivers/mtd/ofpart.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/mtd/ofpart.c b/drivers/mtd/ofpart.c
index 6bdf4e525677..92fcbac046d9 100644
--- a/drivers/mtd/ofpart.c
+++ b/drivers/mtd/ofpart.c
@@ -140,9 +140,16 @@ static int parse_ofpart_partitions(struct mtd_info *master,
 	return ret;
 }
 
+static const struct of_device_id parse_ofpart_match_table[] = {
+	{ .compatible = "fixed-partitions" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, parse_ofpart_match_table);
+
 static struct mtd_part_parser ofpart_parser = {
 	.parse_fn = parse_ofpart_partitions,
 	.name = "ofpart",
+	.of_match_table = parse_ofpart_match_table,
 };
 
 static int parse_ofoldpart_partitions(struct mtd_info *master,
-- 
2.11.0

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH V6 1/2] mtd: partitions: add of_match_table parser matching
       [not found]           ` <9a799300a0730a0103fe744878fb1a9f-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
@ 2018-01-09  9:42             ` Boris Brezillon
  2018-01-09 13:47               ` Rafał Miłecki
  0 siblings, 1 reply; 13+ messages in thread
From: Boris Brezillon @ 2018-01-09  9:42 UTC (permalink / raw)
  To: Rafał Miłecki
  Cc: Rob Herring, Rafał Miłecki, Brian Norris,
	David Woodhouse, Marek Vasut, Richard Weinberger,
	Cyrille Pitchen, Mark Rutland, Frank Rowand, Linus Walleij,
	linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	Geert Uytterhoeven, Jonas Gorski, Florian Fainelli, John Crispin

On Thu, 04 Jan 2018 07:32:36 +0100
Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org> wrote:

> On 2018-01-03 19:28, Rob Herring wrote:
> > On Wed, Jan 3, 2018 at 4:55 AM, Rafał Miłecki <zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:  
> >> From: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> >> 
> >> Partition parsers can now provide an of_match_table to enable
> >> flash<-->parser matching via device tree as documented in the
> >> mtd/partition.txt.
> >> 
> >> It works by looking for a matching parser for every string in the
> >> "compatibility" property (starting with the most specific one).
> >> 
> >> This support is currently limited to built-in parsers as it uses
> >> request_module() and friends. This should be sufficient for most cases
> >> though as compiling parsers as modules isn't a common choice.
> >> 
> >> Signed-off-by: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> >> Signed-off-by: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
> >> ---
> >> This is based on Brian's patches:
> >> [RFC PATCH 4/7] mtd: add of_match_mtd_parser() and 
> >> of_mtd_match_mtd_parser() helpers
> >> [RFC PATCH 6/7] RFC: mtd: partitions: enable of_match_table matching
> >> 
> >> V1: Put helpers in mtdpart.c instead of drivers/of/of_mtd.c
> >>     Merge helpers into a single of_mtd_match_mtd_parser
> >> V3: Add a simple comment to note we will need the best match in the 
> >> future
> >> V4: Rework new functions to pick parser with the best match
> >>     Move new code in parse_mtd_partitions up so it has precedence over 
> >> flash
> >>     driver defaults and MTD defaults
> >> V5: Rework matching code to start checking with the most specific 
> >> string in the
> >>     "compatibility" property.
> >> V6: Initialize "ret" variable in mtd_part_get_parser_by_cp to NULL
> >> ---
> >>  drivers/mtd/mtdpart.c          | 64 
> >> ++++++++++++++++++++++++++++++++++++++++++
> >>  include/linux/mtd/partitions.h |  1 +
> >>  2 files changed, 65 insertions(+)
> >> 
> >> diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
> >> index be088bccd593..b11958adcf45 100644
> >> --- a/drivers/mtd/mtdpart.c
> >> +++ b/drivers/mtd/mtdpart.c
> >> @@ -30,6 +30,7 @@
> >>  #include <linux/mtd/mtd.h>
> >>  #include <linux/mtd/partitions.h>
> >>  #include <linux/err.h>
> >> +#include <linux/of.h>
> >> 
> >>  #include "mtdcore.h"
> >> 
> >> @@ -880,6 +881,48 @@ static int mtd_part_do_parse(struct 
> >> mtd_part_parser *parser,
> >>  }
> >> 
> >>  /**
> >> + * mtd_part_get_parser_by_cp - find MTD parser by a compatible string  
> > 
> > What's "cp"? Perhaps mtd_part_get_compatible_parser.  
> 
> That's what some base of functions use internally, like
> __of_device_is_compatible (cp)
> of_modalias_node (cplen)
> but using "compatible" for the function name sounds better.
> 
> 
> >> + *
> >> + * @cp: compatible string describing partitions in a device tree  
> > 
> > "compat" would be clearer IMO
> >   
> >> + *
> >> + * MTD parsers can specify supported partitions by providing a table 
> >> of
> >> + * compatibility strings. This function finds a parser that 
> >> advertises support
> >> + * for a passed value of "compatible".
> >> + */
> >> +static struct mtd_part_parser *mtd_part_get_parser_by_cp(const char 
> >> *cp)
> >> +{
> >> +       struct mtd_part_parser *p, *ret = NULL;
> >> +
> >> +       spin_lock(&part_parser_lock);
> >> +
> >> +       list_for_each_entry(p, &part_parsers, list) {
> >> +               const struct of_device_id *matches;
> >> +
> >> +               matches = p->of_match_table;
> >> +               if (!matches)
> >> +                       continue;
> >> +
> >> +               for (; matches->name[0] || matches->type[0] || 
> >> matches->compatible[0];
> >> +                    matches++) {
> >> +                       if (!matches->compatible[0])
> >> +                               continue;  
> > 
> > It would be simpler to just ignore name and type. Having either of
> > those would be an error and the only consequence if there are entries
> > without compatible is returning early.  
> 
> OK, thanks. I guess I misused pattern I saw in the __of_match_node.
> 
> 
> >> +                       if (!strcmp(matches->compatible, cp) &&
> >> +                           try_module_get(p->owner)) {
> >> +                               ret = p;
> >> +                               break;
> >> +                       }
> >> +               }
> >> +
> >> +               if (ret)
> >> +                       break;
> >> +       }
> >> +
> >> +       spin_unlock(&part_parser_lock);
> >> +
> >> +       return ret;
> >> +}
> >> +
> >> +/**
> >>   * parse_mtd_partitions - parse MTD partitions
> >>   * @master: the master partition (describes whole MTD device)
> >>   * @types: names of partition parsers to try or %NULL
> >> @@ -905,8 +948,29 @@ int parse_mtd_partitions(struct mtd_info *master, 
> >> const char *const *types,
> >>                          struct mtd_part_parser_data *data)
> >>  {
> >>         struct mtd_part_parser *parser;
> >> +       struct device_node *np;
> >> +       struct property *prop;
> >> +       const char *cp;
> >>         int ret, err = 0;
> >> 
> >> +       np = of_get_child_by_name(mtd_get_of_node(master), 
> >> "partitions");
> >> +       if (np) {  
> > 
> > You can drop this. of_property_for_each_string and of_node_put will
> > work if np is NULL.
> >   
> >> +               of_property_for_each_string(np, "compatible", prop, 
> >> cp) {
> >> +                       parser = mtd_part_get_parser_by_cp(cp);
> >> +                       if (!parser)
> >> +                               continue;
> >> +                       ret = mtd_part_do_parse(parser, master, 
> >> pparts, data);
> >> +                       if (ret > 0) {
> >> +                               of_node_put(np);
> >> +                               return 0;
> >> +                       }
> >> +                       mtd_part_parser_put(parser);
> >> +                       if (ret < 0 && !err)
> >> +                               err = ret;
> >> +               }
> >> +               of_node_put(np);
> >> +       }
> >> +
> >>         if (!types)
> >>                 types = default_mtd_part_types;
> >> 
> >> diff --git a/include/linux/mtd/partitions.h 
> >> b/include/linux/mtd/partitions.h
> >> index c4beb70dacbd..11cb0c50cd84 100644
> >> --- a/include/linux/mtd/partitions.h
> >> +++ b/include/linux/mtd/partitions.h
> >> @@ -77,6 +77,7 @@ struct mtd_part_parser {
> >>         struct list_head list;
> >>         struct module *owner;
> >>         const char *name;
> >> +       const struct of_device_id *of_match_table;  
> > 
> > I generally like using of_device_id over just an array of strings, but
> > I'm wondering if there's really cases where you have multiple
> > compatible strings for a single parser? Perhaps a single string here
> > would be sufficient. And if you did have multiple matches, how would
> > you distinguish them later on in the parsing functions? Normally we'd
> > use the matched data ptr, but that's not provided here.  
> 
> I think we may need some flash parsers to support multiple strings in
> the future. For example image tag parser (bcm63xxpart.c) handles
> Broadcom's tag that has few versions (see struct bcm_tag and its
> version field).
> 
> Later we may want to add support for matching partitions parsers (like
> trx) which also can have multple versions support. For example TRX v1
> and TRX v2 differ by a single field in the header and it makes sense to
> use the same parser for them.
> 
> While this may be not a perfect solution with data ptr, we can always do
> of_device_is_compatible(&mtd->dev, "foo")

Well, if we ever need to extract per-compatible driver data, we could
easily add a field to the mtd_part_parser_data struct (void *of_data).

Rafal, I had a look at your v7 and it looks sane, so I'll queue it for
4.16 unless Rob has other concerns.

Thanks for your patience.

Boris

> 
> 
> >>         int (*parse_fn)(struct mtd_info *, const struct mtd_partition 
> >> **,
> >>                         struct mtd_part_parser_data *);
> >>         void (*cleanup)(const struct mtd_partition *pparts, int 
> >> nr_parts);
> >> --
> >> 2.11.0
> >>   

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V6 1/2] mtd: partitions: add of_match_table parser matching
  2018-01-09  9:42             ` Boris Brezillon
@ 2018-01-09 13:47               ` Rafał Miłecki
  0 siblings, 0 replies; 13+ messages in thread
From: Rafał Miłecki @ 2018-01-09 13:47 UTC (permalink / raw)
  To: Boris Brezillon
  Cc: Mark Rutland,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	Florian Fainelli, Jonas Gorski, Geert Uytterhoeven, Frank Rowand,
	Richard Weinberger, Linus Walleij, Rafał Miłecki,
	Marek Vasut, John Crispin, Rob Herring, linux-mtd,
	Cyrille Pitchen, Brian Norris, David Woodhouse

On 2018-01-09 10:42, Boris Brezillon wrote:
> Rafal, I had a look at your v7 and it looks sane, so I'll queue it for
> 4.16 unless Rob has other concerns.
> 
> Thanks for your patience.

Sounds great, thanks!

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V7 1/2] mtd: partitions: add of_match_table parser matching
       [not found]         ` <20180104070534.16248-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2018-01-04  7:05           ` [PATCH V7 2/2] mtd: ofpart: add of_match_table with "fixed-partitions" Rafał Miłecki
@ 2018-01-11  9:04           ` Boris Brezillon
  2018-01-17  8:15           ` [PATCH V8 " Rafał Miłecki
  2 siblings, 0 replies; 13+ messages in thread
From: Boris Brezillon @ 2018-01-11  9:04 UTC (permalink / raw)
  To: Rafał Miłecki
  Cc: Brian Norris, David Woodhouse, Marek Vasut, Richard Weinberger,
	Cyrille Pitchen, Rob Herring, Mark Rutland,
	devicetree-u79uwXL29TY76Z2rM5mHXA, Florian Fainelli,
	Geert Uytterhoeven, Linus Walleij, John Crispin,
	linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jonas Gorski,
	Rafał Miłecki, Frank Rowand

On Thu,  4 Jan 2018 08:05:33 +0100
Rafał Miłecki <zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:

> From: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> 
> Partition parsers can now provide an of_match_table to enable
> flash<-->parser matching via device tree as documented in the
> mtd/partition.txt.
> 
> It works by looking for a matching parser for every string in the
> "compatibility" property (starting with the most specific one).
> 
> This support is currently limited to built-in parsers as it uses
> request_module() and friends. This should be sufficient for most cases
> though as compiling parsers as modules isn't a common choice.
> 

Applied both patches.

Thanks,

Boris

> Signed-off-by: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> Signed-off-by: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
> ---
> This is based on Brian's patches:
> [RFC PATCH 4/7] mtd: add of_match_mtd_parser() and of_mtd_match_mtd_parser() helpers
> [RFC PATCH 6/7] RFC: mtd: partitions: enable of_match_table matching
> 
> V1: Put helpers in mtdpart.c instead of drivers/of/of_mtd.c
>     Merge helpers into a single of_mtd_match_mtd_parser
> V3: Add a simple comment to note we will need the best match in the future
> V4: Rework new functions to pick parser with the best match
>     Move new code in parse_mtd_partitions up so it has precedence over flash
>     driver defaults and MTD defaults
> V5: Rework matching code to start checking with the most specific string in the
>     "compatibility" property.
> V6: Initialize "ret" variable in mtd_part_get_parser_by_cp to NULL
> V7: Rename function "mtd_part_get_parser_by_cp" to use "_compatible_"
>     Rename "cp" variable to "compat"
>     Drop unneeded if (np) check from the parse_mtd_partitions
> ---
>  drivers/mtd/mtdpart.c          | 59 ++++++++++++++++++++++++++++++++++++++++++
>  include/linux/mtd/partitions.h |  1 +
>  2 files changed, 60 insertions(+)
> 
> diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
> index be088bccd593..76e12fb81563 100644
> --- a/drivers/mtd/mtdpart.c
> +++ b/drivers/mtd/mtdpart.c
> @@ -30,6 +30,7 @@
>  #include <linux/mtd/mtd.h>
>  #include <linux/mtd/partitions.h>
>  #include <linux/err.h>
> +#include <linux/of.h>
>  
>  #include "mtdcore.h"
>  
> @@ -880,6 +881,45 @@ static int mtd_part_do_parse(struct mtd_part_parser *parser,
>  }
>  
>  /**
> + * mtd_part_get_compatible_parser - find MTD parser by a compatible string
> + *
> + * @compat: compatible string describing partitions in a device tree
> + *
> + * MTD parsers can specify supported partitions by providing a table of
> + * compatibility strings. This function finds a parser that advertises support
> + * for a passed value of "compatible".
> + */
> +static struct mtd_part_parser *mtd_part_get_compatible_parser(const char *compat)
> +{
> +	struct mtd_part_parser *p, *ret = NULL;
> +
> +	spin_lock(&part_parser_lock);
> +
> +	list_for_each_entry(p, &part_parsers, list) {
> +		const struct of_device_id *matches;
> +
> +		matches = p->of_match_table;
> +		if (!matches)
> +			continue;
> +
> +		for (; matches->compatible[0]; matches++) {
> +			if (!strcmp(matches->compatible, compat) &&
> +			    try_module_get(p->owner)) {
> +				ret = p;
> +				break;
> +			}
> +		}
> +
> +		if (ret)
> +			break;
> +	}
> +
> +	spin_unlock(&part_parser_lock);
> +
> +	return ret;
> +}
> +
> +/**
>   * parse_mtd_partitions - parse MTD partitions
>   * @master: the master partition (describes whole MTD device)
>   * @types: names of partition parsers to try or %NULL
> @@ -905,8 +945,27 @@ int parse_mtd_partitions(struct mtd_info *master, const char *const *types,
>  			 struct mtd_part_parser_data *data)
>  {
>  	struct mtd_part_parser *parser;
> +	struct device_node *np;
> +	struct property *prop;
> +	const char *compat;
>  	int ret, err = 0;
>  
> +	np = of_get_child_by_name(mtd_get_of_node(master), "partitions");
> +	of_property_for_each_string(np, "compatible", prop, compat) {
> +		parser = mtd_part_get_compatible_parser(compat);
> +		if (!parser)
> +			continue;
> +		ret = mtd_part_do_parse(parser, master, pparts, data);
> +		if (ret > 0) {
> +			of_node_put(np);
> +			return 0;
> +		}
> +		mtd_part_parser_put(parser);
> +		if (ret < 0 && !err)
> +			err = ret;
> +	}
> +	of_node_put(np);
> +
>  	if (!types)
>  		types = default_mtd_part_types;
>  
> diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h
> index c4beb70dacbd..11cb0c50cd84 100644
> --- a/include/linux/mtd/partitions.h
> +++ b/include/linux/mtd/partitions.h
> @@ -77,6 +77,7 @@ struct mtd_part_parser {
>  	struct list_head list;
>  	struct module *owner;
>  	const char *name;
> +	const struct of_device_id *of_match_table;
>  	int (*parse_fn)(struct mtd_info *, const struct mtd_partition **,
>  			struct mtd_part_parser_data *);
>  	void (*cleanup)(const struct mtd_partition *pparts, int nr_parts);

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH V8 1/2] mtd: partitions: add of_match_table parser matching
       [not found]         ` <20180104070534.16248-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2018-01-04  7:05           ` [PATCH V7 2/2] mtd: ofpart: add of_match_table with "fixed-partitions" Rafał Miłecki
  2018-01-11  9:04           ` [PATCH V7 1/2] mtd: partitions: add of_match_table parser matching Boris Brezillon
@ 2018-01-17  8:15           ` Rafał Miłecki
       [not found]             ` <20180117081521.2463-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2 siblings, 1 reply; 13+ messages in thread
From: Rafał Miłecki @ 2018-01-17  8:15 UTC (permalink / raw)
  To: Brian Norris, David Woodhouse, Boris Brezillon, Marek Vasut,
	Richard Weinberger, Cyrille Pitchen, Rob Herring
  Cc: Mark Rutland, Frank Rowand, Linus Walleij,
	linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA, Geert Uytterhoeven,
	Jonas Gorski, Florian Fainelli, John Crispin,
	Rafał Miłecki

From: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

Partition parsers can now provide an of_match_table to enable
flash<-->parser matching via device tree as documented in the
mtd/partition.txt.

It works by looking for a matching parser for every string in the
"compatibility" property (starting with the most specific one).
Please note that driver-specified parsers still take a precedence. It's
assumed that driver providing a parser type has a good reason for that
(e.g. having platform data with device-specific info). Also doing
otherwise could break existing setups. The same applies to using default
parsers (including "cmdlinepart") as some overwrite DT data with cmdline
argument.

This support is currently limited to built-in parsers as it uses
request_module() and friends. This should be sufficient for most cases
though as compiling parsers as modules isn't a common choice.

Signed-off-by: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Signed-off-by: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
---
This is based on Brian's patches:
[RFC PATCH 4/7] mtd: add of_match_mtd_parser() and of_mtd_match_mtd_parser() helpers
[RFC PATCH 6/7] RFC: mtd: partitions: enable of_match_table matching

V1: Put helpers in mtdpart.c instead of drivers/of/of_mtd.c
    Merge helpers into a single of_mtd_match_mtd_parser
V3: Add a simple comment to note we will need the best match in the future
V4: Rework new functions to pick parser with the best match
    Move new code in parse_mtd_partitions up so it has precedence over flash
    driver defaults and MTD defaults
V5: Rework matching code to start checking with the most specific string in the
    "compatibility" property.
V6: Initialize "ret" variable in mtd_part_get_parser_by_cp to NULL
V7: Rename function "mtd_part_get_parser_by_cp" to use "_compatible_"
    Rename "cp" variable to "compat"
    Drop unneeded if (np) check from the parse_mtd_partitions
V8: Move new OF code in parse_mtd_partitions() lower so driver-specified parsers
    take a precedence. Update commit message to make that clear.
---
 drivers/mtd/mtdpart.c          | 60 ++++++++++++++++++++++++++++++++++++++++++
 include/linux/mtd/partitions.h |  1 +
 2 files changed, 61 insertions(+)

diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
index 76cd21d1171b..e33bad0e46f5 100644
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
@@ -30,6 +30,7 @@
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
 #include <linux/err.h>
+#include <linux/of.h>
 
 #include "mtdcore.h"
 
@@ -861,6 +862,45 @@ static int mtd_part_do_parse(struct mtd_part_parser *parser,
 }
 
 /**
+ * mtd_part_get_compatible_parser - find MTD parser by a compatible string
+ *
+ * @compat: compatible string describing partitions in a device tree
+ *
+ * MTD parsers can specify supported partitions by providing a table of
+ * compatibility strings. This function finds a parser that advertises support
+ * for a passed value of "compatible".
+ */
+static struct mtd_part_parser *mtd_part_get_compatible_parser(const char *compat)
+{
+	struct mtd_part_parser *p, *ret = NULL;
+
+	spin_lock(&part_parser_lock);
+
+	list_for_each_entry(p, &part_parsers, list) {
+		const struct of_device_id *matches;
+
+		matches = p->of_match_table;
+		if (!matches)
+			continue;
+
+		for (; matches->compatible[0]; matches++) {
+			if (!strcmp(matches->compatible, compat) &&
+			    try_module_get(p->owner)) {
+				ret = p;
+				break;
+			}
+		}
+
+		if (ret)
+			break;
+	}
+
+	spin_unlock(&part_parser_lock);
+
+	return ret;
+}
+
+/**
  * parse_mtd_partitions - parse MTD partitions
  * @master: the master partition (describes whole MTD device)
  * @types: names of partition parsers to try or %NULL
@@ -886,6 +926,9 @@ int parse_mtd_partitions(struct mtd_info *master, const char *const *types,
 			 struct mtd_part_parser_data *data)
 {
 	struct mtd_part_parser *parser;
+	struct device_node *np;
+	struct property *prop;
+	const char *compat;
 	int ret, err = 0;
 
 	if (!types)
@@ -912,6 +955,23 @@ int parse_mtd_partitions(struct mtd_info *master, const char *const *types,
 		if (ret < 0 && !err)
 			err = ret;
 	}
+
+	np = of_get_child_by_name(mtd_get_of_node(master), "partitions");
+	of_property_for_each_string(np, "compatible", prop, compat) {
+		parser = mtd_part_get_compatible_parser(compat);
+		if (!parser)
+			continue;
+		ret = mtd_part_do_parse(parser, master, pparts, data);
+		if (ret > 0) {
+			of_node_put(np);
+			return 0;
+		}
+		mtd_part_parser_put(parser);
+		if (ret < 0 && !err)
+			err = ret;
+	}
+	of_node_put(np);
+
 	return err;
 }
 
diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h
index c4beb70dacbd..11cb0c50cd84 100644
--- a/include/linux/mtd/partitions.h
+++ b/include/linux/mtd/partitions.h
@@ -77,6 +77,7 @@ struct mtd_part_parser {
 	struct list_head list;
 	struct module *owner;
 	const char *name;
+	const struct of_device_id *of_match_table;
 	int (*parse_fn)(struct mtd_info *, const struct mtd_partition **,
 			struct mtd_part_parser_data *);
 	void (*cleanup)(const struct mtd_partition *pparts, int nr_parts);
-- 
2.11.0

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH V8 2/2] mtd: ofpart: add of_match_table with "fixed-partitions"
       [not found]             ` <20180117081521.2463-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2018-01-17  8:15               ` Rafał Miłecki
  0 siblings, 0 replies; 13+ messages in thread
From: Rafał Miłecki @ 2018-01-17  8:15 UTC (permalink / raw)
  To: Brian Norris, David Woodhouse, Boris Brezillon, Marek Vasut,
	Richard Weinberger, Cyrille Pitchen, Rob Herring
  Cc: Mark Rutland, Frank Rowand, Linus Walleij,
	linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA, Geert Uytterhoeven,
	Jonas Gorski, Florian Fainelli, John Crispin,
	Rafał Miłecki

From: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>

This allows using this parser with any flash driver that takes care of
setting of_node (using mtd_set_of_node helper) correctly. Up to now
support for "fixed-partitions" DT compatibility string was working only
with flash drivers that were specifying "ofpart" (manually or by letting
mtd use the default set of parsers).

This matches existing bindings documentation.

Signed-off-by: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
Reviewed-by: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Tested-by: Brian Norris <computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
 drivers/mtd/ofpart.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/mtd/ofpart.c b/drivers/mtd/ofpart.c
index 6bdf4e525677..92fcbac046d9 100644
--- a/drivers/mtd/ofpart.c
+++ b/drivers/mtd/ofpart.c
@@ -140,9 +140,16 @@ static int parse_ofpart_partitions(struct mtd_info *master,
 	return ret;
 }
 
+static const struct of_device_id parse_ofpart_match_table[] = {
+	{ .compatible = "fixed-partitions" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, parse_ofpart_match_table);
+
 static struct mtd_part_parser ofpart_parser = {
 	.parse_fn = parse_ofpart_partitions,
 	.name = "ofpart",
+	.of_match_table = parse_ofpart_match_table,
 };
 
 static int parse_ofoldpart_partitions(struct mtd_info *master,
-- 
2.11.0

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2018-01-17  8:15 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-02 13:04 [PATCH V5 1/2] mtd: partitions: add of_match_table parser matching Rafał Miłecki
     [not found] ` <20180102130458.16226-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2018-01-02 13:04   ` [PATCH V5 2/2] mtd: ofpart: add of_match_table with "fixed-partitions" Rafał Miłecki
2018-01-03 10:55   ` [PATCH V6 1/2] mtd: partitions: add of_match_table parser matching Rafał Miłecki
     [not found]     ` <20180103105543.17897-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2018-01-03 10:55       ` [PATCH V6 2/2] mtd: ofpart: add of_match_table with "fixed-partitions" Rafał Miłecki
2018-01-03 18:28       ` [PATCH V6 1/2] mtd: partitions: add of_match_table parser matching Rob Herring
2018-01-04  6:32         ` Rafał Miłecki
     [not found]           ` <9a799300a0730a0103fe744878fb1a9f-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
2018-01-09  9:42             ` Boris Brezillon
2018-01-09 13:47               ` Rafał Miłecki
2018-01-04  7:05       ` [PATCH V7 " Rafał Miłecki
     [not found]         ` <20180104070534.16248-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2018-01-04  7:05           ` [PATCH V7 2/2] mtd: ofpart: add of_match_table with "fixed-partitions" Rafał Miłecki
2018-01-11  9:04           ` [PATCH V7 1/2] mtd: partitions: add of_match_table parser matching Boris Brezillon
2018-01-17  8:15           ` [PATCH V8 " Rafał Miłecki
     [not found]             ` <20180117081521.2463-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2018-01-17  8:15               ` [PATCH V8 2/2] mtd: ofpart: add of_match_table with "fixed-partitions" Rafał Miłecki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).