xref: /linux/drivers/iio/light/si1145.c (revision e58e871becec2d3b04ed91c0c16fe8deac9c9dfa)
1 /*
2  * si1145.c - Support for Silabs SI1132 and SI1141/2/3/5/6/7 combined ambient
3  * light, UV index and proximity sensors
4  *
5  * Copyright 2014-16 Peter Meerwald-Stadler <pmeerw@pmeerw.net>
6  * Copyright 2016 Crestez Dan Leonard <leonard.crestez@intel.com>
7  *
8  * This file is subject to the terms and conditions of version 2 of
9  * the GNU General Public License.  See the file COPYING in the main
10  * directory of this archive for more details.
11  *
12  * SI1132 (7-bit I2C slave address 0x60)
13  * SI1141/2/3 (7-bit I2C slave address 0x5a)
14  * SI1145/6/6 (7-bit I2C slave address 0x60)
15  */
16 
17 #include <linux/module.h>
18 #include <linux/i2c.h>
19 #include <linux/err.h>
20 #include <linux/slab.h>
21 #include <linux/delay.h>
22 #include <linux/irq.h>
23 #include <linux/gpio.h>
24 
25 #include <linux/iio/iio.h>
26 #include <linux/iio/sysfs.h>
27 #include <linux/iio/trigger.h>
28 #include <linux/iio/trigger_consumer.h>
29 #include <linux/iio/triggered_buffer.h>
30 #include <linux/iio/buffer.h>
31 #include <linux/util_macros.h>
32 
33 #define SI1145_REG_PART_ID		0x00
34 #define SI1145_REG_REV_ID		0x01
35 #define SI1145_REG_SEQ_ID		0x02
36 #define SI1145_REG_INT_CFG		0x03
37 #define SI1145_REG_IRQ_ENABLE		0x04
38 #define SI1145_REG_IRQ_MODE		0x05
39 #define SI1145_REG_HW_KEY		0x07
40 #define SI1145_REG_MEAS_RATE		0x08
41 #define SI1145_REG_PS_LED21		0x0f
42 #define SI1145_REG_PS_LED3		0x10
43 #define SI1145_REG_UCOEF1		0x13
44 #define SI1145_REG_UCOEF2		0x14
45 #define SI1145_REG_UCOEF3		0x15
46 #define SI1145_REG_UCOEF4		0x16
47 #define SI1145_REG_PARAM_WR		0x17
48 #define SI1145_REG_COMMAND		0x18
49 #define SI1145_REG_RESPONSE		0x20
50 #define SI1145_REG_IRQ_STATUS		0x21
51 #define SI1145_REG_ALSVIS_DATA		0x22
52 #define SI1145_REG_ALSIR_DATA		0x24
53 #define SI1145_REG_PS1_DATA		0x26
54 #define SI1145_REG_PS2_DATA		0x28
55 #define SI1145_REG_PS3_DATA		0x2a
56 #define SI1145_REG_AUX_DATA		0x2c
57 #define SI1145_REG_PARAM_RD		0x2e
58 #define SI1145_REG_CHIP_STAT		0x30
59 
60 #define SI1145_UCOEF1_DEFAULT		0x7b
61 #define SI1145_UCOEF2_DEFAULT		0x6b
62 #define SI1145_UCOEF3_DEFAULT		0x01
63 #define SI1145_UCOEF4_DEFAULT		0x00
64 
65 /* Helper to figure out PS_LED register / shift per channel */
66 #define SI1145_PS_LED_REG(ch) \
67 	(((ch) == 2) ? SI1145_REG_PS_LED3 : SI1145_REG_PS_LED21)
68 #define SI1145_PS_LED_SHIFT(ch) \
69 	(((ch) == 1) ? 4 : 0)
70 
71 /* Parameter offsets */
72 #define SI1145_PARAM_CHLIST		0x01
73 #define SI1145_PARAM_PSLED12_SELECT	0x02
74 #define SI1145_PARAM_PSLED3_SELECT	0x03
75 #define SI1145_PARAM_PS_ENCODING	0x05
76 #define SI1145_PARAM_ALS_ENCODING	0x06
77 #define SI1145_PARAM_PS1_ADC_MUX	0x07
78 #define SI1145_PARAM_PS2_ADC_MUX	0x08
79 #define SI1145_PARAM_PS3_ADC_MUX	0x09
80 #define SI1145_PARAM_PS_ADC_COUNTER	0x0a
81 #define SI1145_PARAM_PS_ADC_GAIN	0x0b
82 #define SI1145_PARAM_PS_ADC_MISC	0x0c
83 #define SI1145_PARAM_ALS_ADC_MUX	0x0d
84 #define SI1145_PARAM_ALSIR_ADC_MUX	0x0e
85 #define SI1145_PARAM_AUX_ADC_MUX	0x0f
86 #define SI1145_PARAM_ALSVIS_ADC_COUNTER	0x10
87 #define SI1145_PARAM_ALSVIS_ADC_GAIN	0x11
88 #define SI1145_PARAM_ALSVIS_ADC_MISC	0x12
89 #define SI1145_PARAM_LED_RECOVERY	0x1c
90 #define SI1145_PARAM_ALSIR_ADC_COUNTER	0x1d
91 #define SI1145_PARAM_ALSIR_ADC_GAIN	0x1e
92 #define SI1145_PARAM_ALSIR_ADC_MISC	0x1f
93 #define SI1145_PARAM_ADC_OFFSET		0x1a
94 
95 /* Channel enable masks for CHLIST parameter */
96 #define SI1145_CHLIST_EN_PS1		BIT(0)
97 #define SI1145_CHLIST_EN_PS2		BIT(1)
98 #define SI1145_CHLIST_EN_PS3		BIT(2)
99 #define SI1145_CHLIST_EN_ALSVIS		BIT(4)
100 #define SI1145_CHLIST_EN_ALSIR		BIT(5)
101 #define SI1145_CHLIST_EN_AUX		BIT(6)
102 #define SI1145_CHLIST_EN_UV		BIT(7)
103 
104 /* Proximity measurement mode for ADC_MISC parameter */
105 #define SI1145_PS_ADC_MODE_NORMAL	BIT(2)
106 /* Signal range mask for ADC_MISC parameter */
107 #define SI1145_ADC_MISC_RANGE		BIT(5)
108 
109 /* Commands for REG_COMMAND */
110 #define SI1145_CMD_NOP			0x00
111 #define SI1145_CMD_RESET		0x01
112 #define SI1145_CMD_PS_FORCE		0x05
113 #define SI1145_CMD_ALS_FORCE		0x06
114 #define SI1145_CMD_PSALS_FORCE		0x07
115 #define SI1145_CMD_PS_PAUSE		0x09
116 #define SI1145_CMD_ALS_PAUSE		0x0a
117 #define SI1145_CMD_PSALS_PAUSE		0x0b
118 #define SI1145_CMD_PS_AUTO		0x0d
119 #define SI1145_CMD_ALS_AUTO		0x0e
120 #define SI1145_CMD_PSALS_AUTO		0x0f
121 #define SI1145_CMD_PARAM_QUERY		0x80
122 #define SI1145_CMD_PARAM_SET		0xa0
123 
124 #define SI1145_RSP_INVALID_SETTING	0x80
125 #define SI1145_RSP_COUNTER_MASK		0x0F
126 
127 /* Minimum sleep after each command to ensure it's received */
128 #define SI1145_COMMAND_MINSLEEP_MS	5
129 /* Return -ETIMEDOUT after this long */
130 #define SI1145_COMMAND_TIMEOUT_MS	25
131 
132 /* Interrupt configuration masks for INT_CFG register */
133 #define SI1145_INT_CFG_OE		BIT(0) /* enable interrupt */
134 #define SI1145_INT_CFG_MODE		BIT(1) /* auto reset interrupt pin */
135 
136 /* Interrupt enable masks for IRQ_ENABLE register */
137 #define SI1145_MASK_ALL_IE		(BIT(4) | BIT(3) | BIT(2) | BIT(0))
138 
139 #define SI1145_MUX_TEMP			0x65
140 #define SI1145_MUX_VDD			0x75
141 
142 /* Proximity LED current; see Table 2 in datasheet */
143 #define SI1145_LED_CURRENT_45mA		0x04
144 
145 enum {
146 	SI1132,
147 	SI1141,
148 	SI1142,
149 	SI1143,
150 	SI1145,
151 	SI1146,
152 	SI1147,
153 };
154 
155 struct si1145_part_info {
156 	u8 part;
157 	const struct iio_info *iio_info;
158 	const struct iio_chan_spec *channels;
159 	unsigned int num_channels;
160 	unsigned int num_leds;
161 	bool uncompressed_meas_rate;
162 };
163 
164 /**
165  * struct si1145_data - si1145 chip state data
166  * @client:	I2C client
167  * @lock:	mutex to protect shared state.
168  * @cmdlock:	Low-level mutex to protect command execution only
169  * @rsp_seq:	Next expected response number or -1 if counter reset required
170  * @scan_mask:	Saved scan mask to avoid duplicate set_chlist
171  * @autonomous: If automatic measurements are active (for buffer support)
172  * @part_info:	Part information
173  * @trig:	Pointer to iio trigger
174  * @meas_rate:	Value of MEAS_RATE register. Only set in HW in auto mode
175  */
176 struct si1145_data {
177 	struct i2c_client *client;
178 	struct mutex lock;
179 	struct mutex cmdlock;
180 	int rsp_seq;
181 	const struct si1145_part_info *part_info;
182 	unsigned long scan_mask;
183 	bool autonomous;
184 	struct iio_trigger *trig;
185 	int meas_rate;
186 };
187 
188 /**
189  * __si1145_command_reset() - Send CMD_NOP and wait for response 0
190  *
191  * Does not modify data->rsp_seq
192  *
193  * Return: 0 on success and -errno on error.
194  */
195 static int __si1145_command_reset(struct si1145_data *data)
196 {
197 	struct device *dev = &data->client->dev;
198 	unsigned long stop_jiffies;
199 	int ret;
200 
201 	ret = i2c_smbus_write_byte_data(data->client, SI1145_REG_COMMAND,
202 						      SI1145_CMD_NOP);
203 	if (ret < 0)
204 		return ret;
205 	msleep(SI1145_COMMAND_MINSLEEP_MS);
206 
207 	stop_jiffies = jiffies + SI1145_COMMAND_TIMEOUT_MS * HZ / 1000;
208 	while (true) {
209 		ret = i2c_smbus_read_byte_data(data->client,
210 					       SI1145_REG_RESPONSE);
211 		if (ret <= 0)
212 			return ret;
213 		if (time_after(jiffies, stop_jiffies)) {
214 			dev_warn(dev, "timeout on reset\n");
215 			return -ETIMEDOUT;
216 		}
217 		msleep(SI1145_COMMAND_MINSLEEP_MS);
218 		continue;
219 	}
220 }
221 
222 /**
223  * si1145_command() - Execute a command and poll the response register
224  *
225  * All conversion overflows are reported as -EOVERFLOW
226  * INVALID_SETTING is reported as -EINVAL
227  * Timeouts are reported as -ETIMEDOUT
228  *
229  * Return: 0 on success or -errno on failure
230  */
231 static int si1145_command(struct si1145_data *data, u8 cmd)
232 {
233 	struct device *dev = &data->client->dev;
234 	unsigned long stop_jiffies;
235 	int ret;
236 
237 	mutex_lock(&data->cmdlock);
238 
239 	if (data->rsp_seq < 0) {
240 		ret = __si1145_command_reset(data);
241 		if (ret < 0) {
242 			dev_err(dev, "failed to reset command counter, ret=%d\n",
243 				ret);
244 			goto out;
245 		}
246 		data->rsp_seq = 0;
247 	}
248 
249 	ret = i2c_smbus_write_byte_data(data->client, SI1145_REG_COMMAND, cmd);
250 	if (ret) {
251 		dev_warn(dev, "failed to write command, ret=%d\n", ret);
252 		goto out;
253 	}
254 	/* Sleep a little to ensure the command is received */
255 	msleep(SI1145_COMMAND_MINSLEEP_MS);
256 
257 	stop_jiffies = jiffies + SI1145_COMMAND_TIMEOUT_MS * HZ / 1000;
258 	while (true) {
259 		ret = i2c_smbus_read_byte_data(data->client,
260 					       SI1145_REG_RESPONSE);
261 		if (ret < 0) {
262 			dev_warn(dev, "failed to read response, ret=%d\n", ret);
263 			break;
264 		}
265 
266 		if ((ret & ~SI1145_RSP_COUNTER_MASK) == 0) {
267 			if (ret == data->rsp_seq) {
268 				if (time_after(jiffies, stop_jiffies)) {
269 					dev_warn(dev, "timeout on command %#02hhx\n",
270 						 cmd);
271 					ret = -ETIMEDOUT;
272 					break;
273 				}
274 				msleep(SI1145_COMMAND_MINSLEEP_MS);
275 				continue;
276 			}
277 			if (ret == ((data->rsp_seq + 1) &
278 				SI1145_RSP_COUNTER_MASK)) {
279 				data->rsp_seq = ret;
280 				ret = 0;
281 				break;
282 			}
283 			dev_warn(dev, "unexpected response counter %d instead of %d\n",
284 				 ret, (data->rsp_seq + 1) &
285 					SI1145_RSP_COUNTER_MASK);
286 			ret = -EIO;
287 		} else {
288 			if (ret == SI1145_RSP_INVALID_SETTING) {
289 				dev_warn(dev, "INVALID_SETTING error on command %#02hhx\n",
290 					 cmd);
291 				ret = -EINVAL;
292 			} else {
293 				/* All overflows are treated identically */
294 				dev_dbg(dev, "overflow, ret=%d, cmd=%#02hhx\n",
295 					ret, cmd);
296 				ret = -EOVERFLOW;
297 			}
298 		}
299 
300 		/* Force a counter reset next time */
301 		data->rsp_seq = -1;
302 		break;
303 	}
304 
305 out:
306 	mutex_unlock(&data->cmdlock);
307 
308 	return ret;
309 }
310 
311 static int si1145_param_update(struct si1145_data *data, u8 op, u8 param,
312 			       u8 value)
313 {
314 	int ret;
315 
316 	ret = i2c_smbus_write_byte_data(data->client,
317 		SI1145_REG_PARAM_WR, value);
318 	if (ret < 0)
319 		return ret;
320 
321 	return si1145_command(data, op | (param & 0x1F));
322 }
323 
324 static int si1145_param_set(struct si1145_data *data, u8 param, u8 value)
325 {
326 	return si1145_param_update(data, SI1145_CMD_PARAM_SET, param, value);
327 }
328 
329 /* Set param. Returns negative errno or current value */
330 static int si1145_param_query(struct si1145_data *data, u8 param)
331 {
332 	int ret;
333 
334 	ret = si1145_command(data, SI1145_CMD_PARAM_QUERY | (param & 0x1F));
335 	if (ret < 0)
336 		return ret;
337 
338 	return i2c_smbus_read_byte_data(data->client, SI1145_REG_PARAM_RD);
339 }
340 
341 /* Expand 8 bit compressed value to 16 bit, see Silabs AN498 */
342 static u16 si1145_uncompress(u8 x)
343 {
344 	u16 result = 0;
345 	u8 exponent = 0;
346 
347 	if (x < 8)
348 		return 0;
349 
350 	exponent = (x & 0xf0) >> 4;
351 	result = 0x10 | (x & 0x0f);
352 
353 	if (exponent >= 4)
354 		return result << (exponent - 4);
355 	return result >> (4 - exponent);
356 }
357 
358 /* Compress 16 bit value to 8 bit, see Silabs AN498 */
359 static u8 si1145_compress(u16 x)
360 {
361 	u32 exponent = 0;
362 	u32 significand = 0;
363 	u32 tmp = x;
364 
365 	if (x == 0x0000)
366 		return 0x00;
367 	if (x == 0x0001)
368 		return 0x08;
369 
370 	while (1) {
371 		tmp >>= 1;
372 		exponent += 1;
373 		if (tmp == 1)
374 			break;
375 	}
376 
377 	if (exponent < 5) {
378 		significand = x << (4 - exponent);
379 		return (exponent << 4) | (significand & 0xF);
380 	}
381 
382 	significand = x >> (exponent - 5);
383 	if (significand & 1) {
384 		significand += 2;
385 		if (significand & 0x0040) {
386 			exponent += 1;
387 			significand >>= 1;
388 		}
389 	}
390 
391 	return (exponent << 4) | ((significand >> 1) & 0xF);
392 }
393 
394 /* Write meas_rate in hardware */
395 static int si1145_set_meas_rate(struct si1145_data *data, int interval)
396 {
397 	if (data->part_info->uncompressed_meas_rate)
398 		return i2c_smbus_write_word_data(data->client,
399 			SI1145_REG_MEAS_RATE, interval);
400 	else
401 		return i2c_smbus_write_byte_data(data->client,
402 			SI1145_REG_MEAS_RATE, interval);
403 }
404 
405 static int si1145_read_samp_freq(struct si1145_data *data, int *val, int *val2)
406 {
407 	*val = 32000;
408 	if (data->part_info->uncompressed_meas_rate)
409 		*val2 = data->meas_rate;
410 	else
411 		*val2 = si1145_uncompress(data->meas_rate);
412 	return IIO_VAL_FRACTIONAL;
413 }
414 
415 /* Set the samp freq in driver private data */
416 static int si1145_store_samp_freq(struct si1145_data *data, int val)
417 {
418 	int ret = 0;
419 	int meas_rate;
420 
421 	if (val <= 0 || val > 32000)
422 		return -ERANGE;
423 	meas_rate = 32000 / val;
424 
425 	mutex_lock(&data->lock);
426 	if (data->autonomous) {
427 		ret = si1145_set_meas_rate(data, meas_rate);
428 		if (ret)
429 			goto out;
430 	}
431 	if (data->part_info->uncompressed_meas_rate)
432 		data->meas_rate = meas_rate;
433 	else
434 		data->meas_rate = si1145_compress(meas_rate);
435 
436 out:
437 	mutex_unlock(&data->lock);
438 
439 	return ret;
440 }
441 
442 static irqreturn_t si1145_trigger_handler(int irq, void *private)
443 {
444 	struct iio_poll_func *pf = private;
445 	struct iio_dev *indio_dev = pf->indio_dev;
446 	struct si1145_data *data = iio_priv(indio_dev);
447 	/*
448 	 * Maximum buffer size:
449 	 *   6*2 bytes channels data + 4 bytes alignment +
450 	 *   8 bytes timestamp
451 	 */
452 	u8 buffer[24];
453 	int i, j = 0;
454 	int ret;
455 	u8 irq_status = 0;
456 
457 	if (!data->autonomous) {
458 		ret = si1145_command(data, SI1145_CMD_PSALS_FORCE);
459 		if (ret < 0 && ret != -EOVERFLOW)
460 			goto done;
461 	} else {
462 		irq_status = ret = i2c_smbus_read_byte_data(data->client,
463 				SI1145_REG_IRQ_STATUS);
464 		if (ret < 0)
465 			goto done;
466 		if (!(irq_status & SI1145_MASK_ALL_IE))
467 			goto done;
468 	}
469 
470 	for_each_set_bit(i, indio_dev->active_scan_mask,
471 		indio_dev->masklength) {
472 		int run = 1;
473 
474 		while (i + run < indio_dev->masklength) {
475 			if (!test_bit(i + run, indio_dev->active_scan_mask))
476 				break;
477 			if (indio_dev->channels[i + run].address !=
478 				indio_dev->channels[i].address + 2 * run)
479 				break;
480 			run++;
481 		}
482 
483 		ret = i2c_smbus_read_i2c_block_data_or_emulated(
484 				data->client, indio_dev->channels[i].address,
485 				sizeof(u16) * run, &buffer[j]);
486 		if (ret < 0)
487 			goto done;
488 		j += run * sizeof(u16);
489 		i += run - 1;
490 	}
491 
492 	if (data->autonomous) {
493 		ret = i2c_smbus_write_byte_data(data->client,
494 				SI1145_REG_IRQ_STATUS,
495 				irq_status & SI1145_MASK_ALL_IE);
496 		if (ret < 0)
497 			goto done;
498 	}
499 
500 	iio_push_to_buffers_with_timestamp(indio_dev, buffer,
501 		iio_get_time_ns(indio_dev));
502 
503 done:
504 	iio_trigger_notify_done(indio_dev->trig);
505 	return IRQ_HANDLED;
506 }
507 
508 static int si1145_set_chlist(struct iio_dev *indio_dev, unsigned long scan_mask)
509 {
510 	struct si1145_data *data = iio_priv(indio_dev);
511 	u8 reg = 0, mux;
512 	int ret;
513 	int i;
514 
515 	/* channel list already set, no need to reprogram */
516 	if (data->scan_mask == scan_mask)
517 		return 0;
518 
519 	for_each_set_bit(i, &scan_mask, indio_dev->masklength) {
520 		switch (indio_dev->channels[i].address) {
521 		case SI1145_REG_ALSVIS_DATA:
522 			reg |= SI1145_CHLIST_EN_ALSVIS;
523 			break;
524 		case SI1145_REG_ALSIR_DATA:
525 			reg |= SI1145_CHLIST_EN_ALSIR;
526 			break;
527 		case SI1145_REG_PS1_DATA:
528 			reg |= SI1145_CHLIST_EN_PS1;
529 			break;
530 		case SI1145_REG_PS2_DATA:
531 			reg |= SI1145_CHLIST_EN_PS2;
532 			break;
533 		case SI1145_REG_PS3_DATA:
534 			reg |= SI1145_CHLIST_EN_PS3;
535 			break;
536 		case SI1145_REG_AUX_DATA:
537 			switch (indio_dev->channels[i].type) {
538 			case IIO_UVINDEX:
539 				reg |= SI1145_CHLIST_EN_UV;
540 				break;
541 			default:
542 				reg |= SI1145_CHLIST_EN_AUX;
543 				if (indio_dev->channels[i].type == IIO_TEMP)
544 					mux = SI1145_MUX_TEMP;
545 				else
546 					mux = SI1145_MUX_VDD;
547 				ret = si1145_param_set(data,
548 					SI1145_PARAM_AUX_ADC_MUX, mux);
549 				if (ret < 0)
550 					return ret;
551 
552 				break;
553 			}
554 		}
555 	}
556 
557 	data->scan_mask = scan_mask;
558 	ret = si1145_param_set(data, SI1145_PARAM_CHLIST, reg);
559 
560 	return ret < 0 ? ret : 0;
561 }
562 
563 static int si1145_measure(struct iio_dev *indio_dev,
564 			  struct iio_chan_spec const *chan)
565 {
566 	struct si1145_data *data = iio_priv(indio_dev);
567 	u8 cmd;
568 	int ret;
569 
570 	ret = si1145_set_chlist(indio_dev, BIT(chan->scan_index));
571 	if (ret < 0)
572 		return ret;
573 
574 	cmd = (chan->type == IIO_PROXIMITY) ? SI1145_CMD_PS_FORCE :
575 		SI1145_CMD_ALS_FORCE;
576 	ret = si1145_command(data, cmd);
577 	if (ret < 0 && ret != -EOVERFLOW)
578 		return ret;
579 
580 	return i2c_smbus_read_word_data(data->client, chan->address);
581 }
582 
583 /*
584  * Conversion between iio scale and ADC_GAIN values
585  * These could be further adjusted but proximity/intensity are dimensionless
586  */
587 static const int si1145_proximity_scale_available[] = {
588 	128, 64, 32, 16, 8, 4};
589 static const int si1145_intensity_scale_available[] = {
590 	128, 64, 32, 16, 8, 4, 2, 1};
591 static IIO_CONST_ATTR(in_proximity_scale_available,
592 	"128 64 32 16 8 4");
593 static IIO_CONST_ATTR(in_intensity_scale_available,
594 	"128 64 32 16 8 4 2 1");
595 static IIO_CONST_ATTR(in_intensity_ir_scale_available,
596 	"128 64 32 16 8 4 2 1");
597 
598 static int si1145_scale_from_adcgain(int regval)
599 {
600 	return 128 >> regval;
601 }
602 
603 static int si1145_proximity_adcgain_from_scale(int val, int val2)
604 {
605 	val = find_closest_descending(val, si1145_proximity_scale_available,
606 				ARRAY_SIZE(si1145_proximity_scale_available));
607 	if (val < 0 || val > 5 || val2 != 0)
608 		return -EINVAL;
609 
610 	return val;
611 }
612 
613 static int si1145_intensity_adcgain_from_scale(int val, int val2)
614 {
615 	val = find_closest_descending(val, si1145_intensity_scale_available,
616 				ARRAY_SIZE(si1145_intensity_scale_available));
617 	if (val < 0 || val > 7 || val2 != 0)
618 		return -EINVAL;
619 
620 	return val;
621 }
622 
623 static int si1145_read_raw(struct iio_dev *indio_dev,
624 				struct iio_chan_spec const *chan,
625 				int *val, int *val2, long mask)
626 {
627 	struct si1145_data *data = iio_priv(indio_dev);
628 	int ret;
629 	u8 reg;
630 
631 	switch (mask) {
632 	case IIO_CHAN_INFO_RAW:
633 		switch (chan->type) {
634 		case IIO_INTENSITY:
635 		case IIO_PROXIMITY:
636 		case IIO_VOLTAGE:
637 		case IIO_TEMP:
638 		case IIO_UVINDEX:
639 			ret = iio_device_claim_direct_mode(indio_dev);
640 			if (ret)
641 				return ret;
642 			ret = si1145_measure(indio_dev, chan);
643 			iio_device_release_direct_mode(indio_dev);
644 
645 			if (ret < 0)
646 				return ret;
647 
648 			*val = ret;
649 
650 			return IIO_VAL_INT;
651 		case IIO_CURRENT:
652 			ret = i2c_smbus_read_byte_data(data->client,
653 				SI1145_PS_LED_REG(chan->channel));
654 			if (ret < 0)
655 				return ret;
656 
657 			*val = (ret >> SI1145_PS_LED_SHIFT(chan->channel))
658 				& 0x0f;
659 
660 			return IIO_VAL_INT;
661 		default:
662 			return -EINVAL;
663 		}
664 	case IIO_CHAN_INFO_SCALE:
665 		switch (chan->type) {
666 		case IIO_PROXIMITY:
667 			reg = SI1145_PARAM_PS_ADC_GAIN;
668 			break;
669 		case IIO_INTENSITY:
670 			if (chan->channel2 == IIO_MOD_LIGHT_IR)
671 				reg = SI1145_PARAM_ALSIR_ADC_GAIN;
672 			else
673 				reg = SI1145_PARAM_ALSVIS_ADC_GAIN;
674 			break;
675 		case IIO_TEMP:
676 			*val = 28;
677 			*val2 = 571429;
678 			return IIO_VAL_INT_PLUS_MICRO;
679 		case IIO_UVINDEX:
680 			*val = 0;
681 			*val2 = 10000;
682 			return IIO_VAL_INT_PLUS_MICRO;
683 		default:
684 			return -EINVAL;
685 		}
686 
687 		ret = si1145_param_query(data, reg);
688 		if (ret < 0)
689 			return ret;
690 
691 		*val = si1145_scale_from_adcgain(ret & 0x07);
692 
693 		return IIO_VAL_INT;
694 	case IIO_CHAN_INFO_OFFSET:
695 		switch (chan->type) {
696 		case IIO_TEMP:
697 			/*
698 			 * -ADC offset - ADC counts @ 25°C -
699 			 *   35 * ADC counts / °C
700 			 */
701 			*val = -256 - 11136 + 25 * 35;
702 			return IIO_VAL_INT;
703 		default:
704 			/*
705 			 * All ADC measurements have are by default offset
706 			 * by -256
707 			 * See AN498 5.6.3
708 			 */
709 			ret = si1145_param_query(data, SI1145_PARAM_ADC_OFFSET);
710 			if (ret < 0)
711 				return ret;
712 			*val = -si1145_uncompress(ret);
713 			return IIO_VAL_INT;
714 		}
715 	case IIO_CHAN_INFO_SAMP_FREQ:
716 		return si1145_read_samp_freq(data, val, val2);
717 	default:
718 		return -EINVAL;
719 	}
720 }
721 
722 static int si1145_write_raw(struct iio_dev *indio_dev,
723 			       struct iio_chan_spec const *chan,
724 			       int val, int val2, long mask)
725 {
726 	struct si1145_data *data = iio_priv(indio_dev);
727 	u8 reg1, reg2, shift;
728 	int ret;
729 
730 	switch (mask) {
731 	case IIO_CHAN_INFO_SCALE:
732 		switch (chan->type) {
733 		case IIO_PROXIMITY:
734 			val = si1145_proximity_adcgain_from_scale(val, val2);
735 			if (val < 0)
736 				return val;
737 			reg1 = SI1145_PARAM_PS_ADC_GAIN;
738 			reg2 = SI1145_PARAM_PS_ADC_COUNTER;
739 			break;
740 		case IIO_INTENSITY:
741 			val = si1145_intensity_adcgain_from_scale(val, val2);
742 			if (val < 0)
743 				return val;
744 			if (chan->channel2 == IIO_MOD_LIGHT_IR) {
745 				reg1 = SI1145_PARAM_ALSIR_ADC_GAIN;
746 				reg2 = SI1145_PARAM_ALSIR_ADC_COUNTER;
747 			} else {
748 				reg1 = SI1145_PARAM_ALSVIS_ADC_GAIN;
749 				reg2 = SI1145_PARAM_ALSVIS_ADC_COUNTER;
750 			}
751 			break;
752 		default:
753 			return -EINVAL;
754 		}
755 
756 		ret = iio_device_claim_direct_mode(indio_dev);
757 		if (ret)
758 			return ret;
759 
760 		ret = si1145_param_set(data, reg1, val);
761 		if (ret < 0) {
762 			iio_device_release_direct_mode(indio_dev);
763 			return ret;
764 		}
765 		/* Set recovery period to one's complement of gain */
766 		ret = si1145_param_set(data, reg2, (~val & 0x07) << 4);
767 		iio_device_release_direct_mode(indio_dev);
768 		return ret;
769 	case IIO_CHAN_INFO_RAW:
770 		if (chan->type != IIO_CURRENT)
771 			return -EINVAL;
772 
773 		if (val < 0 || val > 15 || val2 != 0)
774 			return -EINVAL;
775 
776 		reg1 = SI1145_PS_LED_REG(chan->channel);
777 		shift = SI1145_PS_LED_SHIFT(chan->channel);
778 
779 		ret = iio_device_claim_direct_mode(indio_dev);
780 		if (ret)
781 			return ret;
782 
783 		ret = i2c_smbus_read_byte_data(data->client, reg1);
784 		if (ret < 0) {
785 			iio_device_release_direct_mode(indio_dev);
786 			return ret;
787 		}
788 		ret = i2c_smbus_write_byte_data(data->client, reg1,
789 			(ret & ~(0x0f << shift)) |
790 			((val & 0x0f) << shift));
791 		iio_device_release_direct_mode(indio_dev);
792 		return ret;
793 	case IIO_CHAN_INFO_SAMP_FREQ:
794 		return si1145_store_samp_freq(data, val);
795 	default:
796 		return -EINVAL;
797 	}
798 }
799 
800 #define SI1145_ST { \
801 	.sign = 'u', \
802 	.realbits = 16, \
803 	.storagebits = 16, \
804 	.endianness = IIO_LE, \
805 }
806 
807 #define SI1145_INTENSITY_CHANNEL(_si) { \
808 	.type = IIO_INTENSITY, \
809 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
810 			      BIT(IIO_CHAN_INFO_OFFSET) | \
811 			      BIT(IIO_CHAN_INFO_SCALE), \
812 	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
813 	.scan_type = SI1145_ST, \
814 	.scan_index = _si, \
815 	.address = SI1145_REG_ALSVIS_DATA, \
816 }
817 
818 #define SI1145_INTENSITY_IR_CHANNEL(_si) { \
819 	.type = IIO_INTENSITY, \
820 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
821 			      BIT(IIO_CHAN_INFO_OFFSET) | \
822 			      BIT(IIO_CHAN_INFO_SCALE), \
823 	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
824 	.modified = 1, \
825 	.channel2 = IIO_MOD_LIGHT_IR, \
826 	.scan_type = SI1145_ST, \
827 	.scan_index = _si, \
828 	.address = SI1145_REG_ALSIR_DATA, \
829 }
830 
831 #define SI1145_TEMP_CHANNEL(_si) { \
832 	.type = IIO_TEMP, \
833 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
834 			      BIT(IIO_CHAN_INFO_OFFSET) | \
835 			      BIT(IIO_CHAN_INFO_SCALE), \
836 	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
837 	.scan_type = SI1145_ST, \
838 	.scan_index = _si, \
839 	.address = SI1145_REG_AUX_DATA, \
840 }
841 
842 #define SI1145_UV_CHANNEL(_si) { \
843 	.type = IIO_UVINDEX, \
844 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
845 			      BIT(IIO_CHAN_INFO_SCALE), \
846 	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
847 	.scan_type = SI1145_ST, \
848 	.scan_index = _si, \
849 	.address = SI1145_REG_AUX_DATA, \
850 }
851 
852 #define SI1145_PROXIMITY_CHANNEL(_si, _ch) { \
853 	.type = IIO_PROXIMITY, \
854 	.indexed = 1, \
855 	.channel = _ch, \
856 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
857 	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
858 				    BIT(IIO_CHAN_INFO_OFFSET), \
859 	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
860 	.scan_type = SI1145_ST, \
861 	.scan_index = _si, \
862 	.address = SI1145_REG_PS1_DATA + _ch * 2, \
863 }
864 
865 #define SI1145_VOLTAGE_CHANNEL(_si) { \
866 	.type = IIO_VOLTAGE, \
867 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
868 	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
869 	.scan_type = SI1145_ST, \
870 	.scan_index = _si, \
871 	.address = SI1145_REG_AUX_DATA, \
872 }
873 
874 #define SI1145_CURRENT_CHANNEL(_ch) { \
875 	.type = IIO_CURRENT, \
876 	.indexed = 1, \
877 	.channel = _ch, \
878 	.output = 1, \
879 	.scan_index = -1, \
880 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
881 }
882 
883 static const struct iio_chan_spec si1132_channels[] = {
884 	SI1145_INTENSITY_CHANNEL(0),
885 	SI1145_INTENSITY_IR_CHANNEL(1),
886 	SI1145_TEMP_CHANNEL(2),
887 	SI1145_VOLTAGE_CHANNEL(3),
888 	SI1145_UV_CHANNEL(4),
889 	IIO_CHAN_SOFT_TIMESTAMP(6),
890 };
891 
892 static const struct iio_chan_spec si1141_channels[] = {
893 	SI1145_INTENSITY_CHANNEL(0),
894 	SI1145_INTENSITY_IR_CHANNEL(1),
895 	SI1145_PROXIMITY_CHANNEL(2, 0),
896 	SI1145_TEMP_CHANNEL(3),
897 	SI1145_VOLTAGE_CHANNEL(4),
898 	IIO_CHAN_SOFT_TIMESTAMP(5),
899 	SI1145_CURRENT_CHANNEL(0),
900 };
901 
902 static const struct iio_chan_spec si1142_channels[] = {
903 	SI1145_INTENSITY_CHANNEL(0),
904 	SI1145_INTENSITY_IR_CHANNEL(1),
905 	SI1145_PROXIMITY_CHANNEL(2, 0),
906 	SI1145_PROXIMITY_CHANNEL(3, 1),
907 	SI1145_TEMP_CHANNEL(4),
908 	SI1145_VOLTAGE_CHANNEL(5),
909 	IIO_CHAN_SOFT_TIMESTAMP(6),
910 	SI1145_CURRENT_CHANNEL(0),
911 	SI1145_CURRENT_CHANNEL(1),
912 };
913 
914 static const struct iio_chan_spec si1143_channels[] = {
915 	SI1145_INTENSITY_CHANNEL(0),
916 	SI1145_INTENSITY_IR_CHANNEL(1),
917 	SI1145_PROXIMITY_CHANNEL(2, 0),
918 	SI1145_PROXIMITY_CHANNEL(3, 1),
919 	SI1145_PROXIMITY_CHANNEL(4, 2),
920 	SI1145_TEMP_CHANNEL(5),
921 	SI1145_VOLTAGE_CHANNEL(6),
922 	IIO_CHAN_SOFT_TIMESTAMP(7),
923 	SI1145_CURRENT_CHANNEL(0),
924 	SI1145_CURRENT_CHANNEL(1),
925 	SI1145_CURRENT_CHANNEL(2),
926 };
927 
928 static const struct iio_chan_spec si1145_channels[] = {
929 	SI1145_INTENSITY_CHANNEL(0),
930 	SI1145_INTENSITY_IR_CHANNEL(1),
931 	SI1145_PROXIMITY_CHANNEL(2, 0),
932 	SI1145_TEMP_CHANNEL(3),
933 	SI1145_VOLTAGE_CHANNEL(4),
934 	SI1145_UV_CHANNEL(5),
935 	IIO_CHAN_SOFT_TIMESTAMP(6),
936 	SI1145_CURRENT_CHANNEL(0),
937 };
938 
939 static const struct iio_chan_spec si1146_channels[] = {
940 	SI1145_INTENSITY_CHANNEL(0),
941 	SI1145_INTENSITY_IR_CHANNEL(1),
942 	SI1145_TEMP_CHANNEL(2),
943 	SI1145_VOLTAGE_CHANNEL(3),
944 	SI1145_UV_CHANNEL(4),
945 	SI1145_PROXIMITY_CHANNEL(5, 0),
946 	SI1145_PROXIMITY_CHANNEL(6, 1),
947 	IIO_CHAN_SOFT_TIMESTAMP(7),
948 	SI1145_CURRENT_CHANNEL(0),
949 	SI1145_CURRENT_CHANNEL(1),
950 };
951 
952 static const struct iio_chan_spec si1147_channels[] = {
953 	SI1145_INTENSITY_CHANNEL(0),
954 	SI1145_INTENSITY_IR_CHANNEL(1),
955 	SI1145_PROXIMITY_CHANNEL(2, 0),
956 	SI1145_PROXIMITY_CHANNEL(3, 1),
957 	SI1145_PROXIMITY_CHANNEL(4, 2),
958 	SI1145_TEMP_CHANNEL(5),
959 	SI1145_VOLTAGE_CHANNEL(6),
960 	SI1145_UV_CHANNEL(7),
961 	IIO_CHAN_SOFT_TIMESTAMP(8),
962 	SI1145_CURRENT_CHANNEL(0),
963 	SI1145_CURRENT_CHANNEL(1),
964 	SI1145_CURRENT_CHANNEL(2),
965 };
966 
967 static struct attribute *si1132_attributes[] = {
968 	&iio_const_attr_in_intensity_scale_available.dev_attr.attr,
969 	&iio_const_attr_in_intensity_ir_scale_available.dev_attr.attr,
970 	NULL,
971 };
972 
973 static struct attribute *si114x_attributes[] = {
974 	&iio_const_attr_in_intensity_scale_available.dev_attr.attr,
975 	&iio_const_attr_in_intensity_ir_scale_available.dev_attr.attr,
976 	&iio_const_attr_in_proximity_scale_available.dev_attr.attr,
977 	NULL,
978 };
979 
980 static const struct attribute_group si1132_attribute_group = {
981 	.attrs = si1132_attributes,
982 };
983 
984 static const struct attribute_group si114x_attribute_group = {
985 	.attrs = si114x_attributes,
986 };
987 
988 
989 static const struct iio_info si1132_info = {
990 	.read_raw = si1145_read_raw,
991 	.write_raw = si1145_write_raw,
992 	.driver_module = THIS_MODULE,
993 	.attrs = &si1132_attribute_group,
994 };
995 
996 static const struct iio_info si114x_info = {
997 	.read_raw = si1145_read_raw,
998 	.write_raw = si1145_write_raw,
999 	.driver_module = THIS_MODULE,
1000 	.attrs = &si114x_attribute_group,
1001 };
1002 
1003 #define SI1145_PART(id, iio_info, chans, leds, uncompressed_meas_rate) \
1004 	{id, iio_info, chans, ARRAY_SIZE(chans), leds, uncompressed_meas_rate}
1005 
1006 static const struct si1145_part_info si1145_part_info[] = {
1007 	[SI1132] = SI1145_PART(0x32, &si1132_info, si1132_channels, 0, true),
1008 	[SI1141] = SI1145_PART(0x41, &si114x_info, si1141_channels, 1, false),
1009 	[SI1142] = SI1145_PART(0x42, &si114x_info, si1142_channels, 2, false),
1010 	[SI1143] = SI1145_PART(0x43, &si114x_info, si1143_channels, 3, false),
1011 	[SI1145] = SI1145_PART(0x45, &si114x_info, si1145_channels, 1, true),
1012 	[SI1146] = SI1145_PART(0x46, &si114x_info, si1146_channels, 2, true),
1013 	[SI1147] = SI1145_PART(0x47, &si114x_info, si1147_channels, 3, true),
1014 };
1015 
1016 static int si1145_initialize(struct si1145_data *data)
1017 {
1018 	struct i2c_client *client = data->client;
1019 	int ret;
1020 
1021 	ret = i2c_smbus_write_byte_data(client, SI1145_REG_COMMAND,
1022 					SI1145_CMD_RESET);
1023 	if (ret < 0)
1024 		return ret;
1025 	msleep(SI1145_COMMAND_TIMEOUT_MS);
1026 
1027 	/* Hardware key, magic value */
1028 	ret = i2c_smbus_write_byte_data(client, SI1145_REG_HW_KEY, 0x17);
1029 	if (ret < 0)
1030 		return ret;
1031 	msleep(SI1145_COMMAND_TIMEOUT_MS);
1032 
1033 	/* Turn off autonomous mode */
1034 	ret = si1145_set_meas_rate(data, 0);
1035 	if (ret < 0)
1036 		return ret;
1037 
1038 	/* Initialize sampling freq to 10 Hz */
1039 	ret = si1145_store_samp_freq(data, 10);
1040 	if (ret < 0)
1041 		return ret;
1042 
1043 	/* Set LED currents to 45 mA; have 4 bits, see Table 2 in datasheet */
1044 	switch (data->part_info->num_leds) {
1045 	case 3:
1046 		ret = i2c_smbus_write_byte_data(client,
1047 						SI1145_REG_PS_LED3,
1048 						SI1145_LED_CURRENT_45mA);
1049 		if (ret < 0)
1050 			return ret;
1051 		/* fallthrough */
1052 	case 2:
1053 		ret = i2c_smbus_write_byte_data(client,
1054 						SI1145_REG_PS_LED21,
1055 						(SI1145_LED_CURRENT_45mA << 4) |
1056 						SI1145_LED_CURRENT_45mA);
1057 		break;
1058 	case 1:
1059 		ret = i2c_smbus_write_byte_data(client,
1060 						SI1145_REG_PS_LED21,
1061 						SI1145_LED_CURRENT_45mA);
1062 		break;
1063 	default:
1064 		ret = 0;
1065 		break;
1066 	}
1067 	if (ret < 0)
1068 		return ret;
1069 
1070 	/* Set normal proximity measurement mode */
1071 	ret = si1145_param_set(data, SI1145_PARAM_PS_ADC_MISC,
1072 			       SI1145_PS_ADC_MODE_NORMAL);
1073 	if (ret < 0)
1074 		return ret;
1075 
1076 	ret = si1145_param_set(data, SI1145_PARAM_PS_ADC_GAIN, 0x01);
1077 	if (ret < 0)
1078 		return ret;
1079 
1080 	/* ADC_COUNTER should be one complement of ADC_GAIN */
1081 	ret = si1145_param_set(data, SI1145_PARAM_PS_ADC_COUNTER, 0x06 << 4);
1082 	if (ret < 0)
1083 		return ret;
1084 
1085 	/* Set ALS visible measurement mode */
1086 	ret = si1145_param_set(data, SI1145_PARAM_ALSVIS_ADC_MISC,
1087 			       SI1145_ADC_MISC_RANGE);
1088 	if (ret < 0)
1089 		return ret;
1090 
1091 	ret = si1145_param_set(data, SI1145_PARAM_ALSVIS_ADC_GAIN, 0x03);
1092 	if (ret < 0)
1093 		return ret;
1094 
1095 	ret = si1145_param_set(data, SI1145_PARAM_ALSVIS_ADC_COUNTER,
1096 			       0x04 << 4);
1097 	if (ret < 0)
1098 		return ret;
1099 
1100 	/* Set ALS IR measurement mode */
1101 	ret = si1145_param_set(data, SI1145_PARAM_ALSIR_ADC_MISC,
1102 			       SI1145_ADC_MISC_RANGE);
1103 	if (ret < 0)
1104 		return ret;
1105 
1106 	ret = si1145_param_set(data, SI1145_PARAM_ALSIR_ADC_GAIN, 0x01);
1107 	if (ret < 0)
1108 		return ret;
1109 
1110 	ret = si1145_param_set(data, SI1145_PARAM_ALSIR_ADC_COUNTER,
1111 			       0x06 << 4);
1112 	if (ret < 0)
1113 		return ret;
1114 
1115 	/*
1116 	 * Initialize UCOEF to default values in datasheet
1117 	 * These registers are normally zero on reset
1118 	 */
1119 	if (data->part_info == &si1145_part_info[SI1132] ||
1120 		data->part_info == &si1145_part_info[SI1145] ||
1121 		data->part_info == &si1145_part_info[SI1146] ||
1122 		data->part_info == &si1145_part_info[SI1147]) {
1123 		ret = i2c_smbus_write_byte_data(data->client,
1124 						SI1145_REG_UCOEF1,
1125 						SI1145_UCOEF1_DEFAULT);
1126 		if (ret < 0)
1127 			return ret;
1128 		ret = i2c_smbus_write_byte_data(data->client,
1129 				SI1145_REG_UCOEF2, SI1145_UCOEF2_DEFAULT);
1130 		if (ret < 0)
1131 			return ret;
1132 		ret = i2c_smbus_write_byte_data(data->client,
1133 				SI1145_REG_UCOEF3, SI1145_UCOEF3_DEFAULT);
1134 		if (ret < 0)
1135 			return ret;
1136 		ret = i2c_smbus_write_byte_data(data->client,
1137 				SI1145_REG_UCOEF4, SI1145_UCOEF4_DEFAULT);
1138 		if (ret < 0)
1139 			return ret;
1140 	}
1141 
1142 	return 0;
1143 }
1144 
1145 /*
1146  * Program the channels we want to measure with CMD_PSALS_AUTO. No need for
1147  * _postdisable as we stop with CMD_PSALS_PAUSE; single measurement (direct)
1148  * mode reprograms the channels list anyway...
1149  */
1150 static int si1145_buffer_preenable(struct iio_dev *indio_dev)
1151 {
1152 	struct si1145_data *data = iio_priv(indio_dev);
1153 	int ret;
1154 
1155 	mutex_lock(&data->lock);
1156 	ret = si1145_set_chlist(indio_dev, *indio_dev->active_scan_mask);
1157 	mutex_unlock(&data->lock);
1158 
1159 	return ret;
1160 }
1161 
1162 static bool si1145_validate_scan_mask(struct iio_dev *indio_dev,
1163 			       const unsigned long *scan_mask)
1164 {
1165 	struct si1145_data *data = iio_priv(indio_dev);
1166 	unsigned int count = 0;
1167 	int i;
1168 
1169 	/* Check that at most one AUX channel is enabled */
1170 	for_each_set_bit(i, scan_mask, data->part_info->num_channels) {
1171 		if (indio_dev->channels[i].address == SI1145_REG_AUX_DATA)
1172 			count++;
1173 	}
1174 
1175 	return count <= 1;
1176 }
1177 
1178 static const struct iio_buffer_setup_ops si1145_buffer_setup_ops = {
1179 	.preenable = si1145_buffer_preenable,
1180 	.postenable = iio_triggered_buffer_postenable,
1181 	.predisable = iio_triggered_buffer_predisable,
1182 	.validate_scan_mask = si1145_validate_scan_mask,
1183 };
1184 
1185 /**
1186  * si1145_trigger_set_state() - Set trigger state
1187  *
1188  * When not using triggers interrupts are disabled and measurement rate is
1189  * set to zero in order to minimize power consumption.
1190  */
1191 static int si1145_trigger_set_state(struct iio_trigger *trig, bool state)
1192 {
1193 	struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
1194 	struct si1145_data *data = iio_priv(indio_dev);
1195 	int err = 0, ret;
1196 
1197 	mutex_lock(&data->lock);
1198 
1199 	if (state) {
1200 		data->autonomous = true;
1201 		err = i2c_smbus_write_byte_data(data->client,
1202 				SI1145_REG_INT_CFG, SI1145_INT_CFG_OE);
1203 		if (err < 0)
1204 			goto disable;
1205 		err = i2c_smbus_write_byte_data(data->client,
1206 				SI1145_REG_IRQ_ENABLE, SI1145_MASK_ALL_IE);
1207 		if (err < 0)
1208 			goto disable;
1209 		err = si1145_set_meas_rate(data, data->meas_rate);
1210 		if (err < 0)
1211 			goto disable;
1212 		err = si1145_command(data, SI1145_CMD_PSALS_AUTO);
1213 		if (err < 0)
1214 			goto disable;
1215 	} else {
1216 disable:
1217 		/* Disable as much as possible skipping errors */
1218 		ret = si1145_command(data, SI1145_CMD_PSALS_PAUSE);
1219 		if (ret < 0 && !err)
1220 			err = ret;
1221 		ret = si1145_set_meas_rate(data, 0);
1222 		if (ret < 0 && !err)
1223 			err = ret;
1224 		ret = i2c_smbus_write_byte_data(data->client,
1225 						SI1145_REG_IRQ_ENABLE, 0);
1226 		if (ret < 0 && !err)
1227 			err = ret;
1228 		ret = i2c_smbus_write_byte_data(data->client,
1229 						SI1145_REG_INT_CFG, 0);
1230 		if (ret < 0 && !err)
1231 			err = ret;
1232 		data->autonomous = false;
1233 	}
1234 
1235 	mutex_unlock(&data->lock);
1236 	return err;
1237 }
1238 
1239 static const struct iio_trigger_ops si1145_trigger_ops = {
1240 	.owner = THIS_MODULE,
1241 	.set_trigger_state = si1145_trigger_set_state,
1242 };
1243 
1244 static int si1145_probe_trigger(struct iio_dev *indio_dev)
1245 {
1246 	struct si1145_data *data = iio_priv(indio_dev);
1247 	struct i2c_client *client = data->client;
1248 	struct iio_trigger *trig;
1249 	int ret;
1250 
1251 	trig = devm_iio_trigger_alloc(&client->dev,
1252 			"%s-dev%d", indio_dev->name, indio_dev->id);
1253 	if (!trig)
1254 		return -ENOMEM;
1255 
1256 	trig->dev.parent = &client->dev;
1257 	trig->ops = &si1145_trigger_ops;
1258 	iio_trigger_set_drvdata(trig, indio_dev);
1259 
1260 	ret = devm_request_irq(&client->dev, client->irq,
1261 			  iio_trigger_generic_data_rdy_poll,
1262 			  IRQF_TRIGGER_FALLING,
1263 			  "si1145_irq",
1264 			  trig);
1265 	if (ret < 0) {
1266 		dev_err(&client->dev, "irq request failed\n");
1267 		return ret;
1268 	}
1269 
1270 	ret = iio_trigger_register(trig);
1271 	if (ret)
1272 		return ret;
1273 
1274 	data->trig = trig;
1275 	indio_dev->trig = iio_trigger_get(data->trig);
1276 
1277 	return 0;
1278 }
1279 
1280 static void si1145_remove_trigger(struct iio_dev *indio_dev)
1281 {
1282 	struct si1145_data *data = iio_priv(indio_dev);
1283 
1284 	if (data->trig) {
1285 		iio_trigger_unregister(data->trig);
1286 		data->trig = NULL;
1287 	}
1288 }
1289 
1290 static int si1145_probe(struct i2c_client *client,
1291 			const struct i2c_device_id *id)
1292 {
1293 	struct si1145_data *data;
1294 	struct iio_dev *indio_dev;
1295 	u8 part_id, rev_id, seq_id;
1296 	int ret;
1297 
1298 	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
1299 	if (!indio_dev)
1300 		return -ENOMEM;
1301 
1302 	data = iio_priv(indio_dev);
1303 	i2c_set_clientdata(client, indio_dev);
1304 	data->client = client;
1305 	data->part_info = &si1145_part_info[id->driver_data];
1306 
1307 	part_id = ret = i2c_smbus_read_byte_data(data->client,
1308 						 SI1145_REG_PART_ID);
1309 	if (ret < 0)
1310 		return ret;
1311 	rev_id = ret = i2c_smbus_read_byte_data(data->client,
1312 						SI1145_REG_REV_ID);
1313 	if (ret < 0)
1314 		return ret;
1315 	seq_id = ret = i2c_smbus_read_byte_data(data->client,
1316 						SI1145_REG_SEQ_ID);
1317 	if (ret < 0)
1318 		return ret;
1319 	dev_info(&client->dev, "device ID part %#02hhx rev %#02hhx seq %#02hhx\n",
1320 			part_id, rev_id, seq_id);
1321 	if (part_id != data->part_info->part) {
1322 		dev_err(&client->dev, "part ID mismatch got %#02hhx, expected %#02x\n",
1323 				part_id, data->part_info->part);
1324 		return -ENODEV;
1325 	}
1326 
1327 	indio_dev->dev.parent = &client->dev;
1328 	indio_dev->name = id->name;
1329 	indio_dev->channels = data->part_info->channels;
1330 	indio_dev->num_channels = data->part_info->num_channels;
1331 	indio_dev->info = data->part_info->iio_info;
1332 	indio_dev->modes = INDIO_DIRECT_MODE;
1333 
1334 	mutex_init(&data->lock);
1335 	mutex_init(&data->cmdlock);
1336 
1337 	ret = si1145_initialize(data);
1338 	if (ret < 0)
1339 		return ret;
1340 
1341 	ret = iio_triggered_buffer_setup(indio_dev, NULL,
1342 		si1145_trigger_handler, &si1145_buffer_setup_ops);
1343 	if (ret < 0)
1344 		return ret;
1345 
1346 	if (client->irq) {
1347 		ret = si1145_probe_trigger(indio_dev);
1348 		if (ret < 0)
1349 			goto error_free_buffer;
1350 	} else {
1351 		dev_info(&client->dev, "no irq, using polling\n");
1352 	}
1353 
1354 	ret = iio_device_register(indio_dev);
1355 	if (ret < 0)
1356 		goto error_free_trigger;
1357 
1358 	return 0;
1359 
1360 error_free_trigger:
1361 	si1145_remove_trigger(indio_dev);
1362 error_free_buffer:
1363 	iio_triggered_buffer_cleanup(indio_dev);
1364 
1365 	return ret;
1366 }
1367 
1368 static const struct i2c_device_id si1145_ids[] = {
1369 	{ "si1132", SI1132 },
1370 	{ "si1141", SI1141 },
1371 	{ "si1142", SI1142 },
1372 	{ "si1143", SI1143 },
1373 	{ "si1145", SI1145 },
1374 	{ "si1146", SI1146 },
1375 	{ "si1147", SI1147 },
1376 	{ }
1377 };
1378 MODULE_DEVICE_TABLE(i2c, si1145_ids);
1379 
1380 static int si1145_remove(struct i2c_client *client)
1381 {
1382 	struct iio_dev *indio_dev = i2c_get_clientdata(client);
1383 
1384 	iio_device_unregister(indio_dev);
1385 	si1145_remove_trigger(indio_dev);
1386 	iio_triggered_buffer_cleanup(indio_dev);
1387 
1388 	return 0;
1389 }
1390 
1391 static struct i2c_driver si1145_driver = {
1392 	.driver = {
1393 		.name   = "si1145",
1394 	},
1395 	.probe  = si1145_probe,
1396 	.remove = si1145_remove,
1397 	.id_table = si1145_ids,
1398 };
1399 
1400 module_i2c_driver(si1145_driver);
1401 
1402 MODULE_AUTHOR("Peter Meerwald-Stadler <pmeerw@pmeerw.net>");
1403 MODULE_DESCRIPTION("Silabs SI1132 and SI1141/2/3/5/6/7 proximity, ambient light and UV index sensor driver");
1404 MODULE_LICENSE("GPL");
1405