Hi Mark,

Yes, this patch solved the issue.It avoid the null function and just
need to handle the native endian case.

Thanks.
Henry

On Fri, 2015-08-28 at 20:11 +0100, Mark Brown wrote:
> When doing a bulk read from a device which lacks raw I/O support we fall
> back to doing register at a time reads but we still use the raw
> formatters in order to render the data into the word size used by the
> device (since bulk reads still operate on the device word size rather
> than unsigned ints).  This means that devices without raw formatting
> such as those that provide reg_read() are not supported.  Provide
> handling for them by copying the values read into native endian values
> of the appropriate size.
> 
> Signed-off-by: Mark Brown <broo...@kernel.org>
> ---
> 
> This is tested with my "hey, look - it compiles!" test plan.  Based on
> looking at the users and the other ways formatting is used this is the
> interface that makes most sense to me, we'll need similar handling for
> the write case.  Does this solve the problems you are seeing?
> 
>  drivers/base/regmap/regmap.c | 29 ++++++++++++++++++++++++++++-
>  1 file changed, 28 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
> index c13b1f2..62e3d7c 100644
> --- a/drivers/base/regmap/regmap.c
> +++ b/drivers/base/regmap/regmap.c
> @@ -2364,7 +2364,34 @@ int regmap_bulk_read(struct regmap *map, unsigned int 
> reg, void *val,
>                                         &ival);
>                       if (ret != 0)
>                               return ret;
> -                     map->format.format_val(val + (i * val_bytes), ival, 0);
> +
> +                     if (map->format.format_val) {
> +                             map->format.format_val(val + (i * val_bytes), 
> ival, 0);
> +                     } else {
> +                             /* Devices providing read and write
> +                              * operations can use the bulk I/O
> +                              * functions if they define a val_bytes,
> +                              * we assume that the values are native
> +                              * endian.
> +                              */
> +                             u32 *u32 = val;
> +                             u16 *u16 = val;
> +                             u8 *u8 = val;
> +
> +                             switch (map->format.val_bytes) {
> +                             case 4:
> +                                     u32[i] = ival;
> +                                     break;
> +                             case 2:
> +                                     u16[i] = ival;
> +                                     break;
> +                             case 1:
> +                                     u8[i] = ival;
> +                                     break;
> +                             default:
> +                                     return -EINVAL;
> +                             }
> +                     }
>               }
>       }
>  


--
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/

Reply via email to