xref: /linux/drivers/iio/light/veml6046x00.c (revision 6093a688a07da07808f0122f9aa2a3eed250d853)
1*4bfb29e8SAndreas Klinger // SPDX-License-Identifier: GPL-2.0+
2*4bfb29e8SAndreas Klinger /*
3*4bfb29e8SAndreas Klinger  * VEML6046X00 High Accuracy RGBIR Color Sensor
4*4bfb29e8SAndreas Klinger  *
5*4bfb29e8SAndreas Klinger  * Copyright (c) 2025 Andreas Klinger <ak@it-klinger.de>
6*4bfb29e8SAndreas Klinger  */
7*4bfb29e8SAndreas Klinger 
8*4bfb29e8SAndreas Klinger #include <linux/array_size.h>
9*4bfb29e8SAndreas Klinger #include <linux/bitfield.h>
10*4bfb29e8SAndreas Klinger #include <linux/bits.h>
11*4bfb29e8SAndreas Klinger #include <linux/dev_printk.h>
12*4bfb29e8SAndreas Klinger #include <linux/err.h>
13*4bfb29e8SAndreas Klinger #include <linux/i2c.h>
14*4bfb29e8SAndreas Klinger #include <linux/interrupt.h>
15*4bfb29e8SAndreas Klinger #include <linux/module.h>
16*4bfb29e8SAndreas Klinger #include <linux/mod_devicetable.h>
17*4bfb29e8SAndreas Klinger #include <linux/pm_runtime.h>
18*4bfb29e8SAndreas Klinger #include <linux/regmap.h>
19*4bfb29e8SAndreas Klinger #include <linux/time.h>
20*4bfb29e8SAndreas Klinger #include <linux/types.h>
21*4bfb29e8SAndreas Klinger #include <linux/units.h>
22*4bfb29e8SAndreas Klinger 
23*4bfb29e8SAndreas Klinger #include <asm/byteorder.h>
24*4bfb29e8SAndreas Klinger 
25*4bfb29e8SAndreas Klinger #include <linux/iio/iio.h>
26*4bfb29e8SAndreas Klinger #include <linux/iio/trigger_consumer.h>
27*4bfb29e8SAndreas Klinger #include <linux/iio/triggered_buffer.h>
28*4bfb29e8SAndreas Klinger 
29*4bfb29e8SAndreas Klinger /*
30*4bfb29e8SAndreas Klinger  * Device registers
31*4bfb29e8SAndreas Klinger  * Those which are accessed as bulk io are omitted
32*4bfb29e8SAndreas Klinger  */
33*4bfb29e8SAndreas Klinger #define VEML6046X00_REG_CONF0       0x00
34*4bfb29e8SAndreas Klinger #define VEML6046X00_REG_CONF1       0x01
35*4bfb29e8SAndreas Klinger #define VEML6046X00_REG_THDH        0x04
36*4bfb29e8SAndreas Klinger #define VEML6046X00_REG_THDL        0x06
37*4bfb29e8SAndreas Klinger #define VEML6046X00_REG_R           0x10
38*4bfb29e8SAndreas Klinger #define VEML6046X00_REG_G           0x12
39*4bfb29e8SAndreas Klinger #define VEML6046X00_REG_B           0x14
40*4bfb29e8SAndreas Klinger #define VEML6046X00_REG_IR          0x16
41*4bfb29e8SAndreas Klinger #define VEML6046X00_REG_ID          0x18
42*4bfb29e8SAndreas Klinger #define VEML6046X00_REG_INT         0x1A
43*4bfb29e8SAndreas Klinger #define VEML6046X00_REG_INT_H       0x1B
44*4bfb29e8SAndreas Klinger 
45*4bfb29e8SAndreas Klinger /* Bit masks for specific functionality */
46*4bfb29e8SAndreas Klinger #define VEML6046X00_CONF0_ON_0      BIT(0)
47*4bfb29e8SAndreas Klinger #define VEML6046X00_CONF0_INT       BIT(1)
48*4bfb29e8SAndreas Klinger #define VEML6046X00_CONF0_AF_TRIG   BIT(2)
49*4bfb29e8SAndreas Klinger #define VEML6046X00_CONF0_AF        BIT(3)
50*4bfb29e8SAndreas Klinger #define VEML6046X00_CONF0_IT        GENMASK(6, 4)
51*4bfb29e8SAndreas Klinger #define VEML6046X00_CONF1_CAL       BIT(0)
52*4bfb29e8SAndreas Klinger #define VEML6046X00_CONF1_PERS      GENMASK(2, 1)
53*4bfb29e8SAndreas Klinger #define VEML6046X00_CONF1_GAIN      GENMASK(4, 3)
54*4bfb29e8SAndreas Klinger #define VEML6046X00_CONF1_PD_D2     BIT(6)
55*4bfb29e8SAndreas Klinger #define VEML6046X00_CONF1_ON_1      BIT(7)
56*4bfb29e8SAndreas Klinger #define VEML6046X00_INT_TH_H        BIT(1)
57*4bfb29e8SAndreas Klinger #define VEML6046X00_INT_TH_L        BIT(2)
58*4bfb29e8SAndreas Klinger #define VEML6046X00_INT_DRDY        BIT(3)
59*4bfb29e8SAndreas Klinger #define VEML6046X00_INT_MASK						       \
60*4bfb29e8SAndreas Klinger 	(VEML6046X00_INT_TH_H | VEML6046X00_INT_TH_L | VEML6046X00_INT_DRDY)
61*4bfb29e8SAndreas Klinger 
62*4bfb29e8SAndreas Klinger #define	VEML6046X00_GAIN_1          0x0
63*4bfb29e8SAndreas Klinger #define	VEML6046X00_GAIN_2          0x1
64*4bfb29e8SAndreas Klinger #define	VEML6046X00_GAIN_0_66       0x2
65*4bfb29e8SAndreas Klinger #define	VEML6046X00_GAIN_0_5        0x3
66*4bfb29e8SAndreas Klinger 
67*4bfb29e8SAndreas Klinger #define VEML6046X00_PD_2_2          0x0
68*4bfb29e8SAndreas Klinger #define VEML6046X00_PD_1_2          BIT(6)
69*4bfb29e8SAndreas Klinger 
70*4bfb29e8SAndreas Klinger /* Autosuspend delay */
71*4bfb29e8SAndreas Klinger #define VEML6046X00_AUTOSUSPEND_MS  (3 * MSEC_PER_SEC)
72*4bfb29e8SAndreas Klinger 
73*4bfb29e8SAndreas Klinger enum veml6046x00_scan {
74*4bfb29e8SAndreas Klinger 	VEML6046X00_SCAN_R,
75*4bfb29e8SAndreas Klinger 	VEML6046X00_SCAN_G,
76*4bfb29e8SAndreas Klinger 	VEML6046X00_SCAN_B,
77*4bfb29e8SAndreas Klinger 	VEML6046X00_SCAN_IR,
78*4bfb29e8SAndreas Klinger 	VEML6046X00_SCAN_TIMESTAMP,
79*4bfb29e8SAndreas Klinger };
80*4bfb29e8SAndreas Klinger 
81*4bfb29e8SAndreas Klinger /**
82*4bfb29e8SAndreas Klinger  * struct veml6046x00_rf - Regmap field of configuration registers.
83*4bfb29e8SAndreas Klinger  * @int_en:	Interrupt enable of green channel.
84*4bfb29e8SAndreas Klinger  * @mode:	Mode of operation.
85*4bfb29e8SAndreas Klinger  *		Driver uses always Active force mode.
86*4bfb29e8SAndreas Klinger  * @trig:	Trigger to be set in active force mode for starting
87*4bfb29e8SAndreas Klinger  *		measurement.
88*4bfb29e8SAndreas Klinger  * @it:		Integration time.
89*4bfb29e8SAndreas Klinger  * @pers:	Persistense - Number of threshold crossing for triggering
90*4bfb29e8SAndreas Klinger  *		interrupt.
91*4bfb29e8SAndreas Klinger  */
92*4bfb29e8SAndreas Klinger struct veml6046x00_rf {
93*4bfb29e8SAndreas Klinger 	struct regmap_field *int_en;
94*4bfb29e8SAndreas Klinger 	struct regmap_field *mode;
95*4bfb29e8SAndreas Klinger 	struct regmap_field *trig;
96*4bfb29e8SAndreas Klinger 	struct regmap_field *it;
97*4bfb29e8SAndreas Klinger 	struct regmap_field *pers;
98*4bfb29e8SAndreas Klinger };
99*4bfb29e8SAndreas Klinger 
100*4bfb29e8SAndreas Klinger /**
101*4bfb29e8SAndreas Klinger  * struct veml6046x00_data - Private data of driver.
102*4bfb29e8SAndreas Klinger  * @regmap:	Regmap definition of sensor.
103*4bfb29e8SAndreas Klinger  * @trig:	Industrial-IO trigger.
104*4bfb29e8SAndreas Klinger  * @rf:		Regmap field of configuration.
105*4bfb29e8SAndreas Klinger  */
106*4bfb29e8SAndreas Klinger struct veml6046x00_data {
107*4bfb29e8SAndreas Klinger 	struct regmap *regmap;
108*4bfb29e8SAndreas Klinger 	struct iio_trigger *trig;
109*4bfb29e8SAndreas Klinger 	struct veml6046x00_rf rf;
110*4bfb29e8SAndreas Klinger };
111*4bfb29e8SAndreas Klinger 
112*4bfb29e8SAndreas Klinger /**
113*4bfb29e8SAndreas Klinger  * DOC: Valid integration times (IT)
114*4bfb29e8SAndreas Klinger  *
115*4bfb29e8SAndreas Klinger  * static const int veml6046x00_it contains the array with valid IT.
116*4bfb29e8SAndreas Klinger  *
117*4bfb29e8SAndreas Klinger  * Register value to be read or written in regmap_field it on veml6046x00 is
118*4bfb29e8SAndreas Klinger  * identical with array index.
119*4bfb29e8SAndreas Klinger  * This means there is no separate translation table between valid integration
120*4bfb29e8SAndreas Klinger  * times and register values needed. The index of the array is identical with
121*4bfb29e8SAndreas Klinger  * the register value.
122*4bfb29e8SAndreas Klinger  *
123*4bfb29e8SAndreas Klinger  * The array is in the form as expected by the callback of the sysfs attribute
124*4bfb29e8SAndreas Klinger  * integration_time_available (IIO_CHAN_INFO_INT_TIME). So there is no
125*4bfb29e8SAndreas Klinger  * additional conversion needed.
126*4bfb29e8SAndreas Klinger  */
127*4bfb29e8SAndreas Klinger static const int veml6046x00_it[][2] = {
128*4bfb29e8SAndreas Klinger 	{ 0, 3125 },
129*4bfb29e8SAndreas Klinger 	{ 0, 6250 },
130*4bfb29e8SAndreas Klinger 	{ 0, 12500 },
131*4bfb29e8SAndreas Klinger 	{ 0, 25000 },
132*4bfb29e8SAndreas Klinger 	{ 0, 50000 },
133*4bfb29e8SAndreas Klinger 	{ 0, 100000 },
134*4bfb29e8SAndreas Klinger 	{ 0, 200000 },
135*4bfb29e8SAndreas Klinger 	{ 0, 400000 },
136*4bfb29e8SAndreas Klinger };
137*4bfb29e8SAndreas Klinger 
138*4bfb29e8SAndreas Klinger /**
139*4bfb29e8SAndreas Klinger  * DOC: Handling of gain and photodiode size (PD)
140*4bfb29e8SAndreas Klinger  *
141*4bfb29e8SAndreas Klinger  * Gains here in the driver are not exactly the same as in the datasheet of the
142*4bfb29e8SAndreas Klinger  * sensor. The gain in the driver is a combination of the gain of the sensor
143*4bfb29e8SAndreas Klinger  * with the photodiode size (PD).
144*4bfb29e8SAndreas Klinger  * The following combinations are possible:
145*4bfb29e8SAndreas Klinger  *   gain(driver) = gain(sensor) * PD
146*4bfb29e8SAndreas Klinger  *           0.25 = x0.5  * 1/2
147*4bfb29e8SAndreas Klinger  *           0.33 = x0.66 * 1/2
148*4bfb29e8SAndreas Klinger  *           0.5  = x0.5  * 2/2
149*4bfb29e8SAndreas Klinger  *           0.66 = x0.66 * 2/2
150*4bfb29e8SAndreas Klinger  *           1    = x1    * 2/2
151*4bfb29e8SAndreas Klinger  *           2    = x2    * 2/2
152*4bfb29e8SAndreas Klinger  */
153*4bfb29e8SAndreas Klinger 
154*4bfb29e8SAndreas Klinger /**
155*4bfb29e8SAndreas Klinger  * struct veml6046x00_gain_pd - Translation of gain and photodiode size (PD).
156*4bfb29e8SAndreas Klinger  * @gain_sen:	Gain used in the sensor as described in the datasheet of the
157*4bfb29e8SAndreas Klinger  *		sensor
158*4bfb29e8SAndreas Klinger  * @pd:		Photodiode size in the sensor
159*4bfb29e8SAndreas Klinger  *
160*4bfb29e8SAndreas Klinger  * This is the translation table from the gain used in the driver (and also used
161*4bfb29e8SAndreas Klinger  * by the userspace interface in sysfs) to the gain and PD used in the sensor
162*4bfb29e8SAndreas Klinger  * hardware.
163*4bfb29e8SAndreas Klinger  *
164*4bfb29e8SAndreas Klinger  * There are six gain values visible to the user (0.25 .. 2) which translate to
165*4bfb29e8SAndreas Klinger  * two different gains in the sensor hardware (x0.5 .. x2) and two PD (1/2 and
166*4bfb29e8SAndreas Klinger  * 2/2). Theoretical are there eight combinations, but gain values 0.5 and 1 are
167*4bfb29e8SAndreas Klinger  * doubled and therefore the combination with the larger PD (2/2) is taken as
168*4bfb29e8SAndreas Klinger  * more photodiode cells are supposed to deliver a more precise result.
169*4bfb29e8SAndreas Klinger  */
170*4bfb29e8SAndreas Klinger struct veml6046x00_gain_pd {
171*4bfb29e8SAndreas Klinger 	unsigned int gain_sen;
172*4bfb29e8SAndreas Klinger 	unsigned int pd;
173*4bfb29e8SAndreas Klinger };
174*4bfb29e8SAndreas Klinger 
175*4bfb29e8SAndreas Klinger static const struct veml6046x00_gain_pd veml6046x00_gain_pd[] = {
176*4bfb29e8SAndreas Klinger 	{ .gain_sen = VEML6046X00_GAIN_0_5, .pd = VEML6046X00_PD_1_2 },
177*4bfb29e8SAndreas Klinger 	{ .gain_sen = VEML6046X00_GAIN_0_66, .pd = VEML6046X00_PD_1_2 },
178*4bfb29e8SAndreas Klinger 	{ .gain_sen = VEML6046X00_GAIN_0_5, .pd = VEML6046X00_PD_2_2 },
179*4bfb29e8SAndreas Klinger 	{ .gain_sen = VEML6046X00_GAIN_0_66, .pd = VEML6046X00_PD_2_2 },
180*4bfb29e8SAndreas Klinger 	{ .gain_sen = VEML6046X00_GAIN_1, .pd = VEML6046X00_PD_2_2 },
181*4bfb29e8SAndreas Klinger 	{ .gain_sen = VEML6046X00_GAIN_2, .pd = VEML6046X00_PD_2_2 },
182*4bfb29e8SAndreas Klinger };
183*4bfb29e8SAndreas Klinger 
184*4bfb29e8SAndreas Klinger /**
185*4bfb29e8SAndreas Klinger  * DOC: Factors for calculation of lux
186*4bfb29e8SAndreas Klinger  *
187*4bfb29e8SAndreas Klinger  * static const int veml6046x00_it_gains contains the factors for calculation of
188*4bfb29e8SAndreas Klinger  * lux.
189*4bfb29e8SAndreas Klinger  *
190*4bfb29e8SAndreas Klinger  * Depending on the set up integration time (IT), gain and photodiode size (PD)
191*4bfb29e8SAndreas Klinger  * the measured raw values are different if the light is constant. As the gain
192*4bfb29e8SAndreas Klinger  * and PD are already coupled in the driver (see &struct veml6046x00_gain_pd)
193*4bfb29e8SAndreas Klinger  * there are two dimensions remaining: IT and gain(driver).
194*4bfb29e8SAndreas Klinger  *
195*4bfb29e8SAndreas Klinger  * The array of available factors for a certain IT are grouped together in the
196*4bfb29e8SAndreas Klinger  * same form as expected by the callback of scale_available
197*4bfb29e8SAndreas Klinger  * (IIO_CHAN_INFO_SCALE).
198*4bfb29e8SAndreas Klinger  *
199*4bfb29e8SAndreas Klinger  * Factors for lux / raw count are taken directly from the datasheet.
200*4bfb29e8SAndreas Klinger  */
201*4bfb29e8SAndreas Klinger static const int veml6046x00_it_gains[][6][2] = {
202*4bfb29e8SAndreas Klinger 	/* integration time: 3.125 ms */
203*4bfb29e8SAndreas Klinger 	{
204*4bfb29e8SAndreas Klinger 		{ 5, 376000 },	/* gain: x0.25 */
205*4bfb29e8SAndreas Klinger 		{ 4,  72700 },	/* gain: x0.33 */
206*4bfb29e8SAndreas Klinger 		{ 2, 688000 },	/* gain: x0.5 */
207*4bfb29e8SAndreas Klinger 		{ 2,  36400 },	/* gain: x0.66 */
208*4bfb29e8SAndreas Klinger 		{ 1, 344000 },	/* gain: x1 */
209*4bfb29e8SAndreas Klinger 		{ 0, 672000 },	/* gain: x2 */
210*4bfb29e8SAndreas Klinger 	},
211*4bfb29e8SAndreas Klinger 	/* integration time: 6.25 ms */
212*4bfb29e8SAndreas Klinger 	{
213*4bfb29e8SAndreas Klinger 		{ 2, 688000 },	/* gain: x0.25 */
214*4bfb29e8SAndreas Klinger 		{ 2,  36350 },	/* gain: x0.33 */
215*4bfb29e8SAndreas Klinger 		{ 1, 344000 },	/* gain: x0.5 */
216*4bfb29e8SAndreas Klinger 		{ 1,  18200 },	/* gain: x0.66 */
217*4bfb29e8SAndreas Klinger 		{ 0, 672000 },	/* gain: x1 */
218*4bfb29e8SAndreas Klinger 		{ 0, 336000 },	/* gain: x2 */
219*4bfb29e8SAndreas Klinger 	},
220*4bfb29e8SAndreas Klinger 	/* integration time: 12.5 ms */
221*4bfb29e8SAndreas Klinger 	{
222*4bfb29e8SAndreas Klinger 		{ 1, 344000 },	/* gain: x0.25 */
223*4bfb29e8SAndreas Klinger 		{ 1,  18175 },	/* gain: x0.33 */
224*4bfb29e8SAndreas Klinger 		{ 0, 672000 },	/* gain: x0.5 */
225*4bfb29e8SAndreas Klinger 		{ 0, 509100 },	/* gain: x0.66 */
226*4bfb29e8SAndreas Klinger 		{ 0, 336000 },	/* gain: x1 */
227*4bfb29e8SAndreas Klinger 		{ 0, 168000 },	/* gain: x2 */
228*4bfb29e8SAndreas Klinger 	},
229*4bfb29e8SAndreas Klinger 	/* integration time: 25 ms */
230*4bfb29e8SAndreas Klinger 	{
231*4bfb29e8SAndreas Klinger 		{ 0, 672000 },	/* gain: x0.25 */
232*4bfb29e8SAndreas Klinger 		{ 0, 509087 },	/* gain: x0.33 */
233*4bfb29e8SAndreas Klinger 		{ 0, 336000 },	/* gain: x0.5 */
234*4bfb29e8SAndreas Klinger 		{ 0, 254550 },	/* gain: x0.66 */
235*4bfb29e8SAndreas Klinger 		{ 0, 168000 },	/* gain: x1 */
236*4bfb29e8SAndreas Klinger 		{ 0,  84000 },	/* gain: x2 */
237*4bfb29e8SAndreas Klinger 	},
238*4bfb29e8SAndreas Klinger 	/* integration time: 50 ms */
239*4bfb29e8SAndreas Klinger 	{
240*4bfb29e8SAndreas Klinger 		{ 0, 336000 },	/* gain: x0.25 */
241*4bfb29e8SAndreas Klinger 		{ 0, 254543 },	/* gain: x0.33 */
242*4bfb29e8SAndreas Klinger 		{ 0, 168000 },	/* gain: x0.5 */
243*4bfb29e8SAndreas Klinger 		{ 0, 127275 },	/* gain: x0.66 */
244*4bfb29e8SAndreas Klinger 		{ 0,  84000 },	/* gain: x1 */
245*4bfb29e8SAndreas Klinger 		{ 0,  42000 },	/* gain: x2 */
246*4bfb29e8SAndreas Klinger 	},
247*4bfb29e8SAndreas Klinger 	/* integration time: 100 ms */
248*4bfb29e8SAndreas Klinger 	{
249*4bfb29e8SAndreas Klinger 		{ 0, 168000 },	/* gain: x0.25 */
250*4bfb29e8SAndreas Klinger 		{ 0, 127271 },	/* gain: x0.33 */
251*4bfb29e8SAndreas Klinger 		{ 0,  84000 },	/* gain: x0.5 */
252*4bfb29e8SAndreas Klinger 		{ 0,  63637 },	/* gain: x0.66 */
253*4bfb29e8SAndreas Klinger 		{ 0,  42000 },	/* gain: x1 */
254*4bfb29e8SAndreas Klinger 		{ 0,  21000 },	/* gain: x2 */
255*4bfb29e8SAndreas Klinger 	},
256*4bfb29e8SAndreas Klinger 	/* integration time: 200 ms */
257*4bfb29e8SAndreas Klinger 	{
258*4bfb29e8SAndreas Klinger 		{ 0,  84000 },	/* gain: x0.25 */
259*4bfb29e8SAndreas Klinger 		{ 0,  63635 },	/* gain: x0.33 */
260*4bfb29e8SAndreas Klinger 		{ 0,  42000 },	/* gain: x0.5 */
261*4bfb29e8SAndreas Klinger 		{ 0,  31818 },	/* gain: x0.66 */
262*4bfb29e8SAndreas Klinger 		{ 0,  21000 },	/* gain: x1 */
263*4bfb29e8SAndreas Klinger 		{ 0,  10500 },	/* gain: x2 */
264*4bfb29e8SAndreas Klinger 	},
265*4bfb29e8SAndreas Klinger 	/* integration time: 400 ms */
266*4bfb29e8SAndreas Klinger 	{
267*4bfb29e8SAndreas Klinger 		{ 0,  42000 },	/* gain: x0.25 */
268*4bfb29e8SAndreas Klinger 		{ 0,  31817 },	/* gain: x0.33 */
269*4bfb29e8SAndreas Klinger 		{ 0,  21000 },	/* gain: x0.5 */
270*4bfb29e8SAndreas Klinger 		{ 0,  15909 },	/* gain: x0.66 */
271*4bfb29e8SAndreas Klinger 		{ 0,  10500 },	/* gain: x1 */
272*4bfb29e8SAndreas Klinger 		{ 0,   5250 },	/* gain: x2 */
273*4bfb29e8SAndreas Klinger 	},
274*4bfb29e8SAndreas Klinger };
275*4bfb29e8SAndreas Klinger 
276*4bfb29e8SAndreas Klinger /*
277*4bfb29e8SAndreas Klinger  * Two bits (RGB_ON_0 and RGB_ON_1) must be cleared to power on the device.
278*4bfb29e8SAndreas Klinger  */
279*4bfb29e8SAndreas Klinger static int veml6046x00_power_on(struct veml6046x00_data *data)
280*4bfb29e8SAndreas Klinger {
281*4bfb29e8SAndreas Klinger 	int ret;
282*4bfb29e8SAndreas Klinger 	struct device *dev = regmap_get_device(data->regmap);
283*4bfb29e8SAndreas Klinger 
284*4bfb29e8SAndreas Klinger 	ret = regmap_clear_bits(data->regmap, VEML6046X00_REG_CONF0,
285*4bfb29e8SAndreas Klinger 				VEML6046X00_CONF0_ON_0);
286*4bfb29e8SAndreas Klinger 	if (ret) {
287*4bfb29e8SAndreas Klinger 		dev_err(dev, "Failed to set bit for power on %d\n", ret);
288*4bfb29e8SAndreas Klinger 		return ret;
289*4bfb29e8SAndreas Klinger 	}
290*4bfb29e8SAndreas Klinger 
291*4bfb29e8SAndreas Klinger 	return regmap_clear_bits(data->regmap, VEML6046X00_REG_CONF1,
292*4bfb29e8SAndreas Klinger 				 VEML6046X00_CONF1_ON_1);
293*4bfb29e8SAndreas Klinger }
294*4bfb29e8SAndreas Klinger 
295*4bfb29e8SAndreas Klinger /*
296*4bfb29e8SAndreas Klinger  * Two bits (RGB_ON_0 and RGB_ON_1) must be set to power off the device.
297*4bfb29e8SAndreas Klinger  */
298*4bfb29e8SAndreas Klinger static int veml6046x00_shutdown(struct veml6046x00_data *data)
299*4bfb29e8SAndreas Klinger {
300*4bfb29e8SAndreas Klinger 	int ret;
301*4bfb29e8SAndreas Klinger 	struct device *dev = regmap_get_device(data->regmap);
302*4bfb29e8SAndreas Klinger 
303*4bfb29e8SAndreas Klinger 	ret = regmap_set_bits(data->regmap, VEML6046X00_REG_CONF0,
304*4bfb29e8SAndreas Klinger 			      VEML6046X00_CONF0_ON_0);
305*4bfb29e8SAndreas Klinger 	if (ret) {
306*4bfb29e8SAndreas Klinger 		dev_err(dev, "Failed to set bit for shutdown %d\n", ret);
307*4bfb29e8SAndreas Klinger 		return ret;
308*4bfb29e8SAndreas Klinger 	}
309*4bfb29e8SAndreas Klinger 
310*4bfb29e8SAndreas Klinger 	return regmap_set_bits(data->regmap, VEML6046X00_REG_CONF1,
311*4bfb29e8SAndreas Klinger 			       VEML6046X00_CONF1_ON_1);
312*4bfb29e8SAndreas Klinger }
313*4bfb29e8SAndreas Klinger 
314*4bfb29e8SAndreas Klinger static void veml6046x00_shutdown_action(void *data)
315*4bfb29e8SAndreas Klinger {
316*4bfb29e8SAndreas Klinger 	veml6046x00_shutdown(data);
317*4bfb29e8SAndreas Klinger }
318*4bfb29e8SAndreas Klinger 
319*4bfb29e8SAndreas Klinger static const struct iio_chan_spec veml6046x00_channels[] = {
320*4bfb29e8SAndreas Klinger 	{
321*4bfb29e8SAndreas Klinger 		.type = IIO_INTENSITY,
322*4bfb29e8SAndreas Klinger 		.address = VEML6046X00_REG_R,
323*4bfb29e8SAndreas Klinger 		.modified = 1,
324*4bfb29e8SAndreas Klinger 		.channel2 = IIO_MOD_LIGHT_RED,
325*4bfb29e8SAndreas Klinger 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
326*4bfb29e8SAndreas Klinger 		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
327*4bfb29e8SAndreas Klinger 					   BIT(IIO_CHAN_INFO_SCALE),
328*4bfb29e8SAndreas Klinger 		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
329*4bfb29e8SAndreas Klinger 						     BIT(IIO_CHAN_INFO_SCALE),
330*4bfb29e8SAndreas Klinger 		.scan_index = VEML6046X00_SCAN_R,
331*4bfb29e8SAndreas Klinger 		.scan_type = {
332*4bfb29e8SAndreas Klinger 			.sign = 'u',
333*4bfb29e8SAndreas Klinger 			.realbits = 16,
334*4bfb29e8SAndreas Klinger 			.storagebits = 16,
335*4bfb29e8SAndreas Klinger 			.endianness = IIO_LE,
336*4bfb29e8SAndreas Klinger 		},
337*4bfb29e8SAndreas Klinger 	},
338*4bfb29e8SAndreas Klinger 	{
339*4bfb29e8SAndreas Klinger 		.type = IIO_INTENSITY,
340*4bfb29e8SAndreas Klinger 		.address = VEML6046X00_REG_G,
341*4bfb29e8SAndreas Klinger 		.modified = 1,
342*4bfb29e8SAndreas Klinger 		.channel2 = IIO_MOD_LIGHT_GREEN,
343*4bfb29e8SAndreas Klinger 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
344*4bfb29e8SAndreas Klinger 		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
345*4bfb29e8SAndreas Klinger 					   BIT(IIO_CHAN_INFO_SCALE),
346*4bfb29e8SAndreas Klinger 		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
347*4bfb29e8SAndreas Klinger 						     BIT(IIO_CHAN_INFO_SCALE),
348*4bfb29e8SAndreas Klinger 		.scan_index = VEML6046X00_SCAN_G,
349*4bfb29e8SAndreas Klinger 		.scan_type = {
350*4bfb29e8SAndreas Klinger 			.sign = 'u',
351*4bfb29e8SAndreas Klinger 			.realbits = 16,
352*4bfb29e8SAndreas Klinger 			.storagebits = 16,
353*4bfb29e8SAndreas Klinger 			.endianness = IIO_LE,
354*4bfb29e8SAndreas Klinger 		},
355*4bfb29e8SAndreas Klinger 	},
356*4bfb29e8SAndreas Klinger 	{
357*4bfb29e8SAndreas Klinger 		.type = IIO_INTENSITY,
358*4bfb29e8SAndreas Klinger 		.address = VEML6046X00_REG_B,
359*4bfb29e8SAndreas Klinger 		.modified = 1,
360*4bfb29e8SAndreas Klinger 		.channel2 = IIO_MOD_LIGHT_BLUE,
361*4bfb29e8SAndreas Klinger 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
362*4bfb29e8SAndreas Klinger 		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
363*4bfb29e8SAndreas Klinger 					   BIT(IIO_CHAN_INFO_SCALE),
364*4bfb29e8SAndreas Klinger 		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
365*4bfb29e8SAndreas Klinger 						     BIT(IIO_CHAN_INFO_SCALE),
366*4bfb29e8SAndreas Klinger 		.scan_index = VEML6046X00_SCAN_B,
367*4bfb29e8SAndreas Klinger 		.scan_type = {
368*4bfb29e8SAndreas Klinger 			.sign = 'u',
369*4bfb29e8SAndreas Klinger 			.realbits = 16,
370*4bfb29e8SAndreas Klinger 			.storagebits = 16,
371*4bfb29e8SAndreas Klinger 			.endianness = IIO_LE,
372*4bfb29e8SAndreas Klinger 		},
373*4bfb29e8SAndreas Klinger 	},
374*4bfb29e8SAndreas Klinger 	{
375*4bfb29e8SAndreas Klinger 		.type = IIO_INTENSITY,
376*4bfb29e8SAndreas Klinger 		.address = VEML6046X00_REG_IR,
377*4bfb29e8SAndreas Klinger 		.modified = 1,
378*4bfb29e8SAndreas Klinger 		.channel2 = IIO_MOD_LIGHT_IR,
379*4bfb29e8SAndreas Klinger 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
380*4bfb29e8SAndreas Klinger 		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
381*4bfb29e8SAndreas Klinger 					   BIT(IIO_CHAN_INFO_SCALE),
382*4bfb29e8SAndreas Klinger 		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
383*4bfb29e8SAndreas Klinger 						     BIT(IIO_CHAN_INFO_SCALE),
384*4bfb29e8SAndreas Klinger 		.scan_index = VEML6046X00_SCAN_IR,
385*4bfb29e8SAndreas Klinger 		.scan_type = {
386*4bfb29e8SAndreas Klinger 			.sign = 'u',
387*4bfb29e8SAndreas Klinger 			.realbits = 16,
388*4bfb29e8SAndreas Klinger 			.storagebits = 16,
389*4bfb29e8SAndreas Klinger 			.endianness = IIO_LE,
390*4bfb29e8SAndreas Klinger 		},
391*4bfb29e8SAndreas Klinger 	},
392*4bfb29e8SAndreas Klinger 	IIO_CHAN_SOFT_TIMESTAMP(VEML6046X00_SCAN_TIMESTAMP),
393*4bfb29e8SAndreas Klinger };
394*4bfb29e8SAndreas Klinger 
395*4bfb29e8SAndreas Klinger static const struct regmap_config veml6046x00_regmap_config = {
396*4bfb29e8SAndreas Klinger 	.name = "veml6046x00_regm",
397*4bfb29e8SAndreas Klinger 	.reg_bits = 8,
398*4bfb29e8SAndreas Klinger 	.val_bits = 8,
399*4bfb29e8SAndreas Klinger 	.max_register = VEML6046X00_REG_INT_H,
400*4bfb29e8SAndreas Klinger };
401*4bfb29e8SAndreas Klinger 
402*4bfb29e8SAndreas Klinger static const struct reg_field veml6046x00_rf_int_en =
403*4bfb29e8SAndreas Klinger 	REG_FIELD(VEML6046X00_REG_CONF0, 1, 1);
404*4bfb29e8SAndreas Klinger 
405*4bfb29e8SAndreas Klinger static const struct reg_field veml6046x00_rf_trig =
406*4bfb29e8SAndreas Klinger 	REG_FIELD(VEML6046X00_REG_CONF0, 2, 2);
407*4bfb29e8SAndreas Klinger 
408*4bfb29e8SAndreas Klinger static const struct reg_field veml6046x00_rf_mode =
409*4bfb29e8SAndreas Klinger 	REG_FIELD(VEML6046X00_REG_CONF0, 3, 3);
410*4bfb29e8SAndreas Klinger 
411*4bfb29e8SAndreas Klinger static const struct reg_field veml6046x00_rf_it =
412*4bfb29e8SAndreas Klinger 	REG_FIELD(VEML6046X00_REG_CONF0, 4, 6);
413*4bfb29e8SAndreas Klinger 
414*4bfb29e8SAndreas Klinger static const struct reg_field veml6046x00_rf_pers =
415*4bfb29e8SAndreas Klinger 	REG_FIELD(VEML6046X00_REG_CONF1, 1, 2);
416*4bfb29e8SAndreas Klinger 
417*4bfb29e8SAndreas Klinger static int veml6046x00_regfield_init(struct veml6046x00_data *data)
418*4bfb29e8SAndreas Klinger {
419*4bfb29e8SAndreas Klinger 	struct regmap *regmap = data->regmap;
420*4bfb29e8SAndreas Klinger 	struct device *dev = regmap_get_device(data->regmap);
421*4bfb29e8SAndreas Klinger 	struct regmap_field *rm_field;
422*4bfb29e8SAndreas Klinger 	struct veml6046x00_rf *rf = &data->rf;
423*4bfb29e8SAndreas Klinger 
424*4bfb29e8SAndreas Klinger 	rm_field = devm_regmap_field_alloc(dev, regmap, veml6046x00_rf_int_en);
425*4bfb29e8SAndreas Klinger 	if (IS_ERR(rm_field))
426*4bfb29e8SAndreas Klinger 		return PTR_ERR(rm_field);
427*4bfb29e8SAndreas Klinger 	rf->int_en = rm_field;
428*4bfb29e8SAndreas Klinger 
429*4bfb29e8SAndreas Klinger 	rm_field = devm_regmap_field_alloc(dev, regmap, veml6046x00_rf_mode);
430*4bfb29e8SAndreas Klinger 	if (IS_ERR(rm_field))
431*4bfb29e8SAndreas Klinger 		return PTR_ERR(rm_field);
432*4bfb29e8SAndreas Klinger 	rf->mode = rm_field;
433*4bfb29e8SAndreas Klinger 
434*4bfb29e8SAndreas Klinger 	rm_field = devm_regmap_field_alloc(dev, regmap, veml6046x00_rf_trig);
435*4bfb29e8SAndreas Klinger 	if (IS_ERR(rm_field))
436*4bfb29e8SAndreas Klinger 		return PTR_ERR(rm_field);
437*4bfb29e8SAndreas Klinger 	rf->trig = rm_field;
438*4bfb29e8SAndreas Klinger 
439*4bfb29e8SAndreas Klinger 	rm_field = devm_regmap_field_alloc(dev, regmap, veml6046x00_rf_it);
440*4bfb29e8SAndreas Klinger 	if (IS_ERR(rm_field))
441*4bfb29e8SAndreas Klinger 		return PTR_ERR(rm_field);
442*4bfb29e8SAndreas Klinger 	rf->it = rm_field;
443*4bfb29e8SAndreas Klinger 
444*4bfb29e8SAndreas Klinger 	rm_field = devm_regmap_field_alloc(dev, regmap, veml6046x00_rf_pers);
445*4bfb29e8SAndreas Klinger 	if (IS_ERR(rm_field))
446*4bfb29e8SAndreas Klinger 		return PTR_ERR(rm_field);
447*4bfb29e8SAndreas Klinger 	rf->pers = rm_field;
448*4bfb29e8SAndreas Klinger 
449*4bfb29e8SAndreas Klinger 	return 0;
450*4bfb29e8SAndreas Klinger }
451*4bfb29e8SAndreas Klinger 
452*4bfb29e8SAndreas Klinger static int veml6046x00_get_it_index(struct veml6046x00_data *data)
453*4bfb29e8SAndreas Klinger {
454*4bfb29e8SAndreas Klinger 	int ret;
455*4bfb29e8SAndreas Klinger 	unsigned int reg;
456*4bfb29e8SAndreas Klinger 
457*4bfb29e8SAndreas Klinger 	ret = regmap_field_read(data->rf.it, &reg);
458*4bfb29e8SAndreas Klinger 	if (ret)
459*4bfb29e8SAndreas Klinger 		return ret;
460*4bfb29e8SAndreas Klinger 
461*4bfb29e8SAndreas Klinger 	/* register value is identical with index of array */
462*4bfb29e8SAndreas Klinger 	if (reg >= ARRAY_SIZE(veml6046x00_it))
463*4bfb29e8SAndreas Klinger 		return -EINVAL;
464*4bfb29e8SAndreas Klinger 
465*4bfb29e8SAndreas Klinger 	return reg;
466*4bfb29e8SAndreas Klinger }
467*4bfb29e8SAndreas Klinger 
468*4bfb29e8SAndreas Klinger static int veml6046x00_get_it_usec(struct veml6046x00_data *data, unsigned int *it_usec)
469*4bfb29e8SAndreas Klinger {
470*4bfb29e8SAndreas Klinger 	int ret;
471*4bfb29e8SAndreas Klinger 	unsigned int reg;
472*4bfb29e8SAndreas Klinger 
473*4bfb29e8SAndreas Klinger 	ret = regmap_field_read(data->rf.it, &reg);
474*4bfb29e8SAndreas Klinger 	if (ret)
475*4bfb29e8SAndreas Klinger 		return ret;
476*4bfb29e8SAndreas Klinger 
477*4bfb29e8SAndreas Klinger 	if (reg >= ARRAY_SIZE(veml6046x00_it))
478*4bfb29e8SAndreas Klinger 		return -EINVAL;
479*4bfb29e8SAndreas Klinger 
480*4bfb29e8SAndreas Klinger 	*it_usec = veml6046x00_it[reg][1];
481*4bfb29e8SAndreas Klinger 
482*4bfb29e8SAndreas Klinger 	return IIO_VAL_INT_PLUS_MICRO;
483*4bfb29e8SAndreas Klinger }
484*4bfb29e8SAndreas Klinger 
485*4bfb29e8SAndreas Klinger static int veml6046x00_set_it(struct iio_dev *iio, int val, int val2)
486*4bfb29e8SAndreas Klinger {
487*4bfb29e8SAndreas Klinger 	struct veml6046x00_data *data = iio_priv(iio);
488*4bfb29e8SAndreas Klinger 	unsigned int i;
489*4bfb29e8SAndreas Klinger 
490*4bfb29e8SAndreas Klinger 	for (i = 0; i < ARRAY_SIZE(veml6046x00_it); i++) {
491*4bfb29e8SAndreas Klinger 		if ((veml6046x00_it[i][0] == val) &&
492*4bfb29e8SAndreas Klinger 		    (veml6046x00_it[i][1] == val2))
493*4bfb29e8SAndreas Klinger 			return regmap_field_write(data->rf.it, i);
494*4bfb29e8SAndreas Klinger 	}
495*4bfb29e8SAndreas Klinger 
496*4bfb29e8SAndreas Klinger 	return -EINVAL;
497*4bfb29e8SAndreas Klinger }
498*4bfb29e8SAndreas Klinger 
499*4bfb29e8SAndreas Klinger static int veml6046x00_get_val_gain_idx(struct veml6046x00_data *data, int val,
500*4bfb29e8SAndreas Klinger 					int val2)
501*4bfb29e8SAndreas Klinger {
502*4bfb29e8SAndreas Klinger 	unsigned int i;
503*4bfb29e8SAndreas Klinger 	int it_idx;
504*4bfb29e8SAndreas Klinger 
505*4bfb29e8SAndreas Klinger 	it_idx = veml6046x00_get_it_index(data);
506*4bfb29e8SAndreas Klinger 	if (it_idx < 0)
507*4bfb29e8SAndreas Klinger 		return it_idx;
508*4bfb29e8SAndreas Klinger 
509*4bfb29e8SAndreas Klinger 	for (i = 0; i < ARRAY_SIZE(veml6046x00_it_gains[it_idx]); i++) {
510*4bfb29e8SAndreas Klinger 		if ((veml6046x00_it_gains[it_idx][i][0] == val) &&
511*4bfb29e8SAndreas Klinger 		    (veml6046x00_it_gains[it_idx][i][1] == val2))
512*4bfb29e8SAndreas Klinger 			return i;
513*4bfb29e8SAndreas Klinger 	}
514*4bfb29e8SAndreas Klinger 
515*4bfb29e8SAndreas Klinger 	return -EINVAL;
516*4bfb29e8SAndreas Klinger }
517*4bfb29e8SAndreas Klinger 
518*4bfb29e8SAndreas Klinger static int veml6046x00_get_gain_idx(struct veml6046x00_data *data)
519*4bfb29e8SAndreas Klinger {
520*4bfb29e8SAndreas Klinger 	int ret;
521*4bfb29e8SAndreas Klinger 	unsigned int i, reg, reg_gain, reg_pd;
522*4bfb29e8SAndreas Klinger 
523*4bfb29e8SAndreas Klinger 	ret = regmap_read(data->regmap, VEML6046X00_REG_CONF1, &reg);
524*4bfb29e8SAndreas Klinger 	if (ret)
525*4bfb29e8SAndreas Klinger 		return ret;
526*4bfb29e8SAndreas Klinger 
527*4bfb29e8SAndreas Klinger 	reg_gain = FIELD_GET(VEML6046X00_CONF1_GAIN, reg);
528*4bfb29e8SAndreas Klinger 	reg_pd = reg & VEML6046X00_CONF1_PD_D2;
529*4bfb29e8SAndreas Klinger 
530*4bfb29e8SAndreas Klinger 	for (i = 0; i < ARRAY_SIZE(veml6046x00_gain_pd); i++) {
531*4bfb29e8SAndreas Klinger 		if ((veml6046x00_gain_pd[i].gain_sen == reg_gain) &&
532*4bfb29e8SAndreas Klinger 		    (veml6046x00_gain_pd[i].pd == reg_pd))
533*4bfb29e8SAndreas Klinger 			return i;
534*4bfb29e8SAndreas Klinger 	}
535*4bfb29e8SAndreas Klinger 
536*4bfb29e8SAndreas Klinger 	return -EINVAL;
537*4bfb29e8SAndreas Klinger }
538*4bfb29e8SAndreas Klinger 
539*4bfb29e8SAndreas Klinger static int veml6046x00_set_scale(struct iio_dev *iio, int val, int val2)
540*4bfb29e8SAndreas Klinger {
541*4bfb29e8SAndreas Klinger 	struct veml6046x00_data *data = iio_priv(iio);
542*4bfb29e8SAndreas Klinger 	unsigned int new_scale;
543*4bfb29e8SAndreas Klinger 	int gain_idx;
544*4bfb29e8SAndreas Klinger 
545*4bfb29e8SAndreas Klinger 	gain_idx = veml6046x00_get_val_gain_idx(data, val, val2);
546*4bfb29e8SAndreas Klinger 	if (gain_idx < 0)
547*4bfb29e8SAndreas Klinger 		return gain_idx;
548*4bfb29e8SAndreas Klinger 
549*4bfb29e8SAndreas Klinger 	new_scale = FIELD_PREP(VEML6046X00_CONF1_GAIN,
550*4bfb29e8SAndreas Klinger 			       veml6046x00_gain_pd[gain_idx].gain_sen) |
551*4bfb29e8SAndreas Klinger 			       veml6046x00_gain_pd[gain_idx].pd;
552*4bfb29e8SAndreas Klinger 
553*4bfb29e8SAndreas Klinger 	return regmap_update_bits(data->regmap, VEML6046X00_REG_CONF1,
554*4bfb29e8SAndreas Klinger 				  VEML6046X00_CONF1_GAIN |
555*4bfb29e8SAndreas Klinger 				  VEML6046X00_CONF1_PD_D2,
556*4bfb29e8SAndreas Klinger 				  new_scale);
557*4bfb29e8SAndreas Klinger }
558*4bfb29e8SAndreas Klinger 
559*4bfb29e8SAndreas Klinger static int veml6046x00_get_scale(struct veml6046x00_data *data,
560*4bfb29e8SAndreas Klinger 				 int *val, int *val2)
561*4bfb29e8SAndreas Klinger {
562*4bfb29e8SAndreas Klinger 	int gain_idx, it_idx;
563*4bfb29e8SAndreas Klinger 
564*4bfb29e8SAndreas Klinger 	gain_idx = veml6046x00_get_gain_idx(data);
565*4bfb29e8SAndreas Klinger 	if (gain_idx < 0)
566*4bfb29e8SAndreas Klinger 		return gain_idx;
567*4bfb29e8SAndreas Klinger 
568*4bfb29e8SAndreas Klinger 	it_idx = veml6046x00_get_it_index(data);
569*4bfb29e8SAndreas Klinger 	if (it_idx < 0)
570*4bfb29e8SAndreas Klinger 		return it_idx;
571*4bfb29e8SAndreas Klinger 
572*4bfb29e8SAndreas Klinger 	*val = veml6046x00_it_gains[it_idx][gain_idx][0];
573*4bfb29e8SAndreas Klinger 	*val2 = veml6046x00_it_gains[it_idx][gain_idx][1];
574*4bfb29e8SAndreas Klinger 
575*4bfb29e8SAndreas Klinger 	return IIO_VAL_INT_PLUS_MICRO;
576*4bfb29e8SAndreas Klinger }
577*4bfb29e8SAndreas Klinger 
578*4bfb29e8SAndreas Klinger /**
579*4bfb29e8SAndreas Klinger  * veml6046x00_read_data_ready() - Read data ready bit
580*4bfb29e8SAndreas Klinger  * @data:	Private data.
581*4bfb29e8SAndreas Klinger  *
582*4bfb29e8SAndreas Klinger  * Helper function for reading data ready bit from interrupt register.
583*4bfb29e8SAndreas Klinger  *
584*4bfb29e8SAndreas Klinger  * Return:
585*4bfb29e8SAndreas Klinger  * * %1		- Data is available (AF_DATA_READY is set)
586*4bfb29e8SAndreas Klinger  * * %0		- No data available
587*4bfb29e8SAndreas Klinger  * * %-EIO	- Error during bulk read
588*4bfb29e8SAndreas Klinger  */
589*4bfb29e8SAndreas Klinger static int veml6046x00_read_data_ready(struct veml6046x00_data *data)
590*4bfb29e8SAndreas Klinger {
591*4bfb29e8SAndreas Klinger 	struct device *dev = regmap_get_device(data->regmap);
592*4bfb29e8SAndreas Klinger 	int ret;
593*4bfb29e8SAndreas Klinger 	u8 reg[2];
594*4bfb29e8SAndreas Klinger 
595*4bfb29e8SAndreas Klinger 	/*
596*4bfb29e8SAndreas Klinger 	 * Note from the vendor, but not explicitly in the datasheet: we
597*4bfb29e8SAndreas Klinger 	 * should always read both registers together.
598*4bfb29e8SAndreas Klinger 	 */
599*4bfb29e8SAndreas Klinger 	ret = regmap_bulk_read(data->regmap, VEML6046X00_REG_INT,
600*4bfb29e8SAndreas Klinger 			       &reg, sizeof(reg));
601*4bfb29e8SAndreas Klinger 	if (ret) {
602*4bfb29e8SAndreas Klinger 		dev_err(dev, "Failed to read interrupt register %d\n", ret);
603*4bfb29e8SAndreas Klinger 		return -EIO;
604*4bfb29e8SAndreas Klinger 	}
605*4bfb29e8SAndreas Klinger 
606*4bfb29e8SAndreas Klinger 	if (reg[1] & VEML6046X00_INT_DRDY)
607*4bfb29e8SAndreas Klinger 		return 1;
608*4bfb29e8SAndreas Klinger 
609*4bfb29e8SAndreas Klinger 	return 0;
610*4bfb29e8SAndreas Klinger }
611*4bfb29e8SAndreas Klinger 
612*4bfb29e8SAndreas Klinger /**
613*4bfb29e8SAndreas Klinger  * veml6046x00_wait_data_available() - Wait until data is available
614*4bfb29e8SAndreas Klinger  * @iio:	Industrial IO.
615*4bfb29e8SAndreas Klinger  * @usecs:	Microseconds to wait for data.
616*4bfb29e8SAndreas Klinger  *
617*4bfb29e8SAndreas Klinger  * This function waits for a certain bit in the interrupt register which signals
618*4bfb29e8SAndreas Klinger  * that there is data to be read available.
619*4bfb29e8SAndreas Klinger  *
620*4bfb29e8SAndreas Klinger  * It tries it two times with a waiting time of usecs in between.
621*4bfb29e8SAndreas Klinger  *
622*4bfb29e8SAndreas Klinger  * Return:
623*4bfb29e8SAndreas Klinger  * * %1		- Data is available (AF_DATA_READY is set)
624*4bfb29e8SAndreas Klinger  * * %0		- Timeout, no data available after usecs timeout
625*4bfb29e8SAndreas Klinger  * * %-EIO	- Error during bulk read
626*4bfb29e8SAndreas Klinger  */
627*4bfb29e8SAndreas Klinger static int veml6046x00_wait_data_available(struct iio_dev *iio, unsigned int usecs)
628*4bfb29e8SAndreas Klinger {
629*4bfb29e8SAndreas Klinger 	struct veml6046x00_data *data = iio_priv(iio);
630*4bfb29e8SAndreas Klinger 	int ret;
631*4bfb29e8SAndreas Klinger 
632*4bfb29e8SAndreas Klinger 	ret = veml6046x00_read_data_ready(data);
633*4bfb29e8SAndreas Klinger 	if (ret)
634*4bfb29e8SAndreas Klinger 		return ret;
635*4bfb29e8SAndreas Klinger 
636*4bfb29e8SAndreas Klinger 	fsleep(usecs);
637*4bfb29e8SAndreas Klinger 	return veml6046x00_read_data_ready(data);
638*4bfb29e8SAndreas Klinger }
639*4bfb29e8SAndreas Klinger 
640*4bfb29e8SAndreas Klinger static int veml6046x00_single_read(struct iio_dev *iio,
641*4bfb29e8SAndreas Klinger 				   enum iio_modifier modifier, int *val)
642*4bfb29e8SAndreas Klinger {
643*4bfb29e8SAndreas Klinger 	struct veml6046x00_data *data = iio_priv(iio);
644*4bfb29e8SAndreas Klinger 	struct device *dev = regmap_get_device(data->regmap);
645*4bfb29e8SAndreas Klinger 	unsigned int addr, it_usec;
646*4bfb29e8SAndreas Klinger 	int ret;
647*4bfb29e8SAndreas Klinger 	__le16 reg;
648*4bfb29e8SAndreas Klinger 
649*4bfb29e8SAndreas Klinger 	switch (modifier) {
650*4bfb29e8SAndreas Klinger 	case IIO_MOD_LIGHT_RED:
651*4bfb29e8SAndreas Klinger 		addr = VEML6046X00_REG_R;
652*4bfb29e8SAndreas Klinger 		break;
653*4bfb29e8SAndreas Klinger 	case IIO_MOD_LIGHT_GREEN:
654*4bfb29e8SAndreas Klinger 		addr = VEML6046X00_REG_G;
655*4bfb29e8SAndreas Klinger 		break;
656*4bfb29e8SAndreas Klinger 	case IIO_MOD_LIGHT_BLUE:
657*4bfb29e8SAndreas Klinger 		addr = VEML6046X00_REG_B;
658*4bfb29e8SAndreas Klinger 		break;
659*4bfb29e8SAndreas Klinger 	case IIO_MOD_LIGHT_IR:
660*4bfb29e8SAndreas Klinger 		addr = VEML6046X00_REG_IR;
661*4bfb29e8SAndreas Klinger 		break;
662*4bfb29e8SAndreas Klinger 	default:
663*4bfb29e8SAndreas Klinger 		return -EINVAL;
664*4bfb29e8SAndreas Klinger 	}
665*4bfb29e8SAndreas Klinger 	ret = pm_runtime_resume_and_get(dev);
666*4bfb29e8SAndreas Klinger 	if (ret)
667*4bfb29e8SAndreas Klinger 		return ret;
668*4bfb29e8SAndreas Klinger 
669*4bfb29e8SAndreas Klinger 	ret = veml6046x00_get_it_usec(data, &it_usec);
670*4bfb29e8SAndreas Klinger 	if (ret < 0) {
671*4bfb29e8SAndreas Klinger 		dev_err(dev, "Failed to get integration time ret: %d", ret);
672*4bfb29e8SAndreas Klinger 		goto out;
673*4bfb29e8SAndreas Klinger 	}
674*4bfb29e8SAndreas Klinger 
675*4bfb29e8SAndreas Klinger 	ret = regmap_field_write(data->rf.mode, 1);
676*4bfb29e8SAndreas Klinger 	if (ret) {
677*4bfb29e8SAndreas Klinger 		dev_err(dev, "Failed to write mode ret: %d", ret);
678*4bfb29e8SAndreas Klinger 		goto out;
679*4bfb29e8SAndreas Klinger 	}
680*4bfb29e8SAndreas Klinger 
681*4bfb29e8SAndreas Klinger 	ret = regmap_field_write(data->rf.trig, 1);
682*4bfb29e8SAndreas Klinger 	if (ret) {
683*4bfb29e8SAndreas Klinger 		dev_err(dev, "Failed to write trigger ret: %d", ret);
684*4bfb29e8SAndreas Klinger 		goto out;
685*4bfb29e8SAndreas Klinger 	}
686*4bfb29e8SAndreas Klinger 
687*4bfb29e8SAndreas Klinger 	/* integration time + 12.5 % to ensure completion */
688*4bfb29e8SAndreas Klinger 	fsleep(it_usec + it_usec / 8);
689*4bfb29e8SAndreas Klinger 
690*4bfb29e8SAndreas Klinger 	ret = veml6046x00_wait_data_available(iio, it_usec * 4);
691*4bfb29e8SAndreas Klinger 	if (ret < 0)
692*4bfb29e8SAndreas Klinger 		goto out;
693*4bfb29e8SAndreas Klinger 	if (ret == 0) {
694*4bfb29e8SAndreas Klinger 		ret = -EAGAIN;
695*4bfb29e8SAndreas Klinger 		goto out;
696*4bfb29e8SAndreas Klinger 	}
697*4bfb29e8SAndreas Klinger 
698*4bfb29e8SAndreas Klinger 	if (!iio_device_claim_direct(iio)) {
699*4bfb29e8SAndreas Klinger 		ret = -EBUSY;
700*4bfb29e8SAndreas Klinger 		goto out;
701*4bfb29e8SAndreas Klinger 	}
702*4bfb29e8SAndreas Klinger 
703*4bfb29e8SAndreas Klinger 	ret = regmap_bulk_read(data->regmap, addr, &reg, sizeof(reg));
704*4bfb29e8SAndreas Klinger 	iio_device_release_direct(iio);
705*4bfb29e8SAndreas Klinger 	if (ret)
706*4bfb29e8SAndreas Klinger 		goto out;
707*4bfb29e8SAndreas Klinger 
708*4bfb29e8SAndreas Klinger 	*val = le16_to_cpu(reg);
709*4bfb29e8SAndreas Klinger 
710*4bfb29e8SAndreas Klinger 	ret = IIO_VAL_INT;
711*4bfb29e8SAndreas Klinger 
712*4bfb29e8SAndreas Klinger out:
713*4bfb29e8SAndreas Klinger 	pm_runtime_put_autosuspend(dev);
714*4bfb29e8SAndreas Klinger 
715*4bfb29e8SAndreas Klinger 	return ret;
716*4bfb29e8SAndreas Klinger }
717*4bfb29e8SAndreas Klinger 
718*4bfb29e8SAndreas Klinger static int veml6046x00_read_raw(struct iio_dev *iio,
719*4bfb29e8SAndreas Klinger 				struct iio_chan_spec const *chan, int *val,
720*4bfb29e8SAndreas Klinger 				int *val2, long mask)
721*4bfb29e8SAndreas Klinger {
722*4bfb29e8SAndreas Klinger 	struct veml6046x00_data *data = iio_priv(iio);
723*4bfb29e8SAndreas Klinger 
724*4bfb29e8SAndreas Klinger 	switch (mask) {
725*4bfb29e8SAndreas Klinger 	case IIO_CHAN_INFO_RAW:
726*4bfb29e8SAndreas Klinger 		if (chan->type != IIO_INTENSITY)
727*4bfb29e8SAndreas Klinger 			return -EINVAL;
728*4bfb29e8SAndreas Klinger 		return veml6046x00_single_read(iio, chan->channel2, val);
729*4bfb29e8SAndreas Klinger 	case IIO_CHAN_INFO_INT_TIME:
730*4bfb29e8SAndreas Klinger 		*val = 0;
731*4bfb29e8SAndreas Klinger 		return veml6046x00_get_it_usec(data, val2);
732*4bfb29e8SAndreas Klinger 	case IIO_CHAN_INFO_SCALE:
733*4bfb29e8SAndreas Klinger 		return veml6046x00_get_scale(data, val, val2);
734*4bfb29e8SAndreas Klinger 	default:
735*4bfb29e8SAndreas Klinger 		return -EINVAL;
736*4bfb29e8SAndreas Klinger 	}
737*4bfb29e8SAndreas Klinger }
738*4bfb29e8SAndreas Klinger 
739*4bfb29e8SAndreas Klinger static int veml6046x00_read_avail(struct iio_dev *iio,
740*4bfb29e8SAndreas Klinger 				  struct iio_chan_spec const *chan,
741*4bfb29e8SAndreas Klinger 				  const int **vals, int *type, int *length,
742*4bfb29e8SAndreas Klinger 				  long mask)
743*4bfb29e8SAndreas Klinger {
744*4bfb29e8SAndreas Klinger 	struct veml6046x00_data *data = iio_priv(iio);
745*4bfb29e8SAndreas Klinger 	int it_idx;
746*4bfb29e8SAndreas Klinger 
747*4bfb29e8SAndreas Klinger 	switch (mask) {
748*4bfb29e8SAndreas Klinger 	case IIO_CHAN_INFO_INT_TIME:
749*4bfb29e8SAndreas Klinger 		*vals = (int *)&veml6046x00_it;
750*4bfb29e8SAndreas Klinger 		*length = 2 * ARRAY_SIZE(veml6046x00_it);
751*4bfb29e8SAndreas Klinger 		*type = IIO_VAL_INT_PLUS_MICRO;
752*4bfb29e8SAndreas Klinger 		return IIO_AVAIL_LIST;
753*4bfb29e8SAndreas Klinger 	case IIO_CHAN_INFO_SCALE:
754*4bfb29e8SAndreas Klinger 		it_idx = veml6046x00_get_it_index(data);
755*4bfb29e8SAndreas Klinger 		if (it_idx < 0)
756*4bfb29e8SAndreas Klinger 			return it_idx;
757*4bfb29e8SAndreas Klinger 		*vals = (int *)&veml6046x00_it_gains[it_idx];
758*4bfb29e8SAndreas Klinger 		*length = 2 * ARRAY_SIZE(veml6046x00_it_gains[it_idx]);
759*4bfb29e8SAndreas Klinger 		*type = IIO_VAL_INT_PLUS_MICRO;
760*4bfb29e8SAndreas Klinger 		return IIO_AVAIL_LIST;
761*4bfb29e8SAndreas Klinger 	default:
762*4bfb29e8SAndreas Klinger 		return -EINVAL;
763*4bfb29e8SAndreas Klinger 	}
764*4bfb29e8SAndreas Klinger }
765*4bfb29e8SAndreas Klinger 
766*4bfb29e8SAndreas Klinger static int veml6046x00_write_raw(struct iio_dev *iio,
767*4bfb29e8SAndreas Klinger 				 struct iio_chan_spec const *chan,
768*4bfb29e8SAndreas Klinger 				 int val, int val2, long mask)
769*4bfb29e8SAndreas Klinger {
770*4bfb29e8SAndreas Klinger 	switch (mask) {
771*4bfb29e8SAndreas Klinger 	case IIO_CHAN_INFO_INT_TIME:
772*4bfb29e8SAndreas Klinger 		return veml6046x00_set_it(iio, val, val2);
773*4bfb29e8SAndreas Klinger 	case IIO_CHAN_INFO_SCALE:
774*4bfb29e8SAndreas Klinger 		return veml6046x00_set_scale(iio, val, val2);
775*4bfb29e8SAndreas Klinger 	default:
776*4bfb29e8SAndreas Klinger 		return -EINVAL;
777*4bfb29e8SAndreas Klinger 	}
778*4bfb29e8SAndreas Klinger }
779*4bfb29e8SAndreas Klinger 
780*4bfb29e8SAndreas Klinger static const struct iio_info veml6046x00_info_no_irq = {
781*4bfb29e8SAndreas Klinger 	.read_raw = veml6046x00_read_raw,
782*4bfb29e8SAndreas Klinger 	.read_avail = veml6046x00_read_avail,
783*4bfb29e8SAndreas Klinger 	.write_raw = veml6046x00_write_raw,
784*4bfb29e8SAndreas Klinger };
785*4bfb29e8SAndreas Klinger 
786*4bfb29e8SAndreas Klinger static int veml6046x00_buffer_preenable(struct iio_dev *iio)
787*4bfb29e8SAndreas Klinger {
788*4bfb29e8SAndreas Klinger 	struct veml6046x00_data *data = iio_priv(iio);
789*4bfb29e8SAndreas Klinger 	struct device *dev = regmap_get_device(data->regmap);
790*4bfb29e8SAndreas Klinger 	int ret;
791*4bfb29e8SAndreas Klinger 
792*4bfb29e8SAndreas Klinger 	ret = regmap_field_write(data->rf.mode, 0);
793*4bfb29e8SAndreas Klinger 	if (ret) {
794*4bfb29e8SAndreas Klinger 		dev_err(dev, "Failed to set mode %d\n", ret);
795*4bfb29e8SAndreas Klinger 		return ret;
796*4bfb29e8SAndreas Klinger 	}
797*4bfb29e8SAndreas Klinger 
798*4bfb29e8SAndreas Klinger 	ret = regmap_field_write(data->rf.trig, 0);
799*4bfb29e8SAndreas Klinger 	if (ret) {
800*4bfb29e8SAndreas Klinger 		/*
801*4bfb29e8SAndreas Klinger 		 * no unrolling of mode as it is set appropriately with next
802*4bfb29e8SAndreas Klinger 		 * single read.
803*4bfb29e8SAndreas Klinger 		 */
804*4bfb29e8SAndreas Klinger 		dev_err(dev, "Failed to set trigger %d\n", ret);
805*4bfb29e8SAndreas Klinger 		return ret;
806*4bfb29e8SAndreas Klinger 	}
807*4bfb29e8SAndreas Klinger 
808*4bfb29e8SAndreas Klinger 	return pm_runtime_resume_and_get(dev);
809*4bfb29e8SAndreas Klinger }
810*4bfb29e8SAndreas Klinger 
811*4bfb29e8SAndreas Klinger static int veml6046x00_buffer_postdisable(struct iio_dev *iio)
812*4bfb29e8SAndreas Klinger {
813*4bfb29e8SAndreas Klinger 	struct veml6046x00_data *data = iio_priv(iio);
814*4bfb29e8SAndreas Klinger 	struct device *dev = regmap_get_device(data->regmap);
815*4bfb29e8SAndreas Klinger 	int ret;
816*4bfb29e8SAndreas Klinger 
817*4bfb29e8SAndreas Klinger 	ret = regmap_field_write(data->rf.mode, 1);
818*4bfb29e8SAndreas Klinger 	if (ret) {
819*4bfb29e8SAndreas Klinger 		dev_err(dev, "Failed to set mode %d\n", ret);
820*4bfb29e8SAndreas Klinger 		return ret;
821*4bfb29e8SAndreas Klinger 	}
822*4bfb29e8SAndreas Klinger 
823*4bfb29e8SAndreas Klinger 	pm_runtime_put_autosuspend(dev);
824*4bfb29e8SAndreas Klinger 
825*4bfb29e8SAndreas Klinger 	return 0;
826*4bfb29e8SAndreas Klinger }
827*4bfb29e8SAndreas Klinger 
828*4bfb29e8SAndreas Klinger static const struct iio_buffer_setup_ops veml6046x00_buffer_setup_ops = {
829*4bfb29e8SAndreas Klinger 	.preenable = veml6046x00_buffer_preenable,
830*4bfb29e8SAndreas Klinger 	.postdisable = veml6046x00_buffer_postdisable,
831*4bfb29e8SAndreas Klinger };
832*4bfb29e8SAndreas Klinger 
833*4bfb29e8SAndreas Klinger static irqreturn_t veml6046x00_trig_handler(int irq, void *p)
834*4bfb29e8SAndreas Klinger {
835*4bfb29e8SAndreas Klinger 	struct iio_poll_func *pf = p;
836*4bfb29e8SAndreas Klinger 	struct iio_dev *iio = pf->indio_dev;
837*4bfb29e8SAndreas Klinger 	struct veml6046x00_data *data = iio_priv(iio);
838*4bfb29e8SAndreas Klinger 	int ret;
839*4bfb29e8SAndreas Klinger 	struct {
840*4bfb29e8SAndreas Klinger 		__le16 chans[4];
841*4bfb29e8SAndreas Klinger 		aligned_s64 timestamp;
842*4bfb29e8SAndreas Klinger 	} scan;
843*4bfb29e8SAndreas Klinger 
844*4bfb29e8SAndreas Klinger 	ret = regmap_bulk_read(data->regmap, VEML6046X00_REG_R,
845*4bfb29e8SAndreas Klinger 			       &scan.chans, sizeof(scan.chans));
846*4bfb29e8SAndreas Klinger 	if (ret)
847*4bfb29e8SAndreas Klinger 		goto done;
848*4bfb29e8SAndreas Klinger 
849*4bfb29e8SAndreas Klinger 	iio_push_to_buffers_with_ts(iio, &scan, sizeof(scan),
850*4bfb29e8SAndreas Klinger 				    iio_get_time_ns(iio));
851*4bfb29e8SAndreas Klinger 
852*4bfb29e8SAndreas Klinger done:
853*4bfb29e8SAndreas Klinger 	iio_trigger_notify_done(iio->trig);
854*4bfb29e8SAndreas Klinger 
855*4bfb29e8SAndreas Klinger 	return IRQ_HANDLED;
856*4bfb29e8SAndreas Klinger }
857*4bfb29e8SAndreas Klinger 
858*4bfb29e8SAndreas Klinger static int veml6046x00_validate_part_id(struct veml6046x00_data *data)
859*4bfb29e8SAndreas Klinger {
860*4bfb29e8SAndreas Klinger 	struct device *dev = regmap_get_device(data->regmap);
861*4bfb29e8SAndreas Klinger 	unsigned int part_id;
862*4bfb29e8SAndreas Klinger 	int ret;
863*4bfb29e8SAndreas Klinger 	__le16 reg;
864*4bfb29e8SAndreas Klinger 
865*4bfb29e8SAndreas Klinger 	ret = regmap_bulk_read(data->regmap, VEML6046X00_REG_ID,
866*4bfb29e8SAndreas Klinger 			       &reg, sizeof(reg));
867*4bfb29e8SAndreas Klinger 	if (ret)
868*4bfb29e8SAndreas Klinger 		return dev_err_probe(dev, ret, "Failed to read ID\n");
869*4bfb29e8SAndreas Klinger 
870*4bfb29e8SAndreas Klinger 	part_id = le16_to_cpu(reg);
871*4bfb29e8SAndreas Klinger 	if (part_id != 0x01)
872*4bfb29e8SAndreas Klinger 		dev_info(dev, "Unknown ID %#04x\n", part_id);
873*4bfb29e8SAndreas Klinger 
874*4bfb29e8SAndreas Klinger 	return 0;
875*4bfb29e8SAndreas Klinger }
876*4bfb29e8SAndreas Klinger 
877*4bfb29e8SAndreas Klinger static int veml6046x00_setup_device(struct iio_dev *iio)
878*4bfb29e8SAndreas Klinger {
879*4bfb29e8SAndreas Klinger 	struct veml6046x00_data *data = iio_priv(iio);
880*4bfb29e8SAndreas Klinger 	struct device *dev = regmap_get_device(data->regmap);
881*4bfb29e8SAndreas Klinger 	int ret;
882*4bfb29e8SAndreas Klinger 	__le16 reg16;
883*4bfb29e8SAndreas Klinger 
884*4bfb29e8SAndreas Klinger 	reg16 = cpu_to_le16(VEML6046X00_CONF0_AF);
885*4bfb29e8SAndreas Klinger 	ret = regmap_bulk_write(data->regmap, VEML6046X00_REG_CONF0,
886*4bfb29e8SAndreas Klinger 				&reg16, sizeof(reg16));
887*4bfb29e8SAndreas Klinger 	if (ret)
888*4bfb29e8SAndreas Klinger 		return dev_err_probe(dev, ret, "Failed to set configuration\n");
889*4bfb29e8SAndreas Klinger 
890*4bfb29e8SAndreas Klinger 	reg16 = cpu_to_le16(0);
891*4bfb29e8SAndreas Klinger 	ret = regmap_bulk_write(data->regmap, VEML6046X00_REG_THDL,
892*4bfb29e8SAndreas Klinger 				&reg16, sizeof(reg16));
893*4bfb29e8SAndreas Klinger 	if (ret)
894*4bfb29e8SAndreas Klinger 		return dev_err_probe(dev, ret, "Failed to set low threshold\n");
895*4bfb29e8SAndreas Klinger 
896*4bfb29e8SAndreas Klinger 	reg16 = cpu_to_le16(U16_MAX);
897*4bfb29e8SAndreas Klinger 	ret = regmap_bulk_write(data->regmap, VEML6046X00_REG_THDH,
898*4bfb29e8SAndreas Klinger 				&reg16, sizeof(reg16));
899*4bfb29e8SAndreas Klinger 	if (ret)
900*4bfb29e8SAndreas Klinger 		return dev_err_probe(dev, ret, "Failed to set high threshold\n");
901*4bfb29e8SAndreas Klinger 
902*4bfb29e8SAndreas Klinger 	ret = regmap_bulk_read(data->regmap, VEML6046X00_REG_INT,
903*4bfb29e8SAndreas Klinger 			       &reg16, sizeof(reg16));
904*4bfb29e8SAndreas Klinger 	if (ret)
905*4bfb29e8SAndreas Klinger 		return dev_err_probe(dev, ret, "Failed to clear interrupts\n");
906*4bfb29e8SAndreas Klinger 
907*4bfb29e8SAndreas Klinger 	return 0;
908*4bfb29e8SAndreas Klinger }
909*4bfb29e8SAndreas Klinger 
910*4bfb29e8SAndreas Klinger static int veml6046x00_probe(struct i2c_client *i2c)
911*4bfb29e8SAndreas Klinger {
912*4bfb29e8SAndreas Klinger 	struct device *dev = &i2c->dev;
913*4bfb29e8SAndreas Klinger 	struct veml6046x00_data *data;
914*4bfb29e8SAndreas Klinger 	struct iio_dev *iio;
915*4bfb29e8SAndreas Klinger 	struct regmap *regmap;
916*4bfb29e8SAndreas Klinger 	int ret;
917*4bfb29e8SAndreas Klinger 
918*4bfb29e8SAndreas Klinger 	regmap = devm_regmap_init_i2c(i2c, &veml6046x00_regmap_config);
919*4bfb29e8SAndreas Klinger 	if (IS_ERR(regmap))
920*4bfb29e8SAndreas Klinger 		return dev_err_probe(dev, PTR_ERR(regmap), "Failed to set regmap\n");
921*4bfb29e8SAndreas Klinger 
922*4bfb29e8SAndreas Klinger 	iio = devm_iio_device_alloc(dev, sizeof(*data));
923*4bfb29e8SAndreas Klinger 	if (!iio)
924*4bfb29e8SAndreas Klinger 		return -ENOMEM;
925*4bfb29e8SAndreas Klinger 
926*4bfb29e8SAndreas Klinger 	data = iio_priv(iio);
927*4bfb29e8SAndreas Klinger 	/* struct iio_dev is retrieved via dev_get_drvdata(). */
928*4bfb29e8SAndreas Klinger 	i2c_set_clientdata(i2c, iio);
929*4bfb29e8SAndreas Klinger 	data->regmap = regmap;
930*4bfb29e8SAndreas Klinger 
931*4bfb29e8SAndreas Klinger 	ret = veml6046x00_regfield_init(data);
932*4bfb29e8SAndreas Klinger 	if (ret)
933*4bfb29e8SAndreas Klinger 		return dev_err_probe(dev, ret, "Failed to init regfield\n");
934*4bfb29e8SAndreas Klinger 
935*4bfb29e8SAndreas Klinger 	ret = devm_regulator_get_enable(dev, "vdd");
936*4bfb29e8SAndreas Klinger 	if (ret)
937*4bfb29e8SAndreas Klinger 		return dev_err_probe(dev, ret, "Failed to enable regulator\n");
938*4bfb29e8SAndreas Klinger 
939*4bfb29e8SAndreas Klinger 	/* bring device in a known state and switch device on */
940*4bfb29e8SAndreas Klinger 	ret = veml6046x00_setup_device(iio);
941*4bfb29e8SAndreas Klinger 	if (ret < 0)
942*4bfb29e8SAndreas Klinger 		return ret;
943*4bfb29e8SAndreas Klinger 
944*4bfb29e8SAndreas Klinger 	ret = devm_add_action_or_reset(dev, veml6046x00_shutdown_action, data);
945*4bfb29e8SAndreas Klinger 	if (ret < 0)
946*4bfb29e8SAndreas Klinger 		return dev_err_probe(dev, ret, "Failed to add shut down action\n");
947*4bfb29e8SAndreas Klinger 
948*4bfb29e8SAndreas Klinger 	ret = pm_runtime_set_active(dev);
949*4bfb29e8SAndreas Klinger 	if (ret < 0)
950*4bfb29e8SAndreas Klinger 		return dev_err_probe(dev, ret, "Failed to activate PM runtime\n");
951*4bfb29e8SAndreas Klinger 
952*4bfb29e8SAndreas Klinger 	ret = devm_pm_runtime_enable(dev);
953*4bfb29e8SAndreas Klinger 	if (ret)
954*4bfb29e8SAndreas Klinger 		return dev_err_probe(dev, ret, "Failed to enable PM runtime\n");
955*4bfb29e8SAndreas Klinger 
956*4bfb29e8SAndreas Klinger 	pm_runtime_get_noresume(dev);
957*4bfb29e8SAndreas Klinger 	pm_runtime_set_autosuspend_delay(dev, VEML6046X00_AUTOSUSPEND_MS);
958*4bfb29e8SAndreas Klinger 	pm_runtime_use_autosuspend(dev);
959*4bfb29e8SAndreas Klinger 
960*4bfb29e8SAndreas Klinger 	ret = veml6046x00_validate_part_id(data);
961*4bfb29e8SAndreas Klinger 	if (ret)
962*4bfb29e8SAndreas Klinger 		return dev_err_probe(dev, ret, "Failed to validate device ID\n");
963*4bfb29e8SAndreas Klinger 
964*4bfb29e8SAndreas Klinger 	iio->name = "veml6046x00";
965*4bfb29e8SAndreas Klinger 	iio->channels = veml6046x00_channels;
966*4bfb29e8SAndreas Klinger 	iio->num_channels = ARRAY_SIZE(veml6046x00_channels);
967*4bfb29e8SAndreas Klinger 	iio->modes = INDIO_DIRECT_MODE;
968*4bfb29e8SAndreas Klinger 
969*4bfb29e8SAndreas Klinger 	iio->info = &veml6046x00_info_no_irq;
970*4bfb29e8SAndreas Klinger 
971*4bfb29e8SAndreas Klinger 	ret = devm_iio_triggered_buffer_setup(dev, iio, NULL,
972*4bfb29e8SAndreas Klinger 					      veml6046x00_trig_handler,
973*4bfb29e8SAndreas Klinger 					      &veml6046x00_buffer_setup_ops);
974*4bfb29e8SAndreas Klinger 	if (ret)
975*4bfb29e8SAndreas Klinger 		return dev_err_probe(dev, ret,
976*4bfb29e8SAndreas Klinger 				     "Failed to register triggered buffer");
977*4bfb29e8SAndreas Klinger 
978*4bfb29e8SAndreas Klinger 	pm_runtime_put_autosuspend(dev);
979*4bfb29e8SAndreas Klinger 
980*4bfb29e8SAndreas Klinger 	ret = devm_iio_device_register(dev, iio);
981*4bfb29e8SAndreas Klinger 	if (ret)
982*4bfb29e8SAndreas Klinger 		return dev_err_probe(dev, ret, "Failed to register iio device");
983*4bfb29e8SAndreas Klinger 
984*4bfb29e8SAndreas Klinger 	return 0;
985*4bfb29e8SAndreas Klinger }
986*4bfb29e8SAndreas Klinger 
987*4bfb29e8SAndreas Klinger static int veml6046x00_runtime_suspend(struct device *dev)
988*4bfb29e8SAndreas Klinger {
989*4bfb29e8SAndreas Klinger 	struct veml6046x00_data *data = iio_priv(dev_get_drvdata(dev));
990*4bfb29e8SAndreas Klinger 
991*4bfb29e8SAndreas Klinger 	return veml6046x00_shutdown(data);
992*4bfb29e8SAndreas Klinger }
993*4bfb29e8SAndreas Klinger 
994*4bfb29e8SAndreas Klinger static int veml6046x00_runtime_resume(struct device *dev)
995*4bfb29e8SAndreas Klinger {
996*4bfb29e8SAndreas Klinger 	struct veml6046x00_data *data = iio_priv(dev_get_drvdata(dev));
997*4bfb29e8SAndreas Klinger 
998*4bfb29e8SAndreas Klinger 	return veml6046x00_power_on(data);
999*4bfb29e8SAndreas Klinger }
1000*4bfb29e8SAndreas Klinger 
1001*4bfb29e8SAndreas Klinger static DEFINE_RUNTIME_DEV_PM_OPS(veml6046x00_pm_ops,
1002*4bfb29e8SAndreas Klinger 				 veml6046x00_runtime_suspend,
1003*4bfb29e8SAndreas Klinger 				 veml6046x00_runtime_resume, NULL);
1004*4bfb29e8SAndreas Klinger 
1005*4bfb29e8SAndreas Klinger static const struct of_device_id veml6046x00_of_match[] = {
1006*4bfb29e8SAndreas Klinger 	{ .compatible = "vishay,veml6046x00" },
1007*4bfb29e8SAndreas Klinger 	{ }
1008*4bfb29e8SAndreas Klinger };
1009*4bfb29e8SAndreas Klinger MODULE_DEVICE_TABLE(of, veml6046x00_of_match);
1010*4bfb29e8SAndreas Klinger 
1011*4bfb29e8SAndreas Klinger static const struct i2c_device_id veml6046x00_id[] = {
1012*4bfb29e8SAndreas Klinger 	{ "veml6046x00" },
1013*4bfb29e8SAndreas Klinger 	{ }
1014*4bfb29e8SAndreas Klinger };
1015*4bfb29e8SAndreas Klinger MODULE_DEVICE_TABLE(i2c, veml6046x00_id);
1016*4bfb29e8SAndreas Klinger 
1017*4bfb29e8SAndreas Klinger static struct i2c_driver veml6046x00_driver = {
1018*4bfb29e8SAndreas Klinger 	.driver = {
1019*4bfb29e8SAndreas Klinger 		.name = "veml6046x00",
1020*4bfb29e8SAndreas Klinger 		.of_match_table = veml6046x00_of_match,
1021*4bfb29e8SAndreas Klinger 		.pm = pm_ptr(&veml6046x00_pm_ops),
1022*4bfb29e8SAndreas Klinger 	},
1023*4bfb29e8SAndreas Klinger 	.probe = veml6046x00_probe,
1024*4bfb29e8SAndreas Klinger 	.id_table = veml6046x00_id,
1025*4bfb29e8SAndreas Klinger };
1026*4bfb29e8SAndreas Klinger module_i2c_driver(veml6046x00_driver);
1027*4bfb29e8SAndreas Klinger 
1028*4bfb29e8SAndreas Klinger MODULE_AUTHOR("Andreas Klinger <ak@it-klinger.de>");
1029*4bfb29e8SAndreas Klinger MODULE_DESCRIPTION("VEML6046X00 RGBIR Color Sensor");
1030*4bfb29e8SAndreas Klinger MODULE_LICENSE("GPL");
1031