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

+ */<br>
+int of_fdt_match(struct boot_param_header *blob, unsigned long node,<br>
+                 const char **compat)<br>
+{<br>
+       unsigned int tmp, score = 0;<br>
+<br>
+       while (*compat) {<br>
+               tmp = of_fdt_is_compatible(blob, node, *compat);<br>
+               if (tmp && (score == 0 || (tmp < score)))<br>
+                       score = tmp;<br>
+               compat++;<br>
+       }<br>
+<br>
+       return score;<br>
+}<br>
+<br>
 static void *unflatten_dt_alloc(unsigned long *mem, unsigned long size,<br>
                                       unsigned long align)<br>
 {<br>
@@ -511,6 +533,14 @@ int __init of_flat_dt_is_compatible(unsigned long node, const char *compat)<br>
        return of_fdt_is_compatible(initial_boot_params, node, compat);<br>
 }<br>
<br>
+/**<br>
+ * of_flat_dt_match - Return true if node matches a list of compatible values<br>
+ */<br>
+int __init of_flat_dt_match(unsigned long node, const char **compat)<br>
+{<br>
+       return of_fdt_match(initial_boot_params, node, compat);<br>
+}<br>
+<br>
 #ifdef CONFIG_BLK_DEV_INITRD<br>
 /**<br>
  * early_init_dt_check_for_initrd - Decode initrd location from flat tree<br>
diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h<br>
index 9ce5dfd..fb327f3 100644<br>
--- a/include/linux/of_fdt.h<br>
+++ b/include/linux/of_fdt.h<br>
@@ -84,6 +84,7 @@ extern int of_scan_flat_dt(int (*it)(unsigned long node, const char *uname,<br>
 extern void *of_get_flat_dt_prop(unsigned long node, const char *name,<br>
                                 unsigned long *size);<br>
 extern int of_flat_dt_is_compatible(unsigned long node, const char *name);<br>
+extern int of_flat_dt_match(unsigned long node, const char **matches);<br></blockquote><div><br></div><div>Maybe export of_fdt_match, too?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

 extern unsigned long of_get_flat_dt_root(void);<br>
<br>
 extern int early_init_dt_scan_chosen(unsigned long node, const char *uname,<br>
<br>
_______________________________________________<br>
Linuxppc-dev mailing list<br>
<a href="mailto:Linuxppc-dev@lists.ozlabs.org">Linuxppc-dev@lists.ozlabs.org</a><br>
<a href="https://lists.ozlabs.org/listinfo/linuxppc-dev" target="_blank">https://lists.ozlabs.org/listinfo/linuxppc-dev</a><br>
</blockquote></div><br>