Patch "power: supply: axp288_fuel_gauge: Read 12 bit values 2 registers at a time" has been added to the 4.9-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
power: supply: axp288_fuel_gauge: Read 12 bit values 2 registers at a time
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
power-supply-axp288_fuel_gauge-read-12-bit-values-2-registers-at-a-time.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Sun Nov 19 11:32:28 CET 2017
From: Hans de Goede <[email protected]>
Date: Wed, 14 Dec 2016 17:38:52 +0100
Subject: power: supply: axp288_fuel_gauge: Read 12 bit values 2 registers at a time
From: Hans de Goede <[email protected]>
[ Upstream commit 248efcf00602f0282587999bcc221a872bd72530 ]
In order for the MSB -> LSB latching to work correctly we must read the 2 8 bit registers of a 12 bit value in one consecutive read.
This fixes voltage_ocv reporting inconsistent values on my tablet.
--- drivers/power/supply/axp288_fuel_gauge.c | 40 +++++++++++++++++-------------- 1 file changed, 22 insertions(+), 18 deletions(-)
drivers/power/supply/axp288_fuel_gauge.c +22 -18
@@ -210,6 +210,22 @@ static int fuel_gauge_read_15bit_word(streturn ret &FG_15BIT_VAL_MASK ; } +static int fuel_gauge_read_12bit_word (struct axp288_fg_info *info,int reg) +{ +unsigned char buf[2 ]; +int ret; + + ret =regmap_bulk_read (info->regmap, reg, buf,2 ); +if (ret <0 ) { +dev_err (&info->pdev->dev,"Error reading reg 0x%02x err: %d\n" , + reg, ret); +return ret; + } + +/* 12-bit data values have upper 8 bits in buf[0], lower 4 in buf[1] */ +return (buf[0 ] <<4 ) | ((buf[1 ] >>4 ) &0x0f ); +} +static int pmic_read_adc_val (const char *name,int *raw_val,struct axp288_fg_info *info) {
@@ -270,12 +286,9 @@ static int fuel_gauge_debug_show(structseq_printf (s," FG_RDC0[%02x] : %02x\n" ,AXP288_FG_RDC0_REG ,fuel_gauge_reg_readb (info,AXP288_FG_RDC0_REG )); -seq_printf (s," FG_OCVH[%02x] : %02x\n" , +seq_printf (s," FG_OCV[%02x] : %04x\n" ,AXP288_FG_OCVH_REG , -fuel_gauge_reg_readb (info,AXP288_FG_OCVH_REG )); -seq_printf (s," FG_OCVL[%02x] : %02x\n" , -AXP288_FG_OCVL_REG , -fuel_gauge_reg_readb (info,AXP288_FG_OCVL_REG )); +fuel_gauge_read_12bit_word (info,AXP288_FG_OCVH_REG ));seq_printf (s," FG_DES_CAP[%02x] : %04x\n" ,AXP288_FG_DES_CAP1_REG ,fuel_gauge_read_15bit_word (info,AXP288_FG_DES_CAP1_REG ));
@@ -532,21 +545,12 @@ temp_read_fail:static int fuel_gauge_get_vocv (struct axp288_fg_info *info,int *vocv) { -int ret, value; - -/* 12-bit data value, upper 8 in OCVH, lower 4 in OCVL */ - ret =fuel_gauge_reg_readb (info,AXP288_FG_OCVH_REG ); -if (ret <0 ) - goto vocv_read_fail; - value = ret <<4 ; +int ret; - ret =fuel_gauge_reg_readb (info,AXP288_FG_OCVL_REG ); -if (ret <0 ) - goto vocv_read_fail; - value |= (ret &0xf ); + ret =fuel_gauge_read_12bit_word (info,AXP288_FG_OCVH_REG ); +if (ret >=0 ) + *vocv =VOLTAGE_FROM_ADC (ret); - *vocv =VOLTAGE_FROM_ADC (value); -vocv_read_fail:return ret; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/power-supply-axp288_fuel_gauge-read-15-bit-values-2-registers-at-a-time.patch queue-4.9/power-supply-axp288_fuel_gauge-read-12-bit-values-2-registers-at-a-time.patch