On Thu, Mar 12, 2015 at 11:17 AM, Wolfram Sang wrote:
> I2C supports adding adapters using either a dynamic or fixed id. The
> latter is provided by aliases in the DT case. To prevent id collisions
> of those two types, install this function which gives us the highest
> fixed id, so we can then let the dynamically created ones come after
> this highest number.
>
> Signed-off-by: Wolfram Sang
Acked-by: Rob Herring
> ---
>
> Because this function is so similar to of_alias_get_id(), I thought of merging
> them into __of_alias_get_id(np, stem, bool get_highest) and have two call
> wrappers but then decided the decreased readability is not worth the hazzle.
>
> drivers/of/base.c | 26 ++
> include/linux/of.h | 6 ++
> 2 files changed, 32 insertions(+)
>
> diff --git a/drivers/of/base.c b/drivers/of/base.c
> index 0a8aeb8523fe7d..63cba04aacf686 100644
> --- a/drivers/of/base.c
> +++ b/drivers/of/base.c
> @@ -1958,6 +1958,32 @@ int of_alias_get_id(struct device_node *np, const char
> *stem)
> }
> EXPORT_SYMBOL_GPL(of_alias_get_id);
>
> +/**
> + * of_alias_get_highest_id - Get highest alias id for the given stem
> + * @stem: Alias stem to be examined
> + *
> + * The function travels the lookup table to get the highest alias id for the
> + * given alias stem. It returns the alias id if found.
> + */
> +int of_alias_get_highest_id(const char *stem)
> +{
> + struct alias_prop *app;
> + int id = -ENODEV;
> +
> + mutex_lock(&of_mutex);
> + list_for_each_entry(app, &aliases_lookup, link) {
> + if (strcmp(app->stem, stem) != 0)
> + continue;
> +
> + if (app->id > id)
> + id = app->id;
> + }
> + mutex_unlock(&of_mutex);
> +
> + return id;
> +}
> +EXPORT_SYMBOL_GPL(of_alias_get_highest_id);
> +
> const __be32 *of_prop_next_u32(struct property *prop, const __be32 *cur,
>u32 *pu)
> {
> diff --git a/include/linux/of.h b/include/linux/of.h
> index dfde07e77a632b..9bfcc18ceab3bf 100644
> --- a/include/linux/of.h
> +++ b/include/linux/of.h
> @@ -332,6 +332,7 @@ extern int of_count_phandle_with_args(const struct
> device_node *np,
>
> extern void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align));
> extern int of_alias_get_id(struct device_node *np, const char *stem);
> +extern int of_alias_get_highest_id(const char *stem);
>
> extern int of_machine_is_compatible(const char *compat);
>
> @@ -594,6 +595,11 @@ static inline int of_alias_get_id(struct device_node
> *np, const char *stem)
> return -ENOSYS;
> }
>
> +static inline int of_alias_get_highest_id(const char *stem)
> +{
> + return -ENOSYS;
> +}
> +
> static inline int of_machine_is_compatible(const char *compat)
> {
> return 0;
> --
> 2.1.4
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/