]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: light: ltr390: Calculate 'counts_per_uvi' dynamically
authorAbhash Jha <abhashkumarjha123@gmail.com>
Wed, 14 Aug 2024 11:31:34 +0000 (17:01 +0530)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 17 Aug 2024 14:38:14 +0000 (15:38 +0100)
counts_per_uvi depends on the current value of gain and resolution.
Hence, we cannot use the hardcoded value 96.
The `counts_per_uvi` function gives the count based on the current gain
and resolution (integration time).

Signed-off-by: Abhash Jha <abhashkumarjha123@gmail.com>
Link: https://patch.msgid.link/20240814113135.14575-3-abhashkumarjha123@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/light/ltr390.c

index 16e06f2ab8783b42736e78a95816a439f192d501..7e58b50f3660332366a787a1fc8f4d1508cf627a 100644 (file)
@@ -46,6 +46,8 @@
 #define LTR390_UVS_MODE              BIT(3)
 #define LTR390_SENSOR_ENABLE  BIT(1)
 
+#define LTR390_FRACTIONAL_PRECISION 100
+
 /*
  * At 20-bit resolution (integration time: 400ms) and 18x gain, 2300 counts of
  * the sensor are equal to 1 UV Index [Datasheet Page#8].
@@ -125,6 +127,14 @@ static int ltr390_set_mode(struct ltr390_data *data, enum ltr390_mode mode)
        return 0;
 }
 
+static int ltr390_counts_per_uvi(struct ltr390_data *data)
+{
+       const int orig_gain = 18;
+       const int orig_int_time = 400;
+
+       return DIV_ROUND_CLOSEST(23 * data->gain * data->int_time_us, 10 * orig_gain * orig_int_time);
+}
+
 static int ltr390_read_raw(struct iio_dev *iio_device,
                           struct iio_chan_spec const *chan, int *val,
                           int *val2, long mask)
@@ -164,8 +174,8 @@ static int ltr390_read_raw(struct iio_dev *iio_device,
        case IIO_CHAN_INFO_SCALE:
                switch (chan->type) {
                case IIO_UVINDEX:
-                       *val = LTR390_WINDOW_FACTOR;
-                       *val2 = LTR390_COUNTS_PER_UVI;
+                       *val = LTR390_WINDOW_FACTOR * LTR390_FRACTIONAL_PRECISION;
+                       *val2 = ltr390_counts_per_uvi(data);
                        return IIO_VAL_FRACTIONAL;
 
                case IIO_LIGHT: