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_LUX:	Illuminance channel, computed using RGB and IR.
134   * @BU27008_NUM_CHANS:	Number of channel types.
135   */
136  enum bu27008_chan_type {
137  	BU27008_RED,
138  	BU27008_GREEN,
139  	BU27008_BLUE,
140  	BU27008_CLEAR,
141  	BU27008_IR,
142  	BU27008_LUX,
143  	BU27008_NUM_CHANS
144  };
145  
146  /**
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
153   */
154  enum bu27008_chan {
155  	BU27008_DATA0,
156  	BU27008_DATA1,
157  	BU27008_DATA2,
158  	BU27008_DATA3,
159  	BU27008_NUM_HW_CHANS
160  };
161  
162  /* We can always measure red and green at same time */
163  #define ALWAYS_SCANNABLE (BIT(BU27008_RED) | BIT(BU27008_GREEN))
164  
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 */
169  
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),
179  	0
180  };
181  
182  /*
183   * Available scales with gain 1x - 1024x, timings 55, 100, 200, 400 mS
184   * Time impacts to gain: 1x, 2x, 4x, 8x.
185   *
186   * => Max total gain is HWGAIN * gain by integration time (8 * 1024) = 8192
187   *
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
192   */
193  #define BU27008_SCALE_1X 16
194  
195  /*
196   * On BU27010 available scales with gain 1x - 4096x,
197   * timings 55, 100, 200, 400 mS. Time impacts to gain: 1x, 2x, 4x, 8x.
198   *
199   * => Max total gain is HWGAIN * gain by integration time (8 * 4096)
200   *
201   * Using NANO precision for scale we must use scale 64x corresponding gain 1x
202   * to avoid precision loss.
203   */
204  #define BU27010_SCALE_1X 64
205  
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
216  
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),
227  };
228  
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),
239  };
240  
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 */
248  
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),
257  };
258  
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),
267  };
268  
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
273  
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
278  
279  #define BU27008_MEAS_TIME_MAX_MS	400
280  
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),
286  };
287  
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),
293  };
294  
295  /*
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.
301   *
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.
306   */
307  #define BU27008_CHAN(color, data, separate_avail)				\
308  {										\
309  	.type = IIO_INTENSITY,							\
310  	.modified = 1,								\
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,						\
319  	.scan_type = {								\
320  		.sign = 'u',							\
321  		.realbits = 16,							\
322  		.storagebits = 16,						\
323  		.endianness = IIO_LE,						\
324  	},									\
325  }
326  
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)),
333  	/*
334  	 * We don't allow setting scale for IR (because of shared gain bits).
335  	 * Hence we don't advertise available ones either.
336  	 */
337  	BU27008_CHAN(IR, DATA3, 0),
338  	{
339  		.type = IIO_LIGHT,
340  		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
341  				      BIT(IIO_CHAN_INFO_SCALE),
342  		.channel = BU27008_LUX,
343  		.scan_index = BU27008_LUX,
344  		.scan_type = {
345  			.sign = 'u',
346  			.realbits = 64,
347  			.storagebits = 64,
348  			.endianness = IIO_CPU,
349  		},
350  	},
351  	IIO_CHAN_SOFT_TIMESTAMP(BU27008_NUM_CHANS),
352  };
353  
354  struct bu27008_data;
355  
356  struct bu27_chip_data {
357  	const char *name;
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;
365  	int num_gains;
366  	int num_gains_ir;
367  	int num_itimes;
368  	int scale1x;
369  
370  	int drdy_en_reg;
371  	int drdy_en_mask;
372  	int meas_en_reg;
373  	int meas_en_mask;
374  	int valid_reg;
375  	int chan_sel_reg;
376  	int chan_sel_mask;
377  	int int_time_mask;
378  	u8 part_id;
379  };
380  
381  struct bu27008_data {
382  	const struct bu27_chip_data *cd;
383  	struct regmap *regmap;
384  	struct iio_trigger *trig;
385  	struct device *dev;
386  	struct iio_gts gts;
387  	struct iio_gts gts_ir;
388  	int irq;
389  
390  	/*
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.
394  	 */
395  	struct mutex mutex;
396  };
397  
398  static const struct regmap_range bu27008_volatile_ranges[] = {
399  	{
400  		.range_min = BU27008_REG_SYSTEM_CONTROL,	/* SWRESET */
401  		.range_max = BU27008_REG_SYSTEM_CONTROL,
402  	}, {
403  		.range_min = BU27008_REG_MODE_CONTROL3,		/* VALID */
404  		.range_max = BU27008_REG_MODE_CONTROL3,
405  	}, {
406  		.range_min = BU27008_REG_DATA0_LO,		/* DATA */
407  		.range_max = BU27008_REG_DATA3_HI,
408  	},
409  };
410  
411  static const struct regmap_range bu27010_volatile_ranges[] = {
412  	{
413  		.range_min = BU27010_REG_RESET,			/* RSTB */
414  		.range_max = BU27008_REG_SYSTEM_CONTROL,	/* RESET */
415  	}, {
416  		.range_min = BU27010_REG_MODE_CONTROL5,		/* VALID bits */
417  		.range_max = BU27010_REG_MODE_CONTROL5,
418  	}, {
419  		.range_min = BU27008_REG_DATA0_LO,
420  		.range_max = BU27010_REG_FIFO_DATA_HI,
421  	},
422  };
423  
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),
427  };
428  
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),
432  };
433  
434  static const struct regmap_range bu27008_read_only_ranges[] = {
435  	{
436  		.range_min = BU27008_REG_DATA0_LO,
437  		.range_max = BU27008_REG_DATA3_HI,
438  	}, {
439  		.range_min = BU27008_REG_MANUFACTURER_ID,
440  		.range_max = BU27008_REG_MANUFACTURER_ID,
441  	},
442  };
443  
444  static const struct regmap_range bu27010_read_only_ranges[] = {
445  	{
446  		.range_min = BU27008_REG_DATA0_LO,
447  		.range_max = BU27010_REG_FIFO_DATA_HI,
448  	}, {
449  		.range_min = BU27010_REG_MANUFACTURER_ID,
450  		.range_max = BU27010_REG_MANUFACTURER_ID,
451  	}
452  };
453  
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),
457  };
458  
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),
462  };
463  
464  static const struct regmap_config bu27008_regmap = {
465  	.reg_bits = 8,
466  	.val_bits = 8,
467  	.max_register = BU27008_REG_MAX,
468  	.cache_type = REGCACHE_RBTREE,
469  	.volatile_table = &bu27008_volatile_regs,
470  	.wr_table = &bu27008_ro_regs,
471  	/*
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.
476  	 *
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.
482  	 */
483  	.disable_locking = true,
484  };
485  
486  static const struct regmap_config bu27010_regmap = {
487  	.reg_bits	= 8,
488  	.val_bits	= 8,
489  
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,
495  };
496  
bu27008_write_gain_sel(struct bu27008_data * data,int sel)497  static int bu27008_write_gain_sel(struct bu27008_data *data, int sel)
498  {
499  	int regval;
500  
501  	regval = FIELD_PREP(BU27008_MASK_RGBC_GAIN, sel);
502  
503  	/*
504  	 * We do always set also the LOW bits of IR-gain because othervice we
505  	 * would risk resulting an invalid GAIN register value.
506  	 *
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.
510  	 *
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.
516  	 *
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.
525  	 *
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.
531  	 */
532  	regval |= FIELD_PREP(BU27008_MASK_IR_GAIN_LO, sel);
533  
534  	return regmap_update_bits(data->regmap, BU27008_REG_MODE_CONTROL2,
535  				  BU27008_MASK_RGBC_GAIN, regval);
536  }
537  
bu27010_write_gain_sel(struct bu27008_data * data,int sel)538  static int bu27010_write_gain_sel(struct bu27008_data *data, int sel)
539  {
540  	unsigned int regval;
541  	int ret, chan_selector;
542  
543  	/*
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.
547  	 *
548  	 * Let's take the 4 high bits of whole 6 bit selector, and prepare
549  	 * the MODE_CONTROL1 value (RGBC gain part).
550  	 */
551  	regval = FIELD_PREP(BU27010_MASK_RGBC_GAIN, (sel >> 2));
552  
553  	ret = regmap_update_bits(data->regmap, BU27008_REG_MODE_CONTROL1,
554  				  BU27010_MASK_RGBC_GAIN, regval);
555  	if (ret)
556  		return ret;
557  
558  	/*
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
561  	 * all channels.
562  	 */
563  	chan_selector = sel & GENMASK(1, 0);
564  
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);
569  
570  	return regmap_write(data->regmap, BU27008_REG_MODE_CONTROL2, regval);
571  }
572  
bu27008_get_gain_sel(struct bu27008_data * data,int * sel)573  static int bu27008_get_gain_sel(struct bu27008_data *data, int *sel)
574  {
575  	int ret;
576  
577  	/*
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.
581  	 *
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
584  	 * case.
585  	 *
586  	 * If we some day decide to support individual gains, then we need to
587  	 * have channel information here.
588  	 */
589  
590  	ret = regmap_read(data->regmap, BU27008_REG_MODE_CONTROL2, sel);
591  	if (ret)
592  		return ret;
593  
594  	*sel = FIELD_GET(BU27008_MASK_RGBC_GAIN, *sel);
595  
596  	return 0;
597  }
598  
bu27010_get_gain_sel(struct bu27008_data * data,int * sel)599  static int bu27010_get_gain_sel(struct bu27008_data *data, int *sel)
600  {
601  	int ret, tmp;
602  
603  	/*
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.
607  	 *
608  	 * Read the channel0 gain.
609  	 */
610  	ret = regmap_read(data->regmap, BU27008_REG_MODE_CONTROL2, sel);
611  	if (ret)
612  		return ret;
613  
614  	*sel = FIELD_GET(BU27010_MASK_DATA0_GAIN, *sel);
615  
616  	/* Read the shared gain */
617  	ret = regmap_read(data->regmap, BU27008_REG_MODE_CONTROL1, &tmp);
618  	if (ret)
619  		return ret;
620  
621  	/*
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.
625  	 *
626  	 * Compose the selector from channel0 gain and shared RGBC gain.
627  	 */
628  	*sel |= FIELD_GET(BU27010_MASK_RGBC_GAIN, tmp) << fls(BU27010_MASK_DATA0_GAIN);
629  
630  	return ret;
631  }
632  
bu27008_chip_init(struct bu27008_data * data)633  static int bu27008_chip_init(struct bu27008_data *data)
634  {
635  	int ret;
636  
637  	ret = regmap_write_bits(data->regmap, BU27008_REG_SYSTEM_CONTROL,
638  				BU27008_MASK_SW_RESET, BU27008_MASK_SW_RESET);
639  	if (ret)
640  		return dev_err_probe(data->dev, ret, "Sensor reset failed\n");
641  
642  	/*
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
646  	 * > 1 mS is enough.
647  	 */
648  	msleep(1);
649  
650  	ret = regmap_reinit_cache(data->regmap, data->cd->regmap_cfg);
651  	if (ret)
652  		dev_err(data->dev, "Failed to reinit reg cache\n");
653  
654  	return ret;
655  }
656  
bu27010_chip_init(struct bu27008_data * data)657  static int bu27010_chip_init(struct bu27008_data *data)
658  {
659  	int ret;
660  
661  	ret = regmap_write_bits(data->regmap, BU27008_REG_SYSTEM_CONTROL,
662  				BU27010_MASK_SW_RESET, BU27010_MASK_SW_RESET);
663  	if (ret)
664  		return dev_err_probe(data->dev, ret, "Sensor reset failed\n");
665  
666  	msleep(1);
667  
668  	/* Power ON*/
669  	ret = regmap_write_bits(data->regmap, BU27010_REG_POWER,
670  				BU27010_MASK_POWER, BU27010_MASK_POWER);
671  	if (ret)
672  		return dev_err_probe(data->dev, ret, "Sensor power-on failed\n");
673  
674  	msleep(1);
675  
676  	/* Release blocks from reset */
677  	ret = regmap_write_bits(data->regmap, BU27010_REG_RESET,
678  				BU27010_MASK_RESET, BU27010_RESET_RELEASE);
679  	if (ret)
680  		return dev_err_probe(data->dev, ret, "Sensor powering failed\n");
681  
682  	msleep(1);
683  
684  	/*
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)
691  	 * 11 => Flicker FIFO
692  	 *
693  	 * So, only one IRQ can be enabled at a time and enabling for example
694  	 * flicker FIFO would automagically disable data-ready IRQ.
695  	 *
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.
700  	 */
701  	return regmap_clear_bits(data->regmap, BU27010_REG_MODE_CONTROL4,
702  				 BU27010_IRQ_DIS_ALL);
703  }
704  
705  static const struct bu27_chip_data bu27010_chip = {
706  	.name = "bu27010",
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,
727  };
728  
729  static const struct bu27_chip_data bu27008_chip = {
730  	.name = "bu27008",
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,
751  };
752  
753  #define BU27008_MAX_VALID_RESULT_WAIT_US	50000
754  #define BU27008_VALID_RESULT_WAIT_QUANTA_US	1000
755  
bu27008_chan_read_data(struct bu27008_data * data,int reg,int * val)756  static int bu27008_chan_read_data(struct bu27008_data *data, int reg, int *val)
757  {
758  	int ret, valid;
759  	__le16 tmp;
760  
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);
765  	if (ret)
766  		return ret;
767  
768  	ret = regmap_bulk_read(data->regmap, reg, &tmp, sizeof(tmp));
769  	if (ret)
770  		dev_err(data->dev, "Reading channel data failed\n");
771  
772  	*val = le16_to_cpu(tmp);
773  
774  	return ret;
775  }
776  
bu27008_get_gain(struct bu27008_data * data,struct iio_gts * gts,int * gain)777  static int bu27008_get_gain(struct bu27008_data *data, struct iio_gts *gts, int *gain)
778  {
779  	int ret, sel;
780  
781  	ret = data->cd->get_gain_sel(data, &sel);
782  	if (ret)
783  		return ret;
784  
785  	ret = iio_gts_find_gain_by_sel(gts, sel);
786  	if (ret < 0) {
787  		dev_err(data->dev, "unknown gain value 0x%x\n", sel);
788  		return ret;
789  	}
790  
791  	*gain = ret;
792  
793  	return 0;
794  }
795  
bu27008_set_gain(struct bu27008_data * data,int gain)796  static int bu27008_set_gain(struct bu27008_data *data, int gain)
797  {
798  	int ret;
799  
800  	ret = iio_gts_find_sel_by_gain(&data->gts, gain);
801  	if (ret < 0)
802  		return ret;
803  
804  	return data->cd->write_gain_sel(data, ret);
805  }
806  
bu27008_get_int_time_sel(struct bu27008_data * data,int * sel)807  static int bu27008_get_int_time_sel(struct bu27008_data *data, int *sel)
808  {
809  	int ret, val;
810  
811  	ret = regmap_read(data->regmap, BU27008_REG_MODE_CONTROL1, &val);
812  	if (ret)
813  		return ret;
814  
815  	val &= data->cd->int_time_mask;
816  	val >>= ffs(data->cd->int_time_mask) - 1;
817  
818  	*sel = val;
819  
820  	return 0;
821  }
822  
bu27008_set_int_time_sel(struct bu27008_data * data,int sel)823  static int bu27008_set_int_time_sel(struct bu27008_data *data, int sel)
824  {
825  	sel <<= ffs(data->cd->int_time_mask) - 1;
826  
827  	return regmap_update_bits(data->regmap, BU27008_REG_MODE_CONTROL1,
828  				  data->cd->int_time_mask, sel);
829  }
830  
bu27008_get_int_time_us(struct bu27008_data * data)831  static int bu27008_get_int_time_us(struct bu27008_data *data)
832  {
833  	int ret, sel;
834  
835  	ret = bu27008_get_int_time_sel(data, &sel);
836  	if (ret)
837  		return ret;
838  
839  	return iio_gts_find_int_time_by_sel(&data->gts, sel);
840  }
841  
_bu27008_get_scale(struct bu27008_data * data,bool ir,int * val,int * val2)842  static int _bu27008_get_scale(struct bu27008_data *data, bool ir, int *val,
843  			      int *val2)
844  {
845  	struct iio_gts *gts;
846  	int gain, ret;
847  
848  	if (ir)
849  		gts = &data->gts_ir;
850  	else
851  		gts = &data->gts;
852  
853  	ret = bu27008_get_gain(data, gts, &gain);
854  	if (ret)
855  		return ret;
856  
857  	ret = bu27008_get_int_time_us(data);
858  	if (ret < 0)
859  		return ret;
860  
861  	return iio_gts_get_scale(gts, gain, ret, val, val2);
862  }
863  
bu27008_get_scale(struct bu27008_data * data,bool ir,int * val,int * val2)864  static int bu27008_get_scale(struct bu27008_data *data, bool ir, int *val,
865  			     int *val2)
866  {
867  	int ret;
868  
869  	mutex_lock(&data->mutex);
870  	ret = _bu27008_get_scale(data, ir, val, val2);
871  	mutex_unlock(&data->mutex);
872  
873  	return ret;
874  }
875  
bu27008_set_int_time(struct bu27008_data * data,int time)876  static int bu27008_set_int_time(struct bu27008_data *data, int time)
877  {
878  	int ret;
879  
880  	ret = iio_gts_find_sel_by_int_time(&data->gts, time);
881  	if (ret < 0)
882  		return ret;
883  
884  	return bu27008_set_int_time_sel(data, ret);
885  }
886  
887  /* Try to change the time so that the scale is maintained */
bu27008_try_set_int_time(struct bu27008_data * data,int int_time_new)888  static int bu27008_try_set_int_time(struct bu27008_data *data, int int_time_new)
889  {
890  	int ret, old_time_sel, new_time_sel,  old_gain, new_gain;
891  
892  	mutex_lock(&data->mutex);
893  
894  	ret = bu27008_get_int_time_sel(data, &old_time_sel);
895  	if (ret < 0)
896  		goto unlock_out;
897  
898  	if (!iio_gts_valid_time(&data->gts, int_time_new)) {
899  		dev_dbg(data->dev, "Unsupported integration time %u\n",
900  			int_time_new);
901  
902  		ret = -EINVAL;
903  		goto unlock_out;
904  	}
905  
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)
909  		goto unlock_out;
910  
911  	ret = bu27008_get_gain(data, &data->gts, &old_gain);
912  	if (ret)
913  		goto unlock_out;
914  
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);
917  	if (ret) {
918  		int scale1, scale2;
919  		bool ok;
920  
921  		_bu27008_get_scale(data, false, &scale1, &scale2);
922  		dev_dbg(data->dev,
923  			"Can't support time %u with current scale %u %u\n",
924  			int_time_new, scale1, scale2);
925  
926  		if (new_gain < 0)
927  			goto unlock_out;
928  
929  		/*
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'.
934  		 */
935  		ret = iio_find_closest_gain_low(&data->gts, new_gain, &ok);
936  		if (!ok)
937  			dev_dbg(data->dev, "optimal gain out of range\n");
938  
939  		if (ret < 0) {
940  			dev_dbg(data->dev,
941  				 "Total gain increase. Risk of saturation");
942  			ret = iio_gts_get_min_gain(&data->gts);
943  			if (ret < 0)
944  				goto unlock_out;
945  		}
946  		new_gain = ret;
947  		dev_dbg(data->dev, "scale changed, new gain %u\n", new_gain);
948  	}
949  
950  	ret = bu27008_set_gain(data, new_gain);
951  	if (ret)
952  		goto unlock_out;
953  
954  	ret = bu27008_set_int_time(data, int_time_new);
955  
956  unlock_out:
957  	mutex_unlock(&data->mutex);
958  
959  	return ret;
960  }
961  
bu27008_meas_set(struct bu27008_data * data,bool enable)962  static int bu27008_meas_set(struct bu27008_data *data, bool enable)
963  {
964  	if (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);
969  }
970  
bu27008_chan_cfg(struct bu27008_data * data,struct iio_chan_spec const * chan)971  static int bu27008_chan_cfg(struct bu27008_data *data,
972  			    struct iio_chan_spec const *chan)
973  {
974  	int chan_sel;
975  
976  	if (chan->scan_index == BU27008_BLUE)
977  		chan_sel = BU27008_BLUE2_CLEAR3;
978  	else
979  		chan_sel = BU27008_CLEAR2_IR3;
980  
981  	/*
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.
986  	 */
987  	chan_sel <<= ffs(data->cd->chan_sel_mask) - 1;
988  
989  	return regmap_update_bits(data->regmap, data->cd->chan_sel_reg,
990  				  BU27008_MASK_CHAN_SEL, chan_sel);
991  }
992  
bu27008_read_one(struct bu27008_data * data,struct iio_dev * idev,struct iio_chan_spec const * chan,int * val,int * val2)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)
995  {
996  	int ret, int_time;
997  
998  	ret = bu27008_chan_cfg(data, chan);
999  	if (ret)
1000  		return ret;
1001  
1002  	ret = bu27008_meas_set(data, true);
1003  	if (ret)
1004  		return ret;
1005  
1006  	ret = bu27008_get_int_time_us(data);
1007  	if (ret < 0)
1008  		int_time = BU27008_MEAS_TIME_MAX_MS;
1009  	else
1010  		int_time = ret / USEC_PER_MSEC;
1011  
1012  	msleep(int_time);
1013  
1014  	ret = bu27008_chan_read_data(data, chan->address, val);
1015  	if (!ret)
1016  		ret = IIO_VAL_INT;
1017  
1018  	if (bu27008_meas_set(data, false))
1019  		dev_warn(data->dev, "measurement disabling failed\n");
1020  
1021  	return ret;
1022  }
1023  
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))
1029  
bu27008_read_lux_chans(struct bu27008_data * data,unsigned int time,__le16 * chan_data)1030  static int bu27008_read_lux_chans(struct bu27008_data *data, unsigned int time,
1031  				  __le16 *chan_data)
1032  {
1033  	int ret, chan_sel, tmpret, valid;
1034  
1035  	chan_sel = BU27008_BLUE2_IR3 << (ffs(data->cd->chan_sel_mask) - 1);
1036  
1037  	ret = regmap_update_bits(data->regmap, data->cd->chan_sel_reg,
1038  				 data->cd->chan_sel_mask, chan_sel);
1039  	if (ret)
1040  		return ret;
1041  
1042  	ret = bu27008_meas_set(data, true);
1043  	if (ret)
1044  		return ret;
1045  
1046  	msleep(time / USEC_PER_MSEC);
1047  
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);
1052  	if (ret)
1053  		goto out;
1054  
1055  	ret = regmap_bulk_read(data->regmap, BU27008_REG_DATA0_LO, chan_data,
1056  			       LUX_DATA_SIZE);
1057  	if (ret)
1058  		goto out;
1059  out:
1060  	tmpret = bu27008_meas_set(data, false);
1061  	if (tmpret)
1062  		dev_warn(data->dev, "Stopping measurement failed\n");
1063  
1064  	return ret;
1065  }
1066  
1067  /*
1068   * Following equation for computing lux out of register values was given by
1069   * ROHM HW colleagues;
1070   *
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
1075   *
1076   * where meas_mode is the integration time in mS / 10
1077   *
1078   * IRratio = (IR > 0.18 * Green) ? 0 : 1
1079   *
1080   * Lx = max(c1*Red + c2*Green + c3*Blue,0)
1081   *
1082   * for
1083   * IRratio 0: c1 = -0.00002237, c2 = 0.0003219, c3 = -0.000120371
1084   * IRratio 1: c1 = -0.00001074, c2 = 0.000305415, c3 = -0.000129367
1085   */
1086  
1087  /*
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.
1090   */
1091  #define NORM_CHAN_DATA_FOR_LX_CALC(chan, gain, time) (le16_to_cpu(chan) * \
1092  				   1024 * 20 / (gain) / (time))
bu27008_calc_nlux(struct bu27008_data * data,__le16 * lux_data,unsigned int gain,unsigned int gain_ir,unsigned int 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)
1095  {
1096  	unsigned int red, green, blue, ir;
1097  	s64 c1, c2, c3, nlux;
1098  
1099  	time /= 10000;
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);
1104  
1105  	if ((u64)ir * 100LLU > (u64)green * 18LLU) {
1106  		c1 = -22370;
1107  		c2 = 321900;
1108  		c3 = -120371;
1109  	} else {
1110  		c1 = -10740;
1111  		c2 = 305415;
1112  		c3 = -129367;
1113  	}
1114  	nlux = c1 * red + c2 * green + c3 * blue;
1115  
1116  	return max_t(s64, 0, nlux);
1117  }
1118  
bu27008_get_time_n_gains(struct bu27008_data * data,unsigned int * gain,unsigned int * gain_ir,unsigned int * time)1119  static int bu27008_get_time_n_gains(struct bu27008_data *data,
1120  		unsigned int *gain, unsigned int *gain_ir, unsigned int *time)
1121  {
1122  	int ret;
1123  
1124  	ret = bu27008_get_gain(data, &data->gts, gain);
1125  	if (ret < 0)
1126  		return ret;
1127  
1128  	ret = bu27008_get_gain(data, &data->gts_ir, gain_ir);
1129  	if (ret < 0)
1130  		return ret;
1131  
1132  	ret = bu27008_get_int_time_us(data);
1133  	if (ret < 0)
1134  		return ret;
1135  
1136  	/* Max integration time is 400000. Fits in signed int. */
1137  	*time = ret;
1138  
1139  	return 0;
1140  }
1141  
1142  struct bu27008_buf {
1143  	__le16 chan[BU27008_NUM_HW_CHANS];
1144  	u64 lux __aligned(8);
1145  	s64 ts __aligned(8);
1146  };
1147  
bu27008_buffer_fill_lux(struct bu27008_data * data,struct bu27008_buf * raw)1148  static int bu27008_buffer_fill_lux(struct bu27008_data *data,
1149  				   struct bu27008_buf *raw)
1150  {
1151  	unsigned int gain, gain_ir, time;
1152  	int ret;
1153  
1154  	ret = bu27008_get_time_n_gains(data, &gain, &gain_ir, &time);
1155  	if (ret)
1156  		return ret;
1157  
1158  	raw->lux = bu27008_calc_nlux(data, raw->chan, gain, gain_ir, time);
1159  
1160  	return 0;
1161  }
1162  
bu27008_read_lux(struct bu27008_data * data,struct iio_dev * idev,struct iio_chan_spec const * chan,int * val,int * val2)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)
1166  {
1167  	__le16 lux_data[BU27008_NUM_HW_CHANS];
1168  	unsigned int gain, gain_ir, time;
1169  	u64 nlux;
1170  	int ret;
1171  
1172  	ret = bu27008_get_time_n_gains(data, &gain, &gain_ir, &time);
1173  	if (ret)
1174  		return ret;
1175  
1176  	ret = bu27008_read_lux_chans(data, time, lux_data);
1177  	if (ret)
1178  		return ret;
1179  
1180  	nlux = bu27008_calc_nlux(data, lux_data, gain, gain_ir, time);
1181  	*val = (int)nlux;
1182  	*val2 = nlux >> 32LLU;
1183  
1184  	return IIO_VAL_INT_64;
1185  }
1186  
bu27008_read_raw(struct iio_dev * idev,struct iio_chan_spec const * chan,int * val,int * val2,long mask)1187  static int bu27008_read_raw(struct iio_dev *idev,
1188  			   struct iio_chan_spec const *chan,
1189  			   int *val, int *val2, long mask)
1190  {
1191  	struct bu27008_data *data = iio_priv(idev);
1192  	int busy, ret;
1193  
1194  	switch (mask) {
1195  	case IIO_CHAN_INFO_RAW:
1196  		busy = iio_device_claim_direct_mode(idev);
1197  		if (busy)
1198  			return -EBUSY;
1199  
1200  		mutex_lock(&data->mutex);
1201  		if (chan->type == IIO_LIGHT)
1202  			ret = bu27008_read_lux(data, idev, chan, val, val2);
1203  		else
1204  			ret = bu27008_read_one(data, idev, chan, val, val2);
1205  		mutex_unlock(&data->mutex);
1206  
1207  		iio_device_release_direct_mode(idev);
1208  
1209  		return ret;
1210  
1211  	case IIO_CHAN_INFO_SCALE:
1212  		if (chan->type == IIO_LIGHT) {
1213  			*val = 0;
1214  			*val2 = 1;
1215  			return IIO_VAL_INT_PLUS_NANO;
1216  		}
1217  		ret = bu27008_get_scale(data, chan->scan_index == BU27008_IR,
1218  					val, val2);
1219  		if (ret)
1220  			return ret;
1221  
1222  		return IIO_VAL_INT_PLUS_NANO;
1223  
1224  	case IIO_CHAN_INFO_INT_TIME:
1225  		ret = bu27008_get_int_time_us(data);
1226  		if (ret < 0)
1227  			return ret;
1228  
1229  		*val = 0;
1230  		*val2 = ret;
1231  
1232  		return IIO_VAL_INT_PLUS_MICRO;
1233  
1234  	default:
1235  		return -EINVAL;
1236  	}
1237  }
1238  
1239  /* Called if the new scale could not be supported with existing int-time */
bu27008_try_find_new_time_gain(struct bu27008_data * data,int val,int val2,int * gain_sel)1240  static int bu27008_try_find_new_time_gain(struct bu27008_data *data, int val,
1241  					  int val2, int *gain_sel)
1242  {
1243  	int i, ret, new_time_sel;
1244  
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);
1249  		if (!ret)
1250  			break;
1251  	}
1252  	if (i == data->gts.num_itime) {
1253  		dev_err(data->dev, "Can't support scale %u %u\n", val, val2);
1254  
1255  		return -EINVAL;
1256  	}
1257  
1258  	return bu27008_set_int_time_sel(data, new_time_sel);
1259  }
1260  
bu27008_set_scale(struct bu27008_data * data,struct iio_chan_spec const * chan,int val,int val2)1261  static int bu27008_set_scale(struct bu27008_data *data,
1262  			     struct iio_chan_spec const *chan,
1263  			     int val, int val2)
1264  {
1265  	int ret, gain_sel, time_sel;
1266  
1267  	if (chan->scan_index == BU27008_IR)
1268  		return -EINVAL;
1269  
1270  	mutex_lock(&data->mutex);
1271  
1272  	ret = bu27008_get_int_time_sel(data, &time_sel);
1273  	if (ret < 0)
1274  		goto unlock_out;
1275  
1276  	ret = iio_gts_find_gain_sel_for_scale_using_time(&data->gts, time_sel,
1277  						val, val2, &gain_sel);
1278  	if (ret) {
1279  		ret = bu27008_try_find_new_time_gain(data, val, val2, &gain_sel);
1280  		if (ret)
1281  			goto unlock_out;
1282  
1283  	}
1284  	ret = data->cd->write_gain_sel(data, gain_sel);
1285  
1286  unlock_out:
1287  	mutex_unlock(&data->mutex);
1288  
1289  	return ret;
1290  }
1291  
bu27008_write_raw_get_fmt(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,long mask)1292  static int bu27008_write_raw_get_fmt(struct iio_dev *indio_dev,
1293  				     struct iio_chan_spec const *chan,
1294  				     long mask)
1295  {
1296  
1297  	switch (mask) {
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;
1302  	default:
1303  		return -EINVAL;
1304  	}
1305  }
1306  
bu27008_write_raw(struct iio_dev * idev,struct iio_chan_spec const * chan,int val,int val2,long mask)1307  static int bu27008_write_raw(struct iio_dev *idev,
1308  			     struct iio_chan_spec const *chan,
1309  			     int val, int val2, long mask)
1310  {
1311  	struct bu27008_data *data = iio_priv(idev);
1312  	int ret;
1313  
1314  	/*
1315  	 * Do not allow changing scale when measurement is ongoing as doing so
1316  	 * could make values in the buffer inconsistent.
1317  	 */
1318  	ret = iio_device_claim_direct_mode(idev);
1319  	if (ret)
1320  		return ret;
1321  
1322  	switch (mask) {
1323  	case IIO_CHAN_INFO_SCALE:
1324  		ret = bu27008_set_scale(data, chan, val, val2);
1325  		break;
1326  	case IIO_CHAN_INFO_INT_TIME:
1327  		if (val) {
1328  			ret = -EINVAL;
1329  			break;
1330  		}
1331  		ret = bu27008_try_set_int_time(data, val2);
1332  		break;
1333  	default:
1334  		ret = -EINVAL;
1335  		break;
1336  	}
1337  	iio_device_release_direct_mode(idev);
1338  
1339  	return ret;
1340  }
1341  
bu27008_read_avail(struct iio_dev * idev,struct iio_chan_spec const * chan,const int ** vals,int * type,int * length,long mask)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)
1345  {
1346  	struct bu27008_data *data = iio_priv(idev);
1347  
1348  	switch (mask) {
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,
1354  							type, length);
1355  		return iio_gts_all_avail_scales(&data->gts, vals, type, length);
1356  	default:
1357  		return -EINVAL;
1358  	}
1359  }
1360  
bu27008_update_scan_mode(struct iio_dev * idev,const unsigned long * scan_mask)1361  static int bu27008_update_scan_mode(struct iio_dev *idev,
1362  				    const unsigned long *scan_mask)
1363  {
1364  	struct bu27008_data *data = iio_priv(idev);
1365  	int chan_sel;
1366  
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;
1371  		else
1372  			chan_sel = BU27008_BLUE2_IR3;
1373  	} else {
1374  		chan_sel = BU27008_CLEAR2_IR3;
1375  	}
1376  
1377  	chan_sel <<= ffs(data->cd->chan_sel_mask) - 1;
1378  
1379  	return regmap_update_bits(data->regmap, data->cd->chan_sel_reg,
1380  				  data->cd->chan_sel_mask, chan_sel);
1381  }
1382  
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,
1390  };
1391  
bu27008_trigger_set_state(struct iio_trigger * trig,bool state)1392  static int bu27008_trigger_set_state(struct iio_trigger *trig, bool state)
1393  {
1394  	struct bu27008_data *data = iio_trigger_get_drvdata(trig);
1395  	int ret;
1396  
1397  
1398  	if (state)
1399  		ret = regmap_set_bits(data->regmap, data->cd->drdy_en_reg,
1400  				      data->cd->drdy_en_mask);
1401  	else
1402  		ret = regmap_clear_bits(data->regmap, data->cd->drdy_en_reg,
1403  					data->cd->drdy_en_mask);
1404  	if (ret)
1405  		dev_err(data->dev, "Failed to set trigger state\n");
1406  
1407  	return ret;
1408  }
1409  
bu27008_trigger_reenable(struct iio_trigger * trig)1410  static void bu27008_trigger_reenable(struct iio_trigger *trig)
1411  {
1412  	struct bu27008_data *data = iio_trigger_get_drvdata(trig);
1413  
1414  	enable_irq(data->irq);
1415  }
1416  
1417  static const struct iio_trigger_ops bu27008_trigger_ops = {
1418  	.set_trigger_state = bu27008_trigger_set_state,
1419  	.reenable = bu27008_trigger_reenable,
1420  };
1421  
bu27008_trigger_handler(int irq,void * p)1422  static irqreturn_t bu27008_trigger_handler(int irq, void *p)
1423  {
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;
1428  	int ret, dummy;
1429  
1430  	memset(&raw, 0, sizeof(raw));
1431  
1432  	/*
1433  	 * After some measurements, it seems reading the
1434  	 * BU27008_REG_MODE_CONTROL3 debounces the IRQ line
1435  	 */
1436  	ret = regmap_read(data->regmap, data->cd->valid_reg, &dummy);
1437  	if (ret < 0)
1438  		goto err_read;
1439  
1440  	ret = regmap_bulk_read(data->regmap, BU27008_REG_DATA0_LO, &raw.chan,
1441  			       sizeof(raw.chan));
1442  	if (ret < 0)
1443  		goto err_read;
1444  
1445  	if (test_bit(BU27008_LUX, idev->active_scan_mask)) {
1446  		ret = bu27008_buffer_fill_lux(data, &raw);
1447  		if (ret)
1448  			goto err_read;
1449  	}
1450  
1451  	iio_push_to_buffers_with_timestamp(idev, &raw, pf->timestamp);
1452  err_read:
1453  	iio_trigger_notify_done(idev->trig);
1454  
1455  	return IRQ_HANDLED;
1456  }
1457  
bu27008_buffer_preenable(struct iio_dev * idev)1458  static int bu27008_buffer_preenable(struct iio_dev *idev)
1459  {
1460  	struct bu27008_data *data = iio_priv(idev);
1461  
1462  	return bu27008_meas_set(data, true);
1463  }
1464  
bu27008_buffer_postdisable(struct iio_dev * idev)1465  static int bu27008_buffer_postdisable(struct iio_dev *idev)
1466  {
1467  	struct bu27008_data *data = iio_priv(idev);
1468  
1469  	return bu27008_meas_set(data, false);
1470  }
1471  
1472  static const struct iio_buffer_setup_ops bu27008_buffer_ops = {
1473  	.preenable = bu27008_buffer_preenable,
1474  	.postdisable = bu27008_buffer_postdisable,
1475  };
1476  
bu27008_data_rdy_poll(int irq,void * private)1477  static irqreturn_t bu27008_data_rdy_poll(int irq, void *private)
1478  {
1479  	/*
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.
1482  	 */
1483  	disable_irq_nosync(irq);
1484  	iio_trigger_poll(private);
1485  
1486  	return IRQ_HANDLED;
1487  }
1488  
bu27008_setup_trigger(struct bu27008_data * data,struct iio_dev * idev)1489  static int bu27008_setup_trigger(struct bu27008_data *data, struct iio_dev *idev)
1490  {
1491  	struct iio_trigger *itrig;
1492  	char *name;
1493  	int ret;
1494  
1495  	ret = devm_iio_triggered_buffer_setup(data->dev, idev,
1496  					      &iio_pollfunc_store_time,
1497  					      bu27008_trigger_handler,
1498  					      &bu27008_buffer_ops);
1499  	if (ret)
1500  		return dev_err_probe(data->dev, ret,
1501  			     "iio_triggered_buffer_setup_ext FAIL\n");
1502  
1503  	itrig = devm_iio_trigger_alloc(data->dev, "%sdata-rdy-dev%d",
1504  				       idev->name, iio_device_id(idev));
1505  	if (!itrig)
1506  		return -ENOMEM;
1507  
1508  	data->trig = itrig;
1509  
1510  	itrig->ops = &bu27008_trigger_ops;
1511  	iio_trigger_set_drvdata(itrig, data);
1512  
1513  	name = devm_kasprintf(data->dev, GFP_KERNEL, "%s-bu27008",
1514  			      dev_name(data->dev));
1515  
1516  	ret = devm_request_irq(data->dev, data->irq,
1517  			       &bu27008_data_rdy_poll,
1518  			       0, name, itrig);
1519  	if (ret)
1520  		return dev_err_probe(data->dev, ret, "Could not request IRQ\n");
1521  
1522  	ret = devm_iio_trigger_register(data->dev, itrig);
1523  	if (ret)
1524  		return dev_err_probe(data->dev, ret,
1525  				     "Trigger registration failed\n");
1526  
1527  	/* set default trigger */
1528  	idev->trig = iio_trigger_get(itrig);
1529  
1530  	return 0;
1531  }
1532  
bu27008_probe(struct i2c_client * i2c)1533  static int bu27008_probe(struct i2c_client *i2c)
1534  {
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;
1540  	int ret;
1541  
1542  	idev = devm_iio_device_alloc(dev, sizeof(*data));
1543  	if (!idev)
1544  		return -ENOMEM;
1545  
1546  	ret = devm_regulator_get_enable(dev, "vdd");
1547  	if (ret)
1548  		return dev_err_probe(dev, ret, "Failed to get regulator\n");
1549  
1550  	data = iio_priv(idev);
1551  
1552  	data->cd = device_get_match_data(&i2c->dev);
1553  	if (!data->cd)
1554  		return -ENODEV;
1555  
1556  	regmap = devm_regmap_init_i2c(i2c, data->cd->regmap_cfg);
1557  	if (IS_ERR(regmap))
1558  		return dev_err_probe(dev, PTR_ERR(regmap),
1559  				     "Failed to initialize Regmap\n");
1560  
1561  
1562  	ret = regmap_read(regmap, BU27008_REG_SYSTEM_CONTROL, &reg);
1563  	if (ret)
1564  		return dev_err_probe(dev, ret, "Failed to access sensor\n");
1565  
1566  	part_id = FIELD_GET(BU27008_MASK_PART_ID, reg);
1567  
1568  	if (part_id != data->cd->part_id)
1569  		dev_warn(dev, "unknown device 0x%x\n", part_id);
1570  
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);
1574  	if (ret)
1575  		return ret;
1576  
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);
1580  	if (ret)
1581  		return ret;
1582  
1583  	mutex_init(&data->mutex);
1584  	data->regmap = regmap;
1585  	data->dev = dev;
1586  	data->irq = i2c->irq;
1587  
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;
1594  
1595  	ret = data->cd->chip_init(data);
1596  	if (ret)
1597  		return ret;
1598  
1599  	if (i2c->irq) {
1600  		ret = bu27008_setup_trigger(data, idev);
1601  		if (ret)
1602  			return ret;
1603  	} else {
1604  		dev_info(dev, "No IRQ, buffered mode disabled\n");
1605  	}
1606  
1607  	ret = devm_iio_device_register(dev, idev);
1608  	if (ret)
1609  		return dev_err_probe(dev, ret,
1610  				     "Unable to register iio device\n");
1611  
1612  	return 0;
1613  }
1614  
1615  static const struct of_device_id bu27008_of_match[] = {
1616  	{ .compatible = "rohm,bu27008", .data = &bu27008_chip },
1617  	{ .compatible = "rohm,bu27010", .data = &bu27010_chip },
1618  	{ }
1619  };
1620  MODULE_DEVICE_TABLE(of, bu27008_of_match);
1621  
1622  static struct i2c_driver bu27008_i2c_driver = {
1623  	.driver = {
1624  		.name = "bu27008",
1625  		.of_match_table = bu27008_of_match,
1626  		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
1627  	},
1628  	.probe = bu27008_probe,
1629  };
1630  module_i2c_driver(bu27008_i2c_driver);
1631  
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);
1636