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