All of lore.kernel.org
 help / color / mirror / Atom feed
From: Grant Likely <grant.likely@secretlab.ca>
To: Stephen Neuendorffer <stephen.neuendorffer@gmail.com>
Cc: devicetree-discuss@lists.ozlabs.org, linuxppc-dev@lists.ozlabs.org
Subject: Re: [PATCH] of/flattree: Add of_flat_dt_match() helper function
Date: Fri, 31 Dec 2010 17:54:32 -0700	[thread overview]
Message-ID: <20110101005432.GD19643@angua.secretlab.ca> (raw)
In-Reply-To: <AANLkTikG+F+LbbHKfHKzcMKZjxxj=GzhjdeHZ6Jo10mq@mail.gmail.com>

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

WARNING: multiple messages have this Message-ID (diff)
From: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
To: Stephen Neuendorffer
	<stephen.neuendorffer-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
	linuxppc-dev-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org
Subject: Re: [PATCH] of/flattree: Add of_flat_dt_match() helper function
Date: Fri, 31 Dec 2010 17:54:32 -0700	[thread overview]
Message-ID: <20110101005432.GD19643@angua.secretlab.ca> (raw)
In-Reply-To: <AANLkTikG+F+LbbHKfHKzcMKZjxxj=GzhjdeHZ6Jo10mq-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>

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-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>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-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
> >
> 
> reviewed-by: Stephen Neuendorffer <stephen.neuendorffer-gjFFaj9aHVfQT0dZR+AlfA@public.gmane.org>
> 
> 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-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org
> > https://lists.ozlabs.org/listinfo/linuxppc-dev
> >

  reply	other threads:[~2011-01-01  0:54 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-12-31  9:15 [PATCH] of/flattree: Add of_flat_dt_match() helper function Grant Likely
2010-12-31  9:15 ` Grant Likely
2010-12-31 15:59 ` Stephen Neuendorffer
2010-12-31 15:59   ` Stephen Neuendorffer
2011-01-01  0:54   ` Grant Likely [this message]
2011-01-01  0:54     ` Grant Likely

Reply instructions:

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

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

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

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

  git send-email \
    --in-reply-to=20110101005432.GD19643@angua.secretlab.ca \
    --to=grant.likely@secretlab.ca \
    --cc=devicetree-discuss@lists.ozlabs.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=stephen.neuendorffer@gmail.com \
    /path/to/YOUR_REPLY

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

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