1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * ROHM Colour Sensor driver for
4 * - BU27008 RGBC sensor
5 * - BU27010 RGBC + Flickering sensor
6 *
7 * Copyright (c) 2023, ROHM Semiconductor.
8 */
9
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>
20
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>
26
27/*
28 * A word about register address and mask definitions.
29 *
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
32 * ones.
33 *
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.
37 *
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.
42 *
43 * Chip-specific mapping from register addresses/bits to functionality is done
44 * in bu27_chip_data structures.
45 */
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)
53
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
58
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
67
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
75
76/* BU27010 specific definitions */
77
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)
82
83#define BU27010_REG_RESET		0x3f
84#define BU27010_MASK_RESET		BIT(0)
85#define BU27010_RESET_RELEASE		BU27010_MASK_RESET
86
87#define BU27010_MASK_MEAS_EN		BIT(1)
88
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)
92
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)
97
98#define BU27010_MASK_FLC_MODE		BIT(7)
99#define BU27010_MASK_FLC_GAIN		GENMASK(4, 0)
100
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)
106
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)
114
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
125
126/**
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_NUM_CHANS:	Number of channel types.
134 */
135enum bu27008_chan_type {
136	BU27008_RED,
137	BU27008_GREEN,
138	BU27008_BLUE,
139	BU27008_CLEAR,
140	BU27008_IR,
141	BU27008_NUM_CHANS
142};
143
144/**
145 * enum bu27008_chan - BU27008 physical data channel
146 * @BU27008_DATA0:		Always red.
147 * @BU27008_DATA1:		Always green.
148 * @BU27008_DATA2:		Blue or clear.
149 * @BU27008_DATA3:		IR or clear.
150 * @BU27008_NUM_HW_CHANS:	Number of physical channels
151 */
152enum bu27008_chan {
153	BU27008_DATA0,
154	BU27008_DATA1,
155	BU27008_DATA2,
156	BU27008_DATA3,
157	BU27008_NUM_HW_CHANS
158};
159
160/* We can always measure red and green at same time */
161#define ALWAYS_SCANNABLE (BIT(BU27008_RED) | BIT(BU27008_GREEN))
162
163/* We use these data channel configs. Ensure scan_masks below follow them too */
164#define BU27008_BLUE2_CLEAR3		0x0 /* buffer is R, G, B, C */
165#define BU27008_CLEAR2_IR3		0x1 /* buffer is R, G, C, IR */
166#define BU27008_BLUE2_IR3		0x2 /* buffer is R, G, B, IR */
167
168static const unsigned long bu27008_scan_masks[] = {
169	/* buffer is R, G, B, C */
170	ALWAYS_SCANNABLE | BIT(BU27008_BLUE) | BIT(BU27008_CLEAR),
171	/* buffer is R, G, C, IR */
172	ALWAYS_SCANNABLE | BIT(BU27008_CLEAR) | BIT(BU27008_IR),
173	/* buffer is R, G, B, IR */
174	ALWAYS_SCANNABLE | BIT(BU27008_BLUE) | BIT(BU27008_IR),
175	0
176};
177
178/*
179 * Available scales with gain 1x - 1024x, timings 55, 100, 200, 400 mS
180 * Time impacts to gain: 1x, 2x, 4x, 8x.
181 *
182 * => Max total gain is HWGAIN * gain by integration time (8 * 1024) = 8192
183 *
184 * Max amplification is (HWGAIN * MAX integration-time multiplier) 1024 * 8
185 * = 8192. With NANO scale we get rid of accuracy loss when we start with the
186 * scale 16.0 for HWGAIN1, INT-TIME 55 mS. This way the nano scale for MAX
187 * total gain 8192 will be 1953125
188 */
189#define BU27008_SCALE_1X 16
190
191/*
192 * On BU27010 available scales with gain 1x - 4096x,
193 * timings 55, 100, 200, 400 mS. Time impacts to gain: 1x, 2x, 4x, 8x.
194 *
195 * => Max total gain is HWGAIN * gain by integration time (8 * 4096)
196 *
197 * Using NANO precision for scale we must use scale 64x corresponding gain 1x
198 * to avoid precision loss.
199 */
200#define BU27010_SCALE_1X 64
201
202/* See the data sheet for the "Gain Setting" table */
203#define BU27008_GSEL_1X		0x00
204#define BU27008_GSEL_4X		0x08
205#define BU27008_GSEL_8X		0x09
206#define BU27008_GSEL_16X	0x0a
207#define BU27008_GSEL_32X	0x0b
208#define BU27008_GSEL_64X	0x0c
209#define BU27008_GSEL_256X	0x18
210#define BU27008_GSEL_512X	0x19
211#define BU27008_GSEL_1024X	0x1a
212
213static const struct iio_gain_sel_pair bu27008_gains[] = {
214	GAIN_SCALE_GAIN(1, BU27008_GSEL_1X),
215	GAIN_SCALE_GAIN(4, BU27008_GSEL_4X),
216	GAIN_SCALE_GAIN(8, BU27008_GSEL_8X),
217	GAIN_SCALE_GAIN(16, BU27008_GSEL_16X),
218	GAIN_SCALE_GAIN(32, BU27008_GSEL_32X),
219	GAIN_SCALE_GAIN(64, BU27008_GSEL_64X),
220	GAIN_SCALE_GAIN(256, BU27008_GSEL_256X),
221	GAIN_SCALE_GAIN(512, BU27008_GSEL_512X),
222	GAIN_SCALE_GAIN(1024, BU27008_GSEL_1024X),
223};
224
225static const struct iio_gain_sel_pair bu27008_gains_ir[] = {
226	GAIN_SCALE_GAIN(2, BU27008_GSEL_1X),
227	GAIN_SCALE_GAIN(4, BU27008_GSEL_4X),
228	GAIN_SCALE_GAIN(8, BU27008_GSEL_8X),
229	GAIN_SCALE_GAIN(16, BU27008_GSEL_16X),
230	GAIN_SCALE_GAIN(32, BU27008_GSEL_32X),
231	GAIN_SCALE_GAIN(64, BU27008_GSEL_64X),
232	GAIN_SCALE_GAIN(256, BU27008_GSEL_256X),
233	GAIN_SCALE_GAIN(512, BU27008_GSEL_512X),
234	GAIN_SCALE_GAIN(1024, BU27008_GSEL_1024X),
235};
236
237#define BU27010_GSEL_1X		0x00	/* 000000 */
238#define BU27010_GSEL_4X		0x08	/* 001000 */
239#define BU27010_GSEL_16X	0x09	/* 001001 */
240#define BU27010_GSEL_64X	0x0e	/* 001110 */
241#define BU27010_GSEL_256X	0x1e	/* 011110 */
242#define BU27010_GSEL_1024X	0x2e	/* 101110 */
243#define BU27010_GSEL_4096X	0x3f	/* 111111 */
244
245static const struct iio_gain_sel_pair bu27010_gains[] = {
246	GAIN_SCALE_GAIN(1, BU27010_GSEL_1X),
247	GAIN_SCALE_GAIN(4, BU27010_GSEL_4X),
248	GAIN_SCALE_GAIN(16, BU27010_GSEL_16X),
249	GAIN_SCALE_GAIN(64, BU27010_GSEL_64X),
250	GAIN_SCALE_GAIN(256, BU27010_GSEL_256X),
251	GAIN_SCALE_GAIN(1024, BU27010_GSEL_1024X),
252	GAIN_SCALE_GAIN(4096, BU27010_GSEL_4096X),
253};
254
255static const struct iio_gain_sel_pair bu27010_gains_ir[] = {
256	GAIN_SCALE_GAIN(2, BU27010_GSEL_1X),
257	GAIN_SCALE_GAIN(4, BU27010_GSEL_4X),
258	GAIN_SCALE_GAIN(16, BU27010_GSEL_16X),
259	GAIN_SCALE_GAIN(64, BU27010_GSEL_64X),
260	GAIN_SCALE_GAIN(256, BU27010_GSEL_256X),
261	GAIN_SCALE_GAIN(1024, BU27010_GSEL_1024X),
262	GAIN_SCALE_GAIN(4096, BU27010_GSEL_4096X),
263};
264
265#define BU27008_MEAS_MODE_100MS		0x00
266#define BU27008_MEAS_MODE_55MS		0x01
267#define BU27008_MEAS_MODE_200MS		0x02
268#define BU27008_MEAS_MODE_400MS		0x04
269
270#define BU27010_MEAS_MODE_100MS		0x00
271#define BU27010_MEAS_MODE_55MS		0x03
272#define BU27010_MEAS_MODE_200MS		0x01
273#define BU27010_MEAS_MODE_400MS		0x02
274
275#define BU27008_MEAS_TIME_MAX_MS	400
276
277static const struct iio_itime_sel_mul bu27008_itimes[] = {
278	GAIN_SCALE_ITIME_US(400000, BU27008_MEAS_MODE_400MS, 8),
279	GAIN_SCALE_ITIME_US(200000, BU27008_MEAS_MODE_200MS, 4),
280	GAIN_SCALE_ITIME_US(100000, BU27008_MEAS_MODE_100MS, 2),
281	GAIN_SCALE_ITIME_US(55000, BU27008_MEAS_MODE_55MS, 1),
282};
283
284static const struct iio_itime_sel_mul bu27010_itimes[] = {
285	GAIN_SCALE_ITIME_US(400000, BU27010_MEAS_MODE_400MS, 8),
286	GAIN_SCALE_ITIME_US(200000, BU27010_MEAS_MODE_200MS, 4),
287	GAIN_SCALE_ITIME_US(100000, BU27010_MEAS_MODE_100MS, 2),
288	GAIN_SCALE_ITIME_US(55000, BU27010_MEAS_MODE_55MS, 1),
289};
290
291/*
292 * All the RGBC channels share the same gain.
293 * IR gain can be fine-tuned from the gain set for the RGBC by 2 bit, but this
294 * would yield quite complex gain setting. Especially since not all bit
295 * compinations are supported. And in any case setting GAIN for RGBC will
296 * always also change the IR-gain.
297 *
298 * On top of this, the selector '0' which corresponds to hw-gain 1X on RGBC,
299 * corresponds to gain 2X on IR. Rest of the selctors correspond to same gains
300 * though. This, however, makes it not possible to use shared gain for all
301 * RGBC and IR settings even though they are all changed at the one go.
302 */
303#define BU27008_CHAN(color, data, separate_avail)				\
304{										\
305	.type = IIO_INTENSITY,							\
306	.modified = 1,								\
307	.channel2 = IIO_MOD_LIGHT_##color,					\
308	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |				\
309			      BIT(IIO_CHAN_INFO_SCALE),				\
310	.info_mask_separate_available = (separate_avail),			\
311	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME),			\
312	.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME),	\
313	.address = BU27008_REG_##data##_LO,					\
314	.scan_index = BU27008_##color,						\
315	.scan_type = {								\
316		.sign = 'u',							\
317		.realbits = 16,							\
318		.storagebits = 16,						\
319		.endianness = IIO_LE,						\
320	},									\
321}
322
323/* For raw reads we always configure DATA3 for CLEAR */
324static const struct iio_chan_spec bu27008_channels[] = {
325	BU27008_CHAN(RED, DATA0, BIT(IIO_CHAN_INFO_SCALE)),
326	BU27008_CHAN(GREEN, DATA1, BIT(IIO_CHAN_INFO_SCALE)),
327	BU27008_CHAN(BLUE, DATA2, BIT(IIO_CHAN_INFO_SCALE)),
328	BU27008_CHAN(CLEAR, DATA2, BIT(IIO_CHAN_INFO_SCALE)),
329	/*
330	 * We don't allow setting scale for IR (because of shared gain bits).
331	 * Hence we don't advertise available ones either.
332	 */
333	BU27008_CHAN(IR, DATA3, 0),
334	IIO_CHAN_SOFT_TIMESTAMP(BU27008_NUM_CHANS),
335};
336
337struct bu27008_data;
338
339struct bu27_chip_data {
340	const char *name;
341	int (*chip_init)(struct bu27008_data *data);
342	int (*get_gain_sel)(struct bu27008_data *data, int *sel);
343	int (*write_gain_sel)(struct bu27008_data *data, int sel);
344	const struct regmap_config *regmap_cfg;
345	const struct iio_gain_sel_pair *gains;
346	const struct iio_gain_sel_pair *gains_ir;
347	const struct iio_itime_sel_mul *itimes;
348	int num_gains;
349	int num_gains_ir;
350	int num_itimes;
351	int scale1x;
352
353	int drdy_en_reg;
354	int drdy_en_mask;
355	int meas_en_reg;
356	int meas_en_mask;
357	int valid_reg;
358	int chan_sel_reg;
359	int chan_sel_mask;
360	int int_time_mask;
361	u8 part_id;
362};
363
364struct bu27008_data {
365	const struct bu27_chip_data *cd;
366	struct regmap *regmap;
367	struct iio_trigger *trig;
368	struct device *dev;
369	struct iio_gts gts;
370	struct iio_gts gts_ir;
371	int irq;
372
373	/*
374	 * Prevent changing gain/time config when scale is read/written.
375	 * Similarly, protect the integration_time read/change sequence.
376	 * Prevent changing gain/time when data is read.
377	 */
378	struct mutex mutex;
379};
380
381static const struct regmap_range bu27008_volatile_ranges[] = {
382	{
383		.range_min = BU27008_REG_SYSTEM_CONTROL,	/* SWRESET */
384		.range_max = BU27008_REG_SYSTEM_CONTROL,
385	}, {
386		.range_min = BU27008_REG_MODE_CONTROL3,		/* VALID */
387		.range_max = BU27008_REG_MODE_CONTROL3,
388	}, {
389		.range_min = BU27008_REG_DATA0_LO,		/* DATA */
390		.range_max = BU27008_REG_DATA3_HI,
391	},
392};
393
394static const struct regmap_range bu27010_volatile_ranges[] = {
395	{
396		.range_min = BU27010_REG_RESET,			/* RSTB */
397		.range_max = BU27008_REG_SYSTEM_CONTROL,	/* RESET */
398	}, {
399		.range_min = BU27010_REG_MODE_CONTROL5,		/* VALID bits */
400		.range_max = BU27010_REG_MODE_CONTROL5,
401	}, {
402		.range_min = BU27008_REG_DATA0_LO,
403		.range_max = BU27010_REG_FIFO_DATA_HI,
404	},
405};
406
407static const struct regmap_access_table bu27008_volatile_regs = {
408	.yes_ranges = &bu27008_volatile_ranges[0],
409	.n_yes_ranges = ARRAY_SIZE(bu27008_volatile_ranges),
410};
411
412static const struct regmap_access_table bu27010_volatile_regs = {
413	.yes_ranges = &bu27010_volatile_ranges[0],
414	.n_yes_ranges = ARRAY_SIZE(bu27010_volatile_ranges),
415};
416
417static const struct regmap_range bu27008_read_only_ranges[] = {
418	{
419		.range_min = BU27008_REG_DATA0_LO,
420		.range_max = BU27008_REG_DATA3_HI,
421	}, {
422		.range_min = BU27008_REG_MANUFACTURER_ID,
423		.range_max = BU27008_REG_MANUFACTURER_ID,
424	},
425};
426
427static const struct regmap_range bu27010_read_only_ranges[] = {
428	{
429		.range_min = BU27008_REG_DATA0_LO,
430		.range_max = BU27010_REG_FIFO_DATA_HI,
431	}, {
432		.range_min = BU27010_REG_MANUFACTURER_ID,
433		.range_max = BU27010_REG_MANUFACTURER_ID,
434	}
435};
436
437static const struct regmap_access_table bu27008_ro_regs = {
438	.no_ranges = &bu27008_read_only_ranges[0],
439	.n_no_ranges = ARRAY_SIZE(bu27008_read_only_ranges),
440};
441
442static const struct regmap_access_table bu27010_ro_regs = {
443	.no_ranges = &bu27010_read_only_ranges[0],
444	.n_no_ranges = ARRAY_SIZE(bu27010_read_only_ranges),
445};
446
447static const struct regmap_config bu27008_regmap = {
448	.reg_bits = 8,
449	.val_bits = 8,
450	.max_register = BU27008_REG_MAX,
451	.cache_type = REGCACHE_RBTREE,
452	.volatile_table = &bu27008_volatile_regs,
453	.wr_table = &bu27008_ro_regs,
454	/*
455	 * All register writes are serialized by the mutex which protects the
456	 * scale setting/getting. This is needed because scale is combined by
457	 * gain and integration time settings and we need to ensure those are
458	 * not read / written when scale is being computed.
459	 *
460	 * As a result of this serializing, we don't need regmap locking. Note,
461	 * this is not true if we add any configurations which are not
462	 * serialized by the mutex and which may need for example a protected
463	 * read-modify-write cycle (eg. regmap_update_bits()). Please, revise
464	 * this when adding features to the driver.
465	 */
466	.disable_locking = true,
467};
468
469static const struct regmap_config bu27010_regmap = {
470	.reg_bits	= 8,
471	.val_bits	= 8,
472
473	.max_register	= BU27010_REG_MAX,
474	.cache_type	= REGCACHE_RBTREE,
475	.volatile_table = &bu27010_volatile_regs,
476	.wr_table	= &bu27010_ro_regs,
477	.disable_locking = true,
478};
479
480static int bu27008_write_gain_sel(struct bu27008_data *data, int sel)
481{
482	int regval;
483
484	regval = FIELD_PREP(BU27008_MASK_RGBC_GAIN, sel);
485
486	/*
487	 * We do always set also the LOW bits of IR-gain because othervice we
488	 * would risk resulting an invalid GAIN register value.
489	 *
490	 * We could allow setting separate gains for RGBC and IR when the
491	 * values were such that HW could support both gain settings.
492	 * Eg, when the shared bits were same for both gain values.
493	 *
494	 * This, however, has a negligible benefit compared to the increased
495	 * software complexity when we would need to go through the gains
496	 * for both channels separately when the integration time changes.
497	 * This would end up with nasty logic for computing gain values for
498	 * both channels - and rejecting them if shared bits changed.
499	 *
500	 * We should then build the logic by guessing what a user prefers.
501	 * RGBC or IR gains correctly set while other jumps to odd value?
502	 * Maybe look-up a value where both gains are somehow optimized
503	 * <what this somehow is, is ATM unknown to us>. Or maybe user would
504	 * expect us to reject changes when optimal gains can't be set to both
505	 * channels w/given integration time. At best that would result
506	 * solution that works well for a very specific subset of
507	 * configurations but causes unexpected corner-cases.
508	 *
509	 * So, we keep it simple. Always set same selector to IR and RGBC.
510	 * We disallow setting IR (as I expect that most of the users are
511	 * interested in RGBC). This way we can show the user that the scales
512	 * for RGBC and IR channels are different (1X Vs 2X with sel 0) while
513	 * still keeping the operation deterministic.
514	 */
515	regval |= FIELD_PREP(BU27008_MASK_IR_GAIN_LO, sel);
516
517	return regmap_update_bits(data->regmap, BU27008_REG_MODE_CONTROL2,
518				  BU27008_MASK_RGBC_GAIN, regval);
519}
520
521static int bu27010_write_gain_sel(struct bu27008_data *data, int sel)
522{
523	unsigned int regval;
524	int ret, chan_selector;
525
526	/*
527	 * Gain 'selector' is composed of two registers. Selector is 6bit value,
528	 * 4 high bits being the RGBC gain fieild in MODE_CONTROL1 register and
529	 * two low bits being the channel specific gain in MODE_CONTROL2.
530	 *
531	 * Let's take the 4 high bits of whole 6 bit selector, and prepare
532	 * the MODE_CONTROL1 value (RGBC gain part).
533	 */
534	regval = FIELD_PREP(BU27010_MASK_RGBC_GAIN, (sel >> 2));
535
536	ret = regmap_update_bits(data->regmap, BU27008_REG_MODE_CONTROL1,
537				  BU27010_MASK_RGBC_GAIN, regval);
538	if (ret)
539		return ret;
540
541	/*
542	 * Two low two bits of the selector must be written for all 4
543	 * channels in the MODE_CONTROL2 register. Copy these two bits for
544	 * all channels.
545	 */
546	chan_selector = sel & GENMASK(1, 0);
547
548	regval = FIELD_PREP(BU27010_MASK_DATA0_GAIN, chan_selector);
549	regval |= FIELD_PREP(BU27010_MASK_DATA1_GAIN, chan_selector);
550	regval |= FIELD_PREP(BU27010_MASK_DATA2_GAIN, chan_selector);
551	regval |= FIELD_PREP(BU27010_MASK_DATA3_GAIN, chan_selector);
552
553	return regmap_write(data->regmap, BU27008_REG_MODE_CONTROL2, regval);
554}
555
556static int bu27008_get_gain_sel(struct bu27008_data *data, int *sel)
557{
558	int ret;
559
560	/*
561	 * If we always "lock" the gain selectors for all channels to prevent
562	 * unsupported configs, then it does not matter which channel is used
563	 * we can just return selector from any of them.
564	 *
565	 * This, however is not true if we decide to support only 4X and 16X
566	 * and then individual gains for channels. Currently this is not the
567	 * case.
568	 *
569	 * If we some day decide to support individual gains, then we need to
570	 * have channel information here.
571	 */
572
573	ret = regmap_read(data->regmap, BU27008_REG_MODE_CONTROL2, sel);
574	if (ret)
575		return ret;
576
577	*sel = FIELD_GET(BU27008_MASK_RGBC_GAIN, *sel);
578
579	return 0;
580}
581
582static int bu27010_get_gain_sel(struct bu27008_data *data, int *sel)
583{
584	int ret, tmp;
585
586	/*
587	 * We always "lock" the gain selectors for all channels to prevent
588	 * unsupported configs. It does not matter which channel is used
589	 * we can just return selector from any of them.
590	 *
591	 * Read the channel0 gain.
592	 */
593	ret = regmap_read(data->regmap, BU27008_REG_MODE_CONTROL2, sel);
594	if (ret)
595		return ret;
596
597	*sel = FIELD_GET(BU27010_MASK_DATA0_GAIN, *sel);
598
599	/* Read the shared gain */
600	ret = regmap_read(data->regmap, BU27008_REG_MODE_CONTROL1, &tmp);
601	if (ret)
602		return ret;
603
604	/*
605	 * The gain selector is made as a combination of common RGBC gain and
606	 * the channel specific gain. The channel specific gain forms the low
607	 * bits of selector and RGBC gain is appended right after it.
608	 *
609	 * Compose the selector from channel0 gain and shared RGBC gain.
610	 */
611	*sel |= FIELD_GET(BU27010_MASK_RGBC_GAIN, tmp) << fls(BU27010_MASK_DATA0_GAIN);
612
613	return ret;
614}
615
616static int bu27008_chip_init(struct bu27008_data *data)
617{
618	int ret;
619
620	ret = regmap_write_bits(data->regmap, BU27008_REG_SYSTEM_CONTROL,
621				BU27008_MASK_SW_RESET, BU27008_MASK_SW_RESET);
622	if (ret)
623		return dev_err_probe(data->dev, ret, "Sensor reset failed\n");
624
625	/*
626	 * The data-sheet does not tell how long performing the IC reset takes.
627	 * However, the data-sheet says the minimum time it takes the IC to be
628	 * able to take inputs after power is applied, is 100 uS. I'd assume
629	 * > 1 mS is enough.
630	 */
631	msleep(1);
632
633	ret = regmap_reinit_cache(data->regmap, data->cd->regmap_cfg);
634	if (ret)
635		dev_err(data->dev, "Failed to reinit reg cache\n");
636
637	return ret;
638}
639
640static int bu27010_chip_init(struct bu27008_data *data)
641{
642	int ret;
643
644	ret = regmap_write_bits(data->regmap, BU27008_REG_SYSTEM_CONTROL,
645				BU27010_MASK_SW_RESET, BU27010_MASK_SW_RESET);
646	if (ret)
647		return dev_err_probe(data->dev, ret, "Sensor reset failed\n");
648
649	msleep(1);
650
651	/* Power ON*/
652	ret = regmap_write_bits(data->regmap, BU27010_REG_POWER,
653				BU27010_MASK_POWER, BU27010_MASK_POWER);
654	if (ret)
655		return dev_err_probe(data->dev, ret, "Sensor power-on failed\n");
656
657	msleep(1);
658
659	/* Release blocks from reset */
660	ret = regmap_write_bits(data->regmap, BU27010_REG_RESET,
661				BU27010_MASK_RESET, BU27010_RESET_RELEASE);
662	if (ret)
663		return dev_err_probe(data->dev, ret, "Sensor powering failed\n");
664
665	msleep(1);
666
667	/*
668	 * The IRQ enabling on BU27010 is done in a peculiar way. The IRQ
669	 * enabling is not a bit mask where individual IRQs could be enabled but
670	 * a field which values are:
671	 * 00 => IRQs disabled
672	 * 01 => Data-ready (RGBC/IR)
673	 * 10 => Data-ready (flicker)
674	 * 11 => Flicker FIFO
675	 *
676	 * So, only one IRQ can be enabled at a time and enabling for example
677	 * flicker FIFO would automagically disable data-ready IRQ.
678	 *
679	 * Currently the driver does not support the flicker. Hence, we can
680	 * just treat the RGBC data-ready as single bit which can be enabled /
681	 * disabled. This works for as long as the second bit in the field
682	 * stays zero. Here we ensure it gets zeroed.
683	 */
684	return regmap_clear_bits(data->regmap, BU27010_REG_MODE_CONTROL4,
685				 BU27010_IRQ_DIS_ALL);
686}
687
688static const struct bu27_chip_data bu27010_chip = {
689	.name = "bu27010",
690	.chip_init = bu27010_chip_init,
691	.get_gain_sel = bu27010_get_gain_sel,
692	.write_gain_sel = bu27010_write_gain_sel,
693	.regmap_cfg = &bu27010_regmap,
694	.gains = &bu27010_gains[0],
695	.gains_ir = &bu27010_gains_ir[0],
696	.itimes = &bu27010_itimes[0],
697	.num_gains = ARRAY_SIZE(bu27010_gains),
698	.num_gains_ir = ARRAY_SIZE(bu27010_gains_ir),
699	.num_itimes = ARRAY_SIZE(bu27010_itimes),
700	.scale1x = BU27010_SCALE_1X,
701	.drdy_en_reg = BU27010_REG_MODE_CONTROL4,
702	.drdy_en_mask = BU27010_DRDY_EN,
703	.meas_en_reg = BU27010_REG_MODE_CONTROL5,
704	.meas_en_mask = BU27010_MASK_MEAS_EN,
705	.valid_reg = BU27010_REG_MODE_CONTROL5,
706	.chan_sel_reg = BU27008_REG_MODE_CONTROL1,
707	.chan_sel_mask = BU27010_MASK_CHAN_SEL,
708	.int_time_mask = BU27010_MASK_MEAS_MODE,
709	.part_id = BU27010_ID,
710};
711
712static const struct bu27_chip_data bu27008_chip = {
713	.name = "bu27008",
714	.chip_init = bu27008_chip_init,
715	.get_gain_sel = bu27008_get_gain_sel,
716	.write_gain_sel = bu27008_write_gain_sel,
717	.regmap_cfg = &bu27008_regmap,
718	.gains = &bu27008_gains[0],
719	.gains_ir = &bu27008_gains_ir[0],
720	.itimes = &bu27008_itimes[0],
721	.num_gains = ARRAY_SIZE(bu27008_gains),
722	.num_gains_ir = ARRAY_SIZE(bu27008_gains_ir),
723	.num_itimes = ARRAY_SIZE(bu27008_itimes),
724	.scale1x = BU27008_SCALE_1X,
725	.drdy_en_reg = BU27008_REG_MODE_CONTROL3,
726	.drdy_en_mask = BU27008_MASK_INT_EN,
727	.valid_reg = BU27008_REG_MODE_CONTROL3,
728	.meas_en_reg = BU27008_REG_MODE_CONTROL3,
729	.meas_en_mask = BU27008_MASK_MEAS_EN,
730	.chan_sel_reg = BU27008_REG_MODE_CONTROL3,
731	.chan_sel_mask = BU27008_MASK_CHAN_SEL,
732	.int_time_mask = BU27008_MASK_MEAS_MODE,
733	.part_id = BU27008_ID,
734};
735
736#define BU27008_MAX_VALID_RESULT_WAIT_US	50000
737#define BU27008_VALID_RESULT_WAIT_QUANTA_US	1000
738
739static int bu27008_chan_read_data(struct bu27008_data *data, int reg, int *val)
740{
741	int ret, valid;
742	__le16 tmp;
743
744	ret = regmap_read_poll_timeout(data->regmap, data->cd->valid_reg,
745				       valid, (valid & BU27008_MASK_VALID),
746				       BU27008_VALID_RESULT_WAIT_QUANTA_US,
747				       BU27008_MAX_VALID_RESULT_WAIT_US);
748	if (ret)
749		return ret;
750
751	ret = regmap_bulk_read(data->regmap, reg, &tmp, sizeof(tmp));
752	if (ret)
753		dev_err(data->dev, "Reading channel data failed\n");
754
755	*val = le16_to_cpu(tmp);
756
757	return ret;
758}
759
760static int bu27008_get_gain(struct bu27008_data *data, struct iio_gts *gts, int *gain)
761{
762	int ret, sel;
763
764	ret = data->cd->get_gain_sel(data, &sel);
765	if (ret)
766		return ret;
767
768	ret = iio_gts_find_gain_by_sel(gts, sel);
769	if (ret < 0) {
770		dev_err(data->dev, "unknown gain value 0x%x\n", sel);
771		return ret;
772	}
773
774	*gain = ret;
775
776	return 0;
777}
778
779static int bu27008_set_gain(struct bu27008_data *data, int gain)
780{
781	int ret;
782
783	ret = iio_gts_find_sel_by_gain(&data->gts, gain);
784	if (ret < 0)
785		return ret;
786
787	return data->cd->write_gain_sel(data, ret);
788}
789
790static int bu27008_get_int_time_sel(struct bu27008_data *data, int *sel)
791{
792	int ret, val;
793
794	ret = regmap_read(data->regmap, BU27008_REG_MODE_CONTROL1, &val);
795	if (ret)
796		return ret;
797
798	val &= data->cd->int_time_mask;
799	val >>= ffs(data->cd->int_time_mask) - 1;
800
801	*sel = val;
802
803	return 0;
804}
805
806static int bu27008_set_int_time_sel(struct bu27008_data *data, int sel)
807{
808	sel <<= ffs(data->cd->int_time_mask) - 1;
809
810	return regmap_update_bits(data->regmap, BU27008_REG_MODE_CONTROL1,
811				  data->cd->int_time_mask, sel);
812}
813
814static int bu27008_get_int_time_us(struct bu27008_data *data)
815{
816	int ret, sel;
817
818	ret = bu27008_get_int_time_sel(data, &sel);
819	if (ret)
820		return ret;
821
822	return iio_gts_find_int_time_by_sel(&data->gts, sel);
823}
824
825static int _bu27008_get_scale(struct bu27008_data *data, bool ir, int *val,
826			      int *val2)
827{
828	struct iio_gts *gts;
829	int gain, ret;
830
831	if (ir)
832		gts = &data->gts_ir;
833	else
834		gts = &data->gts;
835
836	ret = bu27008_get_gain(data, gts, &gain);
837	if (ret)
838		return ret;
839
840	ret = bu27008_get_int_time_us(data);
841	if (ret < 0)
842		return ret;
843
844	return iio_gts_get_scale(gts, gain, ret, val, val2);
845}
846
847static int bu27008_get_scale(struct bu27008_data *data, bool ir, int *val,
848			     int *val2)
849{
850	int ret;
851
852	mutex_lock(&data->mutex);
853	ret = _bu27008_get_scale(data, ir, val, val2);
854	mutex_unlock(&data->mutex);
855
856	return ret;
857}
858
859static int bu27008_set_int_time(struct bu27008_data *data, int time)
860{
861	int ret;
862
863	ret = iio_gts_find_sel_by_int_time(&data->gts, time);
864	if (ret < 0)
865		return ret;
866
867	return bu27008_set_int_time_sel(data, ret);
868}
869
870/* Try to change the time so that the scale is maintained */
871static int bu27008_try_set_int_time(struct bu27008_data *data, int int_time_new)
872{
873	int ret, old_time_sel, new_time_sel,  old_gain, new_gain;
874
875	mutex_lock(&data->mutex);
876
877	ret = bu27008_get_int_time_sel(data, &old_time_sel);
878	if (ret < 0)
879		goto unlock_out;
880
881	if (!iio_gts_valid_time(&data->gts, int_time_new)) {
882		dev_dbg(data->dev, "Unsupported integration time %u\n",
883			int_time_new);
884
885		ret = -EINVAL;
886		goto unlock_out;
887	}
888
889	/* If we already use requested time, then we're done */
890	new_time_sel = iio_gts_find_sel_by_int_time(&data->gts, int_time_new);
891	if (new_time_sel == old_time_sel)
892		goto unlock_out;
893
894	ret = bu27008_get_gain(data, &data->gts, &old_gain);
895	if (ret)
896		goto unlock_out;
897
898	ret = iio_gts_find_new_gain_sel_by_old_gain_time(&data->gts, old_gain,
899				old_time_sel, new_time_sel, &new_gain);
900	if (ret) {
901		int scale1, scale2;
902		bool ok;
903
904		_bu27008_get_scale(data, false, &scale1, &scale2);
905		dev_dbg(data->dev,
906			"Can't support time %u with current scale %u %u\n",
907			int_time_new, scale1, scale2);
908
909		if (new_gain < 0)
910			goto unlock_out;
911
912		/*
913		 * If caller requests for integration time change and we
914		 * can't support the scale - then the caller should be
915		 * prepared to 'pick up the pieces and deal with the
916		 * fact that the scale changed'.
917		 */
918		ret = iio_find_closest_gain_low(&data->gts, new_gain, &ok);
919		if (!ok)
920			dev_dbg(data->dev, "optimal gain out of range\n");
921
922		if (ret < 0) {
923			dev_dbg(data->dev,
924				 "Total gain increase. Risk of saturation");
925			ret = iio_gts_get_min_gain(&data->gts);
926			if (ret < 0)
927				goto unlock_out;
928		}
929		new_gain = ret;
930		dev_dbg(data->dev, "scale changed, new gain %u\n", new_gain);
931	}
932
933	ret = bu27008_set_gain(data, new_gain);
934	if (ret)
935		goto unlock_out;
936
937	ret = bu27008_set_int_time(data, int_time_new);
938
939unlock_out:
940	mutex_unlock(&data->mutex);
941
942	return ret;
943}
944
945static int bu27008_meas_set(struct bu27008_data *data, bool enable)
946{
947	if (enable)
948		return regmap_set_bits(data->regmap, data->cd->meas_en_reg,
949				       data->cd->meas_en_mask);
950	return regmap_clear_bits(data->regmap, data->cd->meas_en_reg,
951				 data->cd->meas_en_mask);
952}
953
954static int bu27008_chan_cfg(struct bu27008_data *data,
955			    struct iio_chan_spec const *chan)
956{
957	int chan_sel;
958
959	if (chan->scan_index == BU27008_BLUE)
960		chan_sel = BU27008_BLUE2_CLEAR3;
961	else
962		chan_sel = BU27008_CLEAR2_IR3;
963
964	/*
965	 * prepare bitfield for channel sel. The FIELD_PREP works only when
966	 * mask is constant. In our case the mask is assigned based on the
967	 * chip type. Hence the open-coded FIELD_PREP here. We don't bother
968	 * zeroing the irrelevant bits though - update_bits takes care of that.
969	 */
970	chan_sel <<= ffs(data->cd->chan_sel_mask) - 1;
971
972	return regmap_update_bits(data->regmap, data->cd->chan_sel_reg,
973				  BU27008_MASK_CHAN_SEL, chan_sel);
974}
975
976static int bu27008_read_one(struct bu27008_data *data, struct iio_dev *idev,
977			    struct iio_chan_spec const *chan, int *val, int *val2)
978{
979	int ret, int_time;
980
981	ret = bu27008_chan_cfg(data, chan);
982	if (ret)
983		return ret;
984
985	ret = bu27008_meas_set(data, true);
986	if (ret)
987		return ret;
988
989	ret = bu27008_get_int_time_us(data);
990	if (ret < 0)
991		int_time = BU27008_MEAS_TIME_MAX_MS;
992	else
993		int_time = ret / USEC_PER_MSEC;
994
995	msleep(int_time);
996
997	ret = bu27008_chan_read_data(data, chan->address, val);
998	if (!ret)
999		ret = IIO_VAL_INT;
1000
1001	if (bu27008_meas_set(data, false))
1002		dev_warn(data->dev, "measurement disabling failed\n");
1003
1004	return ret;
1005}
1006
1007static int bu27008_read_raw(struct iio_dev *idev,
1008			   struct iio_chan_spec const *chan,
1009			   int *val, int *val2, long mask)
1010{
1011	struct bu27008_data *data = iio_priv(idev);
1012	int busy, ret;
1013
1014	switch (mask) {
1015	case IIO_CHAN_INFO_RAW:
1016		busy = iio_device_claim_direct_mode(idev);
1017		if (busy)
1018			return -EBUSY;
1019
1020		mutex_lock(&data->mutex);
1021		ret = bu27008_read_one(data, idev, chan, val, val2);
1022		mutex_unlock(&data->mutex);
1023
1024		iio_device_release_direct_mode(idev);
1025
1026		return ret;
1027
1028	case IIO_CHAN_INFO_SCALE:
1029		ret = bu27008_get_scale(data, chan->scan_index == BU27008_IR,
1030					val, val2);
1031		if (ret)
1032			return ret;
1033
1034		return IIO_VAL_INT_PLUS_NANO;
1035
1036	case IIO_CHAN_INFO_INT_TIME:
1037		ret = bu27008_get_int_time_us(data);
1038		if (ret < 0)
1039			return ret;
1040
1041		*val = 0;
1042		*val2 = ret;
1043
1044		return IIO_VAL_INT_PLUS_MICRO;
1045
1046	default:
1047		return -EINVAL;
1048	}
1049}
1050
1051/* Called if the new scale could not be supported with existing int-time */
1052static int bu27008_try_find_new_time_gain(struct bu27008_data *data, int val,
1053					  int val2, int *gain_sel)
1054{
1055	int i, ret, new_time_sel;
1056
1057	for (i = 0; i < data->gts.num_itime; i++) {
1058		new_time_sel = data->gts.itime_table[i].sel;
1059		ret = iio_gts_find_gain_sel_for_scale_using_time(&data->gts,
1060					new_time_sel, val, val2, gain_sel);
1061		if (!ret)
1062			break;
1063	}
1064	if (i == data->gts.num_itime) {
1065		dev_err(data->dev, "Can't support scale %u %u\n", val, val2);
1066
1067		return -EINVAL;
1068	}
1069
1070	return bu27008_set_int_time_sel(data, new_time_sel);
1071}
1072
1073static int bu27008_set_scale(struct bu27008_data *data,
1074			     struct iio_chan_spec const *chan,
1075			     int val, int val2)
1076{
1077	int ret, gain_sel, time_sel;
1078
1079	if (chan->scan_index == BU27008_IR)
1080		return -EINVAL;
1081
1082	mutex_lock(&data->mutex);
1083
1084	ret = bu27008_get_int_time_sel(data, &time_sel);
1085	if (ret < 0)
1086		goto unlock_out;
1087
1088	ret = iio_gts_find_gain_sel_for_scale_using_time(&data->gts, time_sel,
1089						val, val2, &gain_sel);
1090	if (ret) {
1091		ret = bu27008_try_find_new_time_gain(data, val, val2, &gain_sel);
1092		if (ret)
1093			goto unlock_out;
1094
1095	}
1096	ret = data->cd->write_gain_sel(data, gain_sel);
1097
1098unlock_out:
1099	mutex_unlock(&data->mutex);
1100
1101	return ret;
1102}
1103
1104static int bu27008_write_raw_get_fmt(struct iio_dev *indio_dev,
1105				     struct iio_chan_spec const *chan,
1106				     long mask)
1107{
1108
1109	switch (mask) {
1110	case IIO_CHAN_INFO_SCALE:
1111		return IIO_VAL_INT_PLUS_NANO;
1112	case IIO_CHAN_INFO_INT_TIME:
1113		return IIO_VAL_INT_PLUS_MICRO;
1114	default:
1115		return -EINVAL;
1116	}
1117}
1118
1119static int bu27008_write_raw(struct iio_dev *idev,
1120			     struct iio_chan_spec const *chan,
1121			     int val, int val2, long mask)
1122{
1123	struct bu27008_data *data = iio_priv(idev);
1124	int ret;
1125
1126	/*
1127	 * Do not allow changing scale when measurement is ongoing as doing so
1128	 * could make values in the buffer inconsistent.
1129	 */
1130	ret = iio_device_claim_direct_mode(idev);
1131	if (ret)
1132		return ret;
1133
1134	switch (mask) {
1135	case IIO_CHAN_INFO_SCALE:
1136		ret = bu27008_set_scale(data, chan, val, val2);
1137		break;
1138	case IIO_CHAN_INFO_INT_TIME:
1139		if (val) {
1140			ret = -EINVAL;
1141			break;
1142		}
1143		ret = bu27008_try_set_int_time(data, val2);
1144		break;
1145	default:
1146		ret = -EINVAL;
1147		break;
1148	}
1149	iio_device_release_direct_mode(idev);
1150
1151	return ret;
1152}
1153
1154static int bu27008_read_avail(struct iio_dev *idev,
1155			      struct iio_chan_spec const *chan, const int **vals,
1156			      int *type, int *length, long mask)
1157{
1158	struct bu27008_data *data = iio_priv(idev);
1159
1160	switch (mask) {
1161	case IIO_CHAN_INFO_INT_TIME:
1162		return iio_gts_avail_times(&data->gts, vals, type, length);
1163	case IIO_CHAN_INFO_SCALE:
1164		if (chan->channel2 == IIO_MOD_LIGHT_IR)
1165			return iio_gts_all_avail_scales(&data->gts_ir, vals,
1166							type, length);
1167		return iio_gts_all_avail_scales(&data->gts, vals, type, length);
1168	default:
1169		return -EINVAL;
1170	}
1171}
1172
1173static int bu27008_update_scan_mode(struct iio_dev *idev,
1174				    const unsigned long *scan_mask)
1175{
1176	struct bu27008_data *data = iio_priv(idev);
1177	int chan_sel;
1178
1179	/* Configure channel selection */
1180	if (test_bit(BU27008_BLUE, idev->active_scan_mask)) {
1181		if (test_bit(BU27008_CLEAR, idev->active_scan_mask))
1182			chan_sel = BU27008_BLUE2_CLEAR3;
1183		else
1184			chan_sel = BU27008_BLUE2_IR3;
1185	} else {
1186		chan_sel = BU27008_CLEAR2_IR3;
1187	}
1188
1189	chan_sel <<= ffs(data->cd->chan_sel_mask) - 1;
1190
1191	return regmap_update_bits(data->regmap, data->cd->chan_sel_reg,
1192				  data->cd->chan_sel_mask, chan_sel);
1193}
1194
1195static const struct iio_info bu27008_info = {
1196	.read_raw = &bu27008_read_raw,
1197	.write_raw = &bu27008_write_raw,
1198	.write_raw_get_fmt = &bu27008_write_raw_get_fmt,
1199	.read_avail = &bu27008_read_avail,
1200	.update_scan_mode = bu27008_update_scan_mode,
1201	.validate_trigger = iio_validate_own_trigger,
1202};
1203
1204static int bu27008_trigger_set_state(struct iio_trigger *trig, bool state)
1205{
1206	struct bu27008_data *data = iio_trigger_get_drvdata(trig);
1207	int ret;
1208
1209
1210	if (state)
1211		ret = regmap_set_bits(data->regmap, data->cd->drdy_en_reg,
1212				      data->cd->drdy_en_mask);
1213	else
1214		ret = regmap_clear_bits(data->regmap, data->cd->drdy_en_reg,
1215					data->cd->drdy_en_mask);
1216	if (ret)
1217		dev_err(data->dev, "Failed to set trigger state\n");
1218
1219	return ret;
1220}
1221
1222static void bu27008_trigger_reenable(struct iio_trigger *trig)
1223{
1224	struct bu27008_data *data = iio_trigger_get_drvdata(trig);
1225
1226	enable_irq(data->irq);
1227}
1228
1229static const struct iio_trigger_ops bu27008_trigger_ops = {
1230	.set_trigger_state = bu27008_trigger_set_state,
1231	.reenable = bu27008_trigger_reenable,
1232};
1233
1234static irqreturn_t bu27008_trigger_handler(int irq, void *p)
1235{
1236	struct iio_poll_func *pf = p;
1237	struct iio_dev *idev = pf->indio_dev;
1238	struct bu27008_data *data = iio_priv(idev);
1239	struct {
1240		__le16 chan[BU27008_NUM_HW_CHANS];
1241		s64 ts __aligned(8);
1242	} raw;
1243	int ret, dummy;
1244
1245	memset(&raw, 0, sizeof(raw));
1246
1247	/*
1248	 * After some measurements, it seems reading the
1249	 * BU27008_REG_MODE_CONTROL3 debounces the IRQ line
1250	 */
1251	ret = regmap_read(data->regmap, data->cd->valid_reg, &dummy);
1252	if (ret < 0)
1253		goto err_read;
1254
1255	ret = regmap_bulk_read(data->regmap, BU27008_REG_DATA0_LO, &raw.chan,
1256			       sizeof(raw.chan));
1257	if (ret < 0)
1258		goto err_read;
1259
1260	iio_push_to_buffers_with_timestamp(idev, &raw, pf->timestamp);
1261err_read:
1262	iio_trigger_notify_done(idev->trig);
1263
1264	return IRQ_HANDLED;
1265}
1266
1267static int bu27008_buffer_preenable(struct iio_dev *idev)
1268{
1269	struct bu27008_data *data = iio_priv(idev);
1270
1271	return bu27008_meas_set(data, true);
1272}
1273
1274static int bu27008_buffer_postdisable(struct iio_dev *idev)
1275{
1276	struct bu27008_data *data = iio_priv(idev);
1277
1278	return bu27008_meas_set(data, false);
1279}
1280
1281static const struct iio_buffer_setup_ops bu27008_buffer_ops = {
1282	.preenable = bu27008_buffer_preenable,
1283	.postdisable = bu27008_buffer_postdisable,
1284};
1285
1286static irqreturn_t bu27008_data_rdy_poll(int irq, void *private)
1287{
1288	/*
1289	 * The BU27008 keeps IRQ asserted until we read the VALID bit from
1290	 * a register. We need to keep the IRQ disabled until then.
1291	 */
1292	disable_irq_nosync(irq);
1293	iio_trigger_poll(private);
1294
1295	return IRQ_HANDLED;
1296}
1297
1298static int bu27008_setup_trigger(struct bu27008_data *data, struct iio_dev *idev)
1299{
1300	struct iio_trigger *itrig;
1301	char *name;
1302	int ret;
1303
1304	ret = devm_iio_triggered_buffer_setup(data->dev, idev,
1305					      &iio_pollfunc_store_time,
1306					      bu27008_trigger_handler,
1307					      &bu27008_buffer_ops);
1308	if (ret)
1309		return dev_err_probe(data->dev, ret,
1310			     "iio_triggered_buffer_setup_ext FAIL\n");
1311
1312	itrig = devm_iio_trigger_alloc(data->dev, "%sdata-rdy-dev%d",
1313				       idev->name, iio_device_id(idev));
1314	if (!itrig)
1315		return -ENOMEM;
1316
1317	data->trig = itrig;
1318
1319	itrig->ops = &bu27008_trigger_ops;
1320	iio_trigger_set_drvdata(itrig, data);
1321
1322	name = devm_kasprintf(data->dev, GFP_KERNEL, "%s-bu27008",
1323			      dev_name(data->dev));
1324
1325	ret = devm_request_irq(data->dev, data->irq,
1326			       &bu27008_data_rdy_poll,
1327			       0, name, itrig);
1328	if (ret)
1329		return dev_err_probe(data->dev, ret, "Could not request IRQ\n");
1330
1331	ret = devm_iio_trigger_register(data->dev, itrig);
1332	if (ret)
1333		return dev_err_probe(data->dev, ret,
1334				     "Trigger registration failed\n");
1335
1336	/* set default trigger */
1337	idev->trig = iio_trigger_get(itrig);
1338
1339	return 0;
1340}
1341
1342static int bu27008_probe(struct i2c_client *i2c)
1343{
1344	struct device *dev = &i2c->dev;
1345	struct bu27008_data *data;
1346	struct regmap *regmap;
1347	unsigned int part_id, reg;
1348	struct iio_dev *idev;
1349	int ret;
1350
1351	idev = devm_iio_device_alloc(dev, sizeof(*data));
1352	if (!idev)
1353		return -ENOMEM;
1354
1355	ret = devm_regulator_get_enable(dev, "vdd");
1356	if (ret)
1357		return dev_err_probe(dev, ret, "Failed to get regulator\n");
1358
1359	data = iio_priv(idev);
1360
1361	data->cd = device_get_match_data(&i2c->dev);
1362	if (!data->cd)
1363		return -ENODEV;
1364
1365	regmap = devm_regmap_init_i2c(i2c, data->cd->regmap_cfg);
1366	if (IS_ERR(regmap))
1367		return dev_err_probe(dev, PTR_ERR(regmap),
1368				     "Failed to initialize Regmap\n");
1369
1370
1371	ret = regmap_read(regmap, BU27008_REG_SYSTEM_CONTROL, &reg);
1372	if (ret)
1373		return dev_err_probe(dev, ret, "Failed to access sensor\n");
1374
1375	part_id = FIELD_GET(BU27008_MASK_PART_ID, reg);
1376
1377	if (part_id != data->cd->part_id)
1378		dev_warn(dev, "unknown device 0x%x\n", part_id);
1379
1380	ret = devm_iio_init_iio_gts(dev, data->cd->scale1x, 0, data->cd->gains,
1381				    data->cd->num_gains, data->cd->itimes,
1382				    data->cd->num_itimes, &data->gts);
1383	if (ret)
1384		return ret;
1385
1386	ret = devm_iio_init_iio_gts(dev, data->cd->scale1x, 0, data->cd->gains_ir,
1387				    data->cd->num_gains_ir, data->cd->itimes,
1388				    data->cd->num_itimes, &data->gts_ir);
1389	if (ret)
1390		return ret;
1391
1392	mutex_init(&data->mutex);
1393	data->regmap = regmap;
1394	data->dev = dev;
1395	data->irq = i2c->irq;
1396
1397	idev->channels = bu27008_channels;
1398	idev->num_channels = ARRAY_SIZE(bu27008_channels);
1399	idev->name = data->cd->name;
1400	idev->info = &bu27008_info;
1401	idev->modes = INDIO_DIRECT_MODE;
1402	idev->available_scan_masks = bu27008_scan_masks;
1403
1404	ret = data->cd->chip_init(data);
1405	if (ret)
1406		return ret;
1407
1408	if (i2c->irq) {
1409		ret = bu27008_setup_trigger(data, idev);
1410		if (ret)
1411			return ret;
1412	} else {
1413		dev_info(dev, "No IRQ, buffered mode disabled\n");
1414	}
1415
1416	ret = devm_iio_device_register(dev, idev);
1417	if (ret)
1418		return dev_err_probe(dev, ret,
1419				     "Unable to register iio device\n");
1420
1421	return 0;
1422}
1423
1424static const struct of_device_id bu27008_of_match[] = {
1425	{ .compatible = "rohm,bu27008", .data = &bu27008_chip },
1426	{ .compatible = "rohm,bu27010", .data = &bu27010_chip },
1427	{ }
1428};
1429MODULE_DEVICE_TABLE(of, bu27008_of_match);
1430
1431static struct i2c_driver bu27008_i2c_driver = {
1432	.driver = {
1433		.name = "bu27008",
1434		.of_match_table = bu27008_of_match,
1435		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
1436	},
1437	.probe = bu27008_probe,
1438};
1439module_i2c_driver(bu27008_i2c_driver);
1440
1441MODULE_DESCRIPTION("ROHM BU27008 and BU27010 colour sensor driver");
1442MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
1443MODULE_LICENSE("GPL");
1444MODULE_IMPORT_NS(IIO_GTS_HELPER);
1445