iio: adc: axp20x_adc: Minor code cleanups
authorAidan MacDonald <aidanmacdonald.0x0@gmail.com>
Fri, 17 Feb 2023 15:34:03 +0000 (15:34 +0000)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 11 Mar 2023 12:18:28 +0000 (12:18 +0000)
The code may be clearer if parameters are not re-purposed to hold
temporary results like register values, so introduce local variables
as necessary to avoid that. Regroup macros based on chip type, and
use the FIELD_PREP() macro instead of a hand-rolled version.

Suggested-by: Jonathan Cameron <jic23@kernel.org>
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Aidan MacDonald <aidanmacdonald.0x0@gmail.com>
Link: https://lore.kernel.org/r/20230217153404.32481-1-aidanmacdonald.0x0@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/axp20x_adc.c

index 53bf7d4899d2048bb37d6a8caae5d8a58b9cddf6..ab25e6e1ff65ea4a1ceb3a7cca1803d9920a20a6 100644 (file)
@@ -5,6 +5,7 @@
  *     Quentin Schulz <quentin.schulz@free-electrons.com>
  */
 
+#include <linux/bitfield.h>
 #include <linux/completion.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
 #include <linux/mfd/axp20x.h>
 
 #define AXP20X_ADC_EN1_MASK                    GENMASK(7, 0)
-
 #define AXP20X_ADC_EN2_MASK                    (GENMASK(3, 2) | BIT(7))
+
 #define AXP22X_ADC_EN1_MASK                    (GENMASK(7, 5) | BIT(0))
 
 #define AXP20X_GPIO10_IN_RANGE_GPIO0           BIT(0)
 #define AXP20X_GPIO10_IN_RANGE_GPIO1           BIT(1)
-#define AXP20X_GPIO10_IN_RANGE_GPIO0_VAL(x)    ((x) & BIT(0))
-#define AXP20X_GPIO10_IN_RANGE_GPIO1_VAL(x)    (((x) & BIT(0)) << 1)
 
 #define AXP20X_ADC_RATE_MASK                   GENMASK(7, 6)
-#define AXP813_V_I_ADC_RATE_MASK               GENMASK(5, 4)
-#define AXP813_ADC_RATE_MASK                   (AXP20X_ADC_RATE_MASK | AXP813_V_I_ADC_RATE_MASK)
 #define AXP20X_ADC_RATE_HZ(x)                  ((ilog2((x) / 25) << 6) & AXP20X_ADC_RATE_MASK)
+
 #define AXP22X_ADC_RATE_HZ(x)                  ((ilog2((x) / 100) << 6) & AXP20X_ADC_RATE_MASK)
+
+#define AXP813_V_I_ADC_RATE_MASK               GENMASK(5, 4)
+#define AXP813_ADC_RATE_MASK                   (AXP20X_ADC_RATE_MASK | AXP813_V_I_ADC_RATE_MASK)
 #define AXP813_TS_GPIO0_ADC_RATE_HZ(x)         AXP20X_ADC_RATE_HZ(x)
 #define AXP813_V_I_ADC_RATE_HZ(x)              ((ilog2((x) / 100) << 4) & AXP813_V_I_ADC_RATE_MASK)
 #define AXP813_ADC_RATE_HZ(x)                  (AXP20X_ADC_RATE_HZ(x) | AXP813_V_I_ADC_RATE_HZ(x))
@@ -234,7 +235,7 @@ static int axp20x_adc_raw(struct iio_dev *indio_dev,
                          struct iio_chan_spec const *chan, int *val)
 {
        struct axp20x_adc_iio *info = iio_priv(indio_dev);
-       int size = 12;
+       int ret, size;
 
        /*
         * N.B.:  Unlike the Chinese datasheets tell, the charging current is
@@ -246,10 +247,11 @@ static int axp20x_adc_raw(struct iio_dev *indio_dev,
        else
                size = 12;
 
-       *val = axp20x_read_variable_width(info->regmap, chan->address, size);
-       if (*val < 0)
-               return *val;
+       ret = axp20x_read_variable_width(info->regmap, chan->address, size);
+       if (ret < 0)
+               return ret;
 
+       *val = ret;
        return IIO_VAL_INT;
 }
 
@@ -257,11 +259,13 @@ static int axp22x_adc_raw(struct iio_dev *indio_dev,
                          struct iio_chan_spec const *chan, int *val)
 {
        struct axp20x_adc_iio *info = iio_priv(indio_dev);
+       int ret;
 
-       *val = axp20x_read_variable_width(info->regmap, chan->address, 12);
-       if (*val < 0)
-               return *val;
+       ret = axp20x_read_variable_width(info->regmap, chan->address, 12);
+       if (ret < 0)
+               return ret;
 
+       *val = ret;
        return IIO_VAL_INT;
 }
 
@@ -269,11 +273,13 @@ static int axp813_adc_raw(struct iio_dev *indio_dev,
                          struct iio_chan_spec const *chan, int *val)
 {
        struct axp20x_adc_iio *info = iio_priv(indio_dev);
+       int ret;
 
-       *val = axp20x_read_variable_width(info->regmap, chan->address, 12);
-       if (*val < 0)
-               return *val;
+       ret = axp20x_read_variable_width(info->regmap, chan->address, 12);
+       if (ret < 0)
+               return ret;
 
+       *val = ret;
        return IIO_VAL_INT;
 }
 
@@ -443,27 +449,27 @@ static int axp20x_adc_offset_voltage(struct iio_dev *indio_dev, int channel,
                                     int *val)
 {
        struct axp20x_adc_iio *info = iio_priv(indio_dev);
+       unsigned int regval;
        int ret;
 
-       ret = regmap_read(info->regmap, AXP20X_GPIO10_IN_RANGE, val);
+       ret = regmap_read(info->regmap, AXP20X_GPIO10_IN_RANGE, &regval);
        if (ret < 0)
                return ret;
 
        switch (channel) {
        case AXP20X_GPIO0_V:
-               *val &= AXP20X_GPIO10_IN_RANGE_GPIO0;
+               regval = FIELD_GET(AXP20X_GPIO10_IN_RANGE_GPIO0, regval);
                break;
 
        case AXP20X_GPIO1_V:
-               *val &= AXP20X_GPIO10_IN_RANGE_GPIO1;
+               regval = FIELD_GET(AXP20X_GPIO10_IN_RANGE_GPIO1, regval);
                break;
 
        default:
                return -EINVAL;
        }
 
-       *val = *val ? 700000 : 0;
-
+       *val = regval ? 700000 : 0;
        return IIO_VAL_INT;
 }
 
@@ -548,7 +554,7 @@ static int axp20x_write_raw(struct iio_dev *indio_dev,
                            long mask)
 {
        struct axp20x_adc_iio *info = iio_priv(indio_dev);
-       unsigned int reg, regval;
+       unsigned int regmask, regval;
 
        /*
         * The AXP20X PMIC allows the user to choose between 0V and 0.7V offsets
@@ -560,25 +566,22 @@ static int axp20x_write_raw(struct iio_dev *indio_dev,
        if (val != 0 && val != 700000)
                return -EINVAL;
 
-       val = val ? 1 : 0;
-
        switch (chan->channel) {
        case AXP20X_GPIO0_V:
-               reg = AXP20X_GPIO10_IN_RANGE_GPIO0;
-               regval = AXP20X_GPIO10_IN_RANGE_GPIO0_VAL(val);
+               regmask = AXP20X_GPIO10_IN_RANGE_GPIO0;
+               regval = FIELD_PREP(AXP20X_GPIO10_IN_RANGE_GPIO0, !!val);
                break;
 
        case AXP20X_GPIO1_V:
-               reg = AXP20X_GPIO10_IN_RANGE_GPIO1;
-               regval = AXP20X_GPIO10_IN_RANGE_GPIO1_VAL(val);
+               regmask = AXP20X_GPIO10_IN_RANGE_GPIO1;
+               regval = FIELD_PREP(AXP20X_GPIO10_IN_RANGE_GPIO1, !!val);
                break;
 
        default:
                return -EINVAL;
        }
 
-       return regmap_update_bits(info->regmap, AXP20X_GPIO10_IN_RANGE, reg,
-                                 regval);
+       return regmap_update_bits(info->regmap, AXP20X_GPIO10_IN_RANGE, regmask, regval);
 }
 
 static const struct iio_info axp20x_adc_iio_info = {