Skip to content

Commit 4bd7e5c

Browse files
AbhashPLjic23
authored andcommitted
iio: light: ltr390: Calculate 'counts_per_uvi' dynamically
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 <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jonathan Cameron <[email protected]>
1 parent 14e0d91 commit 4bd7e5c

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

drivers/iio/light/ltr390.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646
#define LTR390_UVS_MODE BIT(3)
4747
#define LTR390_SENSOR_ENABLE BIT(1)
4848

49+
#define LTR390_FRACTIONAL_PRECISION 100
50+
4951
/*
5052
* At 20-bit resolution (integration time: 400ms) and 18x gain, 2300 counts of
5153
* 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)
125127
return 0;
126128
}
127129

130+
static int ltr390_counts_per_uvi(struct ltr390_data *data)
131+
{
132+
const int orig_gain = 18;
133+
const int orig_int_time = 400;
134+
135+
return DIV_ROUND_CLOSEST(23 * data->gain * data->int_time_us, 10 * orig_gain * orig_int_time);
136+
}
137+
128138
static int ltr390_read_raw(struct iio_dev *iio_device,
129139
struct iio_chan_spec const *chan, int *val,
130140
int *val2, long mask)
@@ -164,8 +174,8 @@ static int ltr390_read_raw(struct iio_dev *iio_device,
164174
case IIO_CHAN_INFO_SCALE:
165175
switch (chan->type) {
166176
case IIO_UVINDEX:
167-
*val = LTR390_WINDOW_FACTOR;
168-
*val2 = LTR390_COUNTS_PER_UVI;
177+
*val = LTR390_WINDOW_FACTOR * LTR390_FRACTIONAL_PRECISION;
178+
*val2 = ltr390_counts_per_uvi(data);
169179
return IIO_VAL_FRACTIONAL;
170180

171181
case IIO_LIGHT:

0 commit comments

Comments
 (0)