linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] of/flattree: Add of_flat_dt_match() helper function
@ 2010-12-31  9:15 Grant Likely
  2010-12-31 15:59 ` Stephen Neuendorffer
  0 siblings, 1 reply; 3+ messages in thread
From: Grant Likely @ 2010-12-31  9:15 UTC (permalink / raw)
  To: devicetree-discuss, linuxppc-dev

This patch adds of_flat_dt_match() which tests a node for
compatibility with a list of values and converts the relevant powerpc
platform code to use it.  This approach simplifies the board support
code a bit.

Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
 arch/powerpc/platforms/40x/ppc40x_simple.c    |   13 +++-------
 arch/powerpc/platforms/512x/mpc5121_generic.c |   13 +---------
 arch/powerpc/platforms/52xx/lite5200.c        |   16 +++++-------
 arch/powerpc/platforms/52xx/media5200.c       |   13 +---------
 arch/powerpc/platforms/52xx/mpc5200_simple.c  |   13 +---------
 arch/powerpc/platforms/83xx/mpc830x_rdb.c     |   13 ++++++----
 arch/powerpc/platforms/83xx/mpc831x_rdb.c     |   11 +++++---
 arch/powerpc/platforms/83xx/mpc837x_rdb.c     |   15 +++++++----
 arch/powerpc/platforms/85xx/tqm85xx.c         |   20 +++++++--------
 drivers/of/fdt.c                              |   34 ++++++++++++++++++++++++-
 include/linux/of_fdt.h                        |    1 +
 11 files changed, 84 insertions(+), 78 deletions(-)

diff --git a/arch/powerpc/platforms/40x/ppc40x_simple.c b/arch/powerpc/platforms/40x/ppc40x_simple.c
index 546bbc2..2521d93 100644
--- a/arch/powerpc/platforms/40x/ppc40x_simple.c
+++ b/arch/powerpc/platforms/40x/ppc40x_simple.c
@@ -50,7 +50,7 @@ machine_device_initcall(ppc40x_simple, ppc40x_device_probe);
  * Again, if your board needs to do things differently then create a
  * board.c file for it rather than adding it to this list.
  */
-static char *board[] __initdata = {
+static const char *board[] __initdata = {
 	"amcc,acadia",
 	"amcc,haleakala",
 	"amcc,kilauea",
@@ -60,14 +60,9 @@ static char *board[] __initdata = {
 
 static int __init ppc40x_probe(void)
 {
-	unsigned long root = of_get_flat_dt_root();
-	int i = 0;
-
-	for (i = 0; i < ARRAY_SIZE(board); i++) {
-		if (of_flat_dt_is_compatible(root, board[i])) {
-			ppc_pci_set_flags(PPC_PCI_REASSIGN_ALL_RSRC);
-			return 1;
-		}
+	if (of_flat_dt_match(of_get_flat_dt_root(), board)) {
+		ppc_pci_set_flags(PPC_PCI_REASSIGN_ALL_RSRC);
+		return 1;
 	}
 
 	return 0;
diff --git a/arch/powerpc/platforms/512x/mpc5121_generic.c b/arch/powerpc/platforms/512x/mpc5121_generic.c
index e487eb0..926731f 100644
--- a/arch/powerpc/platforms/512x/mpc5121_generic.c
+++ b/arch/powerpc/platforms/512x/mpc5121_generic.c
@@ -26,7 +26,7 @@
 /*
  * list of supported boards
  */
-static char *board[] __initdata = {
+static const char *board[] __initdata = {
 	"prt,prtlvt",
 	NULL
 };
@@ -36,16 +36,7 @@ static char *board[] __initdata = {
  */
 static int __init mpc5121_generic_probe(void)
 {
-	unsigned long node = of_get_flat_dt_root();
-	int i = 0;
-
-	while (board[i]) {
-		if (of_flat_dt_is_compatible(node, board[i]))
-			break;
-		i++;
-	}
-
-	return board[i] != NULL;
+	return of_flat_dt_match(of_get_flat_dt_root(), board);
 }
 
 define_machine(mpc5121_generic) {
diff --git a/arch/powerpc/platforms/52xx/lite5200.c b/arch/powerpc/platforms/52xx/lite5200.c
index de55bc0..01ffa64 100644
--- a/arch/powerpc/platforms/52xx/lite5200.c
+++ b/arch/powerpc/platforms/52xx/lite5200.c
@@ -172,20 +172,18 @@ static void __init lite5200_setup_arch(void)
 	mpc52xx_setup_pci();
 }
 
+static const char *board[] __initdata = {
+	"fsl,lite5200",
+	"fsl,lite5200b",
+	NULL,
+};
+
 /*
  * Called very early, MMU is off, device-tree isn't unflattened
  */
 static int __init lite5200_probe(void)
 {
-	unsigned long node = of_get_flat_dt_root();
-	const char *model = of_get_flat_dt_prop(node, "model", NULL);
-
-	if (!of_flat_dt_is_compatible(node, "fsl,lite5200") &&
-	    !of_flat_dt_is_compatible(node, "fsl,lite5200b"))
-		return 0;
-	pr_debug("%s board found\n", model ? model : "unknown");
-
-	return 1;
+	return of_flat_dt_match(of_get_flat_dt_root(), board);
 }
 
 define_machine(lite5200) {
diff --git a/arch/powerpc/platforms/52xx/media5200.c b/arch/powerpc/platforms/52xx/media5200.c
index 0bac3a3..2c7780c 100644
--- a/arch/powerpc/platforms/52xx/media5200.c
+++ b/arch/powerpc/platforms/52xx/media5200.c
@@ -239,7 +239,7 @@ static void __init media5200_setup_arch(void)
 }
 
 /* list of the supported boards */
-static char *board[] __initdata = {
+static const char *board[] __initdata = {
 	"fsl,media5200",
 	NULL
 };
@@ -249,16 +249,7 @@ static char *board[] __initdata = {
  */
 static int __init media5200_probe(void)
 {
-	unsigned long node = of_get_flat_dt_root();
-	int i = 0;
-
-	while (board[i]) {
-		if (of_flat_dt_is_compatible(node, board[i]))
-			break;
-		i++;
-	}
-
-	return (board[i] != NULL);
+	return of_flat_dt_match(of_get_flat_dt_root(), board);
 }
 
 define_machine(media5200_platform) {
diff --git a/arch/powerpc/platforms/52xx/mpc5200_simple.c b/arch/powerpc/platforms/52xx/mpc5200_simple.c
index d45be5b..e36d6e2 100644
--- a/arch/powerpc/platforms/52xx/mpc5200_simple.c
+++ b/arch/powerpc/platforms/52xx/mpc5200_simple.c
@@ -49,7 +49,7 @@ static void __init mpc5200_simple_setup_arch(void)
 }
 
 /* list of the supported boards */
-static char *board[] __initdata = {
+static const char *board[] __initdata = {
 	"intercontrol,digsy-mtc",
 	"manroland,mucmc52",
 	"manroland,uc101",
@@ -66,16 +66,7 @@ static char *board[] __initdata = {
  */
 static int __init mpc5200_simple_probe(void)
 {
-	unsigned long node = of_get_flat_dt_root();
-	int i = 0;
-
-	while (board[i]) {
-		if (of_flat_dt_is_compatible(node, board[i]))
-			break;
-		i++;
-	}
-	
-	return (board[i] != NULL);
+	return of_flat_dt_match(of_get_flat_dt_root(), board);
 }
 
 define_machine(mpc5200_simple_platform) {
diff --git a/arch/powerpc/platforms/83xx/mpc830x_rdb.c b/arch/powerpc/platforms/83xx/mpc830x_rdb.c
index 846831d..661d354 100644
--- a/arch/powerpc/platforms/83xx/mpc830x_rdb.c
+++ b/arch/powerpc/platforms/83xx/mpc830x_rdb.c
@@ -57,16 +57,19 @@ static void __init mpc830x_rdb_init_IRQ(void)
 	ipic_set_default_priority();
 }
 
+struct const char *board[] __initdata = {
+	"MPC8308RDB",
+	"fsl,mpc8308rdb",
+	"denx,mpc8308_p1m",
+	NULL
+}
+
 /*
  * Called very early, MMU is off, device-tree isn't unflattened
  */
 static int __init mpc830x_rdb_probe(void)
 {
-	unsigned long root = of_get_flat_dt_root();
-
-	return of_flat_dt_is_compatible(root, "MPC8308RDB") ||
-	       of_flat_dt_is_compatible(root, "fsl,mpc8308rdb") ||
-	       of_flat_dt_is_compatible(root, "denx,mpc8308_p1m");
+	return of_flat_dt_match(of_get_flat_dt_root(), board);
 }
 
 static struct of_device_id __initdata of_bus_ids[] = {
diff --git a/arch/powerpc/platforms/83xx/mpc831x_rdb.c b/arch/powerpc/platforms/83xx/mpc831x_rdb.c
index ae525e4..b54cd73 100644
--- a/arch/powerpc/platforms/83xx/mpc831x_rdb.c
+++ b/arch/powerpc/platforms/83xx/mpc831x_rdb.c
@@ -60,15 +60,18 @@ static void __init mpc831x_rdb_init_IRQ(void)
 	ipic_set_default_priority();
 }
 
+struct const char *board[] __initdata = {
+	"MPC8313ERDB",
+	"fsl,mpc8315erdb",
+	NULL
+}
+
 /*
  * Called very early, MMU is off, device-tree isn't unflattened
  */
 static int __init mpc831x_rdb_probe(void)
 {
-	unsigned long root = of_get_flat_dt_root();
-
-	return of_flat_dt_is_compatible(root, "MPC8313ERDB") ||
-	       of_flat_dt_is_compatible(root, "fsl,mpc8315erdb");
+	return of_flat_dt_match(of_get_flat_dt_root(), board);
 }
 
 static struct of_device_id __initdata of_bus_ids[] = {
diff --git a/arch/powerpc/platforms/83xx/mpc837x_rdb.c b/arch/powerpc/platforms/83xx/mpc837x_rdb.c
index 910caa6..7bafbf2 100644
--- a/arch/powerpc/platforms/83xx/mpc837x_rdb.c
+++ b/arch/powerpc/platforms/83xx/mpc837x_rdb.c
@@ -101,17 +101,20 @@ static void __init mpc837x_rdb_init_IRQ(void)
 	ipic_set_default_priority();
 }
 
+static const char *board[] __initdata = {
+	"fsl,mpc8377rdb",
+	"fsl,mpc8378rdb",
+	"fsl,mpc8379rdb",
+	"fsl,mpc8377wlan",
+	NULL
+};
+
 /*
  * Called very early, MMU is off, device-tree isn't unflattened
  */
 static int __init mpc837x_rdb_probe(void)
 {
-	unsigned long root = of_get_flat_dt_root();
-
-	return of_flat_dt_is_compatible(root, "fsl,mpc8377rdb") ||
-	       of_flat_dt_is_compatible(root, "fsl,mpc8378rdb") ||
-	       of_flat_dt_is_compatible(root, "fsl,mpc8379rdb") ||
-	       of_flat_dt_is_compatible(root, "fsl,mpc8377wlan");
+	return of_flat_dt_match(of_get_flat_dt_root(), board);
 }
 
 define_machine(mpc837x_rdb) {
diff --git a/arch/powerpc/platforms/85xx/tqm85xx.c b/arch/powerpc/platforms/85xx/tqm85xx.c
index 8f29bbc..5e847d0 100644
--- a/arch/powerpc/platforms/85xx/tqm85xx.c
+++ b/arch/powerpc/platforms/85xx/tqm85xx.c
@@ -186,21 +186,21 @@ static int __init declare_of_platform_devices(void)
 }
 machine_device_initcall(tqm85xx, declare_of_platform_devices);
 
+static const char *board[] __initdata = {
+	"tqc,tqm8540",
+	"tqc,tqm8541",
+	"tqc,tqm8548",
+	"tqc,tqm8555",
+	"tqc,tqm8560",
+	NULL
+};
+
 /*
  * Called very early, device-tree isn't unflattened
  */
 static int __init tqm85xx_probe(void)
 {
-	unsigned long root = of_get_flat_dt_root();
-
-	if ((of_flat_dt_is_compatible(root, "tqc,tqm8540")) ||
-	    (of_flat_dt_is_compatible(root, "tqc,tqm8541")) ||
-	    (of_flat_dt_is_compatible(root, "tqc,tqm8548")) ||
-	    (of_flat_dt_is_compatible(root, "tqc,tqm8555")) ||
-	    (of_flat_dt_is_compatible(root, "tqc,tqm8560")))
-		return 1;
-
-	return 0;
+	return of_flat_dt_match(of_get_flat_dt_root(), board);
 }
 
 define_machine(tqm85xx) {
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index 8a90ee4..5a3db04 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -78,19 +78,23 @@ void *of_fdt_get_property(struct boot_param_header *blob,
  * @blob: A device tree blob
  * @node: node to test
  * @compat: compatible string to compare with compatible list.
+ *
+ * On match, returns a non-zero value with smaller values returned for more
+ * specific compatible values.
  */
 int of_fdt_is_compatible(struct boot_param_header *blob,
 		      unsigned long node, const char *compat)
 {
 	const char *cp;
-	unsigned long cplen, l;
+	unsigned long cplen, l, score = 0;
 
 	cp = of_fdt_get_property(blob, node, "compatible", &cplen);
 	if (cp == NULL)
 		return 0;
 	while (cplen > 0) {
+		score++;
 		if (of_compat_cmp(cp, compat, strlen(compat)) == 0)
-			return 1;
+			return score;
 		l = strlen(cp) + 1;
 		cp += l;
 		cplen -= l;
@@ -99,6 +103,24 @@ int of_fdt_is_compatible(struct boot_param_header *blob,
 	return 0;
 }
 
+/**
+ * of_flat_dt_match - Return true if node matches a list of compatible values
+ */
+int of_fdt_match(struct boot_param_header *blob, unsigned long node,
+                 const char **compat)
+{
+	unsigned int tmp, score = 0;
+
+	while (*compat) {
+		tmp = of_fdt_is_compatible(blob, node, *compat);
+		if (tmp && (score == 0 || (tmp < score)))
+			score = tmp;
+		compat++;
+	}
+
+	return score;
+}
+
 static void *unflatten_dt_alloc(unsigned long *mem, unsigned long size,
 				       unsigned long align)
 {
@@ -511,6 +533,14 @@ int __init of_flat_dt_is_compatible(unsigned long node, const char *compat)
 	return of_fdt_is_compatible(initial_boot_params, node, compat);
 }
 
+/**
+ * of_flat_dt_match - Return true if node matches a list of compatible values
+ */
+int __init of_flat_dt_match(unsigned long node, const char **compat)
+{
+	return of_fdt_match(initial_boot_params, node, compat);
+}
+
 #ifdef CONFIG_BLK_DEV_INITRD
 /**
  * early_init_dt_check_for_initrd - Decode initrd location from flat tree
diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h
index 9ce5dfd..fb327f3 100644
--- a/include/linux/of_fdt.h
+++ b/include/linux/of_fdt.h
@@ -84,6 +84,7 @@ extern int of_scan_flat_dt(int (*it)(unsigned long node, const char *uname,
 extern void *of_get_flat_dt_prop(unsigned long node, const char *name,
 				 unsigned long *size);
 extern int of_flat_dt_is_compatible(unsigned long node, const char *name);
+extern int of_flat_dt_match(unsigned long node, const char **matches);
 extern unsigned long of_get_flat_dt_root(void);
 
 extern int early_init_dt_scan_chosen(unsigned long node, const char *uname,

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

* Re: [PATCH] of/flattree: Add of_flat_dt_match() helper function
  2010-12-31  9:15 [PATCH] of/flattree: Add of_flat_dt_match() helper function Grant Likely
@ 2010-12-31 15:59 ` Stephen Neuendorffer
  2011-01-01  0:54   ` Grant Likely
  0 siblings, 1 reply; 3+ messages in thread
From: Stephen Neuendorffer @ 2010-12-31 15:59 UTC (permalink / raw)
  To: Grant Likely; +Cc: devicetree-discuss, linuxppc-dev

[-- Attachment #1: Type: text/plain, Size: 14108 bytes --]

On Fri, Dec 31, 2010 at 1:15 AM, Grant Likely <grant.likely@secretlab.ca>wrote:

> This patch adds of_flat_dt_match() which tests a node for
> compatibility with a list of values and converts the relevant powerpc
> platform code to use it.  This approach simplifies the board support
> code a bit.
>
> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
>

reviewed-by: Stephen Neuendorffer <stephen.neuendorffer@xilinx.com>

minor nits below.


> ---
>  arch/powerpc/platforms/40x/ppc40x_simple.c    |   13 +++-------
>  arch/powerpc/platforms/512x/mpc5121_generic.c |   13 +---------
>  arch/powerpc/platforms/52xx/lite5200.c        |   16 +++++-------
>  arch/powerpc/platforms/52xx/media5200.c       |   13 +---------
>  arch/powerpc/platforms/52xx/mpc5200_simple.c  |   13 +---------
>  arch/powerpc/platforms/83xx/mpc830x_rdb.c     |   13 ++++++----
>  arch/powerpc/platforms/83xx/mpc831x_rdb.c     |   11 +++++---
>  arch/powerpc/platforms/83xx/mpc837x_rdb.c     |   15 +++++++----
>  arch/powerpc/platforms/85xx/tqm85xx.c         |   20 +++++++--------
>  drivers/of/fdt.c                              |   34
> ++++++++++++++++++++++++-
>  include/linux/of_fdt.h                        |    1 +
>  11 files changed, 84 insertions(+), 78 deletions(-)
>
> diff --git a/arch/powerpc/platforms/40x/ppc40x_simple.c
> b/arch/powerpc/platforms/40x/ppc40x_simple.c
> index 546bbc2..2521d93 100644
> --- a/arch/powerpc/platforms/40x/ppc40x_simple.c
> +++ b/arch/powerpc/platforms/40x/ppc40x_simple.c
> @@ -50,7 +50,7 @@ machine_device_initcall(ppc40x_simple,
> ppc40x_device_probe);
>  * Again, if your board needs to do things differently then create a
>  * board.c file for it rather than adding it to this list.
>  */
> -static char *board[] __initdata = {
> +static const char *board[] __initdata = {
>        "amcc,acadia",
>        "amcc,haleakala",
>        "amcc,kilauea",
> @@ -60,14 +60,9 @@ static char *board[] __initdata = {
>
>  static int __init ppc40x_probe(void)
>  {
> -       unsigned long root = of_get_flat_dt_root();
> -       int i = 0;
> -
> -       for (i = 0; i < ARRAY_SIZE(board); i++) {
> -               if (of_flat_dt_is_compatible(root, board[i])) {
> -                       ppc_pci_set_flags(PPC_PCI_REASSIGN_ALL_RSRC);
> -                       return 1;
> -               }
> +       if (of_flat_dt_match(of_get_flat_dt_root(), board)) {
> +               ppc_pci_set_flags(PPC_PCI_REASSIGN_ALL_RSRC);
> +               return 1;
>        }
>
>        return 0;
> diff --git a/arch/powerpc/platforms/512x/mpc5121_generic.c
> b/arch/powerpc/platforms/512x/mpc5121_generic.c
> index e487eb0..926731f 100644
> --- a/arch/powerpc/platforms/512x/mpc5121_generic.c
> +++ b/arch/powerpc/platforms/512x/mpc5121_generic.c
> @@ -26,7 +26,7 @@
>  /*
>  * list of supported boards
>  */
> -static char *board[] __initdata = {
> +static const char *board[] __initdata = {
>        "prt,prtlvt",
>        NULL
>  };
> @@ -36,16 +36,7 @@ static char *board[] __initdata = {
>  */
>  static int __init mpc5121_generic_probe(void)
>  {
> -       unsigned long node = of_get_flat_dt_root();
> -       int i = 0;
> -
> -       while (board[i]) {
> -               if (of_flat_dt_is_compatible(node, board[i]))
> -                       break;
> -               i++;
> -       }
> -
> -       return board[i] != NULL;
> +       return of_flat_dt_match(of_get_flat_dt_root(), board);
>  }
>
>  define_machine(mpc5121_generic) {
> diff --git a/arch/powerpc/platforms/52xx/lite5200.c
> b/arch/powerpc/platforms/52xx/lite5200.c
> index de55bc0..01ffa64 100644
> --- a/arch/powerpc/platforms/52xx/lite5200.c
> +++ b/arch/powerpc/platforms/52xx/lite5200.c
> @@ -172,20 +172,18 @@ static void __init lite5200_setup_arch(void)
>        mpc52xx_setup_pci();
>  }
>
> +static const char *board[] __initdata = {
> +       "fsl,lite5200",
> +       "fsl,lite5200b",
> +       NULL,
> +};
> +
>  /*
>  * Called very early, MMU is off, device-tree isn't unflattened
>  */
>  static int __init lite5200_probe(void)
>  {
> -       unsigned long node = of_get_flat_dt_root();
> -       const char *model = of_get_flat_dt_prop(node, "model", NULL);
> -
> -       if (!of_flat_dt_is_compatible(node, "fsl,lite5200") &&
> -           !of_flat_dt_is_compatible(node, "fsl,lite5200b"))
> -               return 0;
> -       pr_debug("%s board found\n", model ? model : "unknown");
> -
> -       return 1;
> +       return of_flat_dt_match(of_get_flat_dt_root(), board);
>  }
>
>  define_machine(lite5200) {
> diff --git a/arch/powerpc/platforms/52xx/media5200.c
> b/arch/powerpc/platforms/52xx/media5200.c
> index 0bac3a3..2c7780c 100644
> --- a/arch/powerpc/platforms/52xx/media5200.c
> +++ b/arch/powerpc/platforms/52xx/media5200.c
> @@ -239,7 +239,7 @@ static void __init media5200_setup_arch(void)
>  }
>
>  /* list of the supported boards */
> -static char *board[] __initdata = {
> +static const char *board[] __initdata = {
>        "fsl,media5200",
>        NULL
>  };
> @@ -249,16 +249,7 @@ static char *board[] __initdata = {
>  */
>  static int __init media5200_probe(void)
>  {
> -       unsigned long node = of_get_flat_dt_root();
> -       int i = 0;
> -
> -       while (board[i]) {
> -               if (of_flat_dt_is_compatible(node, board[i]))
> -                       break;
> -               i++;
> -       }
> -
> -       return (board[i] != NULL);
> +       return of_flat_dt_match(of_get_flat_dt_root(), board);
>  }
>
>  define_machine(media5200_platform) {
> diff --git a/arch/powerpc/platforms/52xx/mpc5200_simple.c
> b/arch/powerpc/platforms/52xx/mpc5200_simple.c
> index d45be5b..e36d6e2 100644
> --- a/arch/powerpc/platforms/52xx/mpc5200_simple.c
> +++ b/arch/powerpc/platforms/52xx/mpc5200_simple.c
> @@ -49,7 +49,7 @@ static void __init mpc5200_simple_setup_arch(void)
>  }
>
>  /* list of the supported boards */
> -static char *board[] __initdata = {
> +static const char *board[] __initdata = {
>        "intercontrol,digsy-mtc",
>        "manroland,mucmc52",
>        "manroland,uc101",
> @@ -66,16 +66,7 @@ static char *board[] __initdata = {
>  */
>  static int __init mpc5200_simple_probe(void)
>  {
> -       unsigned long node = of_get_flat_dt_root();
> -       int i = 0;
> -
> -       while (board[i]) {
> -               if (of_flat_dt_is_compatible(node, board[i]))
> -                       break;
> -               i++;
> -       }
> -
> -       return (board[i] != NULL);
> +       return of_flat_dt_match(of_get_flat_dt_root(), board);
>  }
>
>  define_machine(mpc5200_simple_platform) {
> diff --git a/arch/powerpc/platforms/83xx/mpc830x_rdb.c
> b/arch/powerpc/platforms/83xx/mpc830x_rdb.c
> index 846831d..661d354 100644
> --- a/arch/powerpc/platforms/83xx/mpc830x_rdb.c
> +++ b/arch/powerpc/platforms/83xx/mpc830x_rdb.c
> @@ -57,16 +57,19 @@ static void __init mpc830x_rdb_init_IRQ(void)
>        ipic_set_default_priority();
>  }
>
> +struct const char *board[] __initdata = {
> +       "MPC8308RDB",
> +       "fsl,mpc8308rdb",
> +       "denx,mpc8308_p1m",
> +       NULL
> +}
> +
>  /*
>  * Called very early, MMU is off, device-tree isn't unflattened
>  */
>  static int __init mpc830x_rdb_probe(void)
>  {
> -       unsigned long root = of_get_flat_dt_root();
> -
> -       return of_flat_dt_is_compatible(root, "MPC8308RDB") ||
> -              of_flat_dt_is_compatible(root, "fsl,mpc8308rdb") ||
> -              of_flat_dt_is_compatible(root, "denx,mpc8308_p1m");
> +       return of_flat_dt_match(of_get_flat_dt_root(), board);
>  }
>
>  static struct of_device_id __initdata of_bus_ids[] = {
> diff --git a/arch/powerpc/platforms/83xx/mpc831x_rdb.c
> b/arch/powerpc/platforms/83xx/mpc831x_rdb.c
> index ae525e4..b54cd73 100644
> --- a/arch/powerpc/platforms/83xx/mpc831x_rdb.c
> +++ b/arch/powerpc/platforms/83xx/mpc831x_rdb.c
> @@ -60,15 +60,18 @@ static void __init mpc831x_rdb_init_IRQ(void)
>        ipic_set_default_priority();
>  }
>
> +struct const char *board[] __initdata = {
> +       "MPC8313ERDB",
> +       "fsl,mpc8315erdb",
> +       NULL
> +}
> +
>  /*
>  * Called very early, MMU is off, device-tree isn't unflattened
>  */
>  static int __init mpc831x_rdb_probe(void)
>  {
> -       unsigned long root = of_get_flat_dt_root();
> -
> -       return of_flat_dt_is_compatible(root, "MPC8313ERDB") ||
> -              of_flat_dt_is_compatible(root, "fsl,mpc8315erdb");
> +       return of_flat_dt_match(of_get_flat_dt_root(), board);
>  }
>
>  static struct of_device_id __initdata of_bus_ids[] = {
> diff --git a/arch/powerpc/platforms/83xx/mpc837x_rdb.c
> b/arch/powerpc/platforms/83xx/mpc837x_rdb.c
> index 910caa6..7bafbf2 100644
> --- a/arch/powerpc/platforms/83xx/mpc837x_rdb.c
> +++ b/arch/powerpc/platforms/83xx/mpc837x_rdb.c
> @@ -101,17 +101,20 @@ static void __init mpc837x_rdb_init_IRQ(void)
>        ipic_set_default_priority();
>  }
>
> +static const char *board[] __initdata = {
> +       "fsl,mpc8377rdb",
> +       "fsl,mpc8378rdb",
> +       "fsl,mpc8379rdb",
> +       "fsl,mpc8377wlan",
> +       NULL
> +};
> +
>  /*
>  * Called very early, MMU is off, device-tree isn't unflattened
>  */
>  static int __init mpc837x_rdb_probe(void)
>  {
> -       unsigned long root = of_get_flat_dt_root();
> -
> -       return of_flat_dt_is_compatible(root, "fsl,mpc8377rdb") ||
> -              of_flat_dt_is_compatible(root, "fsl,mpc8378rdb") ||
> -              of_flat_dt_is_compatible(root, "fsl,mpc8379rdb") ||
> -              of_flat_dt_is_compatible(root, "fsl,mpc8377wlan");
> +       return of_flat_dt_match(of_get_flat_dt_root(), board);
>  }
>
>  define_machine(mpc837x_rdb) {
> diff --git a/arch/powerpc/platforms/85xx/tqm85xx.c
> b/arch/powerpc/platforms/85xx/tqm85xx.c
> index 8f29bbc..5e847d0 100644
> --- a/arch/powerpc/platforms/85xx/tqm85xx.c
> +++ b/arch/powerpc/platforms/85xx/tqm85xx.c
> @@ -186,21 +186,21 @@ static int __init declare_of_platform_devices(void)
>  }
>  machine_device_initcall(tqm85xx, declare_of_platform_devices);
>
> +static const char *board[] __initdata = {
> +       "tqc,tqm8540",
> +       "tqc,tqm8541",
> +       "tqc,tqm8548",
> +       "tqc,tqm8555",
> +       "tqc,tqm8560",
> +       NULL
> +};
> +
>  /*
>  * Called very early, device-tree isn't unflattened
>  */
>  static int __init tqm85xx_probe(void)
>  {
> -       unsigned long root = of_get_flat_dt_root();
> -
> -       if ((of_flat_dt_is_compatible(root, "tqc,tqm8540")) ||
> -           (of_flat_dt_is_compatible(root, "tqc,tqm8541")) ||
> -           (of_flat_dt_is_compatible(root, "tqc,tqm8548")) ||
> -           (of_flat_dt_is_compatible(root, "tqc,tqm8555")) ||
> -           (of_flat_dt_is_compatible(root, "tqc,tqm8560")))
> -               return 1;
> -
> -       return 0;
> +       return of_flat_dt_match(of_get_flat_dt_root(), board);
>  }
>
>  define_machine(tqm85xx) {
> diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
> index 8a90ee4..5a3db04 100644
> --- a/drivers/of/fdt.c
> +++ b/drivers/of/fdt.c
> @@ -78,19 +78,23 @@ void *of_fdt_get_property(struct boot_param_header
> *blob,
>  * @blob: A device tree blob
>  * @node: node to test
>  * @compat: compatible string to compare with compatible list.
> + *
> + * On match, returns a non-zero value with smaller values returned for
> more
> + * specific compatible values.
>  */
>  int of_fdt_is_compatible(struct boot_param_header *blob,
>                      unsigned long node, const char *compat)
>  {
>        const char *cp;
> -       unsigned long cplen, l;
> +       unsigned long cplen, l, score = 0;
>
>        cp = of_fdt_get_property(blob, node, "compatible", &cplen);
>        if (cp == NULL)
>                return 0;
>        while (cplen > 0) {
> +               score++;
>                if (of_compat_cmp(cp, compat, strlen(compat)) == 0)
> -                       return 1;
> +                       return score;
>                l = strlen(cp) + 1;
>                cp += l;
>                cplen -= l;
> @@ -99,6 +103,24 @@ int of_fdt_is_compatible(struct boot_param_header
> *blob,
>        return 0;
>  }
>
> +/**
> + * of_flat_dt_match - Return true if node matches a list of compatible
> values
>

copy-paste error.


> + */
> +int of_fdt_match(struct boot_param_header *blob, unsigned long node,
> +                 const char **compat)
> +{
> +       unsigned int tmp, score = 0;
> +
> +       while (*compat) {
> +               tmp = of_fdt_is_compatible(blob, node, *compat);
> +               if (tmp && (score == 0 || (tmp < score)))
> +                       score = tmp;
> +               compat++;
> +       }
> +
> +       return score;
> +}
> +
>  static void *unflatten_dt_alloc(unsigned long *mem, unsigned long size,
>                                       unsigned long align)
>  {
> @@ -511,6 +533,14 @@ int __init of_flat_dt_is_compatible(unsigned long
> node, const char *compat)
>        return of_fdt_is_compatible(initial_boot_params, node, compat);
>  }
>
> +/**
> + * of_flat_dt_match - Return true if node matches a list of compatible
> values
> + */
> +int __init of_flat_dt_match(unsigned long node, const char **compat)
> +{
> +       return of_fdt_match(initial_boot_params, node, compat);
> +}
> +
>  #ifdef CONFIG_BLK_DEV_INITRD
>  /**
>  * early_init_dt_check_for_initrd - Decode initrd location from flat tree
> diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h
> index 9ce5dfd..fb327f3 100644
> --- a/include/linux/of_fdt.h
> +++ b/include/linux/of_fdt.h
> @@ -84,6 +84,7 @@ extern int of_scan_flat_dt(int (*it)(unsigned long node,
> const char *uname,
>  extern void *of_get_flat_dt_prop(unsigned long node, const char *name,
>                                 unsigned long *size);
>  extern int of_flat_dt_is_compatible(unsigned long node, const char *name);
> +extern int of_flat_dt_match(unsigned long node, const char **matches);
>

Maybe export of_fdt_match, too?


>  extern unsigned long of_get_flat_dt_root(void);
>
>  extern int early_init_dt_scan_chosen(unsigned long node, const char
> *uname,
>
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev
>

[-- Attachment #2: Type: text/html, Size: 16748 bytes --]

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

* Re: [PATCH] of/flattree: Add of_flat_dt_match() helper function
  2010-12-31 15:59 ` Stephen Neuendorffer
@ 2011-01-01  0:54   ` Grant Likely
  0 siblings, 0 replies; 3+ messages in thread
From: Grant Likely @ 2011-01-01  0:54 UTC (permalink / raw)
  To: Stephen Neuendorffer; +Cc: devicetree-discuss, linuxppc-dev

On Fri, Dec 31, 2010 at 07:59:02AM -0800, Stephen Neuendorffer wrote:
> On Fri, Dec 31, 2010 at 1:15 AM, Grant Likely <grant.likely@secretlab.ca>wrote:
> 
> > This patch adds of_flat_dt_match() which tests a node for
> > compatibility with a list of values and converts the relevant powerpc
> > platform code to use it.  This approach simplifies the board support
> > code a bit.
> >
> > Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
> >
> 
> reviewed-by: Stephen Neuendorffer <stephen.neuendorffer@xilinx.com>
> 
> minor nits below.

Fixed, thanks.

g.

> 
> 
> > ---
> >  arch/powerpc/platforms/40x/ppc40x_simple.c    |   13 +++-------
> >  arch/powerpc/platforms/512x/mpc5121_generic.c |   13 +---------
> >  arch/powerpc/platforms/52xx/lite5200.c        |   16 +++++-------
> >  arch/powerpc/platforms/52xx/media5200.c       |   13 +---------
> >  arch/powerpc/platforms/52xx/mpc5200_simple.c  |   13 +---------
> >  arch/powerpc/platforms/83xx/mpc830x_rdb.c     |   13 ++++++----
> >  arch/powerpc/platforms/83xx/mpc831x_rdb.c     |   11 +++++---
> >  arch/powerpc/platforms/83xx/mpc837x_rdb.c     |   15 +++++++----
> >  arch/powerpc/platforms/85xx/tqm85xx.c         |   20 +++++++--------
> >  drivers/of/fdt.c                              |   34
> > ++++++++++++++++++++++++-
> >  include/linux/of_fdt.h                        |    1 +
> >  11 files changed, 84 insertions(+), 78 deletions(-)
> >
> > diff --git a/arch/powerpc/platforms/40x/ppc40x_simple.c
> > b/arch/powerpc/platforms/40x/ppc40x_simple.c
> > index 546bbc2..2521d93 100644
> > --- a/arch/powerpc/platforms/40x/ppc40x_simple.c
> > +++ b/arch/powerpc/platforms/40x/ppc40x_simple.c
> > @@ -50,7 +50,7 @@ machine_device_initcall(ppc40x_simple,
> > ppc40x_device_probe);
> >  * Again, if your board needs to do things differently then create a
> >  * board.c file for it rather than adding it to this list.
> >  */
> > -static char *board[] __initdata = {
> > +static const char *board[] __initdata = {
> >        "amcc,acadia",
> >        "amcc,haleakala",
> >        "amcc,kilauea",
> > @@ -60,14 +60,9 @@ static char *board[] __initdata = {
> >
> >  static int __init ppc40x_probe(void)
> >  {
> > -       unsigned long root = of_get_flat_dt_root();
> > -       int i = 0;
> > -
> > -       for (i = 0; i < ARRAY_SIZE(board); i++) {
> > -               if (of_flat_dt_is_compatible(root, board[i])) {
> > -                       ppc_pci_set_flags(PPC_PCI_REASSIGN_ALL_RSRC);
> > -                       return 1;
> > -               }
> > +       if (of_flat_dt_match(of_get_flat_dt_root(), board)) {
> > +               ppc_pci_set_flags(PPC_PCI_REASSIGN_ALL_RSRC);
> > +               return 1;
> >        }
> >
> >        return 0;
> > diff --git a/arch/powerpc/platforms/512x/mpc5121_generic.c
> > b/arch/powerpc/platforms/512x/mpc5121_generic.c
> > index e487eb0..926731f 100644
> > --- a/arch/powerpc/platforms/512x/mpc5121_generic.c
> > +++ b/arch/powerpc/platforms/512x/mpc5121_generic.c
> > @@ -26,7 +26,7 @@
> >  /*
> >  * list of supported boards
> >  */
> > -static char *board[] __initdata = {
> > +static const char *board[] __initdata = {
> >        "prt,prtlvt",
> >        NULL
> >  };
> > @@ -36,16 +36,7 @@ static char *board[] __initdata = {
> >  */
> >  static int __init mpc5121_generic_probe(void)
> >  {
> > -       unsigned long node = of_get_flat_dt_root();
> > -       int i = 0;
> > -
> > -       while (board[i]) {
> > -               if (of_flat_dt_is_compatible(node, board[i]))
> > -                       break;
> > -               i++;
> > -       }
> > -
> > -       return board[i] != NULL;
> > +       return of_flat_dt_match(of_get_flat_dt_root(), board);
> >  }
> >
> >  define_machine(mpc5121_generic) {
> > diff --git a/arch/powerpc/platforms/52xx/lite5200.c
> > b/arch/powerpc/platforms/52xx/lite5200.c
> > index de55bc0..01ffa64 100644
> > --- a/arch/powerpc/platforms/52xx/lite5200.c
> > +++ b/arch/powerpc/platforms/52xx/lite5200.c
> > @@ -172,20 +172,18 @@ static void __init lite5200_setup_arch(void)
> >        mpc52xx_setup_pci();
> >  }
> >
> > +static const char *board[] __initdata = {
> > +       "fsl,lite5200",
> > +       "fsl,lite5200b",
> > +       NULL,
> > +};
> > +
> >  /*
> >  * Called very early, MMU is off, device-tree isn't unflattened
> >  */
> >  static int __init lite5200_probe(void)
> >  {
> > -       unsigned long node = of_get_flat_dt_root();
> > -       const char *model = of_get_flat_dt_prop(node, "model", NULL);
> > -
> > -       if (!of_flat_dt_is_compatible(node, "fsl,lite5200") &&
> > -           !of_flat_dt_is_compatible(node, "fsl,lite5200b"))
> > -               return 0;
> > -       pr_debug("%s board found\n", model ? model : "unknown");
> > -
> > -       return 1;
> > +       return of_flat_dt_match(of_get_flat_dt_root(), board);
> >  }
> >
> >  define_machine(lite5200) {
> > diff --git a/arch/powerpc/platforms/52xx/media5200.c
> > b/arch/powerpc/platforms/52xx/media5200.c
> > index 0bac3a3..2c7780c 100644
> > --- a/arch/powerpc/platforms/52xx/media5200.c
> > +++ b/arch/powerpc/platforms/52xx/media5200.c
> > @@ -239,7 +239,7 @@ static void __init media5200_setup_arch(void)
> >  }
> >
> >  /* list of the supported boards */
> > -static char *board[] __initdata = {
> > +static const char *board[] __initdata = {
> >        "fsl,media5200",
> >        NULL
> >  };
> > @@ -249,16 +249,7 @@ static char *board[] __initdata = {
> >  */
> >  static int __init media5200_probe(void)
> >  {
> > -       unsigned long node = of_get_flat_dt_root();
> > -       int i = 0;
> > -
> > -       while (board[i]) {
> > -               if (of_flat_dt_is_compatible(node, board[i]))
> > -                       break;
> > -               i++;
> > -       }
> > -
> > -       return (board[i] != NULL);
> > +       return of_flat_dt_match(of_get_flat_dt_root(), board);
> >  }
> >
> >  define_machine(media5200_platform) {
> > diff --git a/arch/powerpc/platforms/52xx/mpc5200_simple.c
> > b/arch/powerpc/platforms/52xx/mpc5200_simple.c
> > index d45be5b..e36d6e2 100644
> > --- a/arch/powerpc/platforms/52xx/mpc5200_simple.c
> > +++ b/arch/powerpc/platforms/52xx/mpc5200_simple.c
> > @@ -49,7 +49,7 @@ static void __init mpc5200_simple_setup_arch(void)
> >  }
> >
> >  /* list of the supported boards */
> > -static char *board[] __initdata = {
> > +static const char *board[] __initdata = {
> >        "intercontrol,digsy-mtc",
> >        "manroland,mucmc52",
> >        "manroland,uc101",
> > @@ -66,16 +66,7 @@ static char *board[] __initdata = {
> >  */
> >  static int __init mpc5200_simple_probe(void)
> >  {
> > -       unsigned long node = of_get_flat_dt_root();
> > -       int i = 0;
> > -
> > -       while (board[i]) {
> > -               if (of_flat_dt_is_compatible(node, board[i]))
> > -                       break;
> > -               i++;
> > -       }
> > -
> > -       return (board[i] != NULL);
> > +       return of_flat_dt_match(of_get_flat_dt_root(), board);
> >  }
> >
> >  define_machine(mpc5200_simple_platform) {
> > diff --git a/arch/powerpc/platforms/83xx/mpc830x_rdb.c
> > b/arch/powerpc/platforms/83xx/mpc830x_rdb.c
> > index 846831d..661d354 100644
> > --- a/arch/powerpc/platforms/83xx/mpc830x_rdb.c
> > +++ b/arch/powerpc/platforms/83xx/mpc830x_rdb.c
> > @@ -57,16 +57,19 @@ static void __init mpc830x_rdb_init_IRQ(void)
> >        ipic_set_default_priority();
> >  }
> >
> > +struct const char *board[] __initdata = {
> > +       "MPC8308RDB",
> > +       "fsl,mpc8308rdb",
> > +       "denx,mpc8308_p1m",
> > +       NULL
> > +}
> > +
> >  /*
> >  * Called very early, MMU is off, device-tree isn't unflattened
> >  */
> >  static int __init mpc830x_rdb_probe(void)
> >  {
> > -       unsigned long root = of_get_flat_dt_root();
> > -
> > -       return of_flat_dt_is_compatible(root, "MPC8308RDB") ||
> > -              of_flat_dt_is_compatible(root, "fsl,mpc8308rdb") ||
> > -              of_flat_dt_is_compatible(root, "denx,mpc8308_p1m");
> > +       return of_flat_dt_match(of_get_flat_dt_root(), board);
> >  }
> >
> >  static struct of_device_id __initdata of_bus_ids[] = {
> > diff --git a/arch/powerpc/platforms/83xx/mpc831x_rdb.c
> > b/arch/powerpc/platforms/83xx/mpc831x_rdb.c
> > index ae525e4..b54cd73 100644
> > --- a/arch/powerpc/platforms/83xx/mpc831x_rdb.c
> > +++ b/arch/powerpc/platforms/83xx/mpc831x_rdb.c
> > @@ -60,15 +60,18 @@ static void __init mpc831x_rdb_init_IRQ(void)
> >        ipic_set_default_priority();
> >  }
> >
> > +struct const char *board[] __initdata = {
> > +       "MPC8313ERDB",
> > +       "fsl,mpc8315erdb",
> > +       NULL
> > +}
> > +
> >  /*
> >  * Called very early, MMU is off, device-tree isn't unflattened
> >  */
> >  static int __init mpc831x_rdb_probe(void)
> >  {
> > -       unsigned long root = of_get_flat_dt_root();
> > -
> > -       return of_flat_dt_is_compatible(root, "MPC8313ERDB") ||
> > -              of_flat_dt_is_compatible(root, "fsl,mpc8315erdb");
> > +       return of_flat_dt_match(of_get_flat_dt_root(), board);
> >  }
> >
> >  static struct of_device_id __initdata of_bus_ids[] = {
> > diff --git a/arch/powerpc/platforms/83xx/mpc837x_rdb.c
> > b/arch/powerpc/platforms/83xx/mpc837x_rdb.c
> > index 910caa6..7bafbf2 100644
> > --- a/arch/powerpc/platforms/83xx/mpc837x_rdb.c
> > +++ b/arch/powerpc/platforms/83xx/mpc837x_rdb.c
> > @@ -101,17 +101,20 @@ static void __init mpc837x_rdb_init_IRQ(void)
> >        ipic_set_default_priority();
> >  }
> >
> > +static const char *board[] __initdata = {
> > +       "fsl,mpc8377rdb",
> > +       "fsl,mpc8378rdb",
> > +       "fsl,mpc8379rdb",
> > +       "fsl,mpc8377wlan",
> > +       NULL
> > +};
> > +
> >  /*
> >  * Called very early, MMU is off, device-tree isn't unflattened
> >  */
> >  static int __init mpc837x_rdb_probe(void)
> >  {
> > -       unsigned long root = of_get_flat_dt_root();
> > -
> > -       return of_flat_dt_is_compatible(root, "fsl,mpc8377rdb") ||
> > -              of_flat_dt_is_compatible(root, "fsl,mpc8378rdb") ||
> > -              of_flat_dt_is_compatible(root, "fsl,mpc8379rdb") ||
> > -              of_flat_dt_is_compatible(root, "fsl,mpc8377wlan");
> > +       return of_flat_dt_match(of_get_flat_dt_root(), board);
> >  }
> >
> >  define_machine(mpc837x_rdb) {
> > diff --git a/arch/powerpc/platforms/85xx/tqm85xx.c
> > b/arch/powerpc/platforms/85xx/tqm85xx.c
> > index 8f29bbc..5e847d0 100644
> > --- a/arch/powerpc/platforms/85xx/tqm85xx.c
> > +++ b/arch/powerpc/platforms/85xx/tqm85xx.c
> > @@ -186,21 +186,21 @@ static int __init declare_of_platform_devices(void)
> >  }
> >  machine_device_initcall(tqm85xx, declare_of_platform_devices);
> >
> > +static const char *board[] __initdata = {
> > +       "tqc,tqm8540",
> > +       "tqc,tqm8541",
> > +       "tqc,tqm8548",
> > +       "tqc,tqm8555",
> > +       "tqc,tqm8560",
> > +       NULL
> > +};
> > +
> >  /*
> >  * Called very early, device-tree isn't unflattened
> >  */
> >  static int __init tqm85xx_probe(void)
> >  {
> > -       unsigned long root = of_get_flat_dt_root();
> > -
> > -       if ((of_flat_dt_is_compatible(root, "tqc,tqm8540")) ||
> > -           (of_flat_dt_is_compatible(root, "tqc,tqm8541")) ||
> > -           (of_flat_dt_is_compatible(root, "tqc,tqm8548")) ||
> > -           (of_flat_dt_is_compatible(root, "tqc,tqm8555")) ||
> > -           (of_flat_dt_is_compatible(root, "tqc,tqm8560")))
> > -               return 1;
> > -
> > -       return 0;
> > +       return of_flat_dt_match(of_get_flat_dt_root(), board);
> >  }
> >
> >  define_machine(tqm85xx) {
> > diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
> > index 8a90ee4..5a3db04 100644
> > --- a/drivers/of/fdt.c
> > +++ b/drivers/of/fdt.c
> > @@ -78,19 +78,23 @@ void *of_fdt_get_property(struct boot_param_header
> > *blob,
> >  * @blob: A device tree blob
> >  * @node: node to test
> >  * @compat: compatible string to compare with compatible list.
> > + *
> > + * On match, returns a non-zero value with smaller values returned for
> > more
> > + * specific compatible values.
> >  */
> >  int of_fdt_is_compatible(struct boot_param_header *blob,
> >                      unsigned long node, const char *compat)
> >  {
> >        const char *cp;
> > -       unsigned long cplen, l;
> > +       unsigned long cplen, l, score = 0;
> >
> >        cp = of_fdt_get_property(blob, node, "compatible", &cplen);
> >        if (cp == NULL)
> >                return 0;
> >        while (cplen > 0) {
> > +               score++;
> >                if (of_compat_cmp(cp, compat, strlen(compat)) == 0)
> > -                       return 1;
> > +                       return score;
> >                l = strlen(cp) + 1;
> >                cp += l;
> >                cplen -= l;
> > @@ -99,6 +103,24 @@ int of_fdt_is_compatible(struct boot_param_header
> > *blob,
> >        return 0;
> >  }
> >
> > +/**
> > + * of_flat_dt_match - Return true if node matches a list of compatible
> > values
> >
> 
> copy-paste error.
> 
> 
> > + */
> > +int of_fdt_match(struct boot_param_header *blob, unsigned long node,
> > +                 const char **compat)
> > +{
> > +       unsigned int tmp, score = 0;
> > +
> > +       while (*compat) {
> > +               tmp = of_fdt_is_compatible(blob, node, *compat);
> > +               if (tmp && (score == 0 || (tmp < score)))
> > +                       score = tmp;
> > +               compat++;
> > +       }
> > +
> > +       return score;
> > +}
> > +
> >  static void *unflatten_dt_alloc(unsigned long *mem, unsigned long size,
> >                                       unsigned long align)
> >  {
> > @@ -511,6 +533,14 @@ int __init of_flat_dt_is_compatible(unsigned long
> > node, const char *compat)
> >        return of_fdt_is_compatible(initial_boot_params, node, compat);
> >  }
> >
> > +/**
> > + * of_flat_dt_match - Return true if node matches a list of compatible
> > values
> > + */
> > +int __init of_flat_dt_match(unsigned long node, const char **compat)
> > +{
> > +       return of_fdt_match(initial_boot_params, node, compat);
> > +}
> > +
> >  #ifdef CONFIG_BLK_DEV_INITRD
> >  /**
> >  * early_init_dt_check_for_initrd - Decode initrd location from flat tree
> > diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h
> > index 9ce5dfd..fb327f3 100644
> > --- a/include/linux/of_fdt.h
> > +++ b/include/linux/of_fdt.h
> > @@ -84,6 +84,7 @@ extern int of_scan_flat_dt(int (*it)(unsigned long node,
> > const char *uname,
> >  extern void *of_get_flat_dt_prop(unsigned long node, const char *name,
> >                                 unsigned long *size);
> >  extern int of_flat_dt_is_compatible(unsigned long node, const char *name);
> > +extern int of_flat_dt_match(unsigned long node, const char **matches);
> >
> 
> Maybe export of_fdt_match, too?
> 
> 
> >  extern unsigned long of_get_flat_dt_root(void);
> >
> >  extern int early_init_dt_scan_chosen(unsigned long node, const char
> > *uname,
> >
> > _______________________________________________
> > Linuxppc-dev mailing list
> > Linuxppc-dev@lists.ozlabs.org
> > https://lists.ozlabs.org/listinfo/linuxppc-dev
> >

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

end of thread, other threads:[~2011-01-01  0:54 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-31  9:15 [PATCH] of/flattree: Add of_flat_dt_match() helper function Grant Likely
2010-12-31 15:59 ` Stephen Neuendorffer
2011-01-01  0:54   ` Grant Likely

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).