xref: /linux/drivers/iio/light/rpr0521.c (revision 68a052239fc4b351e961f698b824f7654a346091)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * RPR-0521 ROHM Ambient Light and Proximity Sensor
4  *
5  * Copyright (c) 2015, Intel Corporation.
6  *
7  * IIO driver for RPR-0521RS (7-bit I2C slave address 0x38).
8  *
9  * TODO: illuminance channel
10  */
11 
12 #include <linux/module.h>
13 #include <linux/mod_devicetable.h>
14 #include <linux/cleanup.h>
15 #include <linux/init.h>
16 #include <linux/i2c.h>
17 #include <linux/regmap.h>
18 #include <linux/delay.h>
19 
20 #include <linux/iio/iio.h>
21 #include <linux/iio/buffer.h>
22 #include <linux/iio/trigger.h>
23 #include <linux/iio/trigger_consumer.h>
24 #include <linux/iio/triggered_buffer.h>
25 #include <linux/iio/sysfs.h>
26 #include <linux/pm_runtime.h>
27 
28 #define RPR0521_REG_SYSTEM_CTRL		0x40
29 #define RPR0521_REG_MODE_CTRL		0x41
30 #define RPR0521_REG_ALS_CTRL		0x42
31 #define RPR0521_REG_PXS_CTRL		0x43
32 #define RPR0521_REG_PXS_DATA		0x44 /* 16-bit, little endian */
33 #define RPR0521_REG_ALS_DATA0		0x46 /* 16-bit, little endian */
34 #define RPR0521_REG_ALS_DATA1		0x48 /* 16-bit, little endian */
35 #define RPR0521_REG_INTERRUPT		0x4A
36 #define RPR0521_REG_PS_OFFSET_LSB	0x53
37 #define RPR0521_REG_ID			0x92
38 
39 #define RPR0521_MODE_ALS_MASK		BIT(7)
40 #define RPR0521_MODE_PXS_MASK		BIT(6)
41 #define RPR0521_MODE_MEAS_TIME_MASK	GENMASK(3, 0)
42 #define RPR0521_ALS_DATA0_GAIN_MASK	GENMASK(5, 4)
43 #define RPR0521_ALS_DATA0_GAIN_SHIFT	4
44 #define RPR0521_ALS_DATA1_GAIN_MASK	GENMASK(3, 2)
45 #define RPR0521_ALS_DATA1_GAIN_SHIFT	2
46 #define RPR0521_PXS_GAIN_MASK		GENMASK(5, 4)
47 #define RPR0521_PXS_GAIN_SHIFT		4
48 #define RPR0521_PXS_PERSISTENCE_MASK	GENMASK(3, 0)
49 #define RPR0521_INTERRUPT_INT_TRIG_PS_MASK	BIT(0)
50 #define RPR0521_INTERRUPT_INT_TRIG_ALS_MASK	BIT(1)
51 #define RPR0521_INTERRUPT_INT_REASSERT_MASK	BIT(3)
52 #define RPR0521_INTERRUPT_ALS_INT_STATUS_MASK	BIT(6)
53 #define RPR0521_INTERRUPT_PS_INT_STATUS_MASK	BIT(7)
54 
55 #define RPR0521_MODE_ALS_ENABLE		BIT(7)
56 #define RPR0521_MODE_ALS_DISABLE	0x00
57 #define RPR0521_MODE_PXS_ENABLE		BIT(6)
58 #define RPR0521_MODE_PXS_DISABLE	0x00
59 #define RPR0521_PXS_PERSISTENCE_DRDY	0x00
60 
61 #define RPR0521_INTERRUPT_INT_TRIG_PS_ENABLE	BIT(0)
62 #define RPR0521_INTERRUPT_INT_TRIG_PS_DISABLE	0x00
63 #define RPR0521_INTERRUPT_INT_TRIG_ALS_ENABLE	BIT(1)
64 #define RPR0521_INTERRUPT_INT_TRIG_ALS_DISABLE	0x00
65 #define RPR0521_INTERRUPT_INT_REASSERT_ENABLE	BIT(3)
66 #define RPR0521_INTERRUPT_INT_REASSERT_DISABLE	0x00
67 
68 #define RPR0521_MANUFACT_ID		0xE0
69 #define RPR0521_DEFAULT_MEAS_TIME	0x06 /* ALS - 100ms, PXS - 100ms */
70 
71 #define RPR0521_DRV_NAME		"RPR0521"
72 
73 #define RPR0521_SLEEP_DELAY_MS	2000
74 
75 #define RPR0521_ALS_SCALE_AVAIL "0.007812 0.015625 0.5 1"
76 #define RPR0521_PXS_SCALE_AVAIL "0.125 0.5 1"
77 
78 struct rpr0521_gain {
79 	int scale;
80 	int uscale;
81 };
82 
83 static const struct rpr0521_gain rpr0521_als_gain[4] = {
84 	{1, 0},		/* x1 */
85 	{0, 500000},	/* x2 */
86 	{0, 15625},	/* x64 */
87 	{0, 7812},	/* x128 */
88 };
89 
90 static const struct rpr0521_gain rpr0521_pxs_gain[3] = {
91 	{1, 0},		/* x1 */
92 	{0, 500000},	/* x2 */
93 	{0, 125000},	/* x4 */
94 };
95 
96 enum rpr0521_channel {
97 	RPR0521_CHAN_PXS,
98 	RPR0521_CHAN_ALS_DATA0,
99 	RPR0521_CHAN_ALS_DATA1,
100 };
101 
102 struct rpr0521_reg_desc {
103 	u8 address;
104 	u8 device_mask;
105 };
106 
107 static const struct rpr0521_reg_desc rpr0521_data_reg[] = {
108 	[RPR0521_CHAN_PXS]	= {
109 		.address	= RPR0521_REG_PXS_DATA,
110 		.device_mask	= RPR0521_MODE_PXS_MASK,
111 	},
112 	[RPR0521_CHAN_ALS_DATA0] = {
113 		.address	= RPR0521_REG_ALS_DATA0,
114 		.device_mask	= RPR0521_MODE_ALS_MASK,
115 	},
116 	[RPR0521_CHAN_ALS_DATA1] = {
117 		.address	= RPR0521_REG_ALS_DATA1,
118 		.device_mask	= RPR0521_MODE_ALS_MASK,
119 	},
120 };
121 
122 static const struct rpr0521_gain_info {
123 	u8 reg;
124 	u8 mask;
125 	u8 shift;
126 	const struct rpr0521_gain *gain;
127 	int size;
128 } rpr0521_gain[] = {
129 	[RPR0521_CHAN_PXS] = {
130 		.reg	= RPR0521_REG_PXS_CTRL,
131 		.mask	= RPR0521_PXS_GAIN_MASK,
132 		.shift	= RPR0521_PXS_GAIN_SHIFT,
133 		.gain	= rpr0521_pxs_gain,
134 		.size	= ARRAY_SIZE(rpr0521_pxs_gain),
135 	},
136 	[RPR0521_CHAN_ALS_DATA0] = {
137 		.reg	= RPR0521_REG_ALS_CTRL,
138 		.mask	= RPR0521_ALS_DATA0_GAIN_MASK,
139 		.shift	= RPR0521_ALS_DATA0_GAIN_SHIFT,
140 		.gain	= rpr0521_als_gain,
141 		.size	= ARRAY_SIZE(rpr0521_als_gain),
142 	},
143 	[RPR0521_CHAN_ALS_DATA1] = {
144 		.reg	= RPR0521_REG_ALS_CTRL,
145 		.mask	= RPR0521_ALS_DATA1_GAIN_MASK,
146 		.shift	= RPR0521_ALS_DATA1_GAIN_SHIFT,
147 		.gain	= rpr0521_als_gain,
148 		.size	= ARRAY_SIZE(rpr0521_als_gain),
149 	},
150 };
151 
152 struct rpr0521_samp_freq {
153 	int	als_hz;
154 	int	als_uhz;
155 	int	pxs_hz;
156 	int	pxs_uhz;
157 };
158 
159 static const struct rpr0521_samp_freq rpr0521_samp_freq_i[13] = {
160 /*	{ALS, PXS},		   W==currently writable option */
161 	{0, 0, 0, 0},		/* W0000, 0=standby */
162 	{0, 0, 100, 0},		/*  0001 */
163 	{0, 0, 25, 0},		/*  0010 */
164 	{0, 0, 10, 0},		/*  0011 */
165 	{0, 0, 2, 500000},	/*  0100 */
166 	{10, 0, 20, 0},		/*  0101 */
167 	{10, 0, 10, 0},		/* W0110 */
168 	{10, 0, 2, 500000},	/*  0111 */
169 	{2, 500000, 20, 0},	/*  1000, measurement 100ms, sleep 300ms */
170 	{2, 500000, 10, 0},	/*  1001, measurement 100ms, sleep 300ms */
171 	{2, 500000, 0, 0},	/*  1010, high sensitivity mode */
172 	{2, 500000, 2, 500000},	/* W1011, high sensitivity mode */
173 	{20, 0, 20, 0}	/* 1100, ALS_data x 0.5, see specification P.18 */
174 };
175 
176 struct rpr0521_data {
177 	struct i2c_client *client;
178 
179 	/* protect device params updates (e.g state, gain) */
180 	struct mutex lock;
181 
182 	/* device active status */
183 	bool als_dev_en;
184 	bool pxs_dev_en;
185 
186 	struct iio_trigger *drdy_trigger0;
187 	s64 irq_timestamp;
188 
189 	/* optimize runtime pm ops - enable/disable device only if needed */
190 	bool als_ps_need_en;
191 	bool pxs_ps_need_en;
192 	bool als_need_dis;
193 	bool pxs_need_dis;
194 
195 	struct regmap *regmap;
196 
197 	/*
198 	 * Ensure correct naturally aligned timestamp.
199 	 * Note that the read will put garbage data into
200 	 * the padding but this should not be a problem
201 	 */
202 	struct {
203 		__le16 channels[3];
204 		u8 garbage;
205 		aligned_s64 ts;
206 	} scan;
207 };
208 
209 static IIO_CONST_ATTR(in_intensity_scale_available, RPR0521_ALS_SCALE_AVAIL);
210 static IIO_CONST_ATTR(in_proximity_scale_available, RPR0521_PXS_SCALE_AVAIL);
211 
212 /*
213  * Start with easy freq first, whole table of freq combinations is more
214  * complicated.
215  */
216 static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("2.5 10");
217 
218 static struct attribute *rpr0521_attributes[] = {
219 	&iio_const_attr_in_intensity_scale_available.dev_attr.attr,
220 	&iio_const_attr_in_proximity_scale_available.dev_attr.attr,
221 	&iio_const_attr_sampling_frequency_available.dev_attr.attr,
222 	NULL,
223 };
224 
225 static const struct attribute_group rpr0521_attribute_group = {
226 	.attrs = rpr0521_attributes,
227 };
228 
229 /* Order of the channel data in buffer */
230 enum rpr0521_scan_index_order {
231 	RPR0521_CHAN_INDEX_PXS,
232 	RPR0521_CHAN_INDEX_BOTH,
233 	RPR0521_CHAN_INDEX_IR,
234 };
235 
236 static const unsigned long rpr0521_available_scan_masks[] = {
237 	BIT(RPR0521_CHAN_INDEX_PXS) | BIT(RPR0521_CHAN_INDEX_BOTH) |
238 	BIT(RPR0521_CHAN_INDEX_IR),
239 	0
240 };
241 
242 static const struct iio_chan_spec rpr0521_channels[] = {
243 	{
244 		.type = IIO_PROXIMITY,
245 		.address = RPR0521_CHAN_PXS,
246 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
247 			BIT(IIO_CHAN_INFO_OFFSET) |
248 			BIT(IIO_CHAN_INFO_SCALE),
249 		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
250 		.scan_index = RPR0521_CHAN_INDEX_PXS,
251 		.scan_type = {
252 			.sign = 'u',
253 			.realbits = 16,
254 			.storagebits = 16,
255 			.endianness = IIO_LE,
256 		},
257 	},
258 	{
259 		.type = IIO_INTENSITY,
260 		.modified = 1,
261 		.address = RPR0521_CHAN_ALS_DATA0,
262 		.channel2 = IIO_MOD_LIGHT_BOTH,
263 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
264 			BIT(IIO_CHAN_INFO_SCALE),
265 		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
266 		.scan_index = RPR0521_CHAN_INDEX_BOTH,
267 		.scan_type = {
268 			.sign = 'u',
269 			.realbits = 16,
270 			.storagebits = 16,
271 			.endianness = IIO_LE,
272 		},
273 	},
274 	{
275 		.type = IIO_INTENSITY,
276 		.modified = 1,
277 		.address = RPR0521_CHAN_ALS_DATA1,
278 		.channel2 = IIO_MOD_LIGHT_IR,
279 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
280 			BIT(IIO_CHAN_INFO_SCALE),
281 		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
282 		.scan_index = RPR0521_CHAN_INDEX_IR,
283 		.scan_type = {
284 			.sign = 'u',
285 			.realbits = 16,
286 			.storagebits = 16,
287 			.endianness = IIO_LE,
288 		},
289 	},
290 };
291 
292 static int rpr0521_als_enable(struct rpr0521_data *data, u8 status)
293 {
294 	int ret;
295 
296 	ret = regmap_update_bits(data->regmap, RPR0521_REG_MODE_CTRL,
297 				 RPR0521_MODE_ALS_MASK,
298 				 status);
299 	if (ret < 0)
300 		return ret;
301 
302 	if (status & RPR0521_MODE_ALS_MASK)
303 		data->als_dev_en = true;
304 	else
305 		data->als_dev_en = false;
306 
307 	return 0;
308 }
309 
310 static int rpr0521_pxs_enable(struct rpr0521_data *data, u8 status)
311 {
312 	int ret;
313 
314 	ret = regmap_update_bits(data->regmap, RPR0521_REG_MODE_CTRL,
315 				 RPR0521_MODE_PXS_MASK,
316 				 status);
317 	if (ret < 0)
318 		return ret;
319 
320 	if (status & RPR0521_MODE_PXS_MASK)
321 		data->pxs_dev_en = true;
322 	else
323 		data->pxs_dev_en = false;
324 
325 	return 0;
326 }
327 
328 /**
329  * rpr0521_set_power_state - handles runtime PM state and sensors enabled status
330  *
331  * @data: rpr0521 device private data
332  * @on: state to be set for devices in @device_mask
333  * @device_mask: bitmask specifying for which device we need to update @on state
334  *
335  * Calls for this function must be balanced so that each ON should have matching
336  * OFF. Otherwise pm usage_count gets out of sync.
337  */
338 static int rpr0521_set_power_state(struct rpr0521_data *data, bool on,
339 				   u8 device_mask)
340 {
341 #ifdef CONFIG_PM
342 	int ret;
343 
344 	if (device_mask & RPR0521_MODE_ALS_MASK) {
345 		data->als_ps_need_en = on;
346 		data->als_need_dis = !on;
347 	}
348 
349 	if (device_mask & RPR0521_MODE_PXS_MASK) {
350 		data->pxs_ps_need_en = on;
351 		data->pxs_need_dis = !on;
352 	}
353 
354 	/*
355 	 * On: _resume() is called only when we are suspended
356 	 * Off: _suspend() is called after delay if _resume() is not
357 	 * called before that.
358 	 * Note: If either measurement is re-enabled before _suspend(),
359 	 * both stay enabled until _suspend().
360 	 */
361 	if (on)
362 		ret = pm_runtime_resume_and_get(&data->client->dev);
363 	else
364 		ret = pm_runtime_put_autosuspend(&data->client->dev);
365 	if (ret < 0) {
366 		dev_err(&data->client->dev,
367 			"Failed: rpr0521_set_power_state for %d, ret %d\n",
368 			on, ret);
369 		return ret;
370 	}
371 
372 	if (on) {
373 		/* If _resume() was not called, enable measurement now. */
374 		if (data->als_ps_need_en) {
375 			ret = rpr0521_als_enable(data, RPR0521_MODE_ALS_ENABLE);
376 			if (ret)
377 				return ret;
378 			data->als_ps_need_en = false;
379 		}
380 
381 		if (data->pxs_ps_need_en) {
382 			ret = rpr0521_pxs_enable(data, RPR0521_MODE_PXS_ENABLE);
383 			if (ret)
384 				return ret;
385 			data->pxs_ps_need_en = false;
386 		}
387 	}
388 #endif
389 	return 0;
390 }
391 
392 /* Interrupt register tells if this sensor caused the interrupt or not. */
393 static inline bool rpr0521_is_triggered(struct rpr0521_data *data)
394 {
395 	int ret;
396 	int reg;
397 
398 	ret = regmap_read(data->regmap, RPR0521_REG_INTERRUPT, &reg);
399 	if (ret < 0)
400 		return false;   /* Reg read failed. */
401 	if (reg &
402 	    (RPR0521_INTERRUPT_ALS_INT_STATUS_MASK |
403 	    RPR0521_INTERRUPT_PS_INT_STATUS_MASK))
404 		return true;
405 	else
406 		return false;   /* Int not from this sensor. */
407 }
408 
409 /* IRQ to trigger handler */
410 static irqreturn_t rpr0521_drdy_irq_handler(int irq, void *private)
411 {
412 	struct iio_dev *indio_dev = private;
413 	struct rpr0521_data *data = iio_priv(indio_dev);
414 
415 	data->irq_timestamp = iio_get_time_ns(indio_dev);
416 	/*
417 	 * We need to wake the thread to read the interrupt reg. It
418 	 * is not possible to do that here because regmap_read takes a
419 	 * mutex.
420 	 */
421 
422 	return IRQ_WAKE_THREAD;
423 }
424 
425 static irqreturn_t rpr0521_drdy_irq_thread(int irq, void *private)
426 {
427 	struct iio_dev *indio_dev = private;
428 	struct rpr0521_data *data = iio_priv(indio_dev);
429 
430 	if (rpr0521_is_triggered(data)) {
431 		iio_trigger_poll_nested(data->drdy_trigger0);
432 		return IRQ_HANDLED;
433 	}
434 
435 	return IRQ_NONE;
436 }
437 
438 static irqreturn_t rpr0521_trigger_consumer_handler(int irq, void *p)
439 {
440 	struct iio_poll_func *pf = p;
441 	struct iio_dev *indio_dev = pf->indio_dev;
442 	struct rpr0521_data *data = iio_priv(indio_dev);
443 	int err;
444 
445 	/* Use irq timestamp when reasonable. */
446 	if (iio_trigger_using_own(indio_dev) && data->irq_timestamp) {
447 		pf->timestamp = data->irq_timestamp;
448 		data->irq_timestamp = 0;
449 	}
450 	/* Other chained trigger polls get timestamp only here. */
451 	if (!pf->timestamp)
452 		pf->timestamp = iio_get_time_ns(indio_dev);
453 
454 	err = regmap_bulk_read(data->regmap, RPR0521_REG_PXS_DATA,
455 		data->scan.channels,
456 		(3 * 2) + 1);	/* 3 * 16-bit + (discarded) int clear reg. */
457 	if (!err)
458 		iio_push_to_buffers_with_ts(indio_dev, &data->scan,
459 					    sizeof(data->scan), pf->timestamp);
460 	else
461 		dev_err(&data->client->dev,
462 			"Trigger consumer can't read from sensor.\n");
463 	pf->timestamp = 0;
464 
465 	iio_trigger_notify_done(indio_dev->trig);
466 
467 	return IRQ_HANDLED;
468 }
469 
470 static int rpr0521_write_int_enable(struct rpr0521_data *data)
471 {
472 	int err;
473 
474 	/* Interrupt after each measurement */
475 	err = regmap_update_bits(data->regmap, RPR0521_REG_PXS_CTRL,
476 		RPR0521_PXS_PERSISTENCE_MASK,
477 		RPR0521_PXS_PERSISTENCE_DRDY);
478 	if (err) {
479 		dev_err(&data->client->dev, "PS control reg write fail.\n");
480 		return -EBUSY;
481 		}
482 
483 	/* Ignore latch and mode because of drdy */
484 	err = regmap_write(data->regmap, RPR0521_REG_INTERRUPT,
485 		RPR0521_INTERRUPT_INT_REASSERT_DISABLE |
486 		RPR0521_INTERRUPT_INT_TRIG_ALS_DISABLE |
487 		RPR0521_INTERRUPT_INT_TRIG_PS_ENABLE
488 		);
489 	if (err) {
490 		dev_err(&data->client->dev, "Interrupt setup write fail.\n");
491 		return -EBUSY;
492 		}
493 
494 	return 0;
495 }
496 
497 static int rpr0521_write_int_disable(struct rpr0521_data *data)
498 {
499 	/* Don't care of clearing mode, assert and latch. */
500 	return regmap_write(data->regmap, RPR0521_REG_INTERRUPT,
501 				RPR0521_INTERRUPT_INT_TRIG_ALS_DISABLE |
502 				RPR0521_INTERRUPT_INT_TRIG_PS_DISABLE
503 				);
504 }
505 
506 /*
507  * Trigger producer enable / disable. Note that there will be trigs only when
508  * measurement data is ready to be read.
509  */
510 static int rpr0521_pxs_drdy_set_state(struct iio_trigger *trigger,
511 	bool enable_drdy)
512 {
513 	struct iio_dev *indio_dev = iio_trigger_get_drvdata(trigger);
514 	struct rpr0521_data *data = iio_priv(indio_dev);
515 	int err;
516 
517 	if (enable_drdy)
518 		err = rpr0521_write_int_enable(data);
519 	else
520 		err = rpr0521_write_int_disable(data);
521 	if (err)
522 		dev_err(&data->client->dev, "rpr0521_pxs_drdy_set_state failed\n");
523 
524 	return err;
525 }
526 
527 static const struct iio_trigger_ops rpr0521_trigger_ops = {
528 	.set_trigger_state = rpr0521_pxs_drdy_set_state,
529 	};
530 
531 
532 static int rpr0521_buffer_preenable(struct iio_dev *indio_dev)
533 {
534 	int err;
535 	struct rpr0521_data *data = iio_priv(indio_dev);
536 
537 	mutex_lock(&data->lock);
538 	err = rpr0521_set_power_state(data, true,
539 		(RPR0521_MODE_PXS_MASK | RPR0521_MODE_ALS_MASK));
540 	mutex_unlock(&data->lock);
541 	if (err)
542 		dev_err(&data->client->dev, "_buffer_preenable fail\n");
543 
544 	return err;
545 }
546 
547 static int rpr0521_buffer_postdisable(struct iio_dev *indio_dev)
548 {
549 	int err;
550 	struct rpr0521_data *data = iio_priv(indio_dev);
551 
552 	mutex_lock(&data->lock);
553 	err = rpr0521_set_power_state(data, false,
554 		(RPR0521_MODE_PXS_MASK | RPR0521_MODE_ALS_MASK));
555 	mutex_unlock(&data->lock);
556 	if (err)
557 		dev_err(&data->client->dev, "_buffer_postdisable fail\n");
558 
559 	return err;
560 }
561 
562 static const struct iio_buffer_setup_ops rpr0521_buffer_setup_ops = {
563 	.preenable = rpr0521_buffer_preenable,
564 	.postdisable = rpr0521_buffer_postdisable,
565 };
566 
567 static int rpr0521_get_gain(struct rpr0521_data *data, int chan,
568 			    int *val, int *val2)
569 {
570 	int ret, reg, idx;
571 
572 	ret = regmap_read(data->regmap, rpr0521_gain[chan].reg, &reg);
573 	if (ret < 0)
574 		return ret;
575 
576 	idx = (rpr0521_gain[chan].mask & reg) >> rpr0521_gain[chan].shift;
577 	*val = rpr0521_gain[chan].gain[idx].scale;
578 	*val2 = rpr0521_gain[chan].gain[idx].uscale;
579 
580 	return 0;
581 }
582 
583 static int rpr0521_set_gain(struct rpr0521_data *data, int chan,
584 			    int val, int val2)
585 {
586 	int i, idx = -EINVAL;
587 
588 	/* get gain index */
589 	for (i = 0; i < rpr0521_gain[chan].size; i++)
590 		if (val == rpr0521_gain[chan].gain[i].scale &&
591 		    val2 == rpr0521_gain[chan].gain[i].uscale) {
592 			idx = i;
593 			break;
594 		}
595 
596 	if (idx < 0)
597 		return idx;
598 
599 	return regmap_update_bits(data->regmap, rpr0521_gain[chan].reg,
600 				  rpr0521_gain[chan].mask,
601 				  idx << rpr0521_gain[chan].shift);
602 }
603 
604 static int rpr0521_read_samp_freq(struct rpr0521_data *data,
605 				enum iio_chan_type chan_type,
606 			    int *val, int *val2)
607 {
608 	int reg, ret;
609 
610 	ret = regmap_read(data->regmap, RPR0521_REG_MODE_CTRL, &reg);
611 	if (ret < 0)
612 		return ret;
613 
614 	reg &= RPR0521_MODE_MEAS_TIME_MASK;
615 	if (reg >= ARRAY_SIZE(rpr0521_samp_freq_i))
616 		return -EINVAL;
617 
618 	switch (chan_type) {
619 	case IIO_INTENSITY:
620 		*val = rpr0521_samp_freq_i[reg].als_hz;
621 		*val2 = rpr0521_samp_freq_i[reg].als_uhz;
622 		return 0;
623 
624 	case IIO_PROXIMITY:
625 		*val = rpr0521_samp_freq_i[reg].pxs_hz;
626 		*val2 = rpr0521_samp_freq_i[reg].pxs_uhz;
627 		return 0;
628 
629 	default:
630 		return -EINVAL;
631 	}
632 }
633 
634 static int rpr0521_write_samp_freq_common(struct rpr0521_data *data,
635 				enum iio_chan_type chan_type,
636 				int val, int val2)
637 {
638 	int i;
639 
640 	/*
641 	 * Ignore channel
642 	 * both pxs and als are setup only to same freq because of simplicity
643 	 */
644 	switch (val) {
645 	case 0:
646 		i = 0;
647 		break;
648 
649 	case 2:
650 		if (val2 != 500000)
651 			return -EINVAL;
652 
653 		i = 11;
654 		break;
655 
656 	case 10:
657 		i = 6;
658 		break;
659 
660 	default:
661 		return -EINVAL;
662 	}
663 
664 	return regmap_update_bits(data->regmap,
665 		RPR0521_REG_MODE_CTRL,
666 		RPR0521_MODE_MEAS_TIME_MASK,
667 		i);
668 }
669 
670 static int rpr0521_read_ps_offset(struct rpr0521_data *data, int *offset)
671 {
672 	int ret;
673 	__le16 buffer;
674 
675 	ret = regmap_bulk_read(data->regmap,
676 		RPR0521_REG_PS_OFFSET_LSB, &buffer, sizeof(buffer));
677 
678 	if (ret < 0) {
679 		dev_err(&data->client->dev, "Failed to read PS OFFSET register\n");
680 		return ret;
681 	}
682 	*offset = le16_to_cpu(buffer);
683 
684 	return ret;
685 }
686 
687 static int rpr0521_write_ps_offset(struct rpr0521_data *data, int offset)
688 {
689 	int ret;
690 	__le16 buffer;
691 
692 	buffer = cpu_to_le16(offset & 0x3ff);
693 	ret = regmap_raw_write(data->regmap,
694 		RPR0521_REG_PS_OFFSET_LSB, &buffer, sizeof(buffer));
695 
696 	if (ret < 0) {
697 		dev_err(&data->client->dev, "Failed to write PS OFFSET register\n");
698 		return ret;
699 	}
700 
701 	return ret;
702 }
703 
704 static int rpr0521_read_info_raw(struct rpr0521_data *data,
705 				 struct iio_chan_spec const *chan,
706 				 int *val)
707 {
708 	u8 device_mask;
709 	__le16 raw_data;
710 	int ret;
711 
712 	device_mask = rpr0521_data_reg[chan->address].device_mask;
713 
714 	guard(mutex)(&data->lock);
715 	ret = rpr0521_set_power_state(data, true, device_mask);
716 	if (ret < 0)
717 		return ret;
718 
719 	ret = regmap_bulk_read(data->regmap,
720 			       rpr0521_data_reg[chan->address].address,
721 			       &raw_data, sizeof(raw_data));
722 	if (ret < 0) {
723 		rpr0521_set_power_state(data, false, device_mask);
724 		return ret;
725 	}
726 
727 	ret = rpr0521_set_power_state(data, false, device_mask);
728 	if (ret < 0)
729 		return ret;
730 
731 	*val = le16_to_cpu(raw_data);
732 
733 	return 0;
734 }
735 
736 static int rpr0521_read_raw(struct iio_dev *indio_dev,
737 			    struct iio_chan_spec const *chan, int *val,
738 			    int *val2, long mask)
739 {
740 	struct rpr0521_data *data = iio_priv(indio_dev);
741 	int ret;
742 
743 	switch (mask) {
744 	case IIO_CHAN_INFO_RAW:
745 		if (chan->type != IIO_INTENSITY && chan->type != IIO_PROXIMITY)
746 			return -EINVAL;
747 
748 		if (!iio_device_claim_direct(indio_dev))
749 			return -EBUSY;
750 
751 		ret = rpr0521_read_info_raw(data, chan, val);
752 		iio_device_release_direct(indio_dev);
753 		if (ret < 0)
754 			return ret;
755 
756 		return IIO_VAL_INT;
757 
758 	case IIO_CHAN_INFO_SCALE:
759 		mutex_lock(&data->lock);
760 		ret = rpr0521_get_gain(data, chan->address, val, val2);
761 		mutex_unlock(&data->lock);
762 		if (ret < 0)
763 			return ret;
764 
765 		return IIO_VAL_INT_PLUS_MICRO;
766 
767 	case IIO_CHAN_INFO_SAMP_FREQ:
768 		mutex_lock(&data->lock);
769 		ret = rpr0521_read_samp_freq(data, chan->type, val, val2);
770 		mutex_unlock(&data->lock);
771 		if (ret < 0)
772 			return ret;
773 
774 		return IIO_VAL_INT_PLUS_MICRO;
775 
776 	case IIO_CHAN_INFO_OFFSET:
777 		mutex_lock(&data->lock);
778 		ret = rpr0521_read_ps_offset(data, val);
779 		mutex_unlock(&data->lock);
780 		if (ret < 0)
781 			return ret;
782 
783 		return IIO_VAL_INT;
784 
785 	default:
786 		return -EINVAL;
787 	}
788 }
789 
790 static int rpr0521_write_raw(struct iio_dev *indio_dev,
791 			     struct iio_chan_spec const *chan, int val,
792 			     int val2, long mask)
793 {
794 	struct rpr0521_data *data = iio_priv(indio_dev);
795 	int ret;
796 
797 	switch (mask) {
798 	case IIO_CHAN_INFO_SCALE:
799 		mutex_lock(&data->lock);
800 		ret = rpr0521_set_gain(data, chan->address, val, val2);
801 		mutex_unlock(&data->lock);
802 
803 		return ret;
804 
805 	case IIO_CHAN_INFO_SAMP_FREQ:
806 		mutex_lock(&data->lock);
807 		ret = rpr0521_write_samp_freq_common(data, chan->type,
808 						     val, val2);
809 		mutex_unlock(&data->lock);
810 
811 		return ret;
812 
813 	case IIO_CHAN_INFO_OFFSET:
814 		mutex_lock(&data->lock);
815 		ret = rpr0521_write_ps_offset(data, val);
816 		mutex_unlock(&data->lock);
817 
818 		return ret;
819 
820 	default:
821 		return -EINVAL;
822 	}
823 }
824 
825 static const struct iio_info rpr0521_info = {
826 	.read_raw	= rpr0521_read_raw,
827 	.write_raw	= rpr0521_write_raw,
828 	.attrs		= &rpr0521_attribute_group,
829 };
830 
831 static int rpr0521_init(struct rpr0521_data *data)
832 {
833 	int ret;
834 	int id;
835 
836 	ret = regmap_read(data->regmap, RPR0521_REG_ID, &id);
837 	if (ret < 0) {
838 		dev_err(&data->client->dev, "Failed to read REG_ID register\n");
839 		return ret;
840 	}
841 
842 	if (id != RPR0521_MANUFACT_ID) {
843 		dev_err(&data->client->dev, "Wrong id, got %x, expected %x\n",
844 			id, RPR0521_MANUFACT_ID);
845 		return -ENODEV;
846 	}
847 
848 	/* set default measurement time - 100 ms for both ALS and PS */
849 	ret = regmap_update_bits(data->regmap, RPR0521_REG_MODE_CTRL,
850 				 RPR0521_MODE_MEAS_TIME_MASK,
851 				 RPR0521_DEFAULT_MEAS_TIME);
852 	if (ret) {
853 		pr_err("regmap_update_bits returned %d\n", ret);
854 		return ret;
855 	}
856 
857 #ifndef CONFIG_PM
858 	ret = rpr0521_als_enable(data, RPR0521_MODE_ALS_ENABLE);
859 	if (ret < 0)
860 		return ret;
861 	ret = rpr0521_pxs_enable(data, RPR0521_MODE_PXS_ENABLE);
862 	if (ret < 0)
863 		return ret;
864 #endif
865 
866 	data->irq_timestamp = 0;
867 
868 	return 0;
869 }
870 
871 static int rpr0521_poweroff(struct rpr0521_data *data)
872 {
873 	int ret;
874 	int tmp;
875 
876 	ret = regmap_update_bits(data->regmap, RPR0521_REG_MODE_CTRL,
877 				 RPR0521_MODE_ALS_MASK |
878 				 RPR0521_MODE_PXS_MASK,
879 				 RPR0521_MODE_ALS_DISABLE |
880 				 RPR0521_MODE_PXS_DISABLE);
881 	if (ret < 0)
882 		return ret;
883 
884 	data->als_dev_en = false;
885 	data->pxs_dev_en = false;
886 
887 	/*
888 	 * Int pin keeps state after power off. Set pin to high impedance
889 	 * mode to prevent power drain.
890 	 */
891 	ret = regmap_read(data->regmap, RPR0521_REG_INTERRUPT, &tmp);
892 	if (ret) {
893 		dev_err(&data->client->dev, "Failed to reset int pin.\n");
894 		return ret;
895 	}
896 
897 	return 0;
898 }
899 
900 static bool rpr0521_is_volatile_reg(struct device *dev, unsigned int reg)
901 {
902 	switch (reg) {
903 	case RPR0521_REG_MODE_CTRL:
904 	case RPR0521_REG_ALS_CTRL:
905 	case RPR0521_REG_PXS_CTRL:
906 		return false;
907 	default:
908 		return true;
909 	}
910 }
911 
912 static const struct regmap_config rpr0521_regmap_config = {
913 	.name		= "rpr0521_regmap",
914 
915 	.reg_bits	= 8,
916 	.val_bits	= 8,
917 
918 	.max_register	= RPR0521_REG_ID,
919 	.cache_type	= REGCACHE_RBTREE,
920 	.volatile_reg	= rpr0521_is_volatile_reg,
921 };
922 
923 static int rpr0521_probe(struct i2c_client *client)
924 {
925 	struct rpr0521_data *data;
926 	struct iio_dev *indio_dev;
927 	struct regmap *regmap;
928 	int ret;
929 
930 	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
931 	if (!indio_dev)
932 		return -ENOMEM;
933 
934 	regmap = devm_regmap_init_i2c(client, &rpr0521_regmap_config);
935 	if (IS_ERR(regmap)) {
936 		dev_err(&client->dev, "regmap_init failed!\n");
937 		return PTR_ERR(regmap);
938 	}
939 
940 	data = iio_priv(indio_dev);
941 	i2c_set_clientdata(client, indio_dev);
942 	data->client = client;
943 	data->regmap = regmap;
944 
945 	mutex_init(&data->lock);
946 
947 	indio_dev->info = &rpr0521_info;
948 	indio_dev->name = RPR0521_DRV_NAME;
949 	indio_dev->channels = rpr0521_channels;
950 	indio_dev->num_channels = ARRAY_SIZE(rpr0521_channels);
951 	indio_dev->modes = INDIO_DIRECT_MODE;
952 
953 	ret = rpr0521_init(data);
954 	if (ret < 0) {
955 		dev_err(&client->dev, "rpr0521 chip init failed\n");
956 		return ret;
957 	}
958 
959 	ret = pm_runtime_set_active(&client->dev);
960 	if (ret < 0)
961 		goto err_poweroff;
962 
963 	pm_runtime_enable(&client->dev);
964 	pm_runtime_set_autosuspend_delay(&client->dev, RPR0521_SLEEP_DELAY_MS);
965 	pm_runtime_use_autosuspend(&client->dev);
966 
967 	/*
968 	 * If sensor write/read is needed in _probe after _use_autosuspend,
969 	 * sensor needs to be _resumed first using rpr0521_set_power_state().
970 	 */
971 
972 	/* IRQ to trigger setup */
973 	if (client->irq) {
974 		/* Trigger0 producer setup */
975 		data->drdy_trigger0 = devm_iio_trigger_alloc(
976 			indio_dev->dev.parent,
977 			"%s-dev%d", indio_dev->name, iio_device_id(indio_dev));
978 		if (!data->drdy_trigger0) {
979 			ret = -ENOMEM;
980 			goto err_pm_disable;
981 		}
982 		data->drdy_trigger0->ops = &rpr0521_trigger_ops;
983 		indio_dev->available_scan_masks = rpr0521_available_scan_masks;
984 		iio_trigger_set_drvdata(data->drdy_trigger0, indio_dev);
985 
986 		/* Ties irq to trigger producer handler. */
987 		ret = devm_request_threaded_irq(&client->dev, client->irq,
988 			rpr0521_drdy_irq_handler, rpr0521_drdy_irq_thread,
989 			IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
990 			"rpr0521_event", indio_dev);
991 		if (ret < 0) {
992 			dev_err(&client->dev, "request irq %d for trigger0 failed\n",
993 				client->irq);
994 			goto err_pm_disable;
995 			}
996 
997 		ret = devm_iio_trigger_register(indio_dev->dev.parent,
998 						data->drdy_trigger0);
999 		if (ret) {
1000 			dev_err(&client->dev, "iio trigger register failed\n");
1001 			goto err_pm_disable;
1002 		}
1003 
1004 		/*
1005 		 * Now whole pipe from physical interrupt (irq defined by
1006 		 * devicetree to device) to trigger0 output is set up.
1007 		 */
1008 
1009 		/* Trigger consumer setup */
1010 		ret = devm_iio_triggered_buffer_setup(indio_dev->dev.parent,
1011 			indio_dev,
1012 			iio_pollfunc_store_time,
1013 			rpr0521_trigger_consumer_handler,
1014 			&rpr0521_buffer_setup_ops);
1015 		if (ret < 0) {
1016 			dev_err(&client->dev, "iio triggered buffer setup failed\n");
1017 			goto err_pm_disable;
1018 		}
1019 	}
1020 
1021 	ret = iio_device_register(indio_dev);
1022 	if (ret)
1023 		goto err_pm_disable;
1024 
1025 	return 0;
1026 
1027 err_pm_disable:
1028 	pm_runtime_disable(&client->dev);
1029 	pm_runtime_set_suspended(&client->dev);
1030 err_poweroff:
1031 	rpr0521_poweroff(data);
1032 
1033 	return ret;
1034 }
1035 
1036 static void rpr0521_remove(struct i2c_client *client)
1037 {
1038 	struct iio_dev *indio_dev = i2c_get_clientdata(client);
1039 
1040 	iio_device_unregister(indio_dev);
1041 
1042 	pm_runtime_disable(&client->dev);
1043 	pm_runtime_set_suspended(&client->dev);
1044 
1045 	rpr0521_poweroff(iio_priv(indio_dev));
1046 }
1047 
1048 static int rpr0521_runtime_suspend(struct device *dev)
1049 {
1050 	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1051 	struct rpr0521_data *data = iio_priv(indio_dev);
1052 	int ret;
1053 
1054 	mutex_lock(&data->lock);
1055 	/* If measurements are enabled, enable them on resume */
1056 	if (!data->als_need_dis)
1057 		data->als_ps_need_en = data->als_dev_en;
1058 	if (!data->pxs_need_dis)
1059 		data->pxs_ps_need_en = data->pxs_dev_en;
1060 
1061 	/* disable channels and sets {als,pxs}_dev_en to false */
1062 	ret = rpr0521_poweroff(data);
1063 	regcache_mark_dirty(data->regmap);
1064 	mutex_unlock(&data->lock);
1065 
1066 	return ret;
1067 }
1068 
1069 static int rpr0521_runtime_resume(struct device *dev)
1070 {
1071 	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1072 	struct rpr0521_data *data = iio_priv(indio_dev);
1073 	int ret;
1074 
1075 	regcache_sync(data->regmap);
1076 	if (data->als_ps_need_en) {
1077 		ret = rpr0521_als_enable(data, RPR0521_MODE_ALS_ENABLE);
1078 		if (ret < 0)
1079 			return ret;
1080 		data->als_ps_need_en = false;
1081 	}
1082 
1083 	if (data->pxs_ps_need_en) {
1084 		ret = rpr0521_pxs_enable(data, RPR0521_MODE_PXS_ENABLE);
1085 		if (ret < 0)
1086 			return ret;
1087 		data->pxs_ps_need_en = false;
1088 	}
1089 	msleep(100);	//wait for first measurement result
1090 
1091 	return 0;
1092 }
1093 
1094 static const struct dev_pm_ops rpr0521_pm_ops = {
1095 	RUNTIME_PM_OPS(rpr0521_runtime_suspend, rpr0521_runtime_resume, NULL)
1096 };
1097 
1098 static const struct acpi_device_id rpr0521_acpi_match[] = {
1099 	{"RPR0521", 0},
1100 	{ }
1101 };
1102 MODULE_DEVICE_TABLE(acpi, rpr0521_acpi_match);
1103 
1104 static const struct i2c_device_id rpr0521_id[] = {
1105 	{ "rpr0521" },
1106 	{ }
1107 };
1108 
1109 MODULE_DEVICE_TABLE(i2c, rpr0521_id);
1110 
1111 static struct i2c_driver rpr0521_driver = {
1112 	.driver = {
1113 		.name	= RPR0521_DRV_NAME,
1114 		.pm	= pm_ptr(&rpr0521_pm_ops),
1115 		.acpi_match_table = rpr0521_acpi_match,
1116 	},
1117 	.probe		= rpr0521_probe,
1118 	.remove		= rpr0521_remove,
1119 	.id_table	= rpr0521_id,
1120 };
1121 
1122 module_i2c_driver(rpr0521_driver);
1123 
1124 MODULE_AUTHOR("Daniel Baluta <daniel.baluta@intel.com>");
1125 MODULE_DESCRIPTION("RPR0521 ROHM Ambient Light and Proximity Sensor driver");
1126 MODULE_LICENSE("GPL v2");
1127