power: supply: ab8500_btemp: Convert to IIO ADC

This switches the AB8500 battery temperature driver to using
the standard IIO ADC channel lookup and conversion routines.

Acked-by: Sebastian Reichel <sre@kernel.org>
Acked-by: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
Linus Walleij 2019-10-11 09:17:59 +02:00 committed by Jonathan Cameron
parent 54ecb8f702
commit 0a8686e309
2 changed files with 30 additions and 13 deletions

View file

@ -629,7 +629,7 @@ config BATTERY_GAUGE_LTC2941
config AB8500_BM config AB8500_BM
bool "AB8500 Battery Management Driver" bool "AB8500 Battery Management Driver"
depends on AB8500_CORE && AB8500_GPADC depends on AB8500_CORE && AB8500_GPADC && (IIO = y)
help help
Say Y to include support for AB8500 battery management. Say Y to include support for AB8500 battery management.

View file

@ -26,7 +26,7 @@
#include <linux/mfd/abx500.h> #include <linux/mfd/abx500.h>
#include <linux/mfd/abx500/ab8500.h> #include <linux/mfd/abx500/ab8500.h>
#include <linux/mfd/abx500/ab8500-bm.h> #include <linux/mfd/abx500/ab8500-bm.h>
#include <linux/mfd/abx500/ab8500-gpadc.h> #include <linux/iio/consumer.h>
#define VTVOUT_V 1800 #define VTVOUT_V 1800
@ -79,7 +79,8 @@ struct ab8500_btemp_ranges {
* @bat_temp: Dispatched battery temperature in degree Celsius * @bat_temp: Dispatched battery temperature in degree Celsius
* @prev_bat_temp Last measured battery temperature in degree Celsius * @prev_bat_temp Last measured battery temperature in degree Celsius
* @parent: Pointer to the struct ab8500 * @parent: Pointer to the struct ab8500
* @gpadc: Pointer to the struct gpadc * @adc_btemp_ball: ADC channel for the battery ball temperature
* @adc_bat_ctrl: ADC channel for the battery control
* @fg: Pointer to the struct fg * @fg: Pointer to the struct fg
* @bm: Platform specific battery management information * @bm: Platform specific battery management information
* @btemp_psy: Structure for BTEMP specific battery properties * @btemp_psy: Structure for BTEMP specific battery properties
@ -96,7 +97,8 @@ struct ab8500_btemp {
int bat_temp; int bat_temp;
int prev_bat_temp; int prev_bat_temp;
struct ab8500 *parent; struct ab8500 *parent;
struct ab8500_gpadc *gpadc; struct iio_channel *btemp_ball;
struct iio_channel *bat_ctrl;
struct ab8500_fg *fg; struct ab8500_fg *fg;
struct abx500_bm_data *bm; struct abx500_bm_data *bm;
struct power_supply *btemp_psy; struct power_supply *btemp_psy;
@ -177,13 +179,13 @@ static int ab8500_btemp_batctrl_volt_to_res(struct ab8500_btemp *di,
*/ */
static int ab8500_btemp_read_batctrl_voltage(struct ab8500_btemp *di) static int ab8500_btemp_read_batctrl_voltage(struct ab8500_btemp *di)
{ {
int vbtemp; int vbtemp, ret;
static int prev; static int prev;
vbtemp = ab8500_gpadc_convert(di->gpadc, BAT_CTRL); ret = iio_read_channel_processed(di->bat_ctrl, &vbtemp);
if (vbtemp < 0) { if (ret < 0) {
dev_err(di->dev, dev_err(di->dev,
"%s gpadc conversion failed, using previous value", "%s ADC conversion failed, using previous value",
__func__); __func__);
return prev; return prev;
} }
@ -455,7 +457,7 @@ static int ab8500_btemp_res_to_temp(struct ab8500_btemp *di,
*/ */
static int ab8500_btemp_measure_temp(struct ab8500_btemp *di) static int ab8500_btemp_measure_temp(struct ab8500_btemp *di)
{ {
int temp; int temp, ret;
static int prev; static int prev;
int rbat, rntc, vntc; int rbat, rntc, vntc;
u8 id; u8 id;
@ -480,10 +482,10 @@ static int ab8500_btemp_measure_temp(struct ab8500_btemp *di)
di->bm->bat_type[id].r_to_t_tbl, di->bm->bat_type[id].r_to_t_tbl,
di->bm->bat_type[id].n_temp_tbl_elements, rbat); di->bm->bat_type[id].n_temp_tbl_elements, rbat);
} else { } else {
vntc = ab8500_gpadc_convert(di->gpadc, BTEMP_BALL); ret = iio_read_channel_processed(di->btemp_ball, &vntc);
if (vntc < 0) { if (ret < 0) {
dev_err(di->dev, dev_err(di->dev,
"%s gpadc conversion failed," "%s ADC conversion failed,"
" using previous value\n", __func__); " using previous value\n", __func__);
return prev; return prev;
} }
@ -1024,7 +1026,22 @@ static int ab8500_btemp_probe(struct platform_device *pdev)
/* get parent data */ /* get parent data */
di->dev = &pdev->dev; di->dev = &pdev->dev;
di->parent = dev_get_drvdata(pdev->dev.parent); di->parent = dev_get_drvdata(pdev->dev.parent);
di->gpadc = ab8500_gpadc_get("ab8500-gpadc.0");
/* Get ADC channels */
di->btemp_ball = devm_iio_channel_get(&pdev->dev, "btemp_ball");
if (IS_ERR(di->btemp_ball)) {
if (PTR_ERR(di->btemp_ball) == -ENODEV)
return -EPROBE_DEFER;
dev_err(&pdev->dev, "failed to get BTEMP BALL ADC channel\n");
return PTR_ERR(di->btemp_ball);
}
di->bat_ctrl = devm_iio_channel_get(&pdev->dev, "bat_ctrl");
if (IS_ERR(di->bat_ctrl)) {
if (PTR_ERR(di->bat_ctrl) == -ENODEV)
return -EPROBE_DEFER;
dev_err(&pdev->dev, "failed to get BAT CTRL ADC channel\n");
return PTR_ERR(di->bat_ctrl);
}
di->initialized = false; di->initialized = false;