xref: /openbmc/linux/drivers/iio/light/rohm-bu27008.c (revision 4cfb9080)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * BU27008 ROHM Colour Sensor
4  *
5  * Copyright (c) 2023, ROHM Semiconductor.
6  */
7 
8 #include <linux/bitfield.h>
9 #include <linux/bitops.h>
10 #include <linux/device.h>
11 #include <linux/i2c.h>
12 #include <linux/interrupt.h>
13 #include <linux/module.h>
14 #include <linux/property.h>
15 #include <linux/regmap.h>
16 #include <linux/regulator/consumer.h>
17 #include <linux/units.h>
18 
19 #include <linux/iio/iio.h>
20 #include <linux/iio/iio-gts-helper.h>
21 #include <linux/iio/trigger.h>
22 #include <linux/iio/trigger_consumer.h>
23 #include <linux/iio/triggered_buffer.h>
24 
25 #define BU27008_REG_SYSTEM_CONTROL	0x40
26 #define BU27008_MASK_SW_RESET		BIT(7)
27 #define BU27008_MASK_PART_ID		GENMASK(5, 0)
28 #define BU27008_ID			0x1a
29 #define BU27008_REG_MODE_CONTROL1	0x41
30 #define BU27008_MASK_MEAS_MODE		GENMASK(2, 0)
31 #define BU27008_MASK_CHAN_SEL		GENMASK(3, 2)
32 
33 #define BU27008_REG_MODE_CONTROL2	0x42
34 #define BU27008_MASK_RGBC_GAIN		GENMASK(7, 3)
35 #define BU27008_MASK_IR_GAIN_LO		GENMASK(2, 0)
36 #define BU27008_SHIFT_IR_GAIN		3
37 
38 #define BU27008_REG_MODE_CONTROL3	0x43
39 #define BU27008_MASK_VALID		BIT(7)
40 #define BU27008_MASK_INT_EN		BIT(1)
41 #define BU27008_INT_EN			BU27008_MASK_INT_EN
42 #define BU27008_INT_DIS			0
43 #define BU27008_MASK_MEAS_EN		BIT(0)
44 #define BU27008_MEAS_EN			BIT(0)
45 #define BU27008_MEAS_DIS		0
46 
47 #define BU27008_REG_DATA0_LO		0x50
48 #define BU27008_REG_DATA1_LO		0x52
49 #define BU27008_REG_DATA2_LO		0x54
50 #define BU27008_REG_DATA3_LO		0x56
51 #define BU27008_REG_DATA3_HI		0x57
52 #define BU27008_REG_MANUFACTURER_ID	0x92
53 #define BU27008_REG_MAX BU27008_REG_MANUFACTURER_ID
54 
55 /**
56  * enum bu27008_chan_type - BU27008 channel types
57  * @BU27008_RED:	Red channel. Always via data0.
58  * @BU27008_GREEN:	Green channel. Always via data1.
59  * @BU27008_BLUE:	Blue channel. Via data2 (when used).
60  * @BU27008_CLEAR:	Clear channel. Via data2 or data3 (when used).
61  * @BU27008_IR:		IR channel. Via data3 (when used).
62  * @BU27008_NUM_CHANS:	Number of channel types.
63  */
64 enum bu27008_chan_type {
65 	BU27008_RED,
66 	BU27008_GREEN,
67 	BU27008_BLUE,
68 	BU27008_CLEAR,
69 	BU27008_IR,
70 	BU27008_NUM_CHANS
71 };
72 
73 /**
74  * enum bu27008_chan - BU27008 physical data channel
75  * @BU27008_DATA0:		Always red.
76  * @BU27008_DATA1:		Always green.
77  * @BU27008_DATA2:		Blue or clear.
78  * @BU27008_DATA3:		IR or clear.
79  * @BU27008_NUM_HW_CHANS:	Number of physical channels
80  */
81 enum bu27008_chan {
82 	BU27008_DATA0,
83 	BU27008_DATA1,
84 	BU27008_DATA2,
85 	BU27008_DATA3,
86 	BU27008_NUM_HW_CHANS
87 };
88 
89 /* We can always measure red and green at same time */
90 #define ALWAYS_SCANNABLE (BIT(BU27008_RED) | BIT(BU27008_GREEN))
91 
92 /* We use these data channel configs. Ensure scan_masks below follow them too */
93 #define BU27008_BLUE2_CLEAR3		0x0 /* buffer is R, G, B, C */
94 #define BU27008_CLEAR2_IR3		0x1 /* buffer is R, G, C, IR */
95 #define BU27008_BLUE2_IR3		0x2 /* buffer is R, G, B, IR */
96 
97 static const unsigned long bu27008_scan_masks[] = {
98 	/* buffer is R, G, B, C */
99 	ALWAYS_SCANNABLE | BIT(BU27008_BLUE) | BIT(BU27008_CLEAR),
100 	/* buffer is R, G, C, IR */
101 	ALWAYS_SCANNABLE | BIT(BU27008_CLEAR) | BIT(BU27008_IR),
102 	/* buffer is R, G, B, IR */
103 	ALWAYS_SCANNABLE | BIT(BU27008_BLUE) | BIT(BU27008_IR),
104 	0
105 };
106 
107 /*
108  * Available scales with gain 1x - 1024x, timings 55, 100, 200, 400 mS
109  * Time impacts to gain: 1x, 2x, 4x, 8x.
110  *
111  * => Max total gain is HWGAIN * gain by integration time (8 * 1024) = 8192
112  *
113  * Max amplification is (HWGAIN * MAX integration-time multiplier) 1024 * 8
114  * = 8192. With NANO scale we get rid of accuracy loss when we start with the
115  * scale 16.0 for HWGAIN1, INT-TIME 55 mS. This way the nano scale for MAX
116  * total gain 8192 will be 1953125
117  */
118 #define BU27008_SCALE_1X 16
119 
120 /* See the data sheet for the "Gain Setting" table */
121 #define BU27008_GSEL_1X		0x00
122 #define BU27008_GSEL_4X		0x08
123 #define BU27008_GSEL_8X		0x09
124 #define BU27008_GSEL_16X	0x0a
125 #define BU27008_GSEL_32X	0x0b
126 #define BU27008_GSEL_64X	0x0c
127 #define BU27008_GSEL_256X	0x18
128 #define BU27008_GSEL_512X	0x19
129 #define BU27008_GSEL_1024X	0x1a
130 
131 static const struct iio_gain_sel_pair bu27008_gains[] = {
132 	GAIN_SCALE_GAIN(1, BU27008_GSEL_1X),
133 	GAIN_SCALE_GAIN(4, BU27008_GSEL_4X),
134 	GAIN_SCALE_GAIN(8, BU27008_GSEL_8X),
135 	GAIN_SCALE_GAIN(16, BU27008_GSEL_16X),
136 	GAIN_SCALE_GAIN(32, BU27008_GSEL_32X),
137 	GAIN_SCALE_GAIN(64, BU27008_GSEL_64X),
138 	GAIN_SCALE_GAIN(256, BU27008_GSEL_256X),
139 	GAIN_SCALE_GAIN(512, BU27008_GSEL_512X),
140 	GAIN_SCALE_GAIN(1024, BU27008_GSEL_1024X),
141 };
142 
143 static const struct iio_gain_sel_pair bu27008_gains_ir[] = {
144 	GAIN_SCALE_GAIN(2, BU27008_GSEL_1X),
145 	GAIN_SCALE_GAIN(4, BU27008_GSEL_4X),
146 	GAIN_SCALE_GAIN(8, BU27008_GSEL_8X),
147 	GAIN_SCALE_GAIN(16, BU27008_GSEL_16X),
148 	GAIN_SCALE_GAIN(32, BU27008_GSEL_32X),
149 	GAIN_SCALE_GAIN(64, BU27008_GSEL_64X),
150 	GAIN_SCALE_GAIN(256, BU27008_GSEL_256X),
151 	GAIN_SCALE_GAIN(512, BU27008_GSEL_512X),
152 	GAIN_SCALE_GAIN(1024, BU27008_GSEL_1024X),
153 };
154 
155 #define BU27008_MEAS_MODE_100MS		0x00
156 #define BU27008_MEAS_MODE_55MS		0x01
157 #define BU27008_MEAS_MODE_200MS		0x02
158 #define BU27008_MEAS_MODE_400MS		0x04
159 #define BU27008_MEAS_TIME_MAX_MS	400
160 
161 static const struct iio_itime_sel_mul bu27008_itimes[] = {
162 	GAIN_SCALE_ITIME_US(400000, BU27008_MEAS_MODE_400MS, 8),
163 	GAIN_SCALE_ITIME_US(200000, BU27008_MEAS_MODE_200MS, 4),
164 	GAIN_SCALE_ITIME_US(100000, BU27008_MEAS_MODE_100MS, 2),
165 	GAIN_SCALE_ITIME_US(55000, BU27008_MEAS_MODE_55MS, 1),
166 };
167 
168 /*
169  * All the RGBC channels share the same gain.
170  * IR gain can be fine-tuned from the gain set for the RGBC by 2 bit, but this
171  * would yield quite complex gain setting. Especially since not all bit
172  * compinations are supported. And in any case setting GAIN for RGBC will
173  * always also change the IR-gain.
174  *
175  * On top of this, the selector '0' which corresponds to hw-gain 1X on RGBC,
176  * corresponds to gain 2X on IR. Rest of the selctors correspond to same gains
177  * though. This, however, makes it not possible to use shared gain for all
178  * RGBC and IR settings even though they are all changed at the one go.
179  */
180 #define BU27008_CHAN(color, data, separate_avail)				\
181 {										\
182 	.type = IIO_INTENSITY,							\
183 	.modified = 1,								\
184 	.channel2 = IIO_MOD_LIGHT_##color,					\
185 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |				\
186 			      BIT(IIO_CHAN_INFO_SCALE),				\
187 	.info_mask_separate_available = (separate_avail),			\
188 	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME),			\
189 	.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME),	\
190 	.address = BU27008_REG_##data##_LO,					\
191 	.scan_index = BU27008_##color,						\
192 	.scan_type = {								\
193 		.sign = 'u',							\
194 		.realbits = 16,							\
195 		.storagebits = 16,						\
196 		.endianness = IIO_LE,						\
197 	},									\
198 }
199 
200 /* For raw reads we always configure DATA3 for CLEAR */
201 static const struct iio_chan_spec bu27008_channels[] = {
202 	BU27008_CHAN(RED, DATA0, BIT(IIO_CHAN_INFO_SCALE)),
203 	BU27008_CHAN(GREEN, DATA1, BIT(IIO_CHAN_INFO_SCALE)),
204 	BU27008_CHAN(BLUE, DATA2, BIT(IIO_CHAN_INFO_SCALE)),
205 	BU27008_CHAN(CLEAR, DATA2, BIT(IIO_CHAN_INFO_SCALE)),
206 	/*
207 	 * We don't allow setting scale for IR (because of shared gain bits).
208 	 * Hence we don't advertise available ones either.
209 	 */
210 	BU27008_CHAN(IR, DATA3, 0),
211 	IIO_CHAN_SOFT_TIMESTAMP(BU27008_NUM_CHANS),
212 };
213 
214 struct bu27008_data {
215 	struct regmap *regmap;
216 	struct iio_trigger *trig;
217 	struct device *dev;
218 	struct iio_gts gts;
219 	struct iio_gts gts_ir;
220 	int irq;
221 
222 	/*
223 	 * Prevent changing gain/time config when scale is read/written.
224 	 * Similarly, protect the integration_time read/change sequence.
225 	 * Prevent changing gain/time when data is read.
226 	 */
227 	struct mutex mutex;
228 };
229 
230 static const struct regmap_range bu27008_volatile_ranges[] = {
231 	{
232 		.range_min = BU27008_REG_SYSTEM_CONTROL,	/* SWRESET */
233 		.range_max = BU27008_REG_SYSTEM_CONTROL,
234 	}, {
235 		.range_min = BU27008_REG_MODE_CONTROL3,		/* VALID */
236 		.range_max = BU27008_REG_MODE_CONTROL3,
237 	}, {
238 		.range_min = BU27008_REG_DATA0_LO,		/* DATA */
239 		.range_max = BU27008_REG_DATA3_HI,
240 	},
241 };
242 
243 static const struct regmap_access_table bu27008_volatile_regs = {
244 	.yes_ranges = &bu27008_volatile_ranges[0],
245 	.n_yes_ranges = ARRAY_SIZE(bu27008_volatile_ranges),
246 };
247 
248 static const struct regmap_range bu27008_read_only_ranges[] = {
249 	{
250 		.range_min = BU27008_REG_DATA0_LO,
251 		.range_max = BU27008_REG_DATA3_HI,
252 	}, {
253 		.range_min = BU27008_REG_MANUFACTURER_ID,
254 		.range_max = BU27008_REG_MANUFACTURER_ID,
255 	},
256 };
257 
258 static const struct regmap_access_table bu27008_ro_regs = {
259 	.no_ranges = &bu27008_read_only_ranges[0],
260 	.n_no_ranges = ARRAY_SIZE(bu27008_read_only_ranges),
261 };
262 
263 static const struct regmap_config bu27008_regmap = {
264 	.reg_bits = 8,
265 	.val_bits = 8,
266 	.max_register = BU27008_REG_MAX,
267 	.cache_type = REGCACHE_RBTREE,
268 	.volatile_table = &bu27008_volatile_regs,
269 	.wr_table = &bu27008_ro_regs,
270 	/*
271 	 * All register writes are serialized by the mutex which protects the
272 	 * scale setting/getting. This is needed because scale is combined by
273 	 * gain and integration time settings and we need to ensure those are
274 	 * not read / written when scale is being computed.
275 	 *
276 	 * As a result of this serializing, we don't need regmap locking. Note,
277 	 * this is not true if we add any configurations which are not
278 	 * serialized by the mutex and which may need for example a protected
279 	 * read-modify-write cycle (eg. regmap_update_bits()). Please, revise
280 	 * this when adding features to the driver.
281 	 */
282 	.disable_locking = true,
283 };
284 
285 #define BU27008_MAX_VALID_RESULT_WAIT_US	50000
286 #define BU27008_VALID_RESULT_WAIT_QUANTA_US	1000
287 
288 static int bu27008_chan_read_data(struct bu27008_data *data, int reg, int *val)
289 {
290 	int ret, valid;
291 	__le16 tmp;
292 
293 	ret = regmap_read_poll_timeout(data->regmap, BU27008_REG_MODE_CONTROL3,
294 				       valid, (valid & BU27008_MASK_VALID),
295 				       BU27008_VALID_RESULT_WAIT_QUANTA_US,
296 				       BU27008_MAX_VALID_RESULT_WAIT_US);
297 	if (ret)
298 		return ret;
299 
300 	ret = regmap_bulk_read(data->regmap, reg, &tmp, sizeof(tmp));
301 	if (ret)
302 		dev_err(data->dev, "Reading channel data failed\n");
303 
304 	*val = le16_to_cpu(tmp);
305 
306 	return ret;
307 }
308 
309 static int bu27008_get_gain(struct bu27008_data *data, struct iio_gts *gts, int *gain)
310 {
311 	int ret, sel;
312 
313 	ret = regmap_read(data->regmap, BU27008_REG_MODE_CONTROL2, &sel);
314 	if (ret)
315 		return ret;
316 
317 	sel = FIELD_GET(BU27008_MASK_RGBC_GAIN, sel);
318 
319 	ret = iio_gts_find_gain_by_sel(gts, sel);
320 	if (ret < 0) {
321 		dev_err(data->dev, "unknown gain value 0x%x\n", sel);
322 		return ret;
323 	}
324 
325 	*gain = ret;
326 
327 	return 0;
328 }
329 
330 static int bu27008_write_gain_sel(struct bu27008_data *data, int sel)
331 {
332 	int regval;
333 
334 	regval = FIELD_PREP(BU27008_MASK_RGBC_GAIN, sel);
335 
336 	/*
337 	 * We do always set also the LOW bits of IR-gain because othervice we
338 	 * would risk resulting an invalid GAIN register value.
339 	 *
340 	 * We could allow setting separate gains for RGBC and IR when the
341 	 * values were such that HW could support both gain settings.
342 	 * Eg, when the shared bits were same for both gain values.
343 	 *
344 	 * This, however, has a negligible benefit compared to the increased
345 	 * software complexity when we would need to go through the gains
346 	 * for both channels separately when the integration time changes.
347 	 * This would end up with nasty logic for computing gain values for
348 	 * both channels - and rejecting them if shared bits changed.
349 	 *
350 	 * We should then build the logic by guessing what a user prefers.
351 	 * RGBC or IR gains correctly set while other jumps to odd value?
352 	 * Maybe look-up a value where both gains are somehow optimized
353 	 * <what this somehow is, is ATM unknown to us>. Or maybe user would
354 	 * expect us to reject changes when optimal gains can't be set to both
355 	 * channels w/given integration time. At best that would result
356 	 * solution that works well for a very specific subset of
357 	 * configurations but causes unexpected corner-cases.
358 	 *
359 	 * So, we keep it simple. Always set same selector to IR and RGBC.
360 	 * We disallow setting IR (as I expect that most of the users are
361 	 * interested in RGBC). This way we can show the user that the scales
362 	 * for RGBC and IR channels are different (1X Vs 2X with sel 0) while
363 	 * still keeping the operation deterministic.
364 	 */
365 	regval |= FIELD_PREP(BU27008_MASK_IR_GAIN_LO, sel);
366 
367 	return regmap_update_bits(data->regmap, BU27008_REG_MODE_CONTROL2,
368 				  BU27008_MASK_RGBC_GAIN, regval);
369 }
370 
371 static int bu27008_set_gain(struct bu27008_data *data, int gain)
372 {
373 	int ret;
374 
375 	ret = iio_gts_find_sel_by_gain(&data->gts, gain);
376 	if (ret < 0)
377 		return ret;
378 
379 	return bu27008_write_gain_sel(data, ret);
380 }
381 
382 static int bu27008_get_int_time_sel(struct bu27008_data *data, int *sel)
383 {
384 	int ret, val;
385 
386 	ret = regmap_read(data->regmap, BU27008_REG_MODE_CONTROL1, &val);
387 	*sel = FIELD_GET(BU27008_MASK_MEAS_MODE, val);
388 
389 	return ret;
390 }
391 
392 static int bu27008_set_int_time_sel(struct bu27008_data *data, int sel)
393 {
394 	return regmap_update_bits(data->regmap, BU27008_REG_MODE_CONTROL1,
395 				  BU27008_MASK_MEAS_MODE, sel);
396 }
397 
398 static int bu27008_get_int_time_us(struct bu27008_data *data)
399 {
400 	int ret, sel;
401 
402 	ret = bu27008_get_int_time_sel(data, &sel);
403 	if (ret)
404 		return ret;
405 
406 	return iio_gts_find_int_time_by_sel(&data->gts, sel);
407 }
408 
409 static int _bu27008_get_scale(struct bu27008_data *data, bool ir, int *val,
410 			      int *val2)
411 {
412 	struct iio_gts *gts;
413 	int gain, ret;
414 
415 	if (ir)
416 		gts = &data->gts_ir;
417 	else
418 		gts = &data->gts;
419 
420 	ret = bu27008_get_gain(data, gts, &gain);
421 	if (ret)
422 		return ret;
423 
424 	ret = bu27008_get_int_time_us(data);
425 	if (ret < 0)
426 		return ret;
427 
428 	return iio_gts_get_scale(gts, gain, ret, val, val2);
429 }
430 
431 static int bu27008_get_scale(struct bu27008_data *data, bool ir, int *val,
432 			     int *val2)
433 {
434 	int ret;
435 
436 	mutex_lock(&data->mutex);
437 	ret = _bu27008_get_scale(data, ir, val, val2);
438 	mutex_unlock(&data->mutex);
439 
440 	return ret;
441 }
442 
443 static int bu27008_set_int_time(struct bu27008_data *data, int time)
444 {
445 	int ret;
446 
447 	ret = iio_gts_find_sel_by_int_time(&data->gts, time);
448 	if (ret < 0)
449 		return ret;
450 
451 	return regmap_update_bits(data->regmap, BU27008_REG_MODE_CONTROL1,
452 				  BU27008_MASK_MEAS_MODE, ret);
453 }
454 
455 /* Try to change the time so that the scale is maintained */
456 static int bu27008_try_set_int_time(struct bu27008_data *data, int int_time_new)
457 {
458 	int ret, old_time_sel, new_time_sel,  old_gain, new_gain;
459 
460 	mutex_lock(&data->mutex);
461 
462 	ret = bu27008_get_int_time_sel(data, &old_time_sel);
463 	if (ret < 0)
464 		goto unlock_out;
465 
466 	if (!iio_gts_valid_time(&data->gts, int_time_new)) {
467 		dev_dbg(data->dev, "Unsupported integration time %u\n",
468 			int_time_new);
469 
470 		ret = -EINVAL;
471 		goto unlock_out;
472 	}
473 
474 	/* If we already use requested time, then we're done */
475 	new_time_sel = iio_gts_find_sel_by_int_time(&data->gts, int_time_new);
476 	if (new_time_sel == old_time_sel)
477 		goto unlock_out;
478 
479 	ret = bu27008_get_gain(data, &data->gts, &old_gain);
480 	if (ret)
481 		goto unlock_out;
482 
483 	ret = iio_gts_find_new_gain_sel_by_old_gain_time(&data->gts, old_gain,
484 				old_time_sel, new_time_sel, &new_gain);
485 	if (ret) {
486 		int scale1, scale2;
487 		bool ok;
488 
489 		_bu27008_get_scale(data, false, &scale1, &scale2);
490 		dev_dbg(data->dev,
491 			"Can't support time %u with current scale %u %u\n",
492 			int_time_new, scale1, scale2);
493 
494 		if (new_gain < 0)
495 			goto unlock_out;
496 
497 		/*
498 		 * If caller requests for integration time change and we
499 		 * can't support the scale - then the caller should be
500 		 * prepared to 'pick up the pieces and deal with the
501 		 * fact that the scale changed'.
502 		 */
503 		ret = iio_find_closest_gain_low(&data->gts, new_gain, &ok);
504 		if (!ok)
505 			dev_dbg(data->dev, "optimal gain out of range\n");
506 
507 		if (ret < 0) {
508 			dev_dbg(data->dev,
509 				 "Total gain increase. Risk of saturation");
510 			ret = iio_gts_get_min_gain(&data->gts);
511 			if (ret < 0)
512 				goto unlock_out;
513 		}
514 		new_gain = ret;
515 		dev_dbg(data->dev, "scale changed, new gain %u\n", new_gain);
516 	}
517 
518 	ret = bu27008_set_gain(data, new_gain);
519 	if (ret)
520 		goto unlock_out;
521 
522 	ret = bu27008_set_int_time(data, int_time_new);
523 
524 unlock_out:
525 	mutex_unlock(&data->mutex);
526 
527 	return ret;
528 }
529 
530 static int bu27008_meas_set(struct bu27008_data *data, int state)
531 {
532 	return regmap_update_bits(data->regmap, BU27008_REG_MODE_CONTROL3,
533 				  BU27008_MASK_MEAS_EN, state);
534 }
535 
536 static int bu27008_chan_cfg(struct bu27008_data *data,
537 			    struct iio_chan_spec const *chan)
538 {
539 	int chan_sel;
540 
541 	if (chan->scan_index == BU27008_BLUE)
542 		chan_sel = BU27008_BLUE2_CLEAR3;
543 	else
544 		chan_sel = BU27008_CLEAR2_IR3;
545 
546 	chan_sel = FIELD_PREP(BU27008_MASK_CHAN_SEL, chan_sel);
547 
548 	return regmap_update_bits(data->regmap, BU27008_REG_MODE_CONTROL3,
549 				  BU27008_MASK_CHAN_SEL, chan_sel);
550 }
551 
552 static int bu27008_read_one(struct bu27008_data *data, struct iio_dev *idev,
553 			    struct iio_chan_spec const *chan, int *val, int *val2)
554 {
555 	int ret, int_time;
556 
557 	ret = bu27008_chan_cfg(data, chan);
558 	if (ret)
559 		return ret;
560 
561 	ret = bu27008_meas_set(data, BU27008_MEAS_EN);
562 	if (ret)
563 		return ret;
564 
565 	ret = bu27008_get_int_time_us(data);
566 	if (ret < 0)
567 		int_time = BU27008_MEAS_TIME_MAX_MS;
568 	else
569 		int_time = ret / USEC_PER_MSEC;
570 
571 	msleep(int_time);
572 
573 	ret = bu27008_chan_read_data(data, chan->address, val);
574 	if (!ret)
575 		ret = IIO_VAL_INT;
576 
577 	if (bu27008_meas_set(data, BU27008_MEAS_DIS))
578 		dev_warn(data->dev, "measurement disabling failed\n");
579 
580 	return ret;
581 }
582 
583 static int bu27008_read_raw(struct iio_dev *idev,
584 			   struct iio_chan_spec const *chan,
585 			   int *val, int *val2, long mask)
586 {
587 	struct bu27008_data *data = iio_priv(idev);
588 	int busy, ret;
589 
590 	switch (mask) {
591 	case IIO_CHAN_INFO_RAW:
592 		busy = iio_device_claim_direct_mode(idev);
593 		if (busy)
594 			return -EBUSY;
595 
596 		mutex_lock(&data->mutex);
597 		ret = bu27008_read_one(data, idev, chan, val, val2);
598 		mutex_unlock(&data->mutex);
599 
600 		iio_device_release_direct_mode(idev);
601 
602 		return ret;
603 
604 	case IIO_CHAN_INFO_SCALE:
605 		ret = bu27008_get_scale(data, chan->scan_index == BU27008_IR,
606 					val, val2);
607 		if (ret)
608 			return ret;
609 
610 		return IIO_VAL_INT_PLUS_NANO;
611 
612 	case IIO_CHAN_INFO_INT_TIME:
613 		ret = bu27008_get_int_time_us(data);
614 		if (ret < 0)
615 			return ret;
616 
617 		*val = 0;
618 		*val2 = ret;
619 
620 		return IIO_VAL_INT_PLUS_MICRO;
621 
622 	default:
623 		return -EINVAL;
624 	}
625 }
626 
627 /* Called if the new scale could not be supported with existing int-time */
628 static int bu27008_try_find_new_time_gain(struct bu27008_data *data, int val,
629 					  int val2, int *gain_sel)
630 {
631 	int i, ret, new_time_sel;
632 
633 	for (i = 0; i < data->gts.num_itime; i++) {
634 		new_time_sel = data->gts.itime_table[i].sel;
635 		ret = iio_gts_find_gain_sel_for_scale_using_time(&data->gts,
636 					new_time_sel, val, val2, gain_sel);
637 		if (!ret)
638 			break;
639 	}
640 	if (i == data->gts.num_itime) {
641 		dev_err(data->dev, "Can't support scale %u %u\n", val, val2);
642 
643 		return -EINVAL;
644 	}
645 
646 	return bu27008_set_int_time_sel(data, new_time_sel);
647 }
648 
649 static int bu27008_set_scale(struct bu27008_data *data,
650 			     struct iio_chan_spec const *chan,
651 			     int val, int val2)
652 {
653 	int ret, gain_sel, time_sel;
654 
655 	if (chan->scan_index == BU27008_IR)
656 		return -EINVAL;
657 
658 	mutex_lock(&data->mutex);
659 
660 	ret = bu27008_get_int_time_sel(data, &time_sel);
661 	if (ret < 0)
662 		goto unlock_out;
663 
664 	ret = iio_gts_find_gain_sel_for_scale_using_time(&data->gts, time_sel,
665 						val, val2, &gain_sel);
666 	if (ret) {
667 		ret = bu27008_try_find_new_time_gain(data, val, val2, &gain_sel);
668 		if (ret)
669 			goto unlock_out;
670 
671 	}
672 	ret = bu27008_write_gain_sel(data, gain_sel);
673 
674 unlock_out:
675 	mutex_unlock(&data->mutex);
676 
677 	return ret;
678 }
679 
680 static int bu27008_write_raw_get_fmt(struct iio_dev *indio_dev,
681 				     struct iio_chan_spec const *chan,
682 				     long mask)
683 {
684 
685 	switch (mask) {
686 	case IIO_CHAN_INFO_SCALE:
687 		return IIO_VAL_INT_PLUS_NANO;
688 	case IIO_CHAN_INFO_INT_TIME:
689 		return IIO_VAL_INT_PLUS_MICRO;
690 	default:
691 		return -EINVAL;
692 	}
693 }
694 
695 static int bu27008_write_raw(struct iio_dev *idev,
696 			     struct iio_chan_spec const *chan,
697 			     int val, int val2, long mask)
698 {
699 	struct bu27008_data *data = iio_priv(idev);
700 	int ret;
701 
702 	/*
703 	 * Do not allow changing scale when measurement is ongoing as doing so
704 	 * could make values in the buffer inconsistent.
705 	 */
706 	ret = iio_device_claim_direct_mode(idev);
707 	if (ret)
708 		return ret;
709 
710 	switch (mask) {
711 	case IIO_CHAN_INFO_SCALE:
712 		ret = bu27008_set_scale(data, chan, val, val2);
713 		break;
714 	case IIO_CHAN_INFO_INT_TIME:
715 		if (val) {
716 			ret = -EINVAL;
717 			break;
718 		}
719 		ret = bu27008_try_set_int_time(data, val2);
720 		break;
721 	default:
722 		ret = -EINVAL;
723 		break;
724 	}
725 	iio_device_release_direct_mode(idev);
726 
727 	return ret;
728 }
729 
730 static int bu27008_read_avail(struct iio_dev *idev,
731 			      struct iio_chan_spec const *chan, const int **vals,
732 			      int *type, int *length, long mask)
733 {
734 	struct bu27008_data *data = iio_priv(idev);
735 
736 	switch (mask) {
737 	case IIO_CHAN_INFO_INT_TIME:
738 		return iio_gts_avail_times(&data->gts, vals, type, length);
739 	case IIO_CHAN_INFO_SCALE:
740 		if (chan->channel2 == IIO_MOD_LIGHT_IR)
741 			return iio_gts_all_avail_scales(&data->gts_ir, vals,
742 							type, length);
743 		return iio_gts_all_avail_scales(&data->gts, vals, type, length);
744 	default:
745 		return -EINVAL;
746 	}
747 }
748 
749 static int bu27008_update_scan_mode(struct iio_dev *idev,
750 				    const unsigned long *scan_mask)
751 {
752 	struct bu27008_data *data = iio_priv(idev);
753 	int chan_sel;
754 
755 	/* Configure channel selection */
756 	if (test_bit(BU27008_BLUE, idev->active_scan_mask)) {
757 		if (test_bit(BU27008_CLEAR, idev->active_scan_mask))
758 			chan_sel = BU27008_BLUE2_CLEAR3;
759 		else
760 			chan_sel = BU27008_BLUE2_IR3;
761 	} else {
762 		chan_sel = BU27008_CLEAR2_IR3;
763 	}
764 
765 	chan_sel = FIELD_PREP(BU27008_MASK_CHAN_SEL, chan_sel);
766 
767 	return regmap_update_bits(data->regmap, BU27008_REG_MODE_CONTROL3,
768 				 BU27008_MASK_CHAN_SEL, chan_sel);
769 }
770 
771 static const struct iio_info bu27008_info = {
772 	.read_raw = &bu27008_read_raw,
773 	.write_raw = &bu27008_write_raw,
774 	.write_raw_get_fmt = &bu27008_write_raw_get_fmt,
775 	.read_avail = &bu27008_read_avail,
776 	.update_scan_mode = bu27008_update_scan_mode,
777 	.validate_trigger = iio_validate_own_trigger,
778 };
779 
780 static int bu27008_chip_init(struct bu27008_data *data)
781 {
782 	int ret;
783 
784 	ret = regmap_write_bits(data->regmap, BU27008_REG_SYSTEM_CONTROL,
785 				BU27008_MASK_SW_RESET, BU27008_MASK_SW_RESET);
786 	if (ret)
787 		return dev_err_probe(data->dev, ret, "Sensor reset failed\n");
788 
789 	/*
790 	 * The data-sheet does not tell how long performing the IC reset takes.
791 	 * However, the data-sheet says the minimum time it takes the IC to be
792 	 * able to take inputs after power is applied, is 100 uS. I'd assume
793 	 * > 1 mS is enough.
794 	 */
795 	msleep(1);
796 
797 	ret = regmap_reinit_cache(data->regmap, &bu27008_regmap);
798 	if (ret)
799 		dev_err(data->dev, "Failed to reinit reg cache\n");
800 
801 	return ret;
802 }
803 
804 static int bu27008_set_drdy_irq(struct bu27008_data *data, int state)
805 {
806 	return regmap_update_bits(data->regmap, BU27008_REG_MODE_CONTROL3,
807 				 BU27008_MASK_INT_EN, state);
808 }
809 
810 static int bu27008_trigger_set_state(struct iio_trigger *trig,
811 				     bool state)
812 {
813 	struct bu27008_data *data = iio_trigger_get_drvdata(trig);
814 	int ret;
815 
816 	if (state)
817 		ret = bu27008_set_drdy_irq(data, BU27008_INT_EN);
818 	else
819 		ret = bu27008_set_drdy_irq(data, BU27008_INT_DIS);
820 	if (ret)
821 		dev_err(data->dev, "Failed to set trigger state\n");
822 
823 	return ret;
824 }
825 
826 static void bu27008_trigger_reenable(struct iio_trigger *trig)
827 {
828 	struct bu27008_data *data = iio_trigger_get_drvdata(trig);
829 
830 	enable_irq(data->irq);
831 }
832 
833 static const struct iio_trigger_ops bu27008_trigger_ops = {
834 	.set_trigger_state = bu27008_trigger_set_state,
835 	.reenable = bu27008_trigger_reenable,
836 };
837 
838 static irqreturn_t bu27008_trigger_handler(int irq, void *p)
839 {
840 	struct iio_poll_func *pf = p;
841 	struct iio_dev *idev = pf->indio_dev;
842 	struct bu27008_data *data = iio_priv(idev);
843 	struct {
844 		__le16 chan[BU27008_NUM_HW_CHANS];
845 		s64 ts __aligned(8);
846 	} raw;
847 	int ret, dummy;
848 
849 	memset(&raw, 0, sizeof(raw));
850 
851 	/*
852 	 * After some measurements, it seems reading the
853 	 * BU27008_REG_MODE_CONTROL3 debounces the IRQ line
854 	 */
855 	ret = regmap_read(data->regmap, BU27008_REG_MODE_CONTROL3, &dummy);
856 	if (ret < 0)
857 		goto err_read;
858 
859 	ret = regmap_bulk_read(data->regmap, BU27008_REG_DATA0_LO, &raw.chan,
860 			       sizeof(raw.chan));
861 	if (ret < 0)
862 		goto err_read;
863 
864 	iio_push_to_buffers_with_timestamp(idev, &raw, pf->timestamp);
865 err_read:
866 	iio_trigger_notify_done(idev->trig);
867 
868 	return IRQ_HANDLED;
869 }
870 
871 static int bu27008_buffer_preenable(struct iio_dev *idev)
872 {
873 	struct bu27008_data *data = iio_priv(idev);
874 
875 	return bu27008_meas_set(data, BU27008_MEAS_EN);
876 }
877 
878 static int bu27008_buffer_postdisable(struct iio_dev *idev)
879 {
880 	struct bu27008_data *data = iio_priv(idev);
881 
882 	return bu27008_meas_set(data, BU27008_MEAS_DIS);
883 }
884 
885 static const struct iio_buffer_setup_ops bu27008_buffer_ops = {
886 	.preenable = bu27008_buffer_preenable,
887 	.postdisable = bu27008_buffer_postdisable,
888 };
889 
890 static irqreturn_t bu27008_data_rdy_poll(int irq, void *private)
891 {
892 	/*
893 	 * The BU27008 keeps IRQ asserted until we read the VALID bit from
894 	 * a register. We need to keep the IRQ disabled until then.
895 	 */
896 	disable_irq_nosync(irq);
897 	iio_trigger_poll(private);
898 
899 	return IRQ_HANDLED;
900 }
901 
902 static int bu27008_setup_trigger(struct bu27008_data *data, struct iio_dev *idev)
903 {
904 	struct iio_trigger *itrig;
905 	char *name;
906 	int ret;
907 
908 	ret = devm_iio_triggered_buffer_setup(data->dev, idev,
909 					      &iio_pollfunc_store_time,
910 					      bu27008_trigger_handler,
911 					      &bu27008_buffer_ops);
912 	if (ret)
913 		return dev_err_probe(data->dev, ret,
914 			     "iio_triggered_buffer_setup_ext FAIL\n");
915 
916 	itrig = devm_iio_trigger_alloc(data->dev, "%sdata-rdy-dev%d",
917 				       idev->name, iio_device_id(idev));
918 	if (!itrig)
919 		return -ENOMEM;
920 
921 	data->trig = itrig;
922 
923 	itrig->ops = &bu27008_trigger_ops;
924 	iio_trigger_set_drvdata(itrig, data);
925 
926 	name = devm_kasprintf(data->dev, GFP_KERNEL, "%s-bu27008",
927 			      dev_name(data->dev));
928 
929 	ret = devm_request_irq(data->dev, data->irq,
930 			       &bu27008_data_rdy_poll,
931 			       0, name, itrig);
932 	if (ret)
933 		return dev_err_probe(data->dev, ret, "Could not request IRQ\n");
934 
935 	ret = devm_iio_trigger_register(data->dev, itrig);
936 	if (ret)
937 		return dev_err_probe(data->dev, ret,
938 				     "Trigger registration failed\n");
939 
940 	/* set default trigger */
941 	idev->trig = iio_trigger_get(itrig);
942 
943 	return 0;
944 }
945 
946 static int bu27008_probe(struct i2c_client *i2c)
947 {
948 	struct device *dev = &i2c->dev;
949 	struct bu27008_data *data;
950 	struct regmap *regmap;
951 	unsigned int part_id, reg;
952 	struct iio_dev *idev;
953 	int ret;
954 
955 	regmap = devm_regmap_init_i2c(i2c, &bu27008_regmap);
956 	if (IS_ERR(regmap))
957 		return dev_err_probe(dev, PTR_ERR(regmap),
958 				     "Failed to initialize Regmap\n");
959 
960 	idev = devm_iio_device_alloc(dev, sizeof(*data));
961 	if (!idev)
962 		return -ENOMEM;
963 
964 	ret = devm_regulator_get_enable(dev, "vdd");
965 	if (ret)
966 		return dev_err_probe(dev, ret, "Failed to get regulator\n");
967 
968 	data = iio_priv(idev);
969 
970 	ret = regmap_read(regmap, BU27008_REG_SYSTEM_CONTROL, &reg);
971 	if (ret)
972 		return dev_err_probe(dev, ret, "Failed to access sensor\n");
973 
974 	part_id = FIELD_GET(BU27008_MASK_PART_ID, reg);
975 
976 	if (part_id != BU27008_ID)
977 		dev_warn(dev, "unknown device 0x%x\n", part_id);
978 
979 	ret = devm_iio_init_iio_gts(dev, BU27008_SCALE_1X, 0, bu27008_gains,
980 				    ARRAY_SIZE(bu27008_gains), bu27008_itimes,
981 				    ARRAY_SIZE(bu27008_itimes), &data->gts);
982 	if (ret)
983 		return ret;
984 
985 	ret = devm_iio_init_iio_gts(dev, BU27008_SCALE_1X, 0, bu27008_gains_ir,
986 				    ARRAY_SIZE(bu27008_gains_ir), bu27008_itimes,
987 				    ARRAY_SIZE(bu27008_itimes), &data->gts_ir);
988 	if (ret)
989 		return ret;
990 
991 	mutex_init(&data->mutex);
992 	data->regmap = regmap;
993 	data->dev = dev;
994 	data->irq = i2c->irq;
995 
996 	idev->channels = bu27008_channels;
997 	idev->num_channels = ARRAY_SIZE(bu27008_channels);
998 	idev->name = "bu27008";
999 	idev->info = &bu27008_info;
1000 	idev->modes = INDIO_DIRECT_MODE;
1001 	idev->available_scan_masks = bu27008_scan_masks;
1002 
1003 	ret = bu27008_chip_init(data);
1004 	if (ret)
1005 		return ret;
1006 
1007 	if (i2c->irq) {
1008 		ret = bu27008_setup_trigger(data, idev);
1009 		if (ret)
1010 			return ret;
1011 	} else {
1012 		dev_info(dev, "No IRQ, buffered mode disabled\n");
1013 	}
1014 
1015 	ret = devm_iio_device_register(dev, idev);
1016 	if (ret)
1017 		return dev_err_probe(dev, ret,
1018 				     "Unable to register iio device\n");
1019 
1020 	return 0;
1021 }
1022 
1023 static const struct of_device_id bu27008_of_match[] = {
1024 	{ .compatible = "rohm,bu27008" },
1025 	{ }
1026 };
1027 MODULE_DEVICE_TABLE(of, bu27008_of_match);
1028 
1029 static struct i2c_driver bu27008_i2c_driver = {
1030 	.driver = {
1031 		.name = "bu27008",
1032 		.of_match_table = bu27008_of_match,
1033 		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
1034 	},
1035 	.probe = bu27008_probe,
1036 };
1037 module_i2c_driver(bu27008_i2c_driver);
1038 
1039 MODULE_DESCRIPTION("ROHM BU27008 colour sensor driver");
1040 MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
1041 MODULE_LICENSE("GPL");
1042 MODULE_IMPORT_NS(IIO_GTS_HELPER);
1043