xref: /linux/drivers/iio/light/rpr0521.c (revision 0d5ec7919f3747193f051036b2301734a4b5e1d6)
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 
rpr0521_als_enable(struct rpr0521_data * data,u8 status)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 
rpr0521_pxs_enable(struct rpr0521_data * data,u8 status)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  */
rpr0521_set_power_state(struct rpr0521_data * data,bool on,u8 device_mask)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 		pm_runtime_mark_last_busy(&data->client->dev);
365 		ret = pm_runtime_put_autosuspend(&data->client->dev);
366 	}
367 	if (ret < 0) {
368 		dev_err(&data->client->dev,
369 			"Failed: rpr0521_set_power_state for %d, ret %d\n",
370 			on, ret);
371 		return ret;
372 	}
373 
374 	if (on) {
375 		/* If _resume() was not called, enable measurement now. */
376 		if (data->als_ps_need_en) {
377 			ret = rpr0521_als_enable(data, RPR0521_MODE_ALS_ENABLE);
378 			if (ret)
379 				return ret;
380 			data->als_ps_need_en = false;
381 		}
382 
383 		if (data->pxs_ps_need_en) {
384 			ret = rpr0521_pxs_enable(data, RPR0521_MODE_PXS_ENABLE);
385 			if (ret)
386 				return ret;
387 			data->pxs_ps_need_en = false;
388 		}
389 	}
390 #endif
391 	return 0;
392 }
393 
394 /* Interrupt register tells if this sensor caused the interrupt or not. */
rpr0521_is_triggered(struct rpr0521_data * data)395 static inline bool rpr0521_is_triggered(struct rpr0521_data *data)
396 {
397 	int ret;
398 	int reg;
399 
400 	ret = regmap_read(data->regmap, RPR0521_REG_INTERRUPT, &reg);
401 	if (ret < 0)
402 		return false;   /* Reg read failed. */
403 	if (reg &
404 	    (RPR0521_INTERRUPT_ALS_INT_STATUS_MASK |
405 	    RPR0521_INTERRUPT_PS_INT_STATUS_MASK))
406 		return true;
407 	else
408 		return false;   /* Int not from this sensor. */
409 }
410 
411 /* IRQ to trigger handler */
rpr0521_drdy_irq_handler(int irq,void * private)412 static irqreturn_t rpr0521_drdy_irq_handler(int irq, void *private)
413 {
414 	struct iio_dev *indio_dev = private;
415 	struct rpr0521_data *data = iio_priv(indio_dev);
416 
417 	data->irq_timestamp = iio_get_time_ns(indio_dev);
418 	/*
419 	 * We need to wake the thread to read the interrupt reg. It
420 	 * is not possible to do that here because regmap_read takes a
421 	 * mutex.
422 	 */
423 
424 	return IRQ_WAKE_THREAD;
425 }
426 
rpr0521_drdy_irq_thread(int irq,void * private)427 static irqreturn_t rpr0521_drdy_irq_thread(int irq, void *private)
428 {
429 	struct iio_dev *indio_dev = private;
430 	struct rpr0521_data *data = iio_priv(indio_dev);
431 
432 	if (rpr0521_is_triggered(data)) {
433 		iio_trigger_poll_nested(data->drdy_trigger0);
434 		return IRQ_HANDLED;
435 	}
436 
437 	return IRQ_NONE;
438 }
439 
rpr0521_trigger_consumer_handler(int irq,void * p)440 static irqreturn_t rpr0521_trigger_consumer_handler(int irq, void *p)
441 {
442 	struct iio_poll_func *pf = p;
443 	struct iio_dev *indio_dev = pf->indio_dev;
444 	struct rpr0521_data *data = iio_priv(indio_dev);
445 	int err;
446 
447 	/* Use irq timestamp when reasonable. */
448 	if (iio_trigger_using_own(indio_dev) && data->irq_timestamp) {
449 		pf->timestamp = data->irq_timestamp;
450 		data->irq_timestamp = 0;
451 	}
452 	/* Other chained trigger polls get timestamp only here. */
453 	if (!pf->timestamp)
454 		pf->timestamp = iio_get_time_ns(indio_dev);
455 
456 	err = regmap_bulk_read(data->regmap, RPR0521_REG_PXS_DATA,
457 		data->scan.channels,
458 		(3 * 2) + 1);	/* 3 * 16-bit + (discarded) int clear reg. */
459 	if (!err)
460 		iio_push_to_buffers_with_timestamp(indio_dev,
461 						   &data->scan, pf->timestamp);
462 	else
463 		dev_err(&data->client->dev,
464 			"Trigger consumer can't read from sensor.\n");
465 	pf->timestamp = 0;
466 
467 	iio_trigger_notify_done(indio_dev->trig);
468 
469 	return IRQ_HANDLED;
470 }
471 
rpr0521_write_int_enable(struct rpr0521_data * data)472 static int rpr0521_write_int_enable(struct rpr0521_data *data)
473 {
474 	int err;
475 
476 	/* Interrupt after each measurement */
477 	err = regmap_update_bits(data->regmap, RPR0521_REG_PXS_CTRL,
478 		RPR0521_PXS_PERSISTENCE_MASK,
479 		RPR0521_PXS_PERSISTENCE_DRDY);
480 	if (err) {
481 		dev_err(&data->client->dev, "PS control reg write fail.\n");
482 		return -EBUSY;
483 		}
484 
485 	/* Ignore latch and mode because of drdy */
486 	err = regmap_write(data->regmap, RPR0521_REG_INTERRUPT,
487 		RPR0521_INTERRUPT_INT_REASSERT_DISABLE |
488 		RPR0521_INTERRUPT_INT_TRIG_ALS_DISABLE |
489 		RPR0521_INTERRUPT_INT_TRIG_PS_ENABLE
490 		);
491 	if (err) {
492 		dev_err(&data->client->dev, "Interrupt setup write fail.\n");
493 		return -EBUSY;
494 		}
495 
496 	return 0;
497 }
498 
rpr0521_write_int_disable(struct rpr0521_data * data)499 static int rpr0521_write_int_disable(struct rpr0521_data *data)
500 {
501 	/* Don't care of clearing mode, assert and latch. */
502 	return regmap_write(data->regmap, RPR0521_REG_INTERRUPT,
503 				RPR0521_INTERRUPT_INT_TRIG_ALS_DISABLE |
504 				RPR0521_INTERRUPT_INT_TRIG_PS_DISABLE
505 				);
506 }
507 
508 /*
509  * Trigger producer enable / disable. Note that there will be trigs only when
510  * measurement data is ready to be read.
511  */
rpr0521_pxs_drdy_set_state(struct iio_trigger * trigger,bool enable_drdy)512 static int rpr0521_pxs_drdy_set_state(struct iio_trigger *trigger,
513 	bool enable_drdy)
514 {
515 	struct iio_dev *indio_dev = iio_trigger_get_drvdata(trigger);
516 	struct rpr0521_data *data = iio_priv(indio_dev);
517 	int err;
518 
519 	if (enable_drdy)
520 		err = rpr0521_write_int_enable(data);
521 	else
522 		err = rpr0521_write_int_disable(data);
523 	if (err)
524 		dev_err(&data->client->dev, "rpr0521_pxs_drdy_set_state failed\n");
525 
526 	return err;
527 }
528 
529 static const struct iio_trigger_ops rpr0521_trigger_ops = {
530 	.set_trigger_state = rpr0521_pxs_drdy_set_state,
531 	};
532 
533 
rpr0521_buffer_preenable(struct iio_dev * indio_dev)534 static int rpr0521_buffer_preenable(struct iio_dev *indio_dev)
535 {
536 	int err;
537 	struct rpr0521_data *data = iio_priv(indio_dev);
538 
539 	mutex_lock(&data->lock);
540 	err = rpr0521_set_power_state(data, true,
541 		(RPR0521_MODE_PXS_MASK | RPR0521_MODE_ALS_MASK));
542 	mutex_unlock(&data->lock);
543 	if (err)
544 		dev_err(&data->client->dev, "_buffer_preenable fail\n");
545 
546 	return err;
547 }
548 
rpr0521_buffer_postdisable(struct iio_dev * indio_dev)549 static int rpr0521_buffer_postdisable(struct iio_dev *indio_dev)
550 {
551 	int err;
552 	struct rpr0521_data *data = iio_priv(indio_dev);
553 
554 	mutex_lock(&data->lock);
555 	err = rpr0521_set_power_state(data, false,
556 		(RPR0521_MODE_PXS_MASK | RPR0521_MODE_ALS_MASK));
557 	mutex_unlock(&data->lock);
558 	if (err)
559 		dev_err(&data->client->dev, "_buffer_postdisable fail\n");
560 
561 	return err;
562 }
563 
564 static const struct iio_buffer_setup_ops rpr0521_buffer_setup_ops = {
565 	.preenable = rpr0521_buffer_preenable,
566 	.postdisable = rpr0521_buffer_postdisable,
567 };
568 
rpr0521_get_gain(struct rpr0521_data * data,int chan,int * val,int * val2)569 static int rpr0521_get_gain(struct rpr0521_data *data, int chan,
570 			    int *val, int *val2)
571 {
572 	int ret, reg, idx;
573 
574 	ret = regmap_read(data->regmap, rpr0521_gain[chan].reg, &reg);
575 	if (ret < 0)
576 		return ret;
577 
578 	idx = (rpr0521_gain[chan].mask & reg) >> rpr0521_gain[chan].shift;
579 	*val = rpr0521_gain[chan].gain[idx].scale;
580 	*val2 = rpr0521_gain[chan].gain[idx].uscale;
581 
582 	return 0;
583 }
584 
rpr0521_set_gain(struct rpr0521_data * data,int chan,int val,int val2)585 static int rpr0521_set_gain(struct rpr0521_data *data, int chan,
586 			    int val, int val2)
587 {
588 	int i, idx = -EINVAL;
589 
590 	/* get gain index */
591 	for (i = 0; i < rpr0521_gain[chan].size; i++)
592 		if (val == rpr0521_gain[chan].gain[i].scale &&
593 		    val2 == rpr0521_gain[chan].gain[i].uscale) {
594 			idx = i;
595 			break;
596 		}
597 
598 	if (idx < 0)
599 		return idx;
600 
601 	return regmap_update_bits(data->regmap, rpr0521_gain[chan].reg,
602 				  rpr0521_gain[chan].mask,
603 				  idx << rpr0521_gain[chan].shift);
604 }
605 
rpr0521_read_samp_freq(struct rpr0521_data * data,enum iio_chan_type chan_type,int * val,int * val2)606 static int rpr0521_read_samp_freq(struct rpr0521_data *data,
607 				enum iio_chan_type chan_type,
608 			    int *val, int *val2)
609 {
610 	int reg, ret;
611 
612 	ret = regmap_read(data->regmap, RPR0521_REG_MODE_CTRL, &reg);
613 	if (ret < 0)
614 		return ret;
615 
616 	reg &= RPR0521_MODE_MEAS_TIME_MASK;
617 	if (reg >= ARRAY_SIZE(rpr0521_samp_freq_i))
618 		return -EINVAL;
619 
620 	switch (chan_type) {
621 	case IIO_INTENSITY:
622 		*val = rpr0521_samp_freq_i[reg].als_hz;
623 		*val2 = rpr0521_samp_freq_i[reg].als_uhz;
624 		return 0;
625 
626 	case IIO_PROXIMITY:
627 		*val = rpr0521_samp_freq_i[reg].pxs_hz;
628 		*val2 = rpr0521_samp_freq_i[reg].pxs_uhz;
629 		return 0;
630 
631 	default:
632 		return -EINVAL;
633 	}
634 }
635 
rpr0521_write_samp_freq_common(struct rpr0521_data * data,enum iio_chan_type chan_type,int val,int val2)636 static int rpr0521_write_samp_freq_common(struct rpr0521_data *data,
637 				enum iio_chan_type chan_type,
638 				int val, int val2)
639 {
640 	int i;
641 
642 	/*
643 	 * Ignore channel
644 	 * both pxs and als are setup only to same freq because of simplicity
645 	 */
646 	switch (val) {
647 	case 0:
648 		i = 0;
649 		break;
650 
651 	case 2:
652 		if (val2 != 500000)
653 			return -EINVAL;
654 
655 		i = 11;
656 		break;
657 
658 	case 10:
659 		i = 6;
660 		break;
661 
662 	default:
663 		return -EINVAL;
664 	}
665 
666 	return regmap_update_bits(data->regmap,
667 		RPR0521_REG_MODE_CTRL,
668 		RPR0521_MODE_MEAS_TIME_MASK,
669 		i);
670 }
671 
rpr0521_read_ps_offset(struct rpr0521_data * data,int * offset)672 static int rpr0521_read_ps_offset(struct rpr0521_data *data, int *offset)
673 {
674 	int ret;
675 	__le16 buffer;
676 
677 	ret = regmap_bulk_read(data->regmap,
678 		RPR0521_REG_PS_OFFSET_LSB, &buffer, sizeof(buffer));
679 
680 	if (ret < 0) {
681 		dev_err(&data->client->dev, "Failed to read PS OFFSET register\n");
682 		return ret;
683 	}
684 	*offset = le16_to_cpu(buffer);
685 
686 	return ret;
687 }
688 
rpr0521_write_ps_offset(struct rpr0521_data * data,int offset)689 static int rpr0521_write_ps_offset(struct rpr0521_data *data, int offset)
690 {
691 	int ret;
692 	__le16 buffer;
693 
694 	buffer = cpu_to_le16(offset & 0x3ff);
695 	ret = regmap_raw_write(data->regmap,
696 		RPR0521_REG_PS_OFFSET_LSB, &buffer, sizeof(buffer));
697 
698 	if (ret < 0) {
699 		dev_err(&data->client->dev, "Failed to write PS OFFSET register\n");
700 		return ret;
701 	}
702 
703 	return ret;
704 }
705 
rpr0521_read_info_raw(struct rpr0521_data * data,struct iio_chan_spec const * chan,int * val)706 static int rpr0521_read_info_raw(struct rpr0521_data *data,
707 				 struct iio_chan_spec const *chan,
708 				 int *val)
709 {
710 	u8 device_mask;
711 	__le16 raw_data;
712 	int ret;
713 
714 	device_mask = rpr0521_data_reg[chan->address].device_mask;
715 
716 	guard(mutex)(&data->lock);
717 	ret = rpr0521_set_power_state(data, true, device_mask);
718 	if (ret < 0)
719 		return ret;
720 
721 	ret = regmap_bulk_read(data->regmap,
722 			       rpr0521_data_reg[chan->address].address,
723 			       &raw_data, sizeof(raw_data));
724 	if (ret < 0) {
725 		rpr0521_set_power_state(data, false, device_mask);
726 		return ret;
727 	}
728 
729 	ret = rpr0521_set_power_state(data, false, device_mask);
730 	if (ret < 0)
731 		return ret;
732 
733 	*val = le16_to_cpu(raw_data);
734 
735 	return 0;
736 }
737 
rpr0521_read_raw(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,int * val,int * val2,long mask)738 static int rpr0521_read_raw(struct iio_dev *indio_dev,
739 			    struct iio_chan_spec const *chan, int *val,
740 			    int *val2, long mask)
741 {
742 	struct rpr0521_data *data = iio_priv(indio_dev);
743 	int ret;
744 
745 	switch (mask) {
746 	case IIO_CHAN_INFO_RAW:
747 		if (chan->type != IIO_INTENSITY && chan->type != IIO_PROXIMITY)
748 			return -EINVAL;
749 
750 		if (!iio_device_claim_direct(indio_dev))
751 			return -EBUSY;
752 
753 		ret = rpr0521_read_info_raw(data, chan, val);
754 		iio_device_release_direct(indio_dev);
755 		if (ret < 0)
756 			return ret;
757 
758 		return IIO_VAL_INT;
759 
760 	case IIO_CHAN_INFO_SCALE:
761 		mutex_lock(&data->lock);
762 		ret = rpr0521_get_gain(data, chan->address, val, val2);
763 		mutex_unlock(&data->lock);
764 		if (ret < 0)
765 			return ret;
766 
767 		return IIO_VAL_INT_PLUS_MICRO;
768 
769 	case IIO_CHAN_INFO_SAMP_FREQ:
770 		mutex_lock(&data->lock);
771 		ret = rpr0521_read_samp_freq(data, chan->type, val, val2);
772 		mutex_unlock(&data->lock);
773 		if (ret < 0)
774 			return ret;
775 
776 		return IIO_VAL_INT_PLUS_MICRO;
777 
778 	case IIO_CHAN_INFO_OFFSET:
779 		mutex_lock(&data->lock);
780 		ret = rpr0521_read_ps_offset(data, val);
781 		mutex_unlock(&data->lock);
782 		if (ret < 0)
783 			return ret;
784 
785 		return IIO_VAL_INT;
786 
787 	default:
788 		return -EINVAL;
789 	}
790 }
791 
rpr0521_write_raw(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,int val,int val2,long mask)792 static int rpr0521_write_raw(struct iio_dev *indio_dev,
793 			     struct iio_chan_spec const *chan, int val,
794 			     int val2, long mask)
795 {
796 	struct rpr0521_data *data = iio_priv(indio_dev);
797 	int ret;
798 
799 	switch (mask) {
800 	case IIO_CHAN_INFO_SCALE:
801 		mutex_lock(&data->lock);
802 		ret = rpr0521_set_gain(data, chan->address, val, val2);
803 		mutex_unlock(&data->lock);
804 
805 		return ret;
806 
807 	case IIO_CHAN_INFO_SAMP_FREQ:
808 		mutex_lock(&data->lock);
809 		ret = rpr0521_write_samp_freq_common(data, chan->type,
810 						     val, val2);
811 		mutex_unlock(&data->lock);
812 
813 		return ret;
814 
815 	case IIO_CHAN_INFO_OFFSET:
816 		mutex_lock(&data->lock);
817 		ret = rpr0521_write_ps_offset(data, val);
818 		mutex_unlock(&data->lock);
819 
820 		return ret;
821 
822 	default:
823 		return -EINVAL;
824 	}
825 }
826 
827 static const struct iio_info rpr0521_info = {
828 	.read_raw	= rpr0521_read_raw,
829 	.write_raw	= rpr0521_write_raw,
830 	.attrs		= &rpr0521_attribute_group,
831 };
832 
rpr0521_init(struct rpr0521_data * data)833 static int rpr0521_init(struct rpr0521_data *data)
834 {
835 	int ret;
836 	int id;
837 
838 	ret = regmap_read(data->regmap, RPR0521_REG_ID, &id);
839 	if (ret < 0) {
840 		dev_err(&data->client->dev, "Failed to read REG_ID register\n");
841 		return ret;
842 	}
843 
844 	if (id != RPR0521_MANUFACT_ID) {
845 		dev_err(&data->client->dev, "Wrong id, got %x, expected %x\n",
846 			id, RPR0521_MANUFACT_ID);
847 		return -ENODEV;
848 	}
849 
850 	/* set default measurement time - 100 ms for both ALS and PS */
851 	ret = regmap_update_bits(data->regmap, RPR0521_REG_MODE_CTRL,
852 				 RPR0521_MODE_MEAS_TIME_MASK,
853 				 RPR0521_DEFAULT_MEAS_TIME);
854 	if (ret) {
855 		pr_err("regmap_update_bits returned %d\n", ret);
856 		return ret;
857 	}
858 
859 #ifndef CONFIG_PM
860 	ret = rpr0521_als_enable(data, RPR0521_MODE_ALS_ENABLE);
861 	if (ret < 0)
862 		return ret;
863 	ret = rpr0521_pxs_enable(data, RPR0521_MODE_PXS_ENABLE);
864 	if (ret < 0)
865 		return ret;
866 #endif
867 
868 	data->irq_timestamp = 0;
869 
870 	return 0;
871 }
872 
rpr0521_poweroff(struct rpr0521_data * data)873 static int rpr0521_poweroff(struct rpr0521_data *data)
874 {
875 	int ret;
876 	int tmp;
877 
878 	ret = regmap_update_bits(data->regmap, RPR0521_REG_MODE_CTRL,
879 				 RPR0521_MODE_ALS_MASK |
880 				 RPR0521_MODE_PXS_MASK,
881 				 RPR0521_MODE_ALS_DISABLE |
882 				 RPR0521_MODE_PXS_DISABLE);
883 	if (ret < 0)
884 		return ret;
885 
886 	data->als_dev_en = false;
887 	data->pxs_dev_en = false;
888 
889 	/*
890 	 * Int pin keeps state after power off. Set pin to high impedance
891 	 * mode to prevent power drain.
892 	 */
893 	ret = regmap_read(data->regmap, RPR0521_REG_INTERRUPT, &tmp);
894 	if (ret) {
895 		dev_err(&data->client->dev, "Failed to reset int pin.\n");
896 		return ret;
897 	}
898 
899 	return 0;
900 }
901 
rpr0521_is_volatile_reg(struct device * dev,unsigned int reg)902 static bool rpr0521_is_volatile_reg(struct device *dev, unsigned int reg)
903 {
904 	switch (reg) {
905 	case RPR0521_REG_MODE_CTRL:
906 	case RPR0521_REG_ALS_CTRL:
907 	case RPR0521_REG_PXS_CTRL:
908 		return false;
909 	default:
910 		return true;
911 	}
912 }
913 
914 static const struct regmap_config rpr0521_regmap_config = {
915 	.name		= "rpr0521_regmap",
916 
917 	.reg_bits	= 8,
918 	.val_bits	= 8,
919 
920 	.max_register	= RPR0521_REG_ID,
921 	.cache_type	= REGCACHE_RBTREE,
922 	.volatile_reg	= rpr0521_is_volatile_reg,
923 };
924 
rpr0521_probe(struct i2c_client * client)925 static int rpr0521_probe(struct i2c_client *client)
926 {
927 	struct rpr0521_data *data;
928 	struct iio_dev *indio_dev;
929 	struct regmap *regmap;
930 	int ret;
931 
932 	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
933 	if (!indio_dev)
934 		return -ENOMEM;
935 
936 	regmap = devm_regmap_init_i2c(client, &rpr0521_regmap_config);
937 	if (IS_ERR(regmap)) {
938 		dev_err(&client->dev, "regmap_init failed!\n");
939 		return PTR_ERR(regmap);
940 	}
941 
942 	data = iio_priv(indio_dev);
943 	i2c_set_clientdata(client, indio_dev);
944 	data->client = client;
945 	data->regmap = regmap;
946 
947 	mutex_init(&data->lock);
948 
949 	indio_dev->info = &rpr0521_info;
950 	indio_dev->name = RPR0521_DRV_NAME;
951 	indio_dev->channels = rpr0521_channels;
952 	indio_dev->num_channels = ARRAY_SIZE(rpr0521_channels);
953 	indio_dev->modes = INDIO_DIRECT_MODE;
954 
955 	ret = rpr0521_init(data);
956 	if (ret < 0) {
957 		dev_err(&client->dev, "rpr0521 chip init failed\n");
958 		return ret;
959 	}
960 
961 	ret = pm_runtime_set_active(&client->dev);
962 	if (ret < 0)
963 		goto err_poweroff;
964 
965 	pm_runtime_enable(&client->dev);
966 	pm_runtime_set_autosuspend_delay(&client->dev, RPR0521_SLEEP_DELAY_MS);
967 	pm_runtime_use_autosuspend(&client->dev);
968 
969 	/*
970 	 * If sensor write/read is needed in _probe after _use_autosuspend,
971 	 * sensor needs to be _resumed first using rpr0521_set_power_state().
972 	 */
973 
974 	/* IRQ to trigger setup */
975 	if (client->irq) {
976 		/* Trigger0 producer setup */
977 		data->drdy_trigger0 = devm_iio_trigger_alloc(
978 			indio_dev->dev.parent,
979 			"%s-dev%d", indio_dev->name, iio_device_id(indio_dev));
980 		if (!data->drdy_trigger0) {
981 			ret = -ENOMEM;
982 			goto err_pm_disable;
983 		}
984 		data->drdy_trigger0->ops = &rpr0521_trigger_ops;
985 		indio_dev->available_scan_masks = rpr0521_available_scan_masks;
986 		iio_trigger_set_drvdata(data->drdy_trigger0, indio_dev);
987 
988 		/* Ties irq to trigger producer handler. */
989 		ret = devm_request_threaded_irq(&client->dev, client->irq,
990 			rpr0521_drdy_irq_handler, rpr0521_drdy_irq_thread,
991 			IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
992 			"rpr0521_event", indio_dev);
993 		if (ret < 0) {
994 			dev_err(&client->dev, "request irq %d for trigger0 failed\n",
995 				client->irq);
996 			goto err_pm_disable;
997 			}
998 
999 		ret = devm_iio_trigger_register(indio_dev->dev.parent,
1000 						data->drdy_trigger0);
1001 		if (ret) {
1002 			dev_err(&client->dev, "iio trigger register failed\n");
1003 			goto err_pm_disable;
1004 		}
1005 
1006 		/*
1007 		 * Now whole pipe from physical interrupt (irq defined by
1008 		 * devicetree to device) to trigger0 output is set up.
1009 		 */
1010 
1011 		/* Trigger consumer setup */
1012 		ret = devm_iio_triggered_buffer_setup(indio_dev->dev.parent,
1013 			indio_dev,
1014 			iio_pollfunc_store_time,
1015 			rpr0521_trigger_consumer_handler,
1016 			&rpr0521_buffer_setup_ops);
1017 		if (ret < 0) {
1018 			dev_err(&client->dev, "iio triggered buffer setup failed\n");
1019 			goto err_pm_disable;
1020 		}
1021 	}
1022 
1023 	ret = iio_device_register(indio_dev);
1024 	if (ret)
1025 		goto err_pm_disable;
1026 
1027 	return 0;
1028 
1029 err_pm_disable:
1030 	pm_runtime_disable(&client->dev);
1031 	pm_runtime_set_suspended(&client->dev);
1032 err_poweroff:
1033 	rpr0521_poweroff(data);
1034 
1035 	return ret;
1036 }
1037 
rpr0521_remove(struct i2c_client * client)1038 static void rpr0521_remove(struct i2c_client *client)
1039 {
1040 	struct iio_dev *indio_dev = i2c_get_clientdata(client);
1041 
1042 	iio_device_unregister(indio_dev);
1043 
1044 	pm_runtime_disable(&client->dev);
1045 	pm_runtime_set_suspended(&client->dev);
1046 
1047 	rpr0521_poweroff(iio_priv(indio_dev));
1048 }
1049 
rpr0521_runtime_suspend(struct device * dev)1050 static int rpr0521_runtime_suspend(struct device *dev)
1051 {
1052 	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1053 	struct rpr0521_data *data = iio_priv(indio_dev);
1054 	int ret;
1055 
1056 	mutex_lock(&data->lock);
1057 	/* If measurements are enabled, enable them on resume */
1058 	if (!data->als_need_dis)
1059 		data->als_ps_need_en = data->als_dev_en;
1060 	if (!data->pxs_need_dis)
1061 		data->pxs_ps_need_en = data->pxs_dev_en;
1062 
1063 	/* disable channels and sets {als,pxs}_dev_en to false */
1064 	ret = rpr0521_poweroff(data);
1065 	regcache_mark_dirty(data->regmap);
1066 	mutex_unlock(&data->lock);
1067 
1068 	return ret;
1069 }
1070 
rpr0521_runtime_resume(struct device * dev)1071 static int rpr0521_runtime_resume(struct device *dev)
1072 {
1073 	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1074 	struct rpr0521_data *data = iio_priv(indio_dev);
1075 	int ret;
1076 
1077 	regcache_sync(data->regmap);
1078 	if (data->als_ps_need_en) {
1079 		ret = rpr0521_als_enable(data, RPR0521_MODE_ALS_ENABLE);
1080 		if (ret < 0)
1081 			return ret;
1082 		data->als_ps_need_en = false;
1083 	}
1084 
1085 	if (data->pxs_ps_need_en) {
1086 		ret = rpr0521_pxs_enable(data, RPR0521_MODE_PXS_ENABLE);
1087 		if (ret < 0)
1088 			return ret;
1089 		data->pxs_ps_need_en = false;
1090 	}
1091 	msleep(100);	//wait for first measurement result
1092 
1093 	return 0;
1094 }
1095 
1096 static const struct dev_pm_ops rpr0521_pm_ops = {
1097 	RUNTIME_PM_OPS(rpr0521_runtime_suspend, rpr0521_runtime_resume, NULL)
1098 };
1099 
1100 static const struct acpi_device_id rpr0521_acpi_match[] = {
1101 	{"RPR0521", 0},
1102 	{ }
1103 };
1104 MODULE_DEVICE_TABLE(acpi, rpr0521_acpi_match);
1105 
1106 static const struct i2c_device_id rpr0521_id[] = {
1107 	{ "rpr0521" },
1108 	{ }
1109 };
1110 
1111 MODULE_DEVICE_TABLE(i2c, rpr0521_id);
1112 
1113 static struct i2c_driver rpr0521_driver = {
1114 	.driver = {
1115 		.name	= RPR0521_DRV_NAME,
1116 		.pm	= pm_ptr(&rpr0521_pm_ops),
1117 		.acpi_match_table = rpr0521_acpi_match,
1118 	},
1119 	.probe		= rpr0521_probe,
1120 	.remove		= rpr0521_remove,
1121 	.id_table	= rpr0521_id,
1122 };
1123 
1124 module_i2c_driver(rpr0521_driver);
1125 
1126 MODULE_AUTHOR("Daniel Baluta <daniel.baluta@intel.com>");
1127 MODULE_DESCRIPTION("RPR0521 ROHM Ambient Light and Proximity Sensor driver");
1128 MODULE_LICENSE("GPL v2");
1129