power: supply: ab8500_btemp: Convert to IIO ADC
authorLinus Walleij <linus.walleij@linaro.org>
Fri, 11 Oct 2019 07:17:59 +0000 (09:17 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Fri, 18 Oct 2019 18:36:48 +0000 (19:36 +0100)
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>
drivers/power/supply/Kconfig
drivers/power/supply/ab8500_btemp.c

index c84a7b1..27164a1 100644 (file)
@@ -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.
 
index 8fe8125..ad8c51e 100644 (file)
@@ -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;