Re: [PATCH] max17042_battery: fix model download bug.
From: Sebastian Reichel
Date: Tue Aug 09 2016 - 14:54:39 EST
Hi,
[adding some people to CC]
On Wed, Aug 03, 2016 at 10:03:46AM -0400, Sven Van Asbroeck wrote:
> The device's model download function returns the model data as
> an array of u32s, which is later compared to the reference
> model data. However, since the latter is an array of u16s,
> the comparison does not happen correctly, and model verification
> fails. This in turn breaks the POR initialization sequence.
Patch looks ok, except for missing Fixes. I guess it should be
"Fixes: 39e7213edc4f3". I will wait with queuing it for a few
days giving Samsung people a chance to reply.
-- Sebastian
> drivers/power/max17042_battery.c | 15 +++++++++------
> 1 file changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/power/max17042_battery.c b/drivers/power/max17042_battery.c
> index 9c65f13..da7a75f 100644
> --- a/drivers/power/max17042_battery.c
> +++ b/drivers/power/max17042_battery.c
> @@ -457,13 +457,16 @@ static inline void
> max17042_write_model_data(struct max17042_chip *chip,
> }
>
> static inline void max17042_read_model_data(struct max17042_chip *chip,
> - u8 addr, u32 *data, int size)
> + u8 addr, u16 *data, int size)
> {
> struct regmap *map = chip->regmap;
> int i;
> + u32 tmp;
>
> - for (i = 0; i < size; i++)
> - regmap_read(map, addr + i, &data[i]);
> + for (i = 0; i < size; i++) {
> + regmap_read(map, addr + i, &tmp);
> + data[i] = (u16)tmp;
> + }
> }
>
> static inline int max17042_model_data_compare(struct max17042_chip *chip,
> @@ -486,7 +489,7 @@ static int max17042_init_model(struct max17042_chip *chip)
> {
> int ret;
> int table_size = ARRAY_SIZE(chip->pdata->config_data->cell_char_tbl);
> - u32 *temp_data;
> + u16 *temp_data;
>
> temp_data = kcalloc(table_size, sizeof(*temp_data), GFP_KERNEL);
> if (!temp_data)
> @@ -501,7 +504,7 @@ static int max17042_init_model(struct max17042_chip *chip)
> ret = max17042_model_data_compare(
> chip,
> chip->pdata->config_data->cell_char_tbl,
> - (u16 *)temp_data,
> + temp_data,
> table_size);
>
> max10742_lock_model(chip);
> @@ -514,7 +517,7 @@ static int max17042_verify_model_lock(struct
> max17042_chip *chip)
> {
> int i;
> int table_size = ARRAY_SIZE(chip->pdata->config_data->cell_char_tbl);
> - u32 *temp_data;
> + u16 *temp_data;
> int ret = 0;
>
> temp_data = kcalloc(table_size, sizeof(*temp_data), GFP_KERNEL);
> --
> 1.9.1
Attachment:
signature.asc
Description: PGP signature