1 // SPDX-License-Identifier: GPL-2.0-only
3 * ROHM Colour Sensor driver for
4 * - BU27008 RGBC sensor
5 * - BU27010 RGBC + Flickering sensor
7 * Copyright (c) 2023, ROHM Semiconductor.
10 #include <linux/bitfield.h>
11 #include <linux/bitops.h>
12 #include <linux/device.h>
13 #include <linux/i2c.h>
14 #include <linux/interrupt.h>
15 #include <linux/module.h>
16 #include <linux/property.h>
17 #include <linux/regmap.h>
18 #include <linux/regulator/consumer.h>
19 #include <linux/units.h>
21 #include <linux/iio/iio.h>
22 #include <linux/iio/iio-gts-helper.h>
23 #include <linux/iio/trigger.h>
24 #include <linux/iio/trigger_consumer.h>
25 #include <linux/iio/triggered_buffer.h>
28 * A word about register address and mask definitions.
30 * At a quick glance to the data-sheet register tables, the BU27010 has all the
31 * registers that the BU27008 has. On top of that the BU27010 adds couple of new
34 * So, all definitions BU27008_REG_* are there also for BU27010 but none of the
35 * BU27010_REG_* are present on BU27008. This makes sense as BU27010 just adds
36 * some features (Flicker FIFO, more power control) on top of the BU27008.
38 * Unfortunately, some of the wheel has been re-invented. Even though the names
39 * of the registers have stayed the same, pretty much all of the functionality
40 * provided by the registers has changed place. Contents of all MODE_CONTROL
41 * registers on BU27008 and BU27010 are different.
43 * Chip-specific mapping from register addresses/bits to functionality is done
44 * in bu27_chip_data structures.
46 #define BU27008_REG_SYSTEM_CONTROL 0x40
47 #define BU27008_MASK_SW_RESET BIT(7)
48 #define BU27008_MASK_PART_ID GENMASK(5, 0)
49 #define BU27008_ID 0x1a
50 #define BU27008_REG_MODE_CONTROL1 0x41
51 #define BU27008_MASK_MEAS_MODE GENMASK(2, 0)
52 #define BU27008_MASK_CHAN_SEL GENMASK(3, 2)
54 #define BU27008_REG_MODE_CONTROL2 0x42
55 #define BU27008_MASK_RGBC_GAIN GENMASK(7, 3)
56 #define BU27008_MASK_IR_GAIN_LO GENMASK(2, 0)
57 #define BU27008_SHIFT_IR_GAIN 3
59 #define BU27008_REG_MODE_CONTROL3 0x43
60 #define BU27008_MASK_VALID BIT(7)
61 #define BU27008_MASK_INT_EN BIT(1)
62 #define BU27008_INT_EN BU27008_MASK_INT_EN
63 #define BU27008_INT_DIS 0
64 #define BU27008_MASK_MEAS_EN BIT(0)
65 #define BU27008_MEAS_EN BIT(0)
66 #define BU27008_MEAS_DIS 0
68 #define BU27008_REG_DATA0_LO 0x50
69 #define BU27008_REG_DATA1_LO 0x52
70 #define BU27008_REG_DATA2_LO 0x54
71 #define BU27008_REG_DATA3_LO 0x56
72 #define BU27008_REG_DATA3_HI 0x57
73 #define BU27008_REG_MANUFACTURER_ID 0x92
74 #define BU27008_REG_MAX BU27008_REG_MANUFACTURER_ID
76 /* BU27010 specific definitions */
78 #define BU27010_MASK_SW_RESET BIT(7)
79 #define BU27010_ID 0x1b
80 #define BU27010_REG_POWER 0x3e
81 #define BU27010_MASK_POWER BIT(0)
83 #define BU27010_REG_RESET 0x3f
84 #define BU27010_MASK_RESET BIT(0)
85 #define BU27010_RESET_RELEASE BU27010_MASK_RESET
87 #define BU27010_MASK_MEAS_EN BIT(1)
89 #define BU27010_MASK_CHAN_SEL GENMASK(7, 6)
90 #define BU27010_MASK_MEAS_MODE GENMASK(5, 4)
91 #define BU27010_MASK_RGBC_GAIN GENMASK(3, 0)
93 #define BU27010_MASK_DATA3_GAIN GENMASK(7, 6)
94 #define BU27010_MASK_DATA2_GAIN GENMASK(5, 4)
95 #define BU27010_MASK_DATA1_GAIN GENMASK(3, 2)
96 #define BU27010_MASK_DATA0_GAIN GENMASK(1, 0)
98 #define BU27010_MASK_FLC_MODE BIT(7)
99 #define BU27010_MASK_FLC_GAIN GENMASK(4, 0)
101 #define BU27010_REG_MODE_CONTROL4 0x44
102 /* If flicker is ever to be supported the IRQ must be handled as a field */
103 #define BU27010_IRQ_DIS_ALL GENMASK(1, 0)
104 #define BU27010_DRDY_EN BIT(0)
105 #define BU27010_MASK_INT_SEL GENMASK(1, 0)
107 #define BU27010_REG_MODE_CONTROL5 0x45
108 #define BU27010_MASK_RGB_VALID BIT(7)
109 #define BU27010_MASK_FLC_VALID BIT(6)
110 #define BU27010_MASK_WAIT_EN BIT(3)
111 #define BU27010_MASK_FIFO_EN BIT(2)
112 #define BU27010_MASK_RGB_EN BIT(1)
113 #define BU27010_MASK_FLC_EN BIT(0)
115 #define BU27010_REG_DATA_FLICKER_LO 0x56
116 #define BU27010_MASK_DATA_FLICKER_HI GENMASK(2, 0)
117 #define BU27010_REG_FLICKER_COUNT 0x5a
118 #define BU27010_REG_FIFO_LEVEL_LO 0x5b
119 #define BU27010_MASK_FIFO_LEVEL_HI BIT(0)
120 #define BU27010_REG_FIFO_DATA_LO 0x5d
121 #define BU27010_REG_FIFO_DATA_HI 0x5e
122 #define BU27010_MASK_FIFO_DATA_HI GENMASK(2, 0)
123 #define BU27010_REG_MANUFACTURER_ID 0x92
124 #define BU27010_REG_MAX BU27010_REG_MANUFACTURER_ID
127 * enum bu27008_chan_type - BU27008 channel types
128 * @BU27008_RED: Red channel. Always via data0.
129 * @BU27008_GREEN: Green channel. Always via data1.
130 * @BU27008_BLUE: Blue channel. Via data2 (when used).
131 * @BU27008_CLEAR: Clear channel. Via data2 or data3 (when used).
132 * @BU27008_IR: IR channel. Via data3 (when used).
133 * @BU27008_LUX: Illuminance channel, computed using RGB and IR.
134 * @BU27008_NUM_CHANS: Number of channel types.
136 enum bu27008_chan_type
{
147 * enum bu27008_chan - BU27008 physical data channel
148 * @BU27008_DATA0: Always red.
149 * @BU27008_DATA1: Always green.
150 * @BU27008_DATA2: Blue or clear.
151 * @BU27008_DATA3: IR or clear.
152 * @BU27008_NUM_HW_CHANS: Number of physical channels
162 /* We can always measure red and green at same time */
163 #define ALWAYS_SCANNABLE (BIT(BU27008_RED) | BIT(BU27008_GREEN))
165 /* We use these data channel configs. Ensure scan_masks below follow them too */
166 #define BU27008_BLUE2_CLEAR3 0x0 /* buffer is R, G, B, C */
167 #define BU27008_CLEAR2_IR3 0x1 /* buffer is R, G, C, IR */
168 #define BU27008_BLUE2_IR3 0x2 /* buffer is R, G, B, IR */
170 static const unsigned long bu27008_scan_masks
[] = {
171 /* buffer is R, G, B, C */
172 ALWAYS_SCANNABLE
| BIT(BU27008_BLUE
) | BIT(BU27008_CLEAR
),
173 /* buffer is R, G, C, IR */
174 ALWAYS_SCANNABLE
| BIT(BU27008_CLEAR
) | BIT(BU27008_IR
),
175 /* buffer is R, G, B, IR */
176 ALWAYS_SCANNABLE
| BIT(BU27008_BLUE
) | BIT(BU27008_IR
),
177 /* buffer is R, G, B, IR, LUX */
178 ALWAYS_SCANNABLE
| BIT(BU27008_BLUE
) | BIT(BU27008_IR
) | BIT(BU27008_LUX
),
183 * Available scales with gain 1x - 1024x, timings 55, 100, 200, 400 mS
184 * Time impacts to gain: 1x, 2x, 4x, 8x.
186 * => Max total gain is HWGAIN * gain by integration time (8 * 1024) = 8192
188 * Max amplification is (HWGAIN * MAX integration-time multiplier) 1024 * 8
189 * = 8192. With NANO scale we get rid of accuracy loss when we start with the
190 * scale 16.0 for HWGAIN1, INT-TIME 55 mS. This way the nano scale for MAX
191 * total gain 8192 will be 1953125
193 #define BU27008_SCALE_1X 16
196 * On BU27010 available scales with gain 1x - 4096x,
197 * timings 55, 100, 200, 400 mS. Time impacts to gain: 1x, 2x, 4x, 8x.
199 * => Max total gain is HWGAIN * gain by integration time (8 * 4096)
201 * Using NANO precision for scale we must use scale 64x corresponding gain 1x
202 * to avoid precision loss.
204 #define BU27010_SCALE_1X 64
206 /* See the data sheet for the "Gain Setting" table */
207 #define BU27008_GSEL_1X 0x00
208 #define BU27008_GSEL_4X 0x08
209 #define BU27008_GSEL_8X 0x09
210 #define BU27008_GSEL_16X 0x0a
211 #define BU27008_GSEL_32X 0x0b
212 #define BU27008_GSEL_64X 0x0c
213 #define BU27008_GSEL_256X 0x18
214 #define BU27008_GSEL_512X 0x19
215 #define BU27008_GSEL_1024X 0x1a
217 static const struct iio_gain_sel_pair bu27008_gains
[] = {
218 GAIN_SCALE_GAIN(1, BU27008_GSEL_1X
),
219 GAIN_SCALE_GAIN(4, BU27008_GSEL_4X
),
220 GAIN_SCALE_GAIN(8, BU27008_GSEL_8X
),
221 GAIN_SCALE_GAIN(16, BU27008_GSEL_16X
),
222 GAIN_SCALE_GAIN(32, BU27008_GSEL_32X
),
223 GAIN_SCALE_GAIN(64, BU27008_GSEL_64X
),
224 GAIN_SCALE_GAIN(256, BU27008_GSEL_256X
),
225 GAIN_SCALE_GAIN(512, BU27008_GSEL_512X
),
226 GAIN_SCALE_GAIN(1024, BU27008_GSEL_1024X
),
229 static const struct iio_gain_sel_pair bu27008_gains_ir
[] = {
230 GAIN_SCALE_GAIN(2, BU27008_GSEL_1X
),
231 GAIN_SCALE_GAIN(4, BU27008_GSEL_4X
),
232 GAIN_SCALE_GAIN(8, BU27008_GSEL_8X
),
233 GAIN_SCALE_GAIN(16, BU27008_GSEL_16X
),
234 GAIN_SCALE_GAIN(32, BU27008_GSEL_32X
),
235 GAIN_SCALE_GAIN(64, BU27008_GSEL_64X
),
236 GAIN_SCALE_GAIN(256, BU27008_GSEL_256X
),
237 GAIN_SCALE_GAIN(512, BU27008_GSEL_512X
),
238 GAIN_SCALE_GAIN(1024, BU27008_GSEL_1024X
),
241 #define BU27010_GSEL_1X 0x00 /* 000000 */
242 #define BU27010_GSEL_4X 0x08 /* 001000 */
243 #define BU27010_GSEL_16X 0x09 /* 001001 */
244 #define BU27010_GSEL_64X 0x0e /* 001110 */
245 #define BU27010_GSEL_256X 0x1e /* 011110 */
246 #define BU27010_GSEL_1024X 0x2e /* 101110 */
247 #define BU27010_GSEL_4096X 0x3f /* 111111 */
249 static const struct iio_gain_sel_pair bu27010_gains
[] = {
250 GAIN_SCALE_GAIN(1, BU27010_GSEL_1X
),
251 GAIN_SCALE_GAIN(4, BU27010_GSEL_4X
),
252 GAIN_SCALE_GAIN(16, BU27010_GSEL_16X
),
253 GAIN_SCALE_GAIN(64, BU27010_GSEL_64X
),
254 GAIN_SCALE_GAIN(256, BU27010_GSEL_256X
),
255 GAIN_SCALE_GAIN(1024, BU27010_GSEL_1024X
),
256 GAIN_SCALE_GAIN(4096, BU27010_GSEL_4096X
),
259 static const struct iio_gain_sel_pair bu27010_gains_ir
[] = {
260 GAIN_SCALE_GAIN(2, BU27010_GSEL_1X
),
261 GAIN_SCALE_GAIN(4, BU27010_GSEL_4X
),
262 GAIN_SCALE_GAIN(16, BU27010_GSEL_16X
),
263 GAIN_SCALE_GAIN(64, BU27010_GSEL_64X
),
264 GAIN_SCALE_GAIN(256, BU27010_GSEL_256X
),
265 GAIN_SCALE_GAIN(1024, BU27010_GSEL_1024X
),
266 GAIN_SCALE_GAIN(4096, BU27010_GSEL_4096X
),
269 #define BU27008_MEAS_MODE_100MS 0x00
270 #define BU27008_MEAS_MODE_55MS 0x01
271 #define BU27008_MEAS_MODE_200MS 0x02
272 #define BU27008_MEAS_MODE_400MS 0x04
274 #define BU27010_MEAS_MODE_100MS 0x00
275 #define BU27010_MEAS_MODE_55MS 0x03
276 #define BU27010_MEAS_MODE_200MS 0x01
277 #define BU27010_MEAS_MODE_400MS 0x02
279 #define BU27008_MEAS_TIME_MAX_MS 400
281 static const struct iio_itime_sel_mul bu27008_itimes
[] = {
282 GAIN_SCALE_ITIME_US(400000, BU27008_MEAS_MODE_400MS
, 8),
283 GAIN_SCALE_ITIME_US(200000, BU27008_MEAS_MODE_200MS
, 4),
284 GAIN_SCALE_ITIME_US(100000, BU27008_MEAS_MODE_100MS
, 2),
285 GAIN_SCALE_ITIME_US(55000, BU27008_MEAS_MODE_55MS
, 1),
288 static const struct iio_itime_sel_mul bu27010_itimes
[] = {
289 GAIN_SCALE_ITIME_US(400000, BU27010_MEAS_MODE_400MS
, 8),
290 GAIN_SCALE_ITIME_US(200000, BU27010_MEAS_MODE_200MS
, 4),
291 GAIN_SCALE_ITIME_US(100000, BU27010_MEAS_MODE_100MS
, 2),
292 GAIN_SCALE_ITIME_US(55000, BU27010_MEAS_MODE_55MS
, 1),
296 * All the RGBC channels share the same gain.
297 * IR gain can be fine-tuned from the gain set for the RGBC by 2 bit, but this
298 * would yield quite complex gain setting. Especially since not all bit
299 * compinations are supported. And in any case setting GAIN for RGBC will
300 * always also change the IR-gain.
302 * On top of this, the selector '0' which corresponds to hw-gain 1X on RGBC,
303 * corresponds to gain 2X on IR. Rest of the selctors correspond to same gains
304 * though. This, however, makes it not possible to use shared gain for all
305 * RGBC and IR settings even though they are all changed at the one go.
307 #define BU27008_CHAN(color, data, separate_avail) \
309 .type = IIO_INTENSITY, \
311 .channel2 = IIO_MOD_LIGHT_##color, \
312 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
313 BIT(IIO_CHAN_INFO_SCALE), \
314 .info_mask_separate_available = (separate_avail), \
315 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME), \
316 .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME), \
317 .address = BU27008_REG_##data##_LO, \
318 .scan_index = BU27008_##color, \
323 .endianness = IIO_LE, \
327 /* For raw reads we always configure DATA3 for CLEAR */
328 static const struct iio_chan_spec bu27008_channels
[] = {
329 BU27008_CHAN(RED
, DATA0
, BIT(IIO_CHAN_INFO_SCALE
)),
330 BU27008_CHAN(GREEN
, DATA1
, BIT(IIO_CHAN_INFO_SCALE
)),
331 BU27008_CHAN(BLUE
, DATA2
, BIT(IIO_CHAN_INFO_SCALE
)),
332 BU27008_CHAN(CLEAR
, DATA2
, BIT(IIO_CHAN_INFO_SCALE
)),
334 * We don't allow setting scale for IR (because of shared gain bits).
335 * Hence we don't advertise available ones either.
337 BU27008_CHAN(IR
, DATA3
, 0),
340 .info_mask_separate
= BIT(IIO_CHAN_INFO_RAW
) |
341 BIT(IIO_CHAN_INFO_SCALE
),
342 .channel
= BU27008_LUX
,
343 .scan_index
= BU27008_LUX
,
348 .endianness
= IIO_CPU
,
351 IIO_CHAN_SOFT_TIMESTAMP(BU27008_NUM_CHANS
),
356 struct bu27_chip_data
{
358 int (*chip_init
)(struct bu27008_data
*data
);
359 int (*get_gain_sel
)(struct bu27008_data
*data
, int *sel
);
360 int (*write_gain_sel
)(struct bu27008_data
*data
, int sel
);
361 const struct regmap_config
*regmap_cfg
;
362 const struct iio_gain_sel_pair
*gains
;
363 const struct iio_gain_sel_pair
*gains_ir
;
364 const struct iio_itime_sel_mul
*itimes
;
381 struct bu27008_data
{
382 const struct bu27_chip_data
*cd
;
383 struct regmap
*regmap
;
384 struct iio_trigger
*trig
;
387 struct iio_gts gts_ir
;
391 * Prevent changing gain/time config when scale is read/written.
392 * Similarly, protect the integration_time read/change sequence.
393 * Prevent changing gain/time when data is read.
398 static const struct regmap_range bu27008_volatile_ranges
[] = {
400 .range_min
= BU27008_REG_SYSTEM_CONTROL
, /* SWRESET */
401 .range_max
= BU27008_REG_SYSTEM_CONTROL
,
403 .range_min
= BU27008_REG_MODE_CONTROL3
, /* VALID */
404 .range_max
= BU27008_REG_MODE_CONTROL3
,
406 .range_min
= BU27008_REG_DATA0_LO
, /* DATA */
407 .range_max
= BU27008_REG_DATA3_HI
,
411 static const struct regmap_range bu27010_volatile_ranges
[] = {
413 .range_min
= BU27010_REG_RESET
, /* RSTB */
414 .range_max
= BU27008_REG_SYSTEM_CONTROL
, /* RESET */
416 .range_min
= BU27010_REG_MODE_CONTROL5
, /* VALID bits */
417 .range_max
= BU27010_REG_MODE_CONTROL5
,
419 .range_min
= BU27008_REG_DATA0_LO
,
420 .range_max
= BU27010_REG_FIFO_DATA_HI
,
424 static const struct regmap_access_table bu27008_volatile_regs
= {
425 .yes_ranges
= &bu27008_volatile_ranges
[0],
426 .n_yes_ranges
= ARRAY_SIZE(bu27008_volatile_ranges
),
429 static const struct regmap_access_table bu27010_volatile_regs
= {
430 .yes_ranges
= &bu27010_volatile_ranges
[0],
431 .n_yes_ranges
= ARRAY_SIZE(bu27010_volatile_ranges
),
434 static const struct regmap_range bu27008_read_only_ranges
[] = {
436 .range_min
= BU27008_REG_DATA0_LO
,
437 .range_max
= BU27008_REG_DATA3_HI
,
439 .range_min
= BU27008_REG_MANUFACTURER_ID
,
440 .range_max
= BU27008_REG_MANUFACTURER_ID
,
444 static const struct regmap_range bu27010_read_only_ranges
[] = {
446 .range_min
= BU27008_REG_DATA0_LO
,
447 .range_max
= BU27010_REG_FIFO_DATA_HI
,
449 .range_min
= BU27010_REG_MANUFACTURER_ID
,
450 .range_max
= BU27010_REG_MANUFACTURER_ID
,
454 static const struct regmap_access_table bu27008_ro_regs
= {
455 .no_ranges
= &bu27008_read_only_ranges
[0],
456 .n_no_ranges
= ARRAY_SIZE(bu27008_read_only_ranges
),
459 static const struct regmap_access_table bu27010_ro_regs
= {
460 .no_ranges
= &bu27010_read_only_ranges
[0],
461 .n_no_ranges
= ARRAY_SIZE(bu27010_read_only_ranges
),
464 static const struct regmap_config bu27008_regmap
= {
467 .max_register
= BU27008_REG_MAX
,
468 .cache_type
= REGCACHE_RBTREE
,
469 .volatile_table
= &bu27008_volatile_regs
,
470 .wr_table
= &bu27008_ro_regs
,
472 * All register writes are serialized by the mutex which protects the
473 * scale setting/getting. This is needed because scale is combined by
474 * gain and integration time settings and we need to ensure those are
475 * not read / written when scale is being computed.
477 * As a result of this serializing, we don't need regmap locking. Note,
478 * this is not true if we add any configurations which are not
479 * serialized by the mutex and which may need for example a protected
480 * read-modify-write cycle (eg. regmap_update_bits()). Please, revise
481 * this when adding features to the driver.
483 .disable_locking
= true,
486 static const struct regmap_config bu27010_regmap
= {
490 .max_register
= BU27010_REG_MAX
,
491 .cache_type
= REGCACHE_RBTREE
,
492 .volatile_table
= &bu27010_volatile_regs
,
493 .wr_table
= &bu27010_ro_regs
,
494 .disable_locking
= true,
497 static int bu27008_write_gain_sel(struct bu27008_data
*data
, int sel
)
501 regval
= FIELD_PREP(BU27008_MASK_RGBC_GAIN
, sel
);
504 * We do always set also the LOW bits of IR-gain because othervice we
505 * would risk resulting an invalid GAIN register value.
507 * We could allow setting separate gains for RGBC and IR when the
508 * values were such that HW could support both gain settings.
509 * Eg, when the shared bits were same for both gain values.
511 * This, however, has a negligible benefit compared to the increased
512 * software complexity when we would need to go through the gains
513 * for both channels separately when the integration time changes.
514 * This would end up with nasty logic for computing gain values for
515 * both channels - and rejecting them if shared bits changed.
517 * We should then build the logic by guessing what a user prefers.
518 * RGBC or IR gains correctly set while other jumps to odd value?
519 * Maybe look-up a value where both gains are somehow optimized
520 * <what this somehow is, is ATM unknown to us>. Or maybe user would
521 * expect us to reject changes when optimal gains can't be set to both
522 * channels w/given integration time. At best that would result
523 * solution that works well for a very specific subset of
524 * configurations but causes unexpected corner-cases.
526 * So, we keep it simple. Always set same selector to IR and RGBC.
527 * We disallow setting IR (as I expect that most of the users are
528 * interested in RGBC). This way we can show the user that the scales
529 * for RGBC and IR channels are different (1X Vs 2X with sel 0) while
530 * still keeping the operation deterministic.
532 regval
|= FIELD_PREP(BU27008_MASK_IR_GAIN_LO
, sel
);
534 return regmap_update_bits(data
->regmap
, BU27008_REG_MODE_CONTROL2
,
535 BU27008_MASK_RGBC_GAIN
, regval
);
538 static int bu27010_write_gain_sel(struct bu27008_data
*data
, int sel
)
541 int ret
, chan_selector
;
544 * Gain 'selector' is composed of two registers. Selector is 6bit value,
545 * 4 high bits being the RGBC gain fieild in MODE_CONTROL1 register and
546 * two low bits being the channel specific gain in MODE_CONTROL2.
548 * Let's take the 4 high bits of whole 6 bit selector, and prepare
549 * the MODE_CONTROL1 value (RGBC gain part).
551 regval
= FIELD_PREP(BU27010_MASK_RGBC_GAIN
, (sel
>> 2));
553 ret
= regmap_update_bits(data
->regmap
, BU27008_REG_MODE_CONTROL1
,
554 BU27010_MASK_RGBC_GAIN
, regval
);
559 * Two low two bits of the selector must be written for all 4
560 * channels in the MODE_CONTROL2 register. Copy these two bits for
563 chan_selector
= sel
& GENMASK(1, 0);
565 regval
= FIELD_PREP(BU27010_MASK_DATA0_GAIN
, chan_selector
);
566 regval
|= FIELD_PREP(BU27010_MASK_DATA1_GAIN
, chan_selector
);
567 regval
|= FIELD_PREP(BU27010_MASK_DATA2_GAIN
, chan_selector
);
568 regval
|= FIELD_PREP(BU27010_MASK_DATA3_GAIN
, chan_selector
);
570 return regmap_write(data
->regmap
, BU27008_REG_MODE_CONTROL2
, regval
);
573 static int bu27008_get_gain_sel(struct bu27008_data
*data
, int *sel
)
578 * If we always "lock" the gain selectors for all channels to prevent
579 * unsupported configs, then it does not matter which channel is used
580 * we can just return selector from any of them.
582 * This, however is not true if we decide to support only 4X and 16X
583 * and then individual gains for channels. Currently this is not the
586 * If we some day decide to support individual gains, then we need to
587 * have channel information here.
590 ret
= regmap_read(data
->regmap
, BU27008_REG_MODE_CONTROL2
, sel
);
594 *sel
= FIELD_GET(BU27008_MASK_RGBC_GAIN
, *sel
);
599 static int bu27010_get_gain_sel(struct bu27008_data
*data
, int *sel
)
604 * We always "lock" the gain selectors for all channels to prevent
605 * unsupported configs. It does not matter which channel is used
606 * we can just return selector from any of them.
608 * Read the channel0 gain.
610 ret
= regmap_read(data
->regmap
, BU27008_REG_MODE_CONTROL2
, sel
);
614 *sel
= FIELD_GET(BU27010_MASK_DATA0_GAIN
, *sel
);
616 /* Read the shared gain */
617 ret
= regmap_read(data
->regmap
, BU27008_REG_MODE_CONTROL1
, &tmp
);
622 * The gain selector is made as a combination of common RGBC gain and
623 * the channel specific gain. The channel specific gain forms the low
624 * bits of selector and RGBC gain is appended right after it.
626 * Compose the selector from channel0 gain and shared RGBC gain.
628 *sel
|= FIELD_GET(BU27010_MASK_RGBC_GAIN
, tmp
) << fls(BU27010_MASK_DATA0_GAIN
);
633 static int bu27008_chip_init(struct bu27008_data
*data
)
637 ret
= regmap_write_bits(data
->regmap
, BU27008_REG_SYSTEM_CONTROL
,
638 BU27008_MASK_SW_RESET
, BU27008_MASK_SW_RESET
);
640 return dev_err_probe(data
->dev
, ret
, "Sensor reset failed\n");
643 * The data-sheet does not tell how long performing the IC reset takes.
644 * However, the data-sheet says the minimum time it takes the IC to be
645 * able to take inputs after power is applied, is 100 uS. I'd assume
650 ret
= regmap_reinit_cache(data
->regmap
, data
->cd
->regmap_cfg
);
652 dev_err(data
->dev
, "Failed to reinit reg cache\n");
657 static int bu27010_chip_init(struct bu27008_data
*data
)
661 ret
= regmap_write_bits(data
->regmap
, BU27008_REG_SYSTEM_CONTROL
,
662 BU27010_MASK_SW_RESET
, BU27010_MASK_SW_RESET
);
664 return dev_err_probe(data
->dev
, ret
, "Sensor reset failed\n");
669 ret
= regmap_write_bits(data
->regmap
, BU27010_REG_POWER
,
670 BU27010_MASK_POWER
, BU27010_MASK_POWER
);
672 return dev_err_probe(data
->dev
, ret
, "Sensor power-on failed\n");
676 /* Release blocks from reset */
677 ret
= regmap_write_bits(data
->regmap
, BU27010_REG_RESET
,
678 BU27010_MASK_RESET
, BU27010_RESET_RELEASE
);
680 return dev_err_probe(data
->dev
, ret
, "Sensor powering failed\n");
685 * The IRQ enabling on BU27010 is done in a peculiar way. The IRQ
686 * enabling is not a bit mask where individual IRQs could be enabled but
687 * a field which values are:
688 * 00 => IRQs disabled
689 * 01 => Data-ready (RGBC/IR)
690 * 10 => Data-ready (flicker)
693 * So, only one IRQ can be enabled at a time and enabling for example
694 * flicker FIFO would automagically disable data-ready IRQ.
696 * Currently the driver does not support the flicker. Hence, we can
697 * just treat the RGBC data-ready as single bit which can be enabled /
698 * disabled. This works for as long as the second bit in the field
699 * stays zero. Here we ensure it gets zeroed.
701 return regmap_clear_bits(data
->regmap
, BU27010_REG_MODE_CONTROL4
,
702 BU27010_IRQ_DIS_ALL
);
705 static const struct bu27_chip_data bu27010_chip
= {
707 .chip_init
= bu27010_chip_init
,
708 .get_gain_sel
= bu27010_get_gain_sel
,
709 .write_gain_sel
= bu27010_write_gain_sel
,
710 .regmap_cfg
= &bu27010_regmap
,
711 .gains
= &bu27010_gains
[0],
712 .gains_ir
= &bu27010_gains_ir
[0],
713 .itimes
= &bu27010_itimes
[0],
714 .num_gains
= ARRAY_SIZE(bu27010_gains
),
715 .num_gains_ir
= ARRAY_SIZE(bu27010_gains_ir
),
716 .num_itimes
= ARRAY_SIZE(bu27010_itimes
),
717 .scale1x
= BU27010_SCALE_1X
,
718 .drdy_en_reg
= BU27010_REG_MODE_CONTROL4
,
719 .drdy_en_mask
= BU27010_DRDY_EN
,
720 .meas_en_reg
= BU27010_REG_MODE_CONTROL5
,
721 .meas_en_mask
= BU27010_MASK_MEAS_EN
,
722 .valid_reg
= BU27010_REG_MODE_CONTROL5
,
723 .chan_sel_reg
= BU27008_REG_MODE_CONTROL1
,
724 .chan_sel_mask
= BU27010_MASK_CHAN_SEL
,
725 .int_time_mask
= BU27010_MASK_MEAS_MODE
,
726 .part_id
= BU27010_ID
,
729 static const struct bu27_chip_data bu27008_chip
= {
731 .chip_init
= bu27008_chip_init
,
732 .get_gain_sel
= bu27008_get_gain_sel
,
733 .write_gain_sel
= bu27008_write_gain_sel
,
734 .regmap_cfg
= &bu27008_regmap
,
735 .gains
= &bu27008_gains
[0],
736 .gains_ir
= &bu27008_gains_ir
[0],
737 .itimes
= &bu27008_itimes
[0],
738 .num_gains
= ARRAY_SIZE(bu27008_gains
),
739 .num_gains_ir
= ARRAY_SIZE(bu27008_gains_ir
),
740 .num_itimes
= ARRAY_SIZE(bu27008_itimes
),
741 .scale1x
= BU27008_SCALE_1X
,
742 .drdy_en_reg
= BU27008_REG_MODE_CONTROL3
,
743 .drdy_en_mask
= BU27008_MASK_INT_EN
,
744 .valid_reg
= BU27008_REG_MODE_CONTROL3
,
745 .meas_en_reg
= BU27008_REG_MODE_CONTROL3
,
746 .meas_en_mask
= BU27008_MASK_MEAS_EN
,
747 .chan_sel_reg
= BU27008_REG_MODE_CONTROL3
,
748 .chan_sel_mask
= BU27008_MASK_CHAN_SEL
,
749 .int_time_mask
= BU27008_MASK_MEAS_MODE
,
750 .part_id
= BU27008_ID
,
753 #define BU27008_MAX_VALID_RESULT_WAIT_US 50000
754 #define BU27008_VALID_RESULT_WAIT_QUANTA_US 1000
756 static int bu27008_chan_read_data(struct bu27008_data
*data
, int reg
, int *val
)
761 ret
= regmap_read_poll_timeout(data
->regmap
, data
->cd
->valid_reg
,
762 valid
, (valid
& BU27008_MASK_VALID
),
763 BU27008_VALID_RESULT_WAIT_QUANTA_US
,
764 BU27008_MAX_VALID_RESULT_WAIT_US
);
768 ret
= regmap_bulk_read(data
->regmap
, reg
, &tmp
, sizeof(tmp
));
770 dev_err(data
->dev
, "Reading channel data failed\n");
772 *val
= le16_to_cpu(tmp
);
777 static int bu27008_get_gain(struct bu27008_data
*data
, struct iio_gts
*gts
, int *gain
)
781 ret
= data
->cd
->get_gain_sel(data
, &sel
);
785 ret
= iio_gts_find_gain_by_sel(gts
, sel
);
787 dev_err(data
->dev
, "unknown gain value 0x%x\n", sel
);
796 static int bu27008_set_gain(struct bu27008_data
*data
, int gain
)
800 ret
= iio_gts_find_sel_by_gain(&data
->gts
, gain
);
804 return data
->cd
->write_gain_sel(data
, ret
);
807 static int bu27008_get_int_time_sel(struct bu27008_data
*data
, int *sel
)
811 ret
= regmap_read(data
->regmap
, BU27008_REG_MODE_CONTROL1
, &val
);
815 val
&= data
->cd
->int_time_mask
;
816 val
>>= ffs(data
->cd
->int_time_mask
) - 1;
823 static int bu27008_set_int_time_sel(struct bu27008_data
*data
, int sel
)
825 sel
<<= ffs(data
->cd
->int_time_mask
) - 1;
827 return regmap_update_bits(data
->regmap
, BU27008_REG_MODE_CONTROL1
,
828 data
->cd
->int_time_mask
, sel
);
831 static int bu27008_get_int_time_us(struct bu27008_data
*data
)
835 ret
= bu27008_get_int_time_sel(data
, &sel
);
839 return iio_gts_find_int_time_by_sel(&data
->gts
, sel
);
842 static int _bu27008_get_scale(struct bu27008_data
*data
, bool ir
, int *val
,
853 ret
= bu27008_get_gain(data
, gts
, &gain
);
857 ret
= bu27008_get_int_time_us(data
);
861 return iio_gts_get_scale(gts
, gain
, ret
, val
, val2
);
864 static int bu27008_get_scale(struct bu27008_data
*data
, bool ir
, int *val
,
869 mutex_lock(&data
->mutex
);
870 ret
= _bu27008_get_scale(data
, ir
, val
, val2
);
871 mutex_unlock(&data
->mutex
);
876 static int bu27008_set_int_time(struct bu27008_data
*data
, int time
)
880 ret
= iio_gts_find_sel_by_int_time(&data
->gts
, time
);
884 return bu27008_set_int_time_sel(data
, ret
);
887 /* Try to change the time so that the scale is maintained */
888 static int bu27008_try_set_int_time(struct bu27008_data
*data
, int int_time_new
)
890 int ret
, old_time_sel
, new_time_sel
, old_gain
, new_gain
;
892 mutex_lock(&data
->mutex
);
894 ret
= bu27008_get_int_time_sel(data
, &old_time_sel
);
898 if (!iio_gts_valid_time(&data
->gts
, int_time_new
)) {
899 dev_dbg(data
->dev
, "Unsupported integration time %u\n",
906 /* If we already use requested time, then we're done */
907 new_time_sel
= iio_gts_find_sel_by_int_time(&data
->gts
, int_time_new
);
908 if (new_time_sel
== old_time_sel
)
911 ret
= bu27008_get_gain(data
, &data
->gts
, &old_gain
);
915 ret
= iio_gts_find_new_gain_sel_by_old_gain_time(&data
->gts
, old_gain
,
916 old_time_sel
, new_time_sel
, &new_gain
);
921 _bu27008_get_scale(data
, false, &scale1
, &scale2
);
923 "Can't support time %u with current scale %u %u\n",
924 int_time_new
, scale1
, scale2
);
930 * If caller requests for integration time change and we
931 * can't support the scale - then the caller should be
932 * prepared to 'pick up the pieces and deal with the
933 * fact that the scale changed'.
935 ret
= iio_find_closest_gain_low(&data
->gts
, new_gain
, &ok
);
937 dev_dbg(data
->dev
, "optimal gain out of range\n");
941 "Total gain increase. Risk of saturation");
942 ret
= iio_gts_get_min_gain(&data
->gts
);
947 dev_dbg(data
->dev
, "scale changed, new gain %u\n", new_gain
);
950 ret
= bu27008_set_gain(data
, new_gain
);
954 ret
= bu27008_set_int_time(data
, int_time_new
);
957 mutex_unlock(&data
->mutex
);
962 static int bu27008_meas_set(struct bu27008_data
*data
, bool enable
)
965 return regmap_set_bits(data
->regmap
, data
->cd
->meas_en_reg
,
966 data
->cd
->meas_en_mask
);
967 return regmap_clear_bits(data
->regmap
, data
->cd
->meas_en_reg
,
968 data
->cd
->meas_en_mask
);
971 static int bu27008_chan_cfg(struct bu27008_data
*data
,
972 struct iio_chan_spec
const *chan
)
976 if (chan
->scan_index
== BU27008_BLUE
)
977 chan_sel
= BU27008_BLUE2_CLEAR3
;
979 chan_sel
= BU27008_CLEAR2_IR3
;
982 * prepare bitfield for channel sel. The FIELD_PREP works only when
983 * mask is constant. In our case the mask is assigned based on the
984 * chip type. Hence the open-coded FIELD_PREP here. We don't bother
985 * zeroing the irrelevant bits though - update_bits takes care of that.
987 chan_sel
<<= ffs(data
->cd
->chan_sel_mask
) - 1;
989 return regmap_update_bits(data
->regmap
, data
->cd
->chan_sel_reg
,
990 BU27008_MASK_CHAN_SEL
, chan_sel
);
993 static int bu27008_read_one(struct bu27008_data
*data
, struct iio_dev
*idev
,
994 struct iio_chan_spec
const *chan
, int *val
, int *val2
)
998 ret
= bu27008_chan_cfg(data
, chan
);
1002 ret
= bu27008_meas_set(data
, true);
1006 ret
= bu27008_get_int_time_us(data
);
1008 int_time
= BU27008_MEAS_TIME_MAX_MS
;
1010 int_time
= ret
/ USEC_PER_MSEC
;
1014 ret
= bu27008_chan_read_data(data
, chan
->address
, val
);
1018 if (bu27008_meas_set(data
, false))
1019 dev_warn(data
->dev
, "measurement disabling failed\n");
1024 #define BU27008_LUX_DATA_RED 0
1025 #define BU27008_LUX_DATA_GREEN 1
1026 #define BU27008_LUX_DATA_BLUE 2
1027 #define BU27008_LUX_DATA_IR 3
1028 #define LUX_DATA_SIZE (BU27008_NUM_HW_CHANS * sizeof(__le16))
1030 static int bu27008_read_lux_chans(struct bu27008_data
*data
, unsigned int time
,
1033 int ret
, chan_sel
, tmpret
, valid
;
1035 chan_sel
= BU27008_BLUE2_IR3
<< (ffs(data
->cd
->chan_sel_mask
) - 1);
1037 ret
= regmap_update_bits(data
->regmap
, data
->cd
->chan_sel_reg
,
1038 data
->cd
->chan_sel_mask
, chan_sel
);
1042 ret
= bu27008_meas_set(data
, true);
1046 msleep(time
/ USEC_PER_MSEC
);
1048 ret
= regmap_read_poll_timeout(data
->regmap
, data
->cd
->valid_reg
,
1049 valid
, (valid
& BU27008_MASK_VALID
),
1050 BU27008_VALID_RESULT_WAIT_QUANTA_US
,
1051 BU27008_MAX_VALID_RESULT_WAIT_US
);
1055 ret
= regmap_bulk_read(data
->regmap
, BU27008_REG_DATA0_LO
, chan_data
,
1060 tmpret
= bu27008_meas_set(data
, false);
1062 dev_warn(data
->dev
, "Stopping measurement failed\n");
1068 * Following equation for computing lux out of register values was given by
1069 * ROHM HW colleagues;
1071 * Red = RedData*1024 / Gain * 20 / meas_mode
1072 * Green = GreenData* 1024 / Gain * 20 / meas_mode
1073 * Blue = BlueData* 1024 / Gain * 20 / meas_mode
1074 * IR = IrData* 1024 / Gain * 20 / meas_mode
1076 * where meas_mode is the integration time in mS / 10
1078 * IRratio = (IR > 0.18 * Green) ? 0 : 1
1080 * Lx = max(c1*Red + c2*Green + c3*Blue,0)
1083 * IRratio 0: c1 = -0.00002237, c2 = 0.0003219, c3 = -0.000120371
1084 * IRratio 1: c1 = -0.00001074, c2 = 0.000305415, c3 = -0.000129367
1088 * The max chan data is 0xffff. When we multiply it by 1024 * 20, we'll get
1089 * 0x4FFFB000 which still fits in 32-bit integer. This won't overflow.
1091 #define NORM_CHAN_DATA_FOR_LX_CALC(chan, gain, time) (le16_to_cpu(chan) * \
1092 1024 * 20 / (gain) / (time))
1093 static u64
bu27008_calc_nlux(struct bu27008_data
*data
, __le16
*lux_data
,
1094 unsigned int gain
, unsigned int gain_ir
, unsigned int time
)
1096 unsigned int red
, green
, blue
, ir
;
1097 s64 c1
, c2
, c3
, nlux
;
1100 ir
= NORM_CHAN_DATA_FOR_LX_CALC(lux_data
[BU27008_LUX_DATA_IR
], gain_ir
, time
);
1101 red
= NORM_CHAN_DATA_FOR_LX_CALC(lux_data
[BU27008_LUX_DATA_RED
], gain
, time
);
1102 green
= NORM_CHAN_DATA_FOR_LX_CALC(lux_data
[BU27008_LUX_DATA_GREEN
], gain
, time
);
1103 blue
= NORM_CHAN_DATA_FOR_LX_CALC(lux_data
[BU27008_LUX_DATA_BLUE
], gain
, time
);
1105 if ((u64
)ir
* 100LLU > (u64
)green
* 18LLU) {
1114 nlux
= c1
* red
+ c2
* green
+ c3
* blue
;
1116 return max_t(s64
, 0, nlux
);
1119 static int bu27008_get_time_n_gains(struct bu27008_data
*data
,
1120 unsigned int *gain
, unsigned int *gain_ir
, unsigned int *time
)
1124 ret
= bu27008_get_gain(data
, &data
->gts
, gain
);
1128 ret
= bu27008_get_gain(data
, &data
->gts_ir
, gain_ir
);
1132 ret
= bu27008_get_int_time_us(data
);
1136 /* Max integration time is 400000. Fits in signed int. */
1142 struct bu27008_buf
{
1143 __le16 chan
[BU27008_NUM_HW_CHANS
];
1144 u64 lux
__aligned(8);
1145 s64 ts
__aligned(8);
1148 static int bu27008_buffer_fill_lux(struct bu27008_data
*data
,
1149 struct bu27008_buf
*raw
)
1151 unsigned int gain
, gain_ir
, time
;
1154 ret
= bu27008_get_time_n_gains(data
, &gain
, &gain_ir
, &time
);
1158 raw
->lux
= bu27008_calc_nlux(data
, raw
->chan
, gain
, gain_ir
, time
);
1163 static int bu27008_read_lux(struct bu27008_data
*data
, struct iio_dev
*idev
,
1164 struct iio_chan_spec
const *chan
,
1165 int *val
, int *val2
)
1167 __le16 lux_data
[BU27008_NUM_HW_CHANS
];
1168 unsigned int gain
, gain_ir
, time
;
1172 ret
= bu27008_get_time_n_gains(data
, &gain
, &gain_ir
, &time
);
1176 ret
= bu27008_read_lux_chans(data
, time
, lux_data
);
1180 nlux
= bu27008_calc_nlux(data
, lux_data
, gain
, gain_ir
, time
);
1182 *val2
= nlux
>> 32LLU;
1184 return IIO_VAL_INT_64
;
1187 static int bu27008_read_raw(struct iio_dev
*idev
,
1188 struct iio_chan_spec
const *chan
,
1189 int *val
, int *val2
, long mask
)
1191 struct bu27008_data
*data
= iio_priv(idev
);
1195 case IIO_CHAN_INFO_RAW
:
1196 busy
= iio_device_claim_direct_mode(idev
);
1200 mutex_lock(&data
->mutex
);
1201 if (chan
->type
== IIO_LIGHT
)
1202 ret
= bu27008_read_lux(data
, idev
, chan
, val
, val2
);
1204 ret
= bu27008_read_one(data
, idev
, chan
, val
, val2
);
1205 mutex_unlock(&data
->mutex
);
1207 iio_device_release_direct_mode(idev
);
1211 case IIO_CHAN_INFO_SCALE
:
1212 if (chan
->type
== IIO_LIGHT
) {
1215 return IIO_VAL_INT_PLUS_NANO
;
1217 ret
= bu27008_get_scale(data
, chan
->scan_index
== BU27008_IR
,
1222 return IIO_VAL_INT_PLUS_NANO
;
1224 case IIO_CHAN_INFO_INT_TIME
:
1225 ret
= bu27008_get_int_time_us(data
);
1232 return IIO_VAL_INT_PLUS_MICRO
;
1239 /* Called if the new scale could not be supported with existing int-time */
1240 static int bu27008_try_find_new_time_gain(struct bu27008_data
*data
, int val
,
1241 int val2
, int *gain_sel
)
1243 int i
, ret
, new_time_sel
;
1245 for (i
= 0; i
< data
->gts
.num_itime
; i
++) {
1246 new_time_sel
= data
->gts
.itime_table
[i
].sel
;
1247 ret
= iio_gts_find_gain_sel_for_scale_using_time(&data
->gts
,
1248 new_time_sel
, val
, val2
, gain_sel
);
1252 if (i
== data
->gts
.num_itime
) {
1253 dev_err(data
->dev
, "Can't support scale %u %u\n", val
, val2
);
1258 return bu27008_set_int_time_sel(data
, new_time_sel
);
1261 static int bu27008_set_scale(struct bu27008_data
*data
,
1262 struct iio_chan_spec
const *chan
,
1265 int ret
, gain_sel
, time_sel
;
1267 if (chan
->scan_index
== BU27008_IR
)
1270 mutex_lock(&data
->mutex
);
1272 ret
= bu27008_get_int_time_sel(data
, &time_sel
);
1276 ret
= iio_gts_find_gain_sel_for_scale_using_time(&data
->gts
, time_sel
,
1277 val
, val2
, &gain_sel
);
1279 ret
= bu27008_try_find_new_time_gain(data
, val
, val2
, &gain_sel
);
1284 ret
= data
->cd
->write_gain_sel(data
, gain_sel
);
1287 mutex_unlock(&data
->mutex
);
1292 static int bu27008_write_raw_get_fmt(struct iio_dev
*indio_dev
,
1293 struct iio_chan_spec
const *chan
,
1298 case IIO_CHAN_INFO_SCALE
:
1299 return IIO_VAL_INT_PLUS_NANO
;
1300 case IIO_CHAN_INFO_INT_TIME
:
1301 return IIO_VAL_INT_PLUS_MICRO
;
1307 static int bu27008_write_raw(struct iio_dev
*idev
,
1308 struct iio_chan_spec
const *chan
,
1309 int val
, int val2
, long mask
)
1311 struct bu27008_data
*data
= iio_priv(idev
);
1315 * Do not allow changing scale when measurement is ongoing as doing so
1316 * could make values in the buffer inconsistent.
1318 ret
= iio_device_claim_direct_mode(idev
);
1323 case IIO_CHAN_INFO_SCALE
:
1324 ret
= bu27008_set_scale(data
, chan
, val
, val2
);
1326 case IIO_CHAN_INFO_INT_TIME
:
1331 ret
= bu27008_try_set_int_time(data
, val2
);
1337 iio_device_release_direct_mode(idev
);
1342 static int bu27008_read_avail(struct iio_dev
*idev
,
1343 struct iio_chan_spec
const *chan
, const int **vals
,
1344 int *type
, int *length
, long mask
)
1346 struct bu27008_data
*data
= iio_priv(idev
);
1349 case IIO_CHAN_INFO_INT_TIME
:
1350 return iio_gts_avail_times(&data
->gts
, vals
, type
, length
);
1351 case IIO_CHAN_INFO_SCALE
:
1352 if (chan
->channel2
== IIO_MOD_LIGHT_IR
)
1353 return iio_gts_all_avail_scales(&data
->gts_ir
, vals
,
1355 return iio_gts_all_avail_scales(&data
->gts
, vals
, type
, length
);
1361 static int bu27008_update_scan_mode(struct iio_dev
*idev
,
1362 const unsigned long *scan_mask
)
1364 struct bu27008_data
*data
= iio_priv(idev
);
1367 /* Configure channel selection */
1368 if (test_bit(BU27008_BLUE
, idev
->active_scan_mask
)) {
1369 if (test_bit(BU27008_CLEAR
, idev
->active_scan_mask
))
1370 chan_sel
= BU27008_BLUE2_CLEAR3
;
1372 chan_sel
= BU27008_BLUE2_IR3
;
1374 chan_sel
= BU27008_CLEAR2_IR3
;
1377 chan_sel
<<= ffs(data
->cd
->chan_sel_mask
) - 1;
1379 return regmap_update_bits(data
->regmap
, data
->cd
->chan_sel_reg
,
1380 data
->cd
->chan_sel_mask
, chan_sel
);
1383 static const struct iio_info bu27008_info
= {
1384 .read_raw
= &bu27008_read_raw
,
1385 .write_raw
= &bu27008_write_raw
,
1386 .write_raw_get_fmt
= &bu27008_write_raw_get_fmt
,
1387 .read_avail
= &bu27008_read_avail
,
1388 .update_scan_mode
= bu27008_update_scan_mode
,
1389 .validate_trigger
= iio_validate_own_trigger
,
1392 static int bu27008_trigger_set_state(struct iio_trigger
*trig
, bool state
)
1394 struct bu27008_data
*data
= iio_trigger_get_drvdata(trig
);
1399 ret
= regmap_set_bits(data
->regmap
, data
->cd
->drdy_en_reg
,
1400 data
->cd
->drdy_en_mask
);
1402 ret
= regmap_clear_bits(data
->regmap
, data
->cd
->drdy_en_reg
,
1403 data
->cd
->drdy_en_mask
);
1405 dev_err(data
->dev
, "Failed to set trigger state\n");
1410 static void bu27008_trigger_reenable(struct iio_trigger
*trig
)
1412 struct bu27008_data
*data
= iio_trigger_get_drvdata(trig
);
1414 enable_irq(data
->irq
);
1417 static const struct iio_trigger_ops bu27008_trigger_ops
= {
1418 .set_trigger_state
= bu27008_trigger_set_state
,
1419 .reenable
= bu27008_trigger_reenable
,
1422 static irqreturn_t
bu27008_trigger_handler(int irq
, void *p
)
1424 struct iio_poll_func
*pf
= p
;
1425 struct iio_dev
*idev
= pf
->indio_dev
;
1426 struct bu27008_data
*data
= iio_priv(idev
);
1427 struct bu27008_buf raw
;
1430 memset(&raw
, 0, sizeof(raw
));
1433 * After some measurements, it seems reading the
1434 * BU27008_REG_MODE_CONTROL3 debounces the IRQ line
1436 ret
= regmap_read(data
->regmap
, data
->cd
->valid_reg
, &dummy
);
1440 ret
= regmap_bulk_read(data
->regmap
, BU27008_REG_DATA0_LO
, &raw
.chan
,
1445 if (test_bit(BU27008_LUX
, idev
->active_scan_mask
)) {
1446 ret
= bu27008_buffer_fill_lux(data
, &raw
);
1451 iio_push_to_buffers_with_timestamp(idev
, &raw
, pf
->timestamp
);
1453 iio_trigger_notify_done(idev
->trig
);
1458 static int bu27008_buffer_preenable(struct iio_dev
*idev
)
1460 struct bu27008_data
*data
= iio_priv(idev
);
1462 return bu27008_meas_set(data
, true);
1465 static int bu27008_buffer_postdisable(struct iio_dev
*idev
)
1467 struct bu27008_data
*data
= iio_priv(idev
);
1469 return bu27008_meas_set(data
, false);
1472 static const struct iio_buffer_setup_ops bu27008_buffer_ops
= {
1473 .preenable
= bu27008_buffer_preenable
,
1474 .postdisable
= bu27008_buffer_postdisable
,
1477 static irqreturn_t
bu27008_data_rdy_poll(int irq
, void *private)
1480 * The BU27008 keeps IRQ asserted until we read the VALID bit from
1481 * a register. We need to keep the IRQ disabled until then.
1483 disable_irq_nosync(irq
);
1484 iio_trigger_poll(private);
1489 static int bu27008_setup_trigger(struct bu27008_data
*data
, struct iio_dev
*idev
)
1491 struct iio_trigger
*itrig
;
1495 ret
= devm_iio_triggered_buffer_setup(data
->dev
, idev
,
1496 &iio_pollfunc_store_time
,
1497 bu27008_trigger_handler
,
1498 &bu27008_buffer_ops
);
1500 return dev_err_probe(data
->dev
, ret
,
1501 "iio_triggered_buffer_setup_ext FAIL\n");
1503 itrig
= devm_iio_trigger_alloc(data
->dev
, "%sdata-rdy-dev%d",
1504 idev
->name
, iio_device_id(idev
));
1510 itrig
->ops
= &bu27008_trigger_ops
;
1511 iio_trigger_set_drvdata(itrig
, data
);
1513 name
= devm_kasprintf(data
->dev
, GFP_KERNEL
, "%s-bu27008",
1514 dev_name(data
->dev
));
1516 ret
= devm_request_irq(data
->dev
, data
->irq
,
1517 &bu27008_data_rdy_poll
,
1520 return dev_err_probe(data
->dev
, ret
, "Could not request IRQ\n");
1522 ret
= devm_iio_trigger_register(data
->dev
, itrig
);
1524 return dev_err_probe(data
->dev
, ret
,
1525 "Trigger registration failed\n");
1527 /* set default trigger */
1528 idev
->trig
= iio_trigger_get(itrig
);
1533 static int bu27008_probe(struct i2c_client
*i2c
)
1535 struct device
*dev
= &i2c
->dev
;
1536 struct bu27008_data
*data
;
1537 struct regmap
*regmap
;
1538 unsigned int part_id
, reg
;
1539 struct iio_dev
*idev
;
1542 idev
= devm_iio_device_alloc(dev
, sizeof(*data
));
1546 ret
= devm_regulator_get_enable(dev
, "vdd");
1548 return dev_err_probe(dev
, ret
, "Failed to get regulator\n");
1550 data
= iio_priv(idev
);
1552 data
->cd
= device_get_match_data(&i2c
->dev
);
1556 regmap
= devm_regmap_init_i2c(i2c
, data
->cd
->regmap_cfg
);
1558 return dev_err_probe(dev
, PTR_ERR(regmap
),
1559 "Failed to initialize Regmap\n");
1562 ret
= regmap_read(regmap
, BU27008_REG_SYSTEM_CONTROL
, ®
);
1564 return dev_err_probe(dev
, ret
, "Failed to access sensor\n");
1566 part_id
= FIELD_GET(BU27008_MASK_PART_ID
, reg
);
1568 if (part_id
!= data
->cd
->part_id
)
1569 dev_warn(dev
, "unknown device 0x%x\n", part_id
);
1571 ret
= devm_iio_init_iio_gts(dev
, data
->cd
->scale1x
, 0, data
->cd
->gains
,
1572 data
->cd
->num_gains
, data
->cd
->itimes
,
1573 data
->cd
->num_itimes
, &data
->gts
);
1577 ret
= devm_iio_init_iio_gts(dev
, data
->cd
->scale1x
, 0, data
->cd
->gains_ir
,
1578 data
->cd
->num_gains_ir
, data
->cd
->itimes
,
1579 data
->cd
->num_itimes
, &data
->gts_ir
);
1583 mutex_init(&data
->mutex
);
1584 data
->regmap
= regmap
;
1586 data
->irq
= i2c
->irq
;
1588 idev
->channels
= bu27008_channels
;
1589 idev
->num_channels
= ARRAY_SIZE(bu27008_channels
);
1590 idev
->name
= data
->cd
->name
;
1591 idev
->info
= &bu27008_info
;
1592 idev
->modes
= INDIO_DIRECT_MODE
;
1593 idev
->available_scan_masks
= bu27008_scan_masks
;
1595 ret
= data
->cd
->chip_init(data
);
1600 ret
= bu27008_setup_trigger(data
, idev
);
1604 dev_info(dev
, "No IRQ, buffered mode disabled\n");
1607 ret
= devm_iio_device_register(dev
, idev
);
1609 return dev_err_probe(dev
, ret
,
1610 "Unable to register iio device\n");
1615 static const struct of_device_id bu27008_of_match
[] = {
1616 { .compatible
= "rohm,bu27008", .data
= &bu27008_chip
},
1617 { .compatible
= "rohm,bu27010", .data
= &bu27010_chip
},
1620 MODULE_DEVICE_TABLE(of
, bu27008_of_match
);
1622 static struct i2c_driver bu27008_i2c_driver
= {
1625 .of_match_table
= bu27008_of_match
,
1626 .probe_type
= PROBE_PREFER_ASYNCHRONOUS
,
1628 .probe
= bu27008_probe
,
1630 module_i2c_driver(bu27008_i2c_driver
);
1632 MODULE_DESCRIPTION("ROHM BU27008 and BU27010 colour sensor driver");
1633 MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
1634 MODULE_LICENSE("GPL");
1635 MODULE_IMPORT_NS("IIO_GTS_HELPER");