On Sun,  1 Jun 2014 15:01:23 +0300, Ivaylo Dimitrov 
<ivo.g.dimitrov...@gmail.com> wrote:
> The current code unconditionally adds aliases without check if it already
> exists, so it is not possible to alter an alias, from board DT file for
> example. Fix that by replacing an alias if it already exists
> 

Can you describe a more detailed use-case for altering an alias?

g.

> Signed-off-by: Ivaylo Dimitrov <ivo.g.dimitrov...@gmail.com>
> ---
>  drivers/of/base.c |   34 +++++++++++++++++++++++++++-------
>  1 file changed, 27 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/of/base.c b/drivers/of/base.c
> index 03e7fc6..99215f0 100644
> --- a/drivers/of/base.c
> +++ b/drivers/of/base.c
> @@ -2036,6 +2036,23 @@ static void of_alias_add(struct alias_prop *ap, struct 
> device_node *np,
>                ap->alias, ap->stem, ap->id, of_node_full_name(np));
>  }
>  
> +static int of_alias_replace(struct device_node *np, int id, const char *stem,
> +                         int stem_len)
> +{
> +     struct alias_prop *ap;
> +
> +     list_for_each_entry(ap, &aliases_lookup, link) {
> +             if (strncmp(ap->stem, stem, stem_len))
> +                     continue;
> +
> +             if (np == ap->np) {
> +                     ap->id = id;
> +                     return 0;
> +             }
> +     }
> +
> +     return -ENODEV;
> +}
>  /**
>   * of_alias_scan - Scan all properties of 'aliases' node
>   *
> @@ -2092,13 +2109,16 @@ void of_alias_scan(void * (*dt_alloc)(u64 size, u64 
> align))
>               if (kstrtoint(end, 10, &id) < 0)
>                       continue;
>  
> -             /* Allocate an alias_prop with enough space for the stem */
> -             ap = dt_alloc(sizeof(*ap) + len + 1, 4);
> -             if (!ap)
> -                     continue;
> -             memset(ap, 0, sizeof(*ap) + len + 1);
> -             ap->alias = start;
> -             of_alias_add(ap, np, id, start, len);
> +             if (of_alias_replace(np, id, start, len)) {
> +                     /* Allocate an alias_prop with enough space for the stem
> +                      */
> +                     ap = dt_alloc(sizeof(*ap) + len + 1, 4);
> +                     if (!ap)
> +                             continue;
> +                     memset(ap, 0, sizeof(*ap) + len + 1);
> +                     ap->alias = start;
> +                     of_alias_add(ap, np, id, start, len);
> +             }
>       }
>  }
>  
> -- 
> 1.7.9.5
> 

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to