1 // SPDX-License-Identifier: GPL-2.0-only
3 * LTRF216A Ambient Light Sensor
5 * Copyright (C) 2022 Collabora, Ltd.
6 * Author: Shreeya Patel <shreeya.patel@collabora.com>
8 * Copyright (C) 2021 Lite-On Technology Corp (Singapore)
9 * Author: Shi Zhigang <Zhigang.Shi@liteon.com>
11 * IIO driver for LTRF216A (7-bit I2C slave address 0x53).
14 #include <linux/bitfield.h>
15 #include <linux/bits.h>
16 #include <linux/delay.h>
17 #include <linux/i2c.h>
18 #include <linux/init.h>
19 #include <linux/iopoll.h>
20 #include <linux/mod_devicetable.h>
21 #include <linux/module.h>
22 #include <linux/mutex.h>
24 #include <linux/pm_runtime.h>
25 #include <linux/regmap.h>
27 #include <linux/iio/iio.h>
29 #include <linux/unaligned.h>
31 #define LTRF216A_ALS_RESET_MASK BIT(4)
32 #define LTRF216A_ALS_DATA_STATUS BIT(3)
33 #define LTRF216A_ALS_ENABLE_MASK BIT(1)
34 #define LTRF216A_MAIN_CTRL 0x00
35 #define LTRF216A_ALS_MEAS_RES 0x04
36 #define LTRF216A_ALS_GAIN 0x05
37 #define LTRF216A_PART_ID 0x06
38 #define LTRF216A_MAIN_STATUS 0x07
39 #define LTRF216A_ALS_CLEAR_DATA_0 0x0a
40 #define LTRF216A_ALS_CLEAR_DATA_1 0x0b
41 #define LTRF216A_ALS_CLEAR_DATA_2 0x0c
42 #define LTRF216A_ALS_DATA_0 0x0d
43 #define LTRF216A_ALS_DATA_1 0x0e
44 #define LTRF216A_ALS_DATA_2 0x0f
45 #define LTRF216A_INT_CFG 0x19
46 #define LTRF216A_INT_PST 0x1a
47 #define LTRF216A_ALS_THRES_UP_0 0x21
48 #define LTRF216A_ALS_THRES_UP_1 0x22
49 #define LTRF216A_ALS_THRES_UP_2 0x23
50 #define LTRF216A_ALS_THRES_LOW_0 0x24
51 #define LTRF216A_ALS_THRES_LOW_1 0x25
52 #define LTRF216A_ALS_THRES_LOW_2 0x26
53 #define LTRF216A_ALS_READ_DATA_DELAY_US 20000
55 static const int ltrf216a_int_time_available
[][2] = {
63 static const int ltrf216a_int_time_reg
[][2] = {
71 struct ltr_chip_info
{
72 /* Chip contains CLEAR_DATA_0/1/2 registers at offset 0xa..0xc */
74 /* Lux calculation multiplier for ALS data */
79 * Window Factor is needed when the device is under Window glass
80 * with coated tinted ink. This is to compensate for the light loss
81 * due to the lower transmission rate of the window glass and helps
84 #define LTRF216A_WIN_FAC 1
86 struct ltrf216a_data
{
87 struct regmap
*regmap
;
88 struct i2c_client
*client
;
89 const struct ltr_chip_info
*info
;
94 * Protects regmap accesses and makes sure integration time
95 * remains constant during the measurement of lux.
100 static const struct iio_chan_spec ltrf216a_channels
[] = {
103 .info_mask_separate
=
104 BIT(IIO_CHAN_INFO_RAW
) |
105 BIT(IIO_CHAN_INFO_PROCESSED
) |
106 BIT(IIO_CHAN_INFO_INT_TIME
),
107 .info_mask_separate_available
=
108 BIT(IIO_CHAN_INFO_INT_TIME
),
112 static void ltrf216a_reset(struct iio_dev
*indio_dev
)
114 struct ltrf216a_data
*data
= iio_priv(indio_dev
);
116 /* reset sensor, chip fails to respond to this, so ignore any errors */
117 regmap_write(data
->regmap
, LTRF216A_MAIN_CTRL
, LTRF216A_ALS_RESET_MASK
);
120 usleep_range(1000, 2000);
123 static int ltrf216a_enable(struct iio_dev
*indio_dev
)
125 struct ltrf216a_data
*data
= iio_priv(indio_dev
);
126 struct device
*dev
= &data
->client
->dev
;
130 ret
= regmap_set_bits(data
->regmap
,
131 LTRF216A_MAIN_CTRL
, LTRF216A_ALS_ENABLE_MASK
);
133 dev_err(dev
, "failed to enable sensor: %d\n", ret
);
137 /* sleep for one integration cycle after enabling the device */
138 msleep(ltrf216a_int_time_reg
[0][0]);
143 static int ltrf216a_disable(struct iio_dev
*indio_dev
)
145 struct ltrf216a_data
*data
= iio_priv(indio_dev
);
146 struct device
*dev
= &data
->client
->dev
;
149 ret
= regmap_write(data
->regmap
, LTRF216A_MAIN_CTRL
, 0);
151 dev_err(dev
, "failed to disable sensor: %d\n", ret
);
156 static void ltrf216a_cleanup(void *data
)
158 struct iio_dev
*indio_dev
= data
;
160 ltrf216a_disable(indio_dev
);
163 static int ltrf216a_set_int_time(struct ltrf216a_data
*data
, int itime
)
165 struct device
*dev
= &data
->client
->dev
;
170 for (i
= 0; i
< ARRAY_SIZE(ltrf216a_int_time_available
); i
++) {
171 if (ltrf216a_int_time_available
[i
][1] == itime
)
174 if (i
== ARRAY_SIZE(ltrf216a_int_time_available
))
177 reg_val
= ltrf216a_int_time_reg
[i
][1];
179 ret
= regmap_write(data
->regmap
, LTRF216A_ALS_MEAS_RES
, reg_val
);
181 dev_err(dev
, "failed to set integration time: %d\n", ret
);
185 data
->int_time_fac
= ltrf216a_int_time_reg
[i
][0];
186 data
->int_time
= itime
;
191 static int ltrf216a_get_int_time(struct ltrf216a_data
*data
,
195 *val2
= data
->int_time
;
196 return IIO_VAL_INT_PLUS_MICRO
;
199 static int ltrf216a_set_power_state(struct ltrf216a_data
*data
, bool on
)
201 struct device
*dev
= &data
->client
->dev
;
205 ret
= pm_runtime_resume_and_get(dev
);
207 dev_err(dev
, "failed to resume runtime PM: %d\n", ret
);
211 pm_runtime_mark_last_busy(dev
);
212 pm_runtime_put_autosuspend(dev
);
218 static int ltrf216a_read_data(struct ltrf216a_data
*data
, u8 addr
)
220 struct device
*dev
= &data
->client
->dev
;
224 ret
= regmap_read_poll_timeout(data
->regmap
, LTRF216A_MAIN_STATUS
,
225 val
, val
& LTRF216A_ALS_DATA_STATUS
,
226 LTRF216A_ALS_READ_DATA_DELAY_US
,
227 LTRF216A_ALS_READ_DATA_DELAY_US
* 50);
229 dev_err(dev
, "failed to wait for measurement data: %d\n", ret
);
233 ret
= regmap_bulk_read(data
->regmap
, addr
, buf
, sizeof(buf
));
235 dev_err(dev
, "failed to read measurement data: %d\n", ret
);
239 return get_unaligned_le24(&buf
[0]);
242 static int ltrf216a_get_lux(struct ltrf216a_data
*data
)
247 ret
= ltrf216a_set_power_state(data
, true);
251 greendata
= ltrf216a_read_data(data
, LTRF216A_ALS_DATA_0
);
255 ltrf216a_set_power_state(data
, false);
257 lux
= greendata
* data
->info
->lux_multiplier
* LTRF216A_WIN_FAC
;
262 static int ltrf216a_read_raw(struct iio_dev
*indio_dev
,
263 struct iio_chan_spec
const *chan
, int *val
,
264 int *val2
, long mask
)
266 struct ltrf216a_data
*data
= iio_priv(indio_dev
);
270 case IIO_CHAN_INFO_RAW
:
271 ret
= ltrf216a_set_power_state(data
, true);
274 mutex_lock(&data
->lock
);
275 ret
= ltrf216a_read_data(data
, LTRF216A_ALS_DATA_0
);
276 mutex_unlock(&data
->lock
);
277 ltrf216a_set_power_state(data
, false);
282 case IIO_CHAN_INFO_PROCESSED
:
283 mutex_lock(&data
->lock
);
284 ret
= ltrf216a_get_lux(data
);
285 mutex_unlock(&data
->lock
);
289 *val2
= data
->als_gain_fac
* data
->int_time_fac
;
290 return IIO_VAL_FRACTIONAL
;
291 case IIO_CHAN_INFO_INT_TIME
:
292 mutex_lock(&data
->lock
);
293 ret
= ltrf216a_get_int_time(data
, val
, val2
);
294 mutex_unlock(&data
->lock
);
301 static int ltrf216a_write_raw(struct iio_dev
*indio_dev
,
302 struct iio_chan_spec
const *chan
, int val
,
305 struct ltrf216a_data
*data
= iio_priv(indio_dev
);
309 case IIO_CHAN_INFO_INT_TIME
:
312 mutex_lock(&data
->lock
);
313 ret
= ltrf216a_set_int_time(data
, val2
);
314 mutex_unlock(&data
->lock
);
321 static int ltrf216a_read_available(struct iio_dev
*indio_dev
,
322 struct iio_chan_spec
const *chan
,
323 const int **vals
, int *type
, int *length
,
327 case IIO_CHAN_INFO_INT_TIME
:
328 *length
= ARRAY_SIZE(ltrf216a_int_time_available
) * 2;
329 *vals
= (const int *)ltrf216a_int_time_available
;
330 *type
= IIO_VAL_INT_PLUS_MICRO
;
331 return IIO_AVAIL_LIST
;
337 static const struct iio_info ltrf216a_info
= {
338 .read_raw
= ltrf216a_read_raw
,
339 .write_raw
= ltrf216a_write_raw
,
340 .read_avail
= ltrf216a_read_available
,
343 static bool ltrf216a_readable_reg(struct device
*dev
, unsigned int reg
)
345 struct iio_dev
*indio_dev
= i2c_get_clientdata(to_i2c_client(dev
));
346 struct ltrf216a_data
*data
= iio_priv(indio_dev
);
349 case LTRF216A_MAIN_CTRL
:
350 case LTRF216A_ALS_MEAS_RES
:
351 case LTRF216A_ALS_GAIN
:
352 case LTRF216A_PART_ID
:
353 case LTRF216A_MAIN_STATUS
:
354 case LTRF216A_ALS_DATA_0
:
355 case LTRF216A_ALS_DATA_1
:
356 case LTRF216A_ALS_DATA_2
:
357 case LTRF216A_INT_CFG
:
358 case LTRF216A_INT_PST
:
359 case LTRF216A_ALS_THRES_UP_0
:
360 case LTRF216A_ALS_THRES_UP_1
:
361 case LTRF216A_ALS_THRES_UP_2
:
362 case LTRF216A_ALS_THRES_LOW_0
:
363 case LTRF216A_ALS_THRES_LOW_1
:
364 case LTRF216A_ALS_THRES_LOW_2
:
366 case LTRF216A_ALS_CLEAR_DATA_0
:
367 case LTRF216A_ALS_CLEAR_DATA_1
:
368 case LTRF216A_ALS_CLEAR_DATA_2
:
369 return data
->info
->has_clear_data
;
375 static bool ltrf216a_writable_reg(struct device
*dev
, unsigned int reg
)
378 case LTRF216A_MAIN_CTRL
:
379 case LTRF216A_ALS_MEAS_RES
:
380 case LTRF216A_ALS_GAIN
:
381 case LTRF216A_INT_CFG
:
382 case LTRF216A_INT_PST
:
383 case LTRF216A_ALS_THRES_UP_0
:
384 case LTRF216A_ALS_THRES_UP_1
:
385 case LTRF216A_ALS_THRES_UP_2
:
386 case LTRF216A_ALS_THRES_LOW_0
:
387 case LTRF216A_ALS_THRES_LOW_1
:
388 case LTRF216A_ALS_THRES_LOW_2
:
395 static bool ltrf216a_volatile_reg(struct device
*dev
, unsigned int reg
)
397 struct iio_dev
*indio_dev
= i2c_get_clientdata(to_i2c_client(dev
));
398 struct ltrf216a_data
*data
= iio_priv(indio_dev
);
401 case LTRF216A_MAIN_STATUS
:
402 case LTRF216A_ALS_DATA_0
:
403 case LTRF216A_ALS_DATA_1
:
404 case LTRF216A_ALS_DATA_2
:
407 * If these registers are not present on a chip (like LTR-308),
408 * the missing registers are not considered volatile.
410 case LTRF216A_ALS_CLEAR_DATA_0
:
411 case LTRF216A_ALS_CLEAR_DATA_1
:
412 case LTRF216A_ALS_CLEAR_DATA_2
:
413 return data
->info
->has_clear_data
;
419 static bool ltrf216a_precious_reg(struct device
*dev
, unsigned int reg
)
421 return reg
== LTRF216A_MAIN_STATUS
;
424 static const struct regmap_config ltrf216a_regmap_config
= {
428 .cache_type
= REGCACHE_RBTREE
,
429 .max_register
= LTRF216A_ALS_THRES_LOW_2
,
430 .readable_reg
= ltrf216a_readable_reg
,
431 .writeable_reg
= ltrf216a_writable_reg
,
432 .volatile_reg
= ltrf216a_volatile_reg
,
433 .precious_reg
= ltrf216a_precious_reg
,
434 .disable_locking
= true,
437 static int ltrf216a_probe(struct i2c_client
*client
)
439 struct ltrf216a_data
*data
;
440 struct iio_dev
*indio_dev
;
443 indio_dev
= devm_iio_device_alloc(&client
->dev
, sizeof(*data
));
447 data
= iio_priv(indio_dev
);
449 data
->regmap
= devm_regmap_init_i2c(client
, <rf216a_regmap_config
);
450 if (IS_ERR(data
->regmap
))
451 return dev_err_probe(&client
->dev
, PTR_ERR(data
->regmap
),
452 "regmap initialization failed\n");
454 i2c_set_clientdata(client
, indio_dev
);
455 data
->client
= client
;
456 data
->info
= i2c_get_match_data(client
);
458 mutex_init(&data
->lock
);
460 indio_dev
->info
= <rf216a_info
;
461 indio_dev
->name
= "ltrf216a";
462 indio_dev
->channels
= ltrf216a_channels
;
463 indio_dev
->num_channels
= ARRAY_SIZE(ltrf216a_channels
);
464 indio_dev
->modes
= INDIO_DIRECT_MODE
;
466 ret
= pm_runtime_set_active(&client
->dev
);
470 /* reset sensor, chip fails to respond to this, so ignore any errors */
471 ltrf216a_reset(indio_dev
);
473 ret
= regmap_reinit_cache(data
->regmap
, <rf216a_regmap_config
);
475 return dev_err_probe(&client
->dev
, ret
,
476 "failed to reinit regmap cache\n");
478 ret
= ltrf216a_enable(indio_dev
);
482 ret
= devm_add_action_or_reset(&client
->dev
, ltrf216a_cleanup
,
487 ret
= devm_pm_runtime_enable(&client
->dev
);
489 return dev_err_probe(&client
->dev
, ret
,
490 "failed to enable runtime PM\n");
492 pm_runtime_set_autosuspend_delay(&client
->dev
, 1000);
493 pm_runtime_use_autosuspend(&client
->dev
);
495 data
->int_time
= 100000;
496 data
->int_time_fac
= 100;
497 data
->als_gain_fac
= 3;
499 return devm_iio_device_register(&client
->dev
, indio_dev
);
502 static int ltrf216a_runtime_suspend(struct device
*dev
)
504 struct iio_dev
*indio_dev
= i2c_get_clientdata(to_i2c_client(dev
));
505 struct ltrf216a_data
*data
= iio_priv(indio_dev
);
508 ret
= ltrf216a_disable(indio_dev
);
512 regcache_cache_only(data
->regmap
, true);
517 static int ltrf216a_runtime_resume(struct device
*dev
)
519 struct iio_dev
*indio_dev
= i2c_get_clientdata(to_i2c_client(dev
));
520 struct ltrf216a_data
*data
= iio_priv(indio_dev
);
523 regcache_cache_only(data
->regmap
, false);
524 regcache_mark_dirty(data
->regmap
);
525 ret
= regcache_sync(data
->regmap
);
529 ret
= ltrf216a_enable(indio_dev
);
536 regcache_cache_only(data
->regmap
, true);
541 static DEFINE_RUNTIME_DEV_PM_OPS(ltrf216a_pm_ops
, ltrf216a_runtime_suspend
,
542 ltrf216a_runtime_resume
, NULL
);
544 static const struct ltr_chip_info ltr308_chip_info
= {
545 .has_clear_data
= false,
546 .lux_multiplier
= 60,
549 static const struct ltr_chip_info ltrf216a_chip_info
= {
550 .has_clear_data
= true,
551 .lux_multiplier
= 45,
554 static const struct i2c_device_id ltrf216a_id
[] = {
555 { "ltr308", .driver_data
= (kernel_ulong_t
)<r308_chip_info
},
556 { "ltrf216a", .driver_data
= (kernel_ulong_t
)<rf216a_chip_info
},
559 MODULE_DEVICE_TABLE(i2c
, ltrf216a_id
);
561 static const struct of_device_id ltrf216a_of_match
[] = {
562 { .compatible
= "liteon,ltr308", .data
= <r308_chip_info
},
563 { .compatible
= "liteon,ltrf216a", .data
= <rf216a_chip_info
},
564 /* For Valve's Steamdeck device, an ACPI platform using PRP0001 */
565 { .compatible
= "ltr,ltrf216a", .data
= <rf216a_chip_info
},
568 MODULE_DEVICE_TABLE(of
, ltrf216a_of_match
);
570 static struct i2c_driver ltrf216a_driver
= {
573 .pm
= pm_ptr(<rf216a_pm_ops
),
574 .of_match_table
= ltrf216a_of_match
,
576 .probe
= ltrf216a_probe
,
577 .id_table
= ltrf216a_id
,
579 module_i2c_driver(ltrf216a_driver
);
581 MODULE_AUTHOR("Shreeya Patel <shreeya.patel@collabora.com>");
582 MODULE_AUTHOR("Shi Zhigang <Zhigang.Shi@liteon.com>");
583 MODULE_DESCRIPTION("LTRF216A ambient light sensor driver");
584 MODULE_LICENSE("GPL");