On 6 November 2012 19:48, Rob Herring <robherring2@gmail.com> wrote:
> diff --git a/drivers/of/base.c b/drivers/of/base.c
 
> +#define of_property_read_array(_np, _pname, _out, _sz)                       \
> +     struct property *_prop = of_find_property(_np, _pname, NULL);   \
> +     const __be32 *_val;                                             \
> +                                                                     \
> +     if (!_prop)                                                     \
> +             return -EINVAL;                                         \
> +     if (!_prop->value)                                              \
> +             return -ENODATA;                                        \
> +     if ((_sz * sizeof(*_out)) > _prop->length)                      \
> +             return -EOVERFLOW;                                      \
> +                                                                     \
> +     _val = _prop->value;                                            \
> +     while (_sz--)                                                   \
> +             *_out++ = (typeof(*_out))be32_to_cpup(_val++);          \

This will not work. You are incrementing _out by 1, 2, or 4 bytes, but
_val is always incremented by 4 bytes.

According to the dtc commit adding this feature, the values are packed:

With this patch the following property assignment:

    property = /bits/ 16 <0x1234 0x5678 0x0 0xffff>;

is equivalent to:

    property = <0x12345678 0x0000ffff>;

Something which i haven't expected :(
I will fix and test it well for all types before sending it now.
 
> +/**
> + * of_property_read_u8_array - Find and read an array of u8 from a property.
> + *
> + * @np:              device node from which the property value is to be read.
> + * @propname:        name of the property to be searched.
> + * @out_value:       pointer to return value, modified only if return value is 0.
> + *

Missing sz

Yes for both misses.