iio: temperature: mlx90632 Read sampling frequency
authorCrt Mori <cmo@melexis.com>
Thu, 22 Sep 2022 08:13:23 +0000 (10:13 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Wed, 23 Nov 2022 19:43:57 +0000 (19:43 +0000)
Allow users to read sensor sampling frequency to better plan the
application measurement requests.

Signed-off-by: Crt Mori <cmo@melexis.com>
Link: https://lore.kernel.org/r/0bd6d6d665b4bd39e4565f6f44cb1bdc03386e23.1663834141.git.cmo@melexis.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/temperature/mlx90632.c

index 71130d237a6912340d226c516a5ea568072164c7..08180394026168ee13a0cfc1e575b7bbe5d188a4 100644 (file)
@@ -81,6 +81,9 @@
 #define MLX90632_PWR_STATUS_CONTINUOUS MLX90632_PWR_STATUS(3) /* continuous */
 
 #define MLX90632_EE_RR GENMASK(10, 8) /* Only Refresh Rate bits */
+#define MLX90632_REFRESH_RATE(ee_val) FIELD_GET(MLX90632_EE_RR, ee_val)
+                                       /* Extract Refresh Rate from ee register */
+#define MLX90632_REFRESH_RATE_STATUS(refresh_rate) (refresh_rate << 8)
 
 /* Measurement types */
 #define MLX90632_MTYP_MEDICAL 0
@@ -914,6 +917,32 @@ static int mlx90632_calc_ambient_dsp105(struct mlx90632_data *data, int *val)
        return ret;
 }
 
+static int mlx90632_get_refresh_rate(struct mlx90632_data *data,
+                                    int *refresh_rate)
+{
+       unsigned int meas1;
+       int ret;
+
+       ret = regmap_read(data->regmap, MLX90632_EE_MEDICAL_MEAS1, &meas1);
+       if (ret < 0)
+               return ret;
+
+       *refresh_rate = MLX90632_REFRESH_RATE(meas1);
+
+       return ret;
+}
+
+static const int mlx90632_freqs[][2] = {
+       {0, 500000},
+       {1, 0},
+       {2, 0},
+       {4, 0},
+       {8, 0},
+       {16, 0},
+       {32, 0},
+       {64, 0}
+};
+
 /**
  * mlx90632_pm_interraction_wakeup() - Measure time between user interactions to change powermode
  * @data: pointer to mlx90632_data object containing interaction_ts information
@@ -992,6 +1021,15 @@ static int mlx90632_read_raw(struct iio_dev *indio_dev,
                *val = data->object_ambient_temperature;
                ret = IIO_VAL_INT;
                break;
+       case IIO_CHAN_INFO_SAMP_FREQ:
+               ret = mlx90632_get_refresh_rate(data, &cr);
+               if (ret < 0)
+                       goto mlx90632_read_raw_pm;
+
+               *val = mlx90632_freqs[cr][0];
+               *val2 = mlx90632_freqs[cr][1];
+               ret = IIO_VAL_INT_PLUS_MICRO;
+               break;
        default:
                ret = -EINVAL;
                break;
@@ -1025,12 +1063,30 @@ static int mlx90632_write_raw(struct iio_dev *indio_dev,
        }
 }
 
+static int mlx90632_read_avail(struct iio_dev *indio_dev,
+                              struct iio_chan_spec const *chan,
+                              const int **vals, int *type, int *length,
+                              long mask)
+{
+       switch (mask) {
+       case IIO_CHAN_INFO_SAMP_FREQ:
+               *vals = (int *)mlx90632_freqs;
+               *type = IIO_VAL_INT_PLUS_MICRO;
+               *length = 2 * ARRAY_SIZE(mlx90632_freqs);
+               return IIO_AVAIL_LIST;
+       default:
+               return -EINVAL;
+       }
+}
+
 static const struct iio_chan_spec mlx90632_channels[] = {
        {
                .type = IIO_TEMP,
                .modified = 1,
                .channel2 = IIO_MOD_TEMP_AMBIENT,
                .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),
+               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
+               .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_SAMP_FREQ),
        },
        {
                .type = IIO_TEMP,
@@ -1038,12 +1094,15 @@ static const struct iio_chan_spec mlx90632_channels[] = {
                .channel2 = IIO_MOD_TEMP_OBJECT,
                .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
                        BIT(IIO_CHAN_INFO_CALIBEMISSIVITY) | BIT(IIO_CHAN_INFO_CALIBAMBIENT),
+               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
+               .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_SAMP_FREQ),
        },
 };
 
 static const struct iio_info mlx90632_info = {
        .read_raw = mlx90632_read_raw,
        .write_raw = mlx90632_write_raw,
+       .read_avail = mlx90632_read_avail,
 };
 
 static void mlx90632_sleep(void *_data)