All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rob Herring <robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Thierry Reding
	<thierry.reding-RM9K5IK7kjKj5M59NBduVrNAH6kLmebB@public.gmane.org>
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org
Subject: Re: [PATCH] of: match by compatible property first
Date: Fri, 20 Apr 2012 08:13:03 -0500	[thread overview]
Message-ID: <4F9160DF.70308@gmail.com> (raw)
In-Reply-To: <1334917312-21192-1-git-send-email-thierry.reding-RM9K5IK7kjKj5M59NBduVrNAH6kLmebB@public.gmane.org>

On 04/20/2012 05:21 AM, Thierry Reding wrote:
> When matching devices against an OF device ID table, the first string of
> the compatible property that is listed in the table should match,
> regardless of its position in the table.
> 
> Signed-off-by: Thierry Reding <thierry.reding-RM9K5IK7kjKj5M59NBduVrNAH6kLmebB@public.gmane.org>
> ---
>  drivers/of/base.c  |   31 +++++++++++++++++++++++++++----
>  include/linux/of.h |    3 +++
>  2 files changed, 30 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/of/base.c b/drivers/of/base.c
> index d9bfd49..db355b7 100644
> --- a/drivers/of/base.c
> +++ b/drivers/of/base.c
> @@ -511,6 +511,23 @@ out:
>  }
>  EXPORT_SYMBOL(of_find_node_with_property);
>  
> +const struct of_device_id *of_match_compat(const struct of_device_id *matches,
> +					   const char *compat)
> +{
> +	while (matches->name[0] || matches->type[0] || matches->compatible[0]) {

You are not using name or type here, so you can remove.

> +		const char *cp = matches->compatible;
> +		int len = strlen(cp);
> +
> +		if (len > 0 && of_compat_cmp(compat, cp, len) == 0)
> +			return matches;
> +
> +		matches++;
> +	}
> +
> +	return NULL;
> +}
> +EXPORT_SYMBOL(of_match_compat);
> +
>  /**
>   * of_match_node - Tell if an device_node has a matching of_match structure
>   *	@matches:	array of of device match structures to search in
> @@ -521,9 +538,18 @@ EXPORT_SYMBOL(of_find_node_with_property);
>  const struct of_device_id *of_match_node(const struct of_device_id *matches,
>  					 const struct device_node *node)
>  {
> +	struct property *prop;
> +	const char *cp;
> +
>  	if (!matches)
>  		return NULL;
>  
> +	of_property_for_each_string(node, "compatible", prop, cp) {
> +		const struct of_device_id *match = of_match_compat(matches, cp);
> +		if (match)
> +			return match;
> +	}
> +
>  	while (matches->name[0] || matches->type[0] || matches->compatible[0]) {

You don't need to check compatible ptr here.

>  		int match = 1;
>  		if (matches->name[0])
> @@ -532,10 +558,7 @@ const struct of_device_id *of_match_node(const struct of_device_id *matches,
>  		if (matches->type[0])
>  			match &= node->type
>  				&& !strcmp(matches->type, node->type);
> -		if (matches->compatible[0])
> -			match &= of_device_is_compatible(node,
> -						matches->compatible);
> -		if (match)
> +		if (match && !matches->compatible[0])
>  			return matches;
>  		matches++;
>  	}
> diff --git a/include/linux/of.h b/include/linux/of.h
> index bd52d83..23b5061 100644
> --- a/include/linux/of.h
> +++ b/include/linux/of.h
> @@ -231,6 +231,8 @@ extern const void *of_get_property(const struct device_node *node,
>  
>  extern int of_n_addr_cells(struct device_node *np);
>  extern int of_n_size_cells(struct device_node *np);
> +extern const struct of_device_id *of_match_compat(
> +	const struct of_device_id *matches, const char *compat);

Why does this need to be a public function?

>  extern const struct of_device_id *of_match_node(
>  	const struct of_device_id *matches, const struct device_node *node);
>  extern int of_modalias_node(struct device_node *node, char *modalias, int len);
> @@ -395,6 +397,7 @@ static inline int of_machine_is_compatible(const char *compat)
>  }
>  
>  #define of_match_ptr(_ptr)	NULL
> +#define of_match_compat(_matches, _compat)	NULL
>  #define of_match_node(_matches, _node)	NULL
>  #define of_property_for_each_u32(np, propname, prop, p, u) \
>  	while (0)

  parent reply	other threads:[~2012-04-20 13:13 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-20 10:21 Thierry Reding
     [not found] ` <1334917312-21192-1-git-send-email-thierry.reding-RM9K5IK7kjKj5M59NBduVrNAH6kLmebB@public.gmane.org>
2012-04-20 13:13   ` Rob Herring [this message]
     [not found]     ` <4F9160DF.70308-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2012-04-20 13:28       ` Thierry Reding
     [not found]         ` <20120420132839.GB25662-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-06-13  7:01           ` Thierry Reding
     [not found]             ` <20120613070138.GA5670-RM9K5IK7kjIQXX3q8xo1gnVAuStQJXxyR5q1nwbD4aMs9pC9oP6+/A@public.gmane.org>
2012-06-13 15:37               ` Rob Herring
     [not found]                 ` <4FD8B3D1.1090706-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2012-06-13 16:58                   ` Thierry Reding

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=4F9160DF.70308@gmail.com \
    --to=robherring2-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
    --cc=devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org \
    --cc=thierry.reding-RM9K5IK7kjKj5M59NBduVrNAH6kLmebB@public.gmane.org \
    --subject='Re: [PATCH] of: match by compatible property first' \
    /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

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.