xref: /linux/drivers/iio/light/veml6030.c (revision 0d5ec7919f3747193f051036b2301734a4b5e1d6)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * VEML6030, VMEL6035 and VEML7700 Ambient Light Sensors
4  *
5  * Copyright (c) 2019, Rishi Gupta <gupt21@gmail.com>
6  *
7  * VEML6030:
8  * Datasheet: https://www.vishay.com/docs/84366/veml6030.pdf
9  * Appnote-84367: https://www.vishay.com/docs/84367/designingveml6030.pdf
10  *
11  * VEML6035:
12  * Datasheet: https://www.vishay.com/docs/84889/veml6035.pdf
13  * Appnote-84944: https://www.vishay.com/docs/84944/designingveml6035.pdf
14  *
15  * VEML7700:
16  * Datasheet: https://www.vishay.com/docs/84286/veml7700.pdf
17  * Appnote-84323: https://www.vishay.com/docs/84323/designingveml7700.pdf
18  */
19 
20 #include <linux/bitfield.h>
21 #include <linux/module.h>
22 #include <linux/i2c.h>
23 #include <linux/err.h>
24 #include <linux/regmap.h>
25 #include <linux/interrupt.h>
26 #include <linux/pm_runtime.h>
27 #include <linux/units.h>
28 #include <linux/regulator/consumer.h>
29 #include <linux/iio/iio.h>
30 #include <linux/iio/sysfs.h>
31 #include <linux/iio/events.h>
32 #include <linux/iio/iio-gts-helper.h>
33 #include <linux/iio/trigger_consumer.h>
34 #include <linux/iio/triggered_buffer.h>
35 
36 /* Device registers */
37 #define VEML6030_REG_ALS_CONF   0x00
38 #define VEML6030_REG_ALS_WH     0x01
39 #define VEML6030_REG_ALS_WL     0x02
40 #define VEML6030_REG_ALS_PSM    0x03
41 #define VEML6030_REG_ALS_DATA   0x04
42 #define VEML6030_REG_WH_DATA    0x05
43 #define VEML6030_REG_ALS_INT    0x06
44 #define VEML6030_REG_DATA(ch)   (VEML6030_REG_ALS_DATA + (ch))
45 
46 /* Bit masks for specific functionality */
47 #define VEML6030_ALS_IT       GENMASK(9, 6)
48 #define VEML6030_PSM          GENMASK(2, 1)
49 #define VEML6030_ALS_PERS     GENMASK(5, 4)
50 #define VEML6030_ALS_GAIN     GENMASK(12, 11)
51 #define VEML6030_PSM_EN       BIT(0)
52 #define VEML6030_INT_TH_LOW   BIT(15)
53 #define VEML6030_INT_TH_HIGH  BIT(14)
54 #define VEML6030_ALS_INT_EN   BIT(1)
55 #define VEML6030_ALS_SD       BIT(0)
56 
57 #define VEML6035_GAIN_M       GENMASK(12, 10)
58 #define VEML6035_GAIN         BIT(10)
59 #define VEML6035_DG           BIT(11)
60 #define VEML6035_SENS         BIT(12)
61 #define VEML6035_INT_CHAN     BIT(3)
62 #define VEML6035_CHAN_EN      BIT(2)
63 
64 /* Regfields */
65 #define VEML6030_GAIN_RF      REG_FIELD(VEML6030_REG_ALS_CONF, 11, 12)
66 #define VEML6030_IT_RF        REG_FIELD(VEML6030_REG_ALS_CONF, 6, 9)
67 
68 #define VEML6035_GAIN_RF      REG_FIELD(VEML6030_REG_ALS_CONF, 10, 12)
69 
70 /* Maximum scales x 10000 to work with integers */
71 #define VEML6030_MAX_SCALE    21504
72 #define VEML6035_MAX_SCALE    4096
73 
74 enum veml6030_scan {
75 	VEML6030_SCAN_ALS,
76 	VEML6030_SCAN_WH,
77 	VEML6030_SCAN_TIMESTAMP,
78 };
79 
80 struct veml6030_rf {
81 	struct regmap_field *it;
82 	struct regmap_field *gain;
83 };
84 
85 struct veml603x_chip {
86 	const char *name;
87 	const struct iio_chan_spec *channels;
88 	const int num_channels;
89 	const struct reg_field gain_rf;
90 	const struct reg_field it_rf;
91 	const int max_scale;
92 	int (*hw_init)(struct iio_dev *indio_dev, struct device *dev);
93 	int (*set_info)(struct iio_dev *indio_dev);
94 };
95 
96 /*
97  * The resolution depends on both gain and integration time. The
98  * cur_resolution stores one of the resolution mentioned in the
99  * table during startup and gets updated whenever integration time
100  * or gain is changed.
101  *
102  * Table 'resolution and maximum detection range' in the appnotes
103  * is visualized as a 2D array. The cur_gain stores index of gain
104  * in this table (0-3 for VEML6030, 0-5 for VEML6035) while the
105  * cur_integration_time holds index of integration time (0-5).
106  */
107 struct veml6030_data {
108 	struct i2c_client *client;
109 	struct regmap *regmap;
110 	struct veml6030_rf rf;
111 	const struct veml603x_chip *chip;
112 	struct iio_gts gts;
113 
114 };
115 
116 #define VEML6030_SEL_IT_25MS  0x0C
117 #define VEML6030_SEL_IT_50MS  0x08
118 #define VEML6030_SEL_IT_100MS 0x00
119 #define VEML6030_SEL_IT_200MS 0x01
120 #define VEML6030_SEL_IT_400MS 0x02
121 #define VEML6030_SEL_IT_800MS 0x03
122 static const struct iio_itime_sel_mul veml6030_it_sel[] = {
123 	GAIN_SCALE_ITIME_US(25000, VEML6030_SEL_IT_25MS, 1),
124 	GAIN_SCALE_ITIME_US(50000, VEML6030_SEL_IT_50MS, 2),
125 	GAIN_SCALE_ITIME_US(100000, VEML6030_SEL_IT_100MS, 4),
126 	GAIN_SCALE_ITIME_US(200000, VEML6030_SEL_IT_200MS, 8),
127 	GAIN_SCALE_ITIME_US(400000, VEML6030_SEL_IT_400MS, 16),
128 	GAIN_SCALE_ITIME_US(800000, VEML6030_SEL_IT_800MS, 32),
129 };
130 
131 /* Gains are multiplied by 8 to work with integers. The values in the
132  * iio-gts tables don't need corrections because the maximum value of
133  * the scale refers to GAIN = x1, and the rest of the values are
134  * obtained from the resulting linear function.
135  */
136 #define VEML6030_SEL_MILLI_GAIN_X125  2
137 #define VEML6030_SEL_MILLI_GAIN_X250  3
138 #define VEML6030_SEL_MILLI_GAIN_X1000 0
139 #define VEML6030_SEL_MILLI_GAIN_X2000 1
140 static const struct iio_gain_sel_pair veml6030_gain_sel[] = {
141 	GAIN_SCALE_GAIN(1, VEML6030_SEL_MILLI_GAIN_X125),
142 	GAIN_SCALE_GAIN(2, VEML6030_SEL_MILLI_GAIN_X250),
143 	GAIN_SCALE_GAIN(8, VEML6030_SEL_MILLI_GAIN_X1000),
144 	GAIN_SCALE_GAIN(16, VEML6030_SEL_MILLI_GAIN_X2000),
145 };
146 
147 #define VEML6035_SEL_MILLI_GAIN_X125  4
148 #define VEML6035_SEL_MILLI_GAIN_X250  5
149 #define VEML6035_SEL_MILLI_GAIN_X500  7
150 #define VEML6035_SEL_MILLI_GAIN_X1000 0
151 #define VEML6035_SEL_MILLI_GAIN_X2000 1
152 #define VEML6035_SEL_MILLI_GAIN_X4000 3
153 static const struct iio_gain_sel_pair veml6035_gain_sel[] = {
154 	GAIN_SCALE_GAIN(1, VEML6035_SEL_MILLI_GAIN_X125),
155 	GAIN_SCALE_GAIN(2, VEML6035_SEL_MILLI_GAIN_X250),
156 	GAIN_SCALE_GAIN(4, VEML6035_SEL_MILLI_GAIN_X500),
157 	GAIN_SCALE_GAIN(8, VEML6035_SEL_MILLI_GAIN_X1000),
158 	GAIN_SCALE_GAIN(16, VEML6035_SEL_MILLI_GAIN_X2000),
159 	GAIN_SCALE_GAIN(32, VEML6035_SEL_MILLI_GAIN_X4000),
160 };
161 
162 /*
163  * Persistence = 1/2/4/8 x integration time
164  * Minimum time for which light readings must stay above configured
165  * threshold to assert the interrupt.
166  */
167 static const char * const period_values[] = {
168 		"0.1 0.2 0.4 0.8",
169 		"0.2 0.4 0.8 1.6",
170 		"0.4 0.8 1.6 3.2",
171 		"0.8 1.6 3.2 6.4",
172 		"0.05 0.1 0.2 0.4",
173 		"0.025 0.050 0.1 0.2"
174 };
175 
176 /*
177  * Return list of valid period values in seconds corresponding to
178  * the currently active integration time.
179  */
in_illuminance_period_available_show(struct device * dev,struct device_attribute * attr,char * buf)180 static ssize_t in_illuminance_period_available_show(struct device *dev,
181 				struct device_attribute *attr, char *buf)
182 {
183 	struct veml6030_data *data = iio_priv(dev_to_iio_dev(dev));
184 	int ret, reg, x;
185 
186 	ret = regmap_read(data->regmap, VEML6030_REG_ALS_CONF, &reg);
187 	if (ret) {
188 		dev_err(&data->client->dev,
189 				"can't read als conf register %d\n", ret);
190 		return ret;
191 	}
192 
193 	ret = ((reg >> 6) & 0xF);
194 	switch (ret) {
195 	case 0:
196 	case 1:
197 	case 2:
198 	case 3:
199 		x = ret;
200 		break;
201 	case 8:
202 		x = 4;
203 		break;
204 	case 12:
205 		x = 5;
206 		break;
207 	default:
208 		return -EINVAL;
209 	}
210 
211 	return sysfs_emit(buf, "%s\n", period_values[x]);
212 }
213 
214 static IIO_DEVICE_ATTR_RO(in_illuminance_period_available, 0);
215 
216 static struct attribute *veml6030_event_attributes[] = {
217 	&iio_dev_attr_in_illuminance_period_available.dev_attr.attr,
218 	NULL
219 };
220 
221 static const struct attribute_group veml6030_event_attr_group = {
222 	.attrs = veml6030_event_attributes,
223 };
224 
veml6030_als_pwr_on(struct veml6030_data * data)225 static int veml6030_als_pwr_on(struct veml6030_data *data)
226 {
227 	int ret;
228 
229 	ret = regmap_clear_bits(data->regmap, VEML6030_REG_ALS_CONF,
230 				VEML6030_ALS_SD);
231 	if (ret)
232 		return ret;
233 
234 	/* Wait 4 ms to let processor & oscillator start correctly */
235 	fsleep(4000);
236 
237 	return 0;
238 }
239 
veml6030_als_shut_down(struct veml6030_data * data)240 static int veml6030_als_shut_down(struct veml6030_data *data)
241 {
242 	return regmap_set_bits(data->regmap, VEML6030_REG_ALS_CONF,
243 				 VEML6030_ALS_SD);
244 }
245 
veml6030_als_shut_down_action(void * data)246 static void veml6030_als_shut_down_action(void *data)
247 {
248 	veml6030_als_shut_down(data);
249 }
250 
251 static const struct iio_event_spec veml6030_event_spec[] = {
252 	{
253 		.type = IIO_EV_TYPE_THRESH,
254 		.dir = IIO_EV_DIR_RISING,
255 		.mask_separate = BIT(IIO_EV_INFO_VALUE),
256 	}, {
257 		.type = IIO_EV_TYPE_THRESH,
258 		.dir = IIO_EV_DIR_FALLING,
259 		.mask_separate = BIT(IIO_EV_INFO_VALUE),
260 	}, {
261 		.type = IIO_EV_TYPE_THRESH,
262 		.dir = IIO_EV_DIR_EITHER,
263 		.mask_separate = BIT(IIO_EV_INFO_PERIOD) |
264 		BIT(IIO_EV_INFO_ENABLE),
265 	},
266 };
267 
268 /* Channel number */
269 enum veml6030_chan {
270 	CH_ALS,
271 	CH_WHITE,
272 };
273 
274 static const struct iio_chan_spec veml6030_channels[] = {
275 	{
276 		.type = IIO_LIGHT,
277 		.channel = CH_ALS,
278 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
279 				BIT(IIO_CHAN_INFO_PROCESSED) |
280 				BIT(IIO_CHAN_INFO_INT_TIME) |
281 				BIT(IIO_CHAN_INFO_SCALE),
282 		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
283 						     BIT(IIO_CHAN_INFO_SCALE),
284 		.event_spec = veml6030_event_spec,
285 		.num_event_specs = ARRAY_SIZE(veml6030_event_spec),
286 		.scan_index = VEML6030_SCAN_ALS,
287 		.scan_type = {
288 			.sign = 'u',
289 			.realbits = 16,
290 			.storagebits = 16,
291 			.endianness = IIO_CPU,
292 		},
293 	},
294 	{
295 		.type = IIO_INTENSITY,
296 		.channel = CH_WHITE,
297 		.modified = 1,
298 		.channel2 = IIO_MOD_LIGHT_BOTH,
299 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
300 				BIT(IIO_CHAN_INFO_INT_TIME) |
301 				BIT(IIO_CHAN_INFO_SCALE),
302 		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
303 						     BIT(IIO_CHAN_INFO_SCALE),
304 		.scan_index = VEML6030_SCAN_WH,
305 		.scan_type = {
306 			.sign = 'u',
307 			.realbits = 16,
308 			.storagebits = 16,
309 			.endianness = IIO_CPU,
310 		},
311 	},
312 	IIO_CHAN_SOFT_TIMESTAMP(VEML6030_SCAN_TIMESTAMP),
313 };
314 
315 static const struct iio_chan_spec veml7700_channels[] = {
316 	{
317 		.type = IIO_LIGHT,
318 		.channel = CH_ALS,
319 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
320 				BIT(IIO_CHAN_INFO_PROCESSED) |
321 				BIT(IIO_CHAN_INFO_INT_TIME) |
322 				BIT(IIO_CHAN_INFO_SCALE),
323 		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
324 						     BIT(IIO_CHAN_INFO_SCALE),
325 		.scan_index = VEML6030_SCAN_ALS,
326 		.scan_type = {
327 			.sign = 'u',
328 			.realbits = 16,
329 			.storagebits = 16,
330 			.endianness = IIO_CPU,
331 		},
332 	},
333 	{
334 		.type = IIO_INTENSITY,
335 		.channel = CH_WHITE,
336 		.modified = 1,
337 		.channel2 = IIO_MOD_LIGHT_BOTH,
338 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
339 				BIT(IIO_CHAN_INFO_INT_TIME) |
340 				BIT(IIO_CHAN_INFO_SCALE),
341 		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
342 						     BIT(IIO_CHAN_INFO_SCALE),
343 		.scan_index = VEML6030_SCAN_WH,
344 		.scan_type = {
345 			.sign = 'u',
346 			.realbits = 16,
347 			.storagebits = 16,
348 			.endianness = IIO_CPU,
349 		},
350 	},
351 	IIO_CHAN_SOFT_TIMESTAMP(VEML6030_SCAN_TIMESTAMP),
352 };
353 
354 static const struct regmap_range veml6030_readable_ranges[] = {
355 	regmap_reg_range(VEML6030_REG_ALS_CONF, VEML6030_REG_ALS_INT),
356 };
357 
358 static const struct regmap_access_table veml6030_readable_table = {
359 	.yes_ranges = veml6030_readable_ranges,
360 	.n_yes_ranges = ARRAY_SIZE(veml6030_readable_ranges),
361 };
362 
363 static const struct regmap_range veml6030_writable_ranges[] = {
364 	regmap_reg_range(VEML6030_REG_ALS_CONF, VEML6030_REG_ALS_PSM),
365 };
366 
367 static const struct regmap_access_table veml6030_writable_table = {
368 	.yes_ranges = veml6030_writable_ranges,
369 	.n_yes_ranges = ARRAY_SIZE(veml6030_writable_ranges),
370 };
371 
372 static const struct regmap_range veml6030_volatile_ranges[] = {
373 	regmap_reg_range(VEML6030_REG_ALS_DATA, VEML6030_REG_WH_DATA),
374 };
375 
376 static const struct regmap_access_table veml6030_volatile_table = {
377 	.yes_ranges = veml6030_volatile_ranges,
378 	.n_yes_ranges = ARRAY_SIZE(veml6030_volatile_ranges),
379 };
380 
381 static const struct regmap_config veml6030_regmap_config = {
382 	.name = "veml6030_regmap",
383 	.reg_bits = 8,
384 	.val_bits = 16,
385 	.max_register = VEML6030_REG_ALS_INT,
386 	.val_format_endian = REGMAP_ENDIAN_LITTLE,
387 	.rd_table = &veml6030_readable_table,
388 	.wr_table = &veml6030_writable_table,
389 	.volatile_table = &veml6030_volatile_table,
390 	.cache_type = REGCACHE_RBTREE,
391 };
392 
veml6030_get_it(struct veml6030_data * data,int * val,int * val2)393 static int veml6030_get_it(struct veml6030_data *data, int *val, int *val2)
394 {
395 	int ret, it_idx;
396 
397 	ret = regmap_field_read(data->rf.it, &it_idx);
398 	if (ret)
399 		return ret;
400 
401 	ret = iio_gts_find_int_time_by_sel(&data->gts, it_idx);
402 	if (ret < 0)
403 		return ret;
404 
405 	*val2 = ret;
406 	*val = 0;
407 
408 	return IIO_VAL_INT_PLUS_MICRO;
409 }
410 
veml6030_set_it(struct iio_dev * indio_dev,int val,int val2)411 static int veml6030_set_it(struct iio_dev *indio_dev, int val, int val2)
412 {
413 	struct veml6030_data *data = iio_priv(indio_dev);
414 	int ret, gain_idx, it_idx, new_gain, prev_gain, prev_it;
415 	bool in_range;
416 
417 	if (val || !iio_gts_valid_time(&data->gts, val2))
418 		return -EINVAL;
419 
420 	ret = regmap_field_read(data->rf.it, &it_idx);
421 	if (ret)
422 		return ret;
423 
424 	ret = regmap_field_read(data->rf.gain, &gain_idx);
425 	if (ret)
426 		return ret;
427 
428 	prev_it = iio_gts_find_int_time_by_sel(&data->gts, it_idx);
429 	if (prev_it < 0)
430 		return prev_it;
431 
432 	if (prev_it == val2)
433 		return 0;
434 
435 	prev_gain = iio_gts_find_gain_by_sel(&data->gts, gain_idx);
436 	if (prev_gain < 0)
437 		return prev_gain;
438 
439 	ret = iio_gts_find_new_gain_by_gain_time_min(&data->gts, prev_gain, prev_it,
440 						     val2, &new_gain, &in_range);
441 	if (ret)
442 		return ret;
443 
444 	if (!in_range)
445 		dev_dbg(&data->client->dev, "Optimal gain out of range\n");
446 
447 	ret = iio_gts_find_sel_by_int_time(&data->gts, val2);
448 	if (ret < 0)
449 		return ret;
450 
451 	ret = regmap_field_write(data->rf.it, ret);
452 	if (ret)
453 		return ret;
454 
455 	ret = iio_gts_find_sel_by_gain(&data->gts, new_gain);
456 	if (ret < 0)
457 		return ret;
458 
459 	return regmap_field_write(data->rf.gain, ret);
460 }
461 
veml6030_read_persistence(struct iio_dev * indio_dev,int * val,int * val2)462 static int veml6030_read_persistence(struct iio_dev *indio_dev,
463 						int *val, int *val2)
464 {
465 	int ret, reg, period, x, y;
466 	struct veml6030_data *data = iio_priv(indio_dev);
467 
468 	ret = veml6030_get_it(data, &x, &y);
469 	if (ret < 0)
470 		return ret;
471 
472 	ret = regmap_read(data->regmap, VEML6030_REG_ALS_CONF, &reg);
473 	if (ret) {
474 		dev_err(&data->client->dev,
475 				"can't read als conf register %d\n", ret);
476 	}
477 
478 	/* integration time multiplied by 1/2/4/8 */
479 	period = y * (1 << ((reg >> 4) & 0x03));
480 
481 	*val = period / 1000000;
482 	*val2 = period % 1000000;
483 
484 	return IIO_VAL_INT_PLUS_MICRO;
485 }
486 
veml6030_write_persistence(struct iio_dev * indio_dev,int val,int val2)487 static int veml6030_write_persistence(struct iio_dev *indio_dev,
488 						int val, int val2)
489 {
490 	int ret, period, x, y;
491 	struct veml6030_data *data = iio_priv(indio_dev);
492 
493 	ret = veml6030_get_it(data, &x, &y);
494 	if (ret < 0)
495 		return ret;
496 
497 	if (!val) {
498 		period = val2 / y;
499 	} else {
500 		if ((val == 1) && (val2 == 600000))
501 			period = 1600000 / y;
502 		else if ((val == 3) && (val2 == 200000))
503 			period = 3200000 / y;
504 		else if ((val == 6) && (val2 == 400000))
505 			period = 6400000 / y;
506 		else
507 			period = -1;
508 	}
509 
510 	if (period <= 0 || period > 8 || hweight8(period) != 1)
511 		return -EINVAL;
512 
513 	ret = regmap_update_bits(data->regmap, VEML6030_REG_ALS_CONF,
514 				VEML6030_ALS_PERS, (ffs(period) - 1) << 4);
515 	if (ret)
516 		dev_err(&data->client->dev,
517 				"can't set persistence value %d\n", ret);
518 
519 	return ret;
520 }
521 
veml6030_set_scale(struct iio_dev * indio_dev,int val,int val2)522 static int veml6030_set_scale(struct iio_dev *indio_dev, int val, int val2)
523 {
524 	int ret, gain_sel, it_idx, it_sel;
525 	struct veml6030_data *data = iio_priv(indio_dev);
526 
527 	ret = regmap_field_read(data->rf.it, &it_idx);
528 	if (ret)
529 		return ret;
530 
531 	ret = iio_gts_find_gain_time_sel_for_scale(&data->gts, val, val2,
532 						   &gain_sel, &it_sel);
533 	if (ret)
534 		return ret;
535 
536 	ret = regmap_field_write(data->rf.it, it_sel);
537 	if (ret)
538 		return ret;
539 
540 	ret = regmap_field_write(data->rf.gain, gain_sel);
541 	if (ret)
542 		return ret;
543 
544 	return 0;
545 }
546 
veml6030_read_thresh(struct iio_dev * indio_dev,int * val,int * val2,int dir)547 static int veml6030_read_thresh(struct iio_dev *indio_dev,
548 						int *val, int *val2, int dir)
549 {
550 	int ret, reg;
551 	struct veml6030_data *data = iio_priv(indio_dev);
552 
553 	if (dir == IIO_EV_DIR_RISING)
554 		ret = regmap_read(data->regmap, VEML6030_REG_ALS_WH, &reg);
555 	else
556 		ret = regmap_read(data->regmap, VEML6030_REG_ALS_WL, &reg);
557 	if (ret) {
558 		dev_err(&data->client->dev,
559 				"can't read als threshold value %d\n", ret);
560 		return ret;
561 	}
562 
563 	*val = reg & 0xffff;
564 	return IIO_VAL_INT;
565 }
566 
veml6030_write_thresh(struct iio_dev * indio_dev,int val,int val2,int dir)567 static int veml6030_write_thresh(struct iio_dev *indio_dev,
568 						int val, int val2, int dir)
569 {
570 	int ret;
571 	struct veml6030_data *data = iio_priv(indio_dev);
572 
573 	if (val > 0xFFFF || val < 0 || val2)
574 		return -EINVAL;
575 
576 	if (dir == IIO_EV_DIR_RISING) {
577 		ret = regmap_write(data->regmap, VEML6030_REG_ALS_WH, val);
578 		if (ret)
579 			dev_err(&data->client->dev,
580 					"can't set high threshold %d\n", ret);
581 	} else {
582 		ret = regmap_write(data->regmap, VEML6030_REG_ALS_WL, val);
583 		if (ret)
584 			dev_err(&data->client->dev,
585 					"can't set low threshold %d\n", ret);
586 	}
587 
588 	return ret;
589 }
590 
veml6030_get_total_gain(struct veml6030_data * data)591 static int veml6030_get_total_gain(struct veml6030_data *data)
592 {
593 	int gain, it, reg, ret;
594 
595 	ret = regmap_field_read(data->rf.gain, &reg);
596 	if (ret)
597 		return ret;
598 
599 	gain = iio_gts_find_gain_by_sel(&data->gts, reg);
600 	if (gain < 0)
601 		return gain;
602 
603 	ret = regmap_field_read(data->rf.it, &reg);
604 	if (ret)
605 		return ret;
606 
607 	it = iio_gts_find_int_time_by_sel(&data->gts, reg);
608 	if (it < 0)
609 		return it;
610 
611 	return iio_gts_get_total_gain(&data->gts, gain, it);
612 }
613 
veml6030_get_scale(struct veml6030_data * data,int * val,int * val2)614 static int veml6030_get_scale(struct veml6030_data *data, int *val, int *val2)
615 {
616 	int gain, it, reg, ret;
617 
618 	ret = regmap_field_read(data->rf.gain, &reg);
619 	if (ret)
620 		return ret;
621 
622 	gain = iio_gts_find_gain_by_sel(&data->gts, reg);
623 	if (gain < 0)
624 		return gain;
625 
626 	ret = regmap_field_read(data->rf.it, &reg);
627 	if (ret)
628 		return ret;
629 
630 	it = iio_gts_find_int_time_by_sel(&data->gts, reg);
631 	if (it < 0)
632 		return it;
633 
634 	ret = iio_gts_get_scale(&data->gts, gain, it, val, val2);
635 	if (ret)
636 		return ret;
637 
638 	return IIO_VAL_INT_PLUS_NANO;
639 }
640 
veml6030_process_als(struct veml6030_data * data,int raw,int * val,int * val2)641 static int veml6030_process_als(struct veml6030_data *data, int raw,
642 				int *val, int *val2)
643 {
644 	int total_gain;
645 
646 	total_gain = veml6030_get_total_gain(data);
647 	if (total_gain < 0)
648 		return total_gain;
649 
650 	*val = raw * data->chip->max_scale / total_gain / 10000;
651 	*val2 = raw * data->chip->max_scale / total_gain % 10000 * 100;
652 
653 	return IIO_VAL_INT_PLUS_MICRO;
654 }
655 
656 /*
657  * Provide both raw as well as light reading in lux.
658  * light (in lux) = resolution * raw reading
659  */
veml6030_read_raw(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,int * val,int * val2,long mask)660 static int veml6030_read_raw(struct iio_dev *indio_dev,
661 			    struct iio_chan_spec const *chan, int *val,
662 			    int *val2, long mask)
663 {
664 	int ret, reg;
665 	struct veml6030_data *data = iio_priv(indio_dev);
666 	struct regmap *regmap = data->regmap;
667 	struct device *dev = &data->client->dev;
668 
669 	switch (mask) {
670 	case IIO_CHAN_INFO_RAW:
671 	case IIO_CHAN_INFO_PROCESSED:
672 		switch (chan->type) {
673 		case IIO_LIGHT:
674 			ret = regmap_read(regmap, VEML6030_REG_ALS_DATA, &reg);
675 			if (ret < 0) {
676 				dev_err(dev, "can't read als data %d\n", ret);
677 				return ret;
678 			}
679 			if (mask == IIO_CHAN_INFO_PROCESSED)
680 				return veml6030_process_als(data, reg, val, val2);
681 
682 			*val = reg;
683 			return IIO_VAL_INT;
684 		case IIO_INTENSITY:
685 			ret = regmap_read(regmap, VEML6030_REG_WH_DATA, &reg);
686 			if (ret < 0) {
687 				dev_err(dev, "can't read white data %d\n", ret);
688 				return ret;
689 			}
690 			*val = reg;
691 			return IIO_VAL_INT;
692 		default:
693 			return -EINVAL;
694 		}
695 	case IIO_CHAN_INFO_INT_TIME:
696 		return veml6030_get_it(data, val, val2);
697 	case IIO_CHAN_INFO_SCALE:
698 		return veml6030_get_scale(data, val, val2);
699 	default:
700 		return -EINVAL;
701 	}
702 }
703 
veml6030_read_avail(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,const int ** vals,int * type,int * length,long mask)704 static int veml6030_read_avail(struct iio_dev *indio_dev,
705 			       struct iio_chan_spec const *chan,
706 			       const int **vals, int *type, int *length,
707 			       long mask)
708 {
709 	struct veml6030_data *data = iio_priv(indio_dev);
710 
711 	switch (mask) {
712 	case IIO_CHAN_INFO_INT_TIME:
713 		return iio_gts_avail_times(&data->gts, vals, type, length);
714 	case IIO_CHAN_INFO_SCALE:
715 		return iio_gts_all_avail_scales(&data->gts, vals, type, length);
716 	}
717 
718 	return -EINVAL;
719 }
720 
veml6030_write_raw(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,int val,int val2,long mask)721 static int veml6030_write_raw(struct iio_dev *indio_dev,
722 				struct iio_chan_spec const *chan,
723 				int val, int val2, long mask)
724 {
725 	switch (mask) {
726 	case IIO_CHAN_INFO_INT_TIME:
727 		return veml6030_set_it(indio_dev, val, val2);
728 	case IIO_CHAN_INFO_SCALE:
729 		return veml6030_set_scale(indio_dev, val, val2);
730 	default:
731 		return -EINVAL;
732 	}
733 }
734 
veml6030_write_raw_get_fmt(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,long mask)735 static int veml6030_write_raw_get_fmt(struct iio_dev *indio_dev,
736 				      struct iio_chan_spec const *chan,
737 				      long mask)
738 {
739 	switch (mask) {
740 	case IIO_CHAN_INFO_SCALE:
741 		return IIO_VAL_INT_PLUS_NANO;
742 	case IIO_CHAN_INFO_INT_TIME:
743 		return IIO_VAL_INT_PLUS_MICRO;
744 	default:
745 		return -EINVAL;
746 	}
747 }
748 
veml6030_read_event_val(struct iio_dev * indio_dev,const struct iio_chan_spec * chan,enum iio_event_type type,enum iio_event_direction dir,enum iio_event_info info,int * val,int * val2)749 static int veml6030_read_event_val(struct iio_dev *indio_dev,
750 		const struct iio_chan_spec *chan, enum iio_event_type type,
751 		enum iio_event_direction dir, enum iio_event_info info,
752 		int *val, int *val2)
753 {
754 	switch (info) {
755 	case IIO_EV_INFO_VALUE:
756 		switch (dir) {
757 		case IIO_EV_DIR_RISING:
758 		case IIO_EV_DIR_FALLING:
759 			return veml6030_read_thresh(indio_dev, val, val2, dir);
760 		default:
761 			return -EINVAL;
762 		}
763 		break;
764 	case IIO_EV_INFO_PERIOD:
765 		return veml6030_read_persistence(indio_dev, val, val2);
766 	default:
767 		return -EINVAL;
768 	}
769 }
770 
veml6030_write_event_val(struct iio_dev * indio_dev,const struct iio_chan_spec * chan,enum iio_event_type type,enum iio_event_direction dir,enum iio_event_info info,int val,int val2)771 static int veml6030_write_event_val(struct iio_dev *indio_dev,
772 		const struct iio_chan_spec *chan, enum iio_event_type type,
773 		enum iio_event_direction dir, enum iio_event_info info,
774 		int val, int val2)
775 {
776 	switch (info) {
777 	case IIO_EV_INFO_VALUE:
778 		return veml6030_write_thresh(indio_dev, val, val2, dir);
779 	case IIO_EV_INFO_PERIOD:
780 		return veml6030_write_persistence(indio_dev, val, val2);
781 	default:
782 		return -EINVAL;
783 	}
784 }
785 
veml6030_read_interrupt_config(struct iio_dev * indio_dev,const struct iio_chan_spec * chan,enum iio_event_type type,enum iio_event_direction dir)786 static int veml6030_read_interrupt_config(struct iio_dev *indio_dev,
787 		const struct iio_chan_spec *chan, enum iio_event_type type,
788 		enum iio_event_direction dir)
789 {
790 	int ret, reg;
791 	struct veml6030_data *data = iio_priv(indio_dev);
792 
793 	ret = regmap_read(data->regmap, VEML6030_REG_ALS_CONF, &reg);
794 	if (ret) {
795 		dev_err(&data->client->dev,
796 				"can't read als conf register %d\n", ret);
797 		return ret;
798 	}
799 
800 	if (reg & VEML6030_ALS_INT_EN)
801 		return 1;
802 	else
803 		return 0;
804 }
805 
806 /*
807  * Sensor should not be measuring light when interrupt is configured.
808  * Therefore correct sequence to configure interrupt functionality is:
809  * shut down -> enable/disable interrupt -> power on
810  *
811  * state = 1 enables interrupt, state = 0 disables interrupt
812  */
veml6030_write_interrupt_config(struct iio_dev * indio_dev,const struct iio_chan_spec * chan,enum iio_event_type type,enum iio_event_direction dir,bool state)813 static int veml6030_write_interrupt_config(struct iio_dev *indio_dev,
814 		const struct iio_chan_spec *chan, enum iio_event_type type,
815 		enum iio_event_direction dir, bool state)
816 {
817 	int ret;
818 	struct veml6030_data *data = iio_priv(indio_dev);
819 
820 	ret = veml6030_als_shut_down(data);
821 	if (ret < 0) {
822 		dev_err(&data->client->dev,
823 			"can't disable als to configure interrupt %d\n", ret);
824 		return ret;
825 	}
826 
827 	/* enable interrupt + power on */
828 	ret = regmap_update_bits(data->regmap, VEML6030_REG_ALS_CONF,
829 			VEML6030_ALS_INT_EN | VEML6030_ALS_SD, state << 1);
830 	if (ret)
831 		dev_err(&data->client->dev,
832 			"can't enable interrupt & poweron als %d\n", ret);
833 
834 	return ret;
835 }
836 
837 static const struct iio_info veml6030_info = {
838 	.read_raw  = veml6030_read_raw,
839 	.read_avail  = veml6030_read_avail,
840 	.write_raw = veml6030_write_raw,
841 	.write_raw_get_fmt = veml6030_write_raw_get_fmt,
842 	.read_event_value = veml6030_read_event_val,
843 	.write_event_value	= veml6030_write_event_val,
844 	.read_event_config = veml6030_read_interrupt_config,
845 	.write_event_config	= veml6030_write_interrupt_config,
846 	.event_attrs = &veml6030_event_attr_group,
847 };
848 
849 static const struct iio_info veml6030_info_no_irq = {
850 	.read_raw  = veml6030_read_raw,
851 	.read_avail  = veml6030_read_avail,
852 	.write_raw = veml6030_write_raw,
853 	.write_raw_get_fmt = veml6030_write_raw_get_fmt,
854 };
855 
veml6030_event_handler(int irq,void * private)856 static irqreturn_t veml6030_event_handler(int irq, void *private)
857 {
858 	int ret, reg, evtdir;
859 	struct iio_dev *indio_dev = private;
860 	struct veml6030_data *data = iio_priv(indio_dev);
861 
862 	ret = regmap_read(data->regmap, VEML6030_REG_ALS_INT, &reg);
863 	if (ret) {
864 		dev_err(&data->client->dev,
865 				"can't read als interrupt register %d\n", ret);
866 		return IRQ_HANDLED;
867 	}
868 
869 	/* Spurious interrupt handling */
870 	if (!(reg & (VEML6030_INT_TH_HIGH | VEML6030_INT_TH_LOW)))
871 		return IRQ_NONE;
872 
873 	if (reg & VEML6030_INT_TH_HIGH)
874 		evtdir = IIO_EV_DIR_RISING;
875 	else
876 		evtdir = IIO_EV_DIR_FALLING;
877 
878 	iio_push_event(indio_dev, IIO_UNMOD_EVENT_CODE(IIO_INTENSITY,
879 					0, IIO_EV_TYPE_THRESH, evtdir),
880 					iio_get_time_ns(indio_dev));
881 
882 	return IRQ_HANDLED;
883 }
884 
veml6030_trigger_handler(int irq,void * p)885 static irqreturn_t veml6030_trigger_handler(int irq, void *p)
886 {
887 	struct iio_poll_func *pf = p;
888 	struct iio_dev *iio = pf->indio_dev;
889 	struct veml6030_data *data = iio_priv(iio);
890 	unsigned int reg;
891 	int ch, ret, i = 0;
892 	struct {
893 		u16 chans[2];
894 		aligned_s64 timestamp;
895 	} scan = { };
896 
897 	iio_for_each_active_channel(iio, ch) {
898 		ret = regmap_read(data->regmap, VEML6030_REG_DATA(ch),
899 				  &reg);
900 		if (ret)
901 			goto done;
902 
903 		scan.chans[i++] = reg;
904 	}
905 
906 	iio_push_to_buffers_with_timestamp(iio, &scan, pf->timestamp);
907 
908 done:
909 	iio_trigger_notify_done(iio->trig);
910 
911 	return IRQ_HANDLED;
912 }
913 
veml6030_set_info(struct iio_dev * indio_dev)914 static int veml6030_set_info(struct iio_dev *indio_dev)
915 {
916 	struct veml6030_data *data = iio_priv(indio_dev);
917 	struct i2c_client *client = data->client;
918 	int ret;
919 
920 	if (client->irq) {
921 		ret = devm_request_threaded_irq(&client->dev, client->irq,
922 						NULL, veml6030_event_handler,
923 						IRQF_TRIGGER_LOW | IRQF_ONESHOT,
924 						indio_dev->name, indio_dev);
925 		if (ret < 0)
926 			return dev_err_probe(&client->dev, ret,
927 					     "irq %d request failed\n",
928 					     client->irq);
929 
930 		indio_dev->info = &veml6030_info;
931 	} else {
932 		indio_dev->info = &veml6030_info_no_irq;
933 	}
934 
935 	return 0;
936 }
937 
veml7700_set_info(struct iio_dev * indio_dev)938 static int veml7700_set_info(struct iio_dev *indio_dev)
939 {
940 	indio_dev->info = &veml6030_info_no_irq;
941 
942 	return 0;
943 }
944 
veml6030_regfield_init(struct iio_dev * indio_dev)945 static int veml6030_regfield_init(struct iio_dev *indio_dev)
946 {
947 	struct veml6030_data *data = iio_priv(indio_dev);
948 	struct regmap *regmap = data->regmap;
949 	struct device *dev = &data->client->dev;
950 	struct regmap_field *rm_field;
951 	struct veml6030_rf *rf = &data->rf;
952 
953 	rm_field = devm_regmap_field_alloc(dev, regmap, data->chip->it_rf);
954 	if (IS_ERR(rm_field))
955 		return PTR_ERR(rm_field);
956 	rf->it = rm_field;
957 
958 	rm_field = devm_regmap_field_alloc(dev, regmap, data->chip->gain_rf);
959 	if (IS_ERR(rm_field))
960 		return PTR_ERR(rm_field);
961 	rf->gain = rm_field;
962 
963 	return 0;
964 }
965 
966 /*
967  * Set ALS gain to 1/8, integration time to 100 ms, PSM to mode 2,
968  * persistence to 1 x integration time and the threshold
969  * interrupt disabled by default. First shutdown the sensor,
970  * update registers and then power on the sensor.
971  */
veml6030_hw_init(struct iio_dev * indio_dev,struct device * dev)972 static int veml6030_hw_init(struct iio_dev *indio_dev, struct device *dev)
973 {
974 	int ret, val;
975 	struct veml6030_data *data = iio_priv(indio_dev);
976 
977 	ret = devm_iio_init_iio_gts(dev, 2, 150400000,
978 				    veml6030_gain_sel, ARRAY_SIZE(veml6030_gain_sel),
979 				    veml6030_it_sel, ARRAY_SIZE(veml6030_it_sel),
980 				    &data->gts);
981 	if (ret)
982 		return dev_err_probe(dev, ret, "failed to init iio gts\n");
983 
984 	ret = veml6030_als_shut_down(data);
985 	if (ret)
986 		return dev_err_probe(dev, ret, "can't shutdown als\n");
987 
988 	ret = regmap_write(data->regmap, VEML6030_REG_ALS_CONF, 0x1001);
989 	if (ret)
990 		return dev_err_probe(dev, ret, "can't setup als configs\n");
991 
992 	ret = regmap_update_bits(data->regmap, VEML6030_REG_ALS_PSM,
993 				 VEML6030_PSM | VEML6030_PSM_EN, 0x03);
994 	if (ret)
995 		return dev_err_probe(dev, ret, "can't setup default PSM\n");
996 
997 	ret = regmap_write(data->regmap, VEML6030_REG_ALS_WH, 0xFFFF);
998 	if (ret)
999 		return dev_err_probe(dev, ret, "can't setup high threshold\n");
1000 
1001 	ret = regmap_write(data->regmap, VEML6030_REG_ALS_WL, 0x0000);
1002 	if (ret)
1003 		return dev_err_probe(dev, ret, "can't setup low threshold\n");
1004 
1005 	ret = veml6030_als_pwr_on(data);
1006 	if (ret)
1007 		return dev_err_probe(dev, ret, "can't poweron als\n");
1008 
1009 	ret = devm_add_action_or_reset(dev, veml6030_als_shut_down_action, data);
1010 	if (ret < 0)
1011 		return ret;
1012 
1013 	/* Clear stale interrupt status bits if any during start */
1014 	ret = regmap_read(data->regmap, VEML6030_REG_ALS_INT, &val);
1015 	if (ret < 0)
1016 		return dev_err_probe(dev, ret,
1017 				     "can't clear als interrupt status\n");
1018 
1019 	return ret;
1020 }
1021 
1022 /*
1023  * Set ALS gain to 1/8, integration time to 100 ms, ALS and WHITE
1024  * channel enabled, ALS channel interrupt, PSM enabled,
1025  * PSM_WAIT = 0.8 s, persistence to 1 x integration time and the
1026  * threshold interrupt disabled by default. First shutdown the sensor,
1027  * update registers and then power on the sensor.
1028  */
veml6035_hw_init(struct iio_dev * indio_dev,struct device * dev)1029 static int veml6035_hw_init(struct iio_dev *indio_dev, struct device *dev)
1030 {
1031 	int ret, val;
1032 	struct veml6030_data *data = iio_priv(indio_dev);
1033 
1034 	ret = devm_iio_init_iio_gts(dev, 0, 409600000,
1035 				    veml6035_gain_sel, ARRAY_SIZE(veml6035_gain_sel),
1036 				    veml6030_it_sel, ARRAY_SIZE(veml6030_it_sel),
1037 				    &data->gts);
1038 	if (ret)
1039 		return dev_err_probe(dev, ret, "failed to init iio gts\n");
1040 
1041 	ret = veml6030_als_shut_down(data);
1042 	if (ret)
1043 		return dev_err_probe(dev, ret, "can't shutdown als\n");
1044 
1045 	ret = regmap_write(data->regmap, VEML6030_REG_ALS_CONF,
1046 			   VEML6035_SENS | VEML6035_CHAN_EN | VEML6030_ALS_SD);
1047 	if (ret)
1048 		return dev_err_probe(dev, ret, "can't setup als configs\n");
1049 
1050 	ret = regmap_update_bits(data->regmap, VEML6030_REG_ALS_PSM,
1051 				 VEML6030_PSM | VEML6030_PSM_EN, 0x03);
1052 	if (ret)
1053 		return dev_err_probe(dev, ret, "can't setup default PSM\n");
1054 
1055 	ret = regmap_write(data->regmap, VEML6030_REG_ALS_WH, 0xFFFF);
1056 	if (ret)
1057 		return dev_err_probe(dev, ret, "can't setup high threshold\n");
1058 
1059 	ret = regmap_write(data->regmap, VEML6030_REG_ALS_WL, 0x0000);
1060 	if (ret)
1061 		return dev_err_probe(dev, ret, "can't setup low threshold\n");
1062 
1063 	ret = veml6030_als_pwr_on(data);
1064 	if (ret)
1065 		return dev_err_probe(dev, ret, "can't poweron als\n");
1066 
1067 	ret = devm_add_action_or_reset(dev, veml6030_als_shut_down_action, data);
1068 	if (ret < 0)
1069 		return ret;
1070 
1071 	/* Clear stale interrupt status bits if any during start */
1072 	ret = regmap_read(data->regmap, VEML6030_REG_ALS_INT, &val);
1073 	if (ret < 0)
1074 		return dev_err_probe(dev, ret,
1075 				     "can't clear als interrupt status\n");
1076 
1077 	return 0;
1078 }
1079 
veml6030_probe(struct i2c_client * client)1080 static int veml6030_probe(struct i2c_client *client)
1081 {
1082 	int ret;
1083 	struct veml6030_data *data;
1084 	struct iio_dev *indio_dev;
1085 	struct regmap *regmap;
1086 
1087 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
1088 		return dev_err_probe(&client->dev, -EOPNOTSUPP,
1089 				     "i2c adapter doesn't support plain i2c\n");
1090 
1091 	regmap = devm_regmap_init_i2c(client, &veml6030_regmap_config);
1092 	if (IS_ERR(regmap))
1093 		return dev_err_probe(&client->dev, PTR_ERR(regmap),
1094 				     "can't setup regmap\n");
1095 
1096 	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
1097 	if (!indio_dev)
1098 		return -ENOMEM;
1099 
1100 	data = iio_priv(indio_dev);
1101 	i2c_set_clientdata(client, indio_dev);
1102 	data->client = client;
1103 	data->regmap = regmap;
1104 
1105 	ret = devm_regulator_get_enable(&client->dev, "vdd");
1106 	if (ret)
1107 		return dev_err_probe(&client->dev, ret,
1108 				     "failed to enable regulator\n");
1109 
1110 	data->chip = i2c_get_match_data(client);
1111 	if (!data->chip)
1112 		return -EINVAL;
1113 
1114 	indio_dev->name = data->chip->name;
1115 	indio_dev->channels = data->chip->channels;
1116 	indio_dev->num_channels = data->chip->num_channels;
1117 	indio_dev->modes = INDIO_DIRECT_MODE;
1118 
1119 	ret = data->chip->set_info(indio_dev);
1120 	if (ret < 0)
1121 		return ret;
1122 
1123 	ret = veml6030_regfield_init(indio_dev);
1124 	if (ret)
1125 		return dev_err_probe(&client->dev, ret,
1126 				     "failed to init regfields\n");
1127 
1128 	ret = data->chip->hw_init(indio_dev, &client->dev);
1129 	if (ret < 0)
1130 		return ret;
1131 
1132 	ret = devm_iio_triggered_buffer_setup(&client->dev, indio_dev, NULL,
1133 					      veml6030_trigger_handler, NULL);
1134 	if (ret)
1135 		return dev_err_probe(&client->dev, ret,
1136 				     "Failed to register triggered buffer");
1137 
1138 	return devm_iio_device_register(&client->dev, indio_dev);
1139 }
1140 
veml6030_runtime_suspend(struct device * dev)1141 static int veml6030_runtime_suspend(struct device *dev)
1142 {
1143 	int ret;
1144 	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1145 	struct veml6030_data *data = iio_priv(indio_dev);
1146 
1147 	ret = veml6030_als_shut_down(data);
1148 	if (ret < 0)
1149 		dev_err(&data->client->dev, "can't suspend als %d\n", ret);
1150 
1151 	return ret;
1152 }
1153 
veml6030_runtime_resume(struct device * dev)1154 static int veml6030_runtime_resume(struct device *dev)
1155 {
1156 	int ret;
1157 	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1158 	struct veml6030_data *data = iio_priv(indio_dev);
1159 
1160 	ret = veml6030_als_pwr_on(data);
1161 	if (ret < 0)
1162 		dev_err(&data->client->dev, "can't resume als %d\n", ret);
1163 
1164 	return ret;
1165 }
1166 
1167 static DEFINE_RUNTIME_DEV_PM_OPS(veml6030_pm_ops, veml6030_runtime_suspend,
1168 				 veml6030_runtime_resume, NULL);
1169 
1170 static const struct veml603x_chip veml6030_chip = {
1171 	.name = "veml6030",
1172 	.channels = veml6030_channels,
1173 	.num_channels = ARRAY_SIZE(veml6030_channels),
1174 	.gain_rf = VEML6030_GAIN_RF,
1175 	.it_rf = VEML6030_IT_RF,
1176 	.max_scale = VEML6030_MAX_SCALE,
1177 	.hw_init = veml6030_hw_init,
1178 	.set_info = veml6030_set_info,
1179 };
1180 
1181 static const struct veml603x_chip veml6035_chip = {
1182 	.name = "veml6035",
1183 	.channels = veml6030_channels,
1184 	.num_channels = ARRAY_SIZE(veml6030_channels),
1185 	.gain_rf = VEML6035_GAIN_RF,
1186 	.it_rf = VEML6030_IT_RF,
1187 	.max_scale = VEML6035_MAX_SCALE,
1188 	.hw_init = veml6035_hw_init,
1189 	.set_info = veml6030_set_info,
1190 };
1191 
1192 static const struct veml603x_chip veml7700_chip = {
1193 	.name = "veml7700",
1194 	.channels = veml7700_channels,
1195 	.num_channels = ARRAY_SIZE(veml7700_channels),
1196 	.gain_rf = VEML6030_GAIN_RF,
1197 	.it_rf = VEML6030_IT_RF,
1198 	.max_scale = VEML6030_MAX_SCALE,
1199 	.hw_init = veml6030_hw_init,
1200 	.set_info = veml7700_set_info,
1201 };
1202 
1203 static const struct of_device_id veml6030_of_match[] = {
1204 	{
1205 		.compatible = "vishay,veml6030",
1206 		.data = &veml6030_chip,
1207 	},
1208 	{
1209 		.compatible = "vishay,veml6035",
1210 		.data = &veml6035_chip,
1211 	},
1212 	{
1213 		.compatible = "vishay,veml7700",
1214 		.data = &veml7700_chip,
1215 	},
1216 	{ }
1217 };
1218 MODULE_DEVICE_TABLE(of, veml6030_of_match);
1219 
1220 static const struct i2c_device_id veml6030_id[] = {
1221 	{ "veml6030", (kernel_ulong_t)&veml6030_chip},
1222 	{ "veml6035", (kernel_ulong_t)&veml6035_chip},
1223 	{ "veml7700", (kernel_ulong_t)&veml7700_chip},
1224 	{ }
1225 };
1226 MODULE_DEVICE_TABLE(i2c, veml6030_id);
1227 
1228 static struct i2c_driver veml6030_driver = {
1229 	.driver = {
1230 		.name = "veml6030",
1231 		.of_match_table = veml6030_of_match,
1232 		.pm = pm_ptr(&veml6030_pm_ops),
1233 	},
1234 	.probe = veml6030_probe,
1235 	.id_table = veml6030_id,
1236 };
1237 module_i2c_driver(veml6030_driver);
1238 
1239 MODULE_AUTHOR("Rishi Gupta <gupt21@gmail.com>");
1240 MODULE_DESCRIPTION("VEML6030 Ambient Light Sensor");
1241 MODULE_LICENSE("GPL v2");
1242 MODULE_IMPORT_NS("IIO_GTS_HELPER");
1243