]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
iio: adc: spear_adc: mask SPEAR_ADC_STATUS channel and avg sample before setting...
authorRodrigo Gobbi <rodrigo.gobbi.7@gmail.com>
Thu, 17 Jul 2025 22:13:49 +0000 (19:13 -0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 16 Aug 2025 10:57:04 +0000 (11:57 +0100)
avg sample info is a bit field coded inside the following
bits: 5,6,7 and 8 of a device status register.

Channel num info the same, but over bits: 1, 2 and 3.

Mask both values in order to avoid touching other register bits,
since the first info (avg sample), came from DT.

Signed-off-by: Rodrigo Gobbi <rodrigo.gobbi.7@gmail.com>
Reviewed-by: David Lechner <dlechner@baylibre.com>
Link: https://patch.msgid.link/20250717221559.158872-1-rodrigo.gobbi.7@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/spear_adc.c

index e3a865c79686ebf73dafddabdc6822dfcff3df51..df100dce77da48bb6d23f189095119f1c295c42c 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/io.h>
+#include <linux/bitfield.h>
 #include <linux/clk.h>
 #include <linux/err.h>
 #include <linux/completion.h>
@@ -29,9 +30,9 @@
 
 /* Bit definitions for SPEAR_ADC_STATUS */
 #define SPEAR_ADC_STATUS_START_CONVERSION      BIT(0)
-#define SPEAR_ADC_STATUS_CHANNEL_NUM(x)                ((x) << 1)
+#define SPEAR_ADC_STATUS_CHANNEL_NUM_MASK      GENMASK(3, 1)
 #define SPEAR_ADC_STATUS_ADC_ENABLE            BIT(4)
-#define SPEAR_ADC_STATUS_AVG_SAMPLE(x)         ((x) << 5)
+#define SPEAR_ADC_STATUS_AVG_SAMPLE_MASK       GENMASK(8, 5)
 #define SPEAR_ADC_STATUS_VREF_INTERNAL         BIT(9)
 
 #define SPEAR_ADC_DATA_MASK            0x03ff
@@ -157,8 +158,8 @@ static int spear_adc_read_raw(struct iio_dev *indio_dev,
        case IIO_CHAN_INFO_RAW:
                mutex_lock(&st->lock);
 
-               status = SPEAR_ADC_STATUS_CHANNEL_NUM(chan->channel) |
-                       SPEAR_ADC_STATUS_AVG_SAMPLE(st->avg_samples) |
+               status = FIELD_PREP(SPEAR_ADC_STATUS_CHANNEL_NUM_MASK, chan->channel) |
+                       FIELD_PREP(SPEAR_ADC_STATUS_AVG_SAMPLE_MASK, st->avg_samples) |
                        SPEAR_ADC_STATUS_START_CONVERSION |
                        SPEAR_ADC_STATUS_ADC_ENABLE;
                if (st->vref_external == 0)