Thread (1 message) 1 message, 1 author, 2014-02-14

Re: [PATCH 2/2] of: search the best compatible match first in __of_match_node()

From: Kumar Gala <hidden>
Date: 2014-02-14 16:19:21
Also in: linux-devicetree

On Feb 14, 2014, at 9:53 AM, Rob Herring [off-list ref] wrote:
On Thu, Feb 13, 2014 at 11:22 PM, Kevin Hao [off-list ref] =
wrote:
quoted
Currently, of_match_node compares each given match against all node's
compatible strings with of_device_is_compatible.
=20
To achieve multiple compatible strings per node with ordering from
specific to generic, this requires given matches to be ordered from
specific to generic. For most of the drivers this is not true and =
also
quoted
an alphabetical ordering is more sane there.
=20
Therefore, this patch introduces a function to match each of the =
node's
quoted
compatible strings against all given compatible matches without type =
and
quoted
name first, before checking the next compatible string. This implies
that node's compatibles are ordered from specific to generic while
given matches can be in any order. If we fail to find such a match
entry, then fall-back to the old method in order to keep =
compatibility.
quoted
=20
Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Signed-off-by: Kevin Hao <redacted>
=20
Looks good to me. I'll put this in next for a few days. I'd really
like to see some acks and tested-by's before sending to Linus.
=20
We could be a bit more strict here and fallback to the old matching if
the match table has any entries with name or type. I don't think that
should be necessary though.
=20
Rob
Can you push the revert to Linus sooner, since currently a ton of boards =
wouldn=92t be working on the PPC side, so at least -rc3 has the =
possibility of working for them.

- k
=20
quoted
---
drivers/of/base.c | 43 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 42 insertions(+), 1 deletion(-)
=20
diff --git a/drivers/of/base.c b/drivers/of/base.c
index ba195fbce4c6..10b51106c854 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -730,13 +730,49 @@ out:
}
EXPORT_SYMBOL(of_find_node_with_property);
=20
+static const struct of_device_id *
+of_match_compatible(const struct of_device_id *matches,
+                       const struct device_node *node)
+{
+       const char *cp;
+       int cplen, l;
+       const struct of_device_id *m;
+
+       cp =3D __of_get_property(node, "compatible", &cplen);
+       while (cp && (cplen > 0)) {
+               m =3D matches;
+               while (m->name[0] || m->type[0] || m->compatible[0]) =
{
quoted
+                       /* Only match for the entries without type =
and name */
quoted
+                       if (m->name[0] || m->type[0] ||
+                               of_compat_cmp(m->compatible, cp,
+                                        strlen(m->compatible)))
+                               m++;
+                       else
+                               return m;
+               }
+
+               /* Get node's next compatible string */
+               l =3D strlen(cp) + 1;
+               cp +=3D l;
+               cplen -=3D l;
+       }
+
+       return NULL;
+}
+
static
const struct of_device_id *__of_match_node(const struct of_device_id =
*matches,
quoted
                                          const struct device_node =
*node)
quoted
{
+       const struct of_device_id *m;
+
       if (!matches)
               return NULL;
=20
+       m =3D of_match_compatible(matches, node);
+       if (m)
+               return m;
+
       while (matches->name[0] || matches->type[0] || =
matches->compatible[0]) {
quoted
               int match =3D 1;
               if (matches->name[0])
@@ -760,7 +796,12 @@ const struct of_device_id *__of_match_node(const =
struct of_device_id *matches,
quoted
 *     @matches:       array of of device match structures to search =
in
quoted
 *     @node:          the of device structure to match against
 *
- *     Low level utility function used by device matching.
+ *     Low level utility function used by device matching. We have =
two ways
quoted
+ *     of matching:
+ *     - Try to find the best compatible match by comparing each =
compatible
quoted
+ *       string of device node with all the given matches =
respectively.
quoted
+ *     - If the above method failed, then try to match the =
compatible by using
quoted
+ *       __of_device_is_compatible() besides the match in type and =
name.
quoted
 */
const struct of_device_id *of_match_node(const struct of_device_id =
*matches,
quoted
                                        const struct device_node =
*node)
quoted
--
1.8.5.3
--=20
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, =
hosted by The Linux Foundation
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help