Commit 0a8686e3 authored by Linus Walleij's avatar Linus Walleij Committed by Jonathan Cameron
Browse files

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: default avatarSebastian Reichel <sre@kernel.org>
Acked-by: default avatarJonathan Cameron <jic23@kernel.org>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 54ecb8f7
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -629,7 +629,7 @@ config BATTERY_GAUGE_LTC2941

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

+29 −12
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@
#include <linux/mfd/abx500.h>
#include <linux/mfd/abx500/ab8500.h>
#include <linux/mfd/abx500/ab8500-bm.h>
#include <linux/mfd/abx500/ab8500-gpadc.h>
#include <linux/iio/consumer.h>

#define VTVOUT_V			1800

@@ -79,7 +79,8 @@ struct ab8500_btemp_ranges {
 * @bat_temp:		Dispatched battery temperature in degree Celsius
 * @prev_bat_temp	Last measured battery temperature in degree Celsius
 * @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
 * @bm:           	Platform specific battery management information
 * @btemp_psy:		Structure for BTEMP specific battery properties
@@ -96,7 +97,8 @@ struct ab8500_btemp {
	int bat_temp;
	int prev_bat_temp;
	struct ab8500 *parent;
	struct ab8500_gpadc *gpadc;
	struct iio_channel *btemp_ball;
	struct iio_channel *bat_ctrl;
	struct ab8500_fg *fg;
	struct abx500_bm_data *bm;
	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)
{
	int vbtemp;
	int vbtemp, ret;
	static int prev;

	vbtemp = ab8500_gpadc_convert(di->gpadc, BAT_CTRL);
	if (vbtemp < 0) {
	ret = iio_read_channel_processed(di->bat_ctrl, &vbtemp);
	if (ret < 0) {
		dev_err(di->dev,
			"%s gpadc conversion failed, using previous value",
			"%s ADC conversion failed, using previous value",
			__func__);
		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)
{
	int temp;
	int temp, ret;
	static int prev;
	int rbat, rntc, vntc;
	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].n_temp_tbl_elements, rbat);
	} else {
		vntc = ab8500_gpadc_convert(di->gpadc, BTEMP_BALL);
		if (vntc < 0) {
		ret = iio_read_channel_processed(di->btemp_ball, &vntc);
		if (ret < 0) {
			dev_err(di->dev,
				"%s gpadc conversion failed,"
				"%s ADC conversion failed,"
				" using previous value\n", __func__);
			return prev;
		}
@@ -1024,7 +1026,22 @@ static int ab8500_btemp_probe(struct platform_device *pdev)
	/* get parent data */
	di->dev = &pdev->dev;
	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;