Skip to content

Commit

Permalink
power: supply: max17042_battery: fix model download bug.
Browse files Browse the repository at this point in the history
commit 5381cfb upstream.

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.

Fixes: 39e7213 ("max17042_battery: Support regmap to access device's registers")
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Sven Van Asbroeck <TheSven73@googlemail.com>
Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Signed-off-by: Sebastian Reichel <sre@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Sven Van Asbroeck authored and Greg Kroah-Hartman committed Sep 30, 2016
1 parent a596ebc commit 97f9aa7
Showing 1 changed file with 9 additions and 6 deletions.
15 changes: 9 additions & 6 deletions drivers/power/max17042_battery.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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)
Expand All @@ -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);
Expand All @@ -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);
Expand Down

0 comments on commit 97f9aa7

Please sign in to comment.