Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.6.
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * MAX44000 Ambient and Infrared Proximity Sensor
  4 *
  5 * Copyright (c) 2016, Intel Corporation.
  6 *
  7 * Data sheet: https://datasheets.maximintegrated.com/en/ds/MAX44000.pdf
  8 *
  9 * 7-bit I2C slave address 0x4a
 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/util_macros.h>
 17#include <linux/iio/iio.h>
 18#include <linux/iio/sysfs.h>
 19#include <linux/iio/buffer.h>
 20#include <linux/iio/trigger_consumer.h>
 21#include <linux/iio/triggered_buffer.h>
 22#include <linux/acpi.h>
 23
 24#define MAX44000_DRV_NAME		"max44000"
 25
 26/* Registers in datasheet order */
 27#define MAX44000_REG_STATUS		0x00
 28#define MAX44000_REG_CFG_MAIN		0x01
 29#define MAX44000_REG_CFG_RX		0x02
 30#define MAX44000_REG_CFG_TX		0x03
 31#define MAX44000_REG_ALS_DATA_HI	0x04
 32#define MAX44000_REG_ALS_DATA_LO	0x05
 33#define MAX44000_REG_PRX_DATA		0x16
 34#define MAX44000_REG_ALS_UPTHR_HI	0x06
 35#define MAX44000_REG_ALS_UPTHR_LO	0x07
 36#define MAX44000_REG_ALS_LOTHR_HI	0x08
 37#define MAX44000_REG_ALS_LOTHR_LO	0x09
 38#define MAX44000_REG_PST		0x0a
 39#define MAX44000_REG_PRX_IND		0x0b
 40#define MAX44000_REG_PRX_THR		0x0c
 41#define MAX44000_REG_TRIM_GAIN_GREEN	0x0f
 42#define MAX44000_REG_TRIM_GAIN_IR	0x10
 43
 44/* REG_CFG bits */
 45#define MAX44000_CFG_ALSINTE            0x01
 46#define MAX44000_CFG_PRXINTE            0x02
 47#define MAX44000_CFG_MASK               0x1c
 48#define MAX44000_CFG_MODE_SHUTDOWN      0x00
 49#define MAX44000_CFG_MODE_ALS_GIR       0x04
 50#define MAX44000_CFG_MODE_ALS_G         0x08
 51#define MAX44000_CFG_MODE_ALS_IR        0x0c
 52#define MAX44000_CFG_MODE_ALS_PRX       0x10
 53#define MAX44000_CFG_MODE_PRX           0x14
 54#define MAX44000_CFG_TRIM               0x20
 55
 56/*
 57 * Upper 4 bits are not documented but start as 1 on powerup
 58 * Setting them to 0 causes proximity to misbehave so set them to 1
 59 */
 60#define MAX44000_REG_CFG_RX_DEFAULT 0xf0
 61
 62/* REG_RX bits */
 63#define MAX44000_CFG_RX_ALSTIM_MASK	0x0c
 64#define MAX44000_CFG_RX_ALSTIM_SHIFT	2
 65#define MAX44000_CFG_RX_ALSPGA_MASK	0x03
 66#define MAX44000_CFG_RX_ALSPGA_SHIFT	0
 67
 68/* REG_TX bits */
 69#define MAX44000_LED_CURRENT_MASK	0xf
 70#define MAX44000_LED_CURRENT_MAX	11
 71#define MAX44000_LED_CURRENT_DEFAULT	6
 72
 73#define MAX44000_ALSDATA_OVERFLOW	0x4000
 74
 75struct max44000_data {
 76	struct mutex lock;
 77	struct regmap *regmap;
 78};
 79
 80/* Default scale is set to the minimum of 0.03125 or 1 / (1 << 5) lux */
 81#define MAX44000_ALS_TO_LUX_DEFAULT_FRACTION_LOG2 5
 82
 83/* Scale can be multiplied by up to 128x via ALSPGA for measurement gain */
 84static const int max44000_alspga_shift[] = {0, 2, 4, 7};
 85#define MAX44000_ALSPGA_MAX_SHIFT 7
 86
 87/*
 88 * Scale can be multiplied by up to 64x via ALSTIM because of lost resolution
 89 *
 90 * This scaling factor is hidden from userspace and instead accounted for when
 91 * reading raw values from the device.
 92 *
 93 * This makes it possible to cleanly expose ALSPGA as IIO_CHAN_INFO_SCALE and
 94 * ALSTIM as IIO_CHAN_INFO_INT_TIME without the values affecting each other.
 95 *
 96 * Handling this internally is also required for buffer support because the
 97 * channel's scan_type can't be modified dynamically.
 98 */
 99#define MAX44000_ALSTIM_SHIFT(alstim) (2 * (alstim))
100
101/* Available integration times with pretty manual alignment: */
102static const int max44000_int_time_avail_ns_array[] = {
103	   100000000,
104	    25000000,
105	     6250000,
106	     1562500,
107};
108static const char max44000_int_time_avail_str[] =
109	"0.100 "
110	"0.025 "
111	"0.00625 "
112	"0.0015625";
113
114/* Available scales (internal to ulux) with pretty manual alignment: */
115static const int max44000_scale_avail_ulux_array[] = {
116	    31250,
117	   125000,
118	   500000,
119	  4000000,
120};
121static const char max44000_scale_avail_str[] =
122	"0.03125 "
123	"0.125 "
124	"0.5 "
125	 "4";
126
127#define MAX44000_SCAN_INDEX_ALS 0
128#define MAX44000_SCAN_INDEX_PRX 1
129
130static const struct iio_chan_spec max44000_channels[] = {
131	{
132		.type = IIO_LIGHT,
133		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
134		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |
135					    BIT(IIO_CHAN_INFO_INT_TIME),
136		.scan_index = MAX44000_SCAN_INDEX_ALS,
137		.scan_type = {
138			.sign		= 'u',
139			.realbits	= 14,
140			.storagebits	= 16,
141		}
142	},
143	{
144		.type = IIO_PROXIMITY,
145		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
146		.scan_index = MAX44000_SCAN_INDEX_PRX,
147		.scan_type = {
148			.sign		= 'u',
149			.realbits	= 8,
150			.storagebits	= 16,
151		}
152	},
153	IIO_CHAN_SOFT_TIMESTAMP(2),
154	{
155		.type = IIO_CURRENT,
156		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
157				      BIT(IIO_CHAN_INFO_SCALE),
158		.extend_name = "led",
159		.output = 1,
160		.scan_index = -1,
161	},
162};
163
164static int max44000_read_alstim(struct max44000_data *data)
165{
166	unsigned int val;
167	int ret;
168
169	ret = regmap_read(data->regmap, MAX44000_REG_CFG_RX, &val);
170	if (ret < 0)
171		return ret;
172	return (val & MAX44000_CFG_RX_ALSTIM_MASK) >> MAX44000_CFG_RX_ALSTIM_SHIFT;
173}
174
175static int max44000_write_alstim(struct max44000_data *data, int val)
176{
177	return regmap_write_bits(data->regmap, MAX44000_REG_CFG_RX,
178				 MAX44000_CFG_RX_ALSTIM_MASK,
179				 val << MAX44000_CFG_RX_ALSTIM_SHIFT);
180}
181
182static int max44000_read_alspga(struct max44000_data *data)
183{
184	unsigned int val;
185	int ret;
186
187	ret = regmap_read(data->regmap, MAX44000_REG_CFG_RX, &val);
188	if (ret < 0)
189		return ret;
190	return (val & MAX44000_CFG_RX_ALSPGA_MASK) >> MAX44000_CFG_RX_ALSPGA_SHIFT;
191}
192
193static int max44000_write_alspga(struct max44000_data *data, int val)
194{
195	return regmap_write_bits(data->regmap, MAX44000_REG_CFG_RX,
196				 MAX44000_CFG_RX_ALSPGA_MASK,
197				 val << MAX44000_CFG_RX_ALSPGA_SHIFT);
198}
199
200static int max44000_read_alsval(struct max44000_data *data)
201{
202	u16 regval;
203	__be16 val;
204	int alstim, ret;
205
206	ret = regmap_bulk_read(data->regmap, MAX44000_REG_ALS_DATA_HI,
207			       &val, sizeof(val));
208	if (ret < 0)
209		return ret;
210	alstim = ret = max44000_read_alstim(data);
211	if (ret < 0)
212		return ret;
213
214	regval = be16_to_cpu(val);
215
216	/*
217	 * Overflow is explained on datasheet page 17.
218	 *
219	 * It's a warning that either the G or IR channel has become saturated
220	 * and that the value in the register is likely incorrect.
221	 *
222	 * The recommendation is to change the scale (ALSPGA).
223	 * The driver just returns the max representable value.
224	 */
225	if (regval & MAX44000_ALSDATA_OVERFLOW)
226		return 0x3FFF;
227
228	return regval << MAX44000_ALSTIM_SHIFT(alstim);
229}
230
231static int max44000_write_led_current_raw(struct max44000_data *data, int val)
232{
233	/* Maybe we should clamp the value instead? */
234	if (val < 0 || val > MAX44000_LED_CURRENT_MAX)
235		return -ERANGE;
236	if (val >= 8)
237		val += 4;
238	return regmap_write_bits(data->regmap, MAX44000_REG_CFG_TX,
239				 MAX44000_LED_CURRENT_MASK, val);
240}
241
242static int max44000_read_led_current_raw(struct max44000_data *data)
243{
244	unsigned int regval;
245	int ret;
246
247	ret = regmap_read(data->regmap, MAX44000_REG_CFG_TX, &regval);
248	if (ret < 0)
249		return ret;
250	regval &= MAX44000_LED_CURRENT_MASK;
251	if (regval >= 8)
252		regval -= 4;
253	return regval;
254}
255
256static int max44000_read_raw(struct iio_dev *indio_dev,
257			     struct iio_chan_spec const *chan,
258			     int *val, int *val2, long mask)
259{
260	struct max44000_data *data = iio_priv(indio_dev);
261	int alstim, alspga;
262	unsigned int regval;
263	int ret;
264
265	switch (mask) {
266	case IIO_CHAN_INFO_RAW:
267		switch (chan->type) {
268		case IIO_LIGHT:
269			mutex_lock(&data->lock);
270			ret = max44000_read_alsval(data);
271			mutex_unlock(&data->lock);
272			if (ret < 0)
273				return ret;
274			*val = ret;
275			return IIO_VAL_INT;
276
277		case IIO_PROXIMITY:
278			mutex_lock(&data->lock);
279			ret = regmap_read(data->regmap, MAX44000_REG_PRX_DATA, &regval);
280			mutex_unlock(&data->lock);
281			if (ret < 0)
282				return ret;
283			*val = regval;
284			return IIO_VAL_INT;
285
286		case IIO_CURRENT:
287			mutex_lock(&data->lock);
288			ret = max44000_read_led_current_raw(data);
289			mutex_unlock(&data->lock);
290			if (ret < 0)
291				return ret;
292			*val = ret;
293			return IIO_VAL_INT;
294
295		default:
296			return -EINVAL;
297		}
298
299	case IIO_CHAN_INFO_SCALE:
300		switch (chan->type) {
301		case IIO_CURRENT:
302			/* Output register is in 10s of miliamps */
303			*val = 10;
304			return IIO_VAL_INT;
305
306		case IIO_LIGHT:
307			mutex_lock(&data->lock);
308			alspga = ret = max44000_read_alspga(data);
309			mutex_unlock(&data->lock);
310			if (ret < 0)
311				return ret;
312
313			/* Avoid negative shifts */
314			*val = (1 << MAX44000_ALSPGA_MAX_SHIFT);
315			*val2 = MAX44000_ALS_TO_LUX_DEFAULT_FRACTION_LOG2
316					+ MAX44000_ALSPGA_MAX_SHIFT
317					- max44000_alspga_shift[alspga];
318			return IIO_VAL_FRACTIONAL_LOG2;
319
320		default:
321			return -EINVAL;
322		}
323
324	case IIO_CHAN_INFO_INT_TIME:
325		mutex_lock(&data->lock);
326		alstim = ret = max44000_read_alstim(data);
327		mutex_unlock(&data->lock);
328
329		if (ret < 0)
330			return ret;
331		*val = 0;
332		*val2 = max44000_int_time_avail_ns_array[alstim];
333		return IIO_VAL_INT_PLUS_NANO;
334
335	default:
336		return -EINVAL;
337	}
338}
339
340static int max44000_write_raw(struct iio_dev *indio_dev,
341			      struct iio_chan_spec const *chan,
342			      int val, int val2, long mask)
343{
344	struct max44000_data *data = iio_priv(indio_dev);
345	int ret;
346
347	if (mask == IIO_CHAN_INFO_RAW && chan->type == IIO_CURRENT) {
348		mutex_lock(&data->lock);
349		ret = max44000_write_led_current_raw(data, val);
350		mutex_unlock(&data->lock);
351		return ret;
352	} else if (mask == IIO_CHAN_INFO_INT_TIME && chan->type == IIO_LIGHT) {
353		s64 valns = val * NSEC_PER_SEC + val2;
354		int alstim = find_closest_descending(valns,
355				max44000_int_time_avail_ns_array,
356				ARRAY_SIZE(max44000_int_time_avail_ns_array));
357		mutex_lock(&data->lock);
358		ret = max44000_write_alstim(data, alstim);
359		mutex_unlock(&data->lock);
360		return ret;
361	} else if (mask == IIO_CHAN_INFO_SCALE && chan->type == IIO_LIGHT) {
362		s64 valus = val * USEC_PER_SEC + val2;
363		int alspga = find_closest(valus,
364				max44000_scale_avail_ulux_array,
365				ARRAY_SIZE(max44000_scale_avail_ulux_array));
366		mutex_lock(&data->lock);
367		ret = max44000_write_alspga(data, alspga);
368		mutex_unlock(&data->lock);
369		return ret;
370	}
371
372	return -EINVAL;
373}
374
375static int max44000_write_raw_get_fmt(struct iio_dev *indio_dev,
376				      struct iio_chan_spec const *chan,
377				      long mask)
378{
379	if (mask == IIO_CHAN_INFO_INT_TIME && chan->type == IIO_LIGHT)
380		return IIO_VAL_INT_PLUS_NANO;
381	else if (mask == IIO_CHAN_INFO_SCALE && chan->type == IIO_LIGHT)
382		return IIO_VAL_INT_PLUS_MICRO;
383	else
384		return IIO_VAL_INT;
385}
386
387static IIO_CONST_ATTR(illuminance_integration_time_available, max44000_int_time_avail_str);
388static IIO_CONST_ATTR(illuminance_scale_available, max44000_scale_avail_str);
389
390static struct attribute *max44000_attributes[] = {
391	&iio_const_attr_illuminance_integration_time_available.dev_attr.attr,
392	&iio_const_attr_illuminance_scale_available.dev_attr.attr,
393	NULL
394};
395
396static const struct attribute_group max44000_attribute_group = {
397	.attrs = max44000_attributes,
398};
399
400static const struct iio_info max44000_info = {
401	.read_raw		= max44000_read_raw,
402	.write_raw		= max44000_write_raw,
403	.write_raw_get_fmt	= max44000_write_raw_get_fmt,
404	.attrs			= &max44000_attribute_group,
405};
406
407static bool max44000_readable_reg(struct device *dev, unsigned int reg)
408{
409	switch (reg) {
410	case MAX44000_REG_STATUS:
411	case MAX44000_REG_CFG_MAIN:
412	case MAX44000_REG_CFG_RX:
413	case MAX44000_REG_CFG_TX:
414	case MAX44000_REG_ALS_DATA_HI:
415	case MAX44000_REG_ALS_DATA_LO:
416	case MAX44000_REG_PRX_DATA:
417	case MAX44000_REG_ALS_UPTHR_HI:
418	case MAX44000_REG_ALS_UPTHR_LO:
419	case MAX44000_REG_ALS_LOTHR_HI:
420	case MAX44000_REG_ALS_LOTHR_LO:
421	case MAX44000_REG_PST:
422	case MAX44000_REG_PRX_IND:
423	case MAX44000_REG_PRX_THR:
424	case MAX44000_REG_TRIM_GAIN_GREEN:
425	case MAX44000_REG_TRIM_GAIN_IR:
426		return true;
427	default:
428		return false;
429	}
430}
431
432static bool max44000_writeable_reg(struct device *dev, unsigned int reg)
433{
434	switch (reg) {
435	case MAX44000_REG_CFG_MAIN:
436	case MAX44000_REG_CFG_RX:
437	case MAX44000_REG_CFG_TX:
438	case MAX44000_REG_ALS_UPTHR_HI:
439	case MAX44000_REG_ALS_UPTHR_LO:
440	case MAX44000_REG_ALS_LOTHR_HI:
441	case MAX44000_REG_ALS_LOTHR_LO:
442	case MAX44000_REG_PST:
443	case MAX44000_REG_PRX_IND:
444	case MAX44000_REG_PRX_THR:
445	case MAX44000_REG_TRIM_GAIN_GREEN:
446	case MAX44000_REG_TRIM_GAIN_IR:
447		return true;
448	default:
449		return false;
450	}
451}
452
453static bool max44000_volatile_reg(struct device *dev, unsigned int reg)
454{
455	switch (reg) {
456	case MAX44000_REG_STATUS:
457	case MAX44000_REG_ALS_DATA_HI:
458	case MAX44000_REG_ALS_DATA_LO:
459	case MAX44000_REG_PRX_DATA:
460		return true;
461	default:
462		return false;
463	}
464}
465
466static bool max44000_precious_reg(struct device *dev, unsigned int reg)
467{
468	return reg == MAX44000_REG_STATUS;
469}
470
471static const struct regmap_config max44000_regmap_config = {
472	.reg_bits		= 8,
473	.val_bits		= 8,
474
475	.max_register		= MAX44000_REG_PRX_DATA,
476	.readable_reg		= max44000_readable_reg,
477	.writeable_reg		= max44000_writeable_reg,
478	.volatile_reg		= max44000_volatile_reg,
479	.precious_reg		= max44000_precious_reg,
480
481	.use_single_read	= true,
482	.use_single_write	= true,
483	.cache_type		= REGCACHE_RBTREE,
484};
485
486static irqreturn_t max44000_trigger_handler(int irq, void *p)
487{
488	struct iio_poll_func *pf = p;
489	struct iio_dev *indio_dev = pf->indio_dev;
490	struct max44000_data *data = iio_priv(indio_dev);
491	u16 buf[8]; /* 2x u16 + padding + 8 bytes timestamp */
492	int index = 0;
493	unsigned int regval;
494	int ret;
495
496	mutex_lock(&data->lock);
497	if (test_bit(MAX44000_SCAN_INDEX_ALS, indio_dev->active_scan_mask)) {
498		ret = max44000_read_alsval(data);
499		if (ret < 0)
500			goto out_unlock;
501		buf[index++] = ret;
502	}
503	if (test_bit(MAX44000_SCAN_INDEX_PRX, indio_dev->active_scan_mask)) {
504		ret = regmap_read(data->regmap, MAX44000_REG_PRX_DATA, &regval);
505		if (ret < 0)
506			goto out_unlock;
507		buf[index] = regval;
508	}
509	mutex_unlock(&data->lock);
510
511	iio_push_to_buffers_with_timestamp(indio_dev, buf,
512					   iio_get_time_ns(indio_dev));
513	iio_trigger_notify_done(indio_dev->trig);
514	return IRQ_HANDLED;
515
516out_unlock:
517	mutex_unlock(&data->lock);
518	iio_trigger_notify_done(indio_dev->trig);
519	return IRQ_HANDLED;
520}
521
522static int max44000_probe(struct i2c_client *client,
523			  const struct i2c_device_id *id)
524{
525	struct max44000_data *data;
526	struct iio_dev *indio_dev;
527	int ret, reg;
528
529	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
530	if (!indio_dev)
531		return -ENOMEM;
532	data = iio_priv(indio_dev);
533	data->regmap = devm_regmap_init_i2c(client, &max44000_regmap_config);
534	if (IS_ERR(data->regmap)) {
535		dev_err(&client->dev, "regmap_init failed!\n");
536		return PTR_ERR(data->regmap);
537	}
538
539	i2c_set_clientdata(client, indio_dev);
540	mutex_init(&data->lock);
541	indio_dev->dev.parent = &client->dev;
542	indio_dev->info = &max44000_info;
543	indio_dev->name = MAX44000_DRV_NAME;
544	indio_dev->channels = max44000_channels;
545	indio_dev->num_channels = ARRAY_SIZE(max44000_channels);
546
547	/*
548	 * The device doesn't have a reset function so we just clear some
549	 * important bits at probe time to ensure sane operation.
550	 *
551	 * Since we don't support interrupts/events the threshold values are
552	 * not important. We also don't touch trim values.
553	 */
554
555	/* Reset ALS scaling bits */
556	ret = regmap_write(data->regmap, MAX44000_REG_CFG_RX,
557			   MAX44000_REG_CFG_RX_DEFAULT);
558	if (ret < 0) {
559		dev_err(&client->dev, "failed to write default CFG_RX: %d\n",
560			ret);
561		return ret;
562	}
563
564	/*
565	 * By default the LED pulse used for the proximity sensor is disabled.
566	 * Set a middle value so that we get some sort of valid data by default.
567	 */
568	ret = max44000_write_led_current_raw(data, MAX44000_LED_CURRENT_DEFAULT);
569	if (ret < 0) {
570		dev_err(&client->dev, "failed to write init config: %d\n", ret);
571		return ret;
572	}
573
574	/* Reset CFG bits to ALS_PRX mode which allows easy reading of both values. */
575	reg = MAX44000_CFG_TRIM | MAX44000_CFG_MODE_ALS_PRX;
576	ret = regmap_write(data->regmap, MAX44000_REG_CFG_MAIN, reg);
577	if (ret < 0) {
578		dev_err(&client->dev, "failed to write init config: %d\n", ret);
579		return ret;
580	}
581
582	/* Read status at least once to clear any stale interrupt bits. */
583	ret = regmap_read(data->regmap, MAX44000_REG_STATUS, &reg);
584	if (ret < 0) {
585		dev_err(&client->dev, "failed to read init status: %d\n", ret);
586		return ret;
587	}
588
589	ret = iio_triggered_buffer_setup(indio_dev, NULL, max44000_trigger_handler, NULL);
590	if (ret < 0) {
591		dev_err(&client->dev, "iio triggered buffer setup failed\n");
592		return ret;
593	}
594
595	return iio_device_register(indio_dev);
596}
597
598static int max44000_remove(struct i2c_client *client)
599{
600	struct iio_dev *indio_dev = i2c_get_clientdata(client);
601
602	iio_device_unregister(indio_dev);
603	iio_triggered_buffer_cleanup(indio_dev);
604
605	return 0;
606}
607
608static const struct i2c_device_id max44000_id[] = {
609	{"max44000", 0},
610	{ }
611};
612MODULE_DEVICE_TABLE(i2c, max44000_id);
613
614#ifdef CONFIG_ACPI
615static const struct acpi_device_id max44000_acpi_match[] = {
616	{"MAX44000", 0},
617	{ }
618};
619MODULE_DEVICE_TABLE(acpi, max44000_acpi_match);
620#endif
621
622static struct i2c_driver max44000_driver = {
623	.driver = {
624		.name	= MAX44000_DRV_NAME,
625		.acpi_match_table = ACPI_PTR(max44000_acpi_match),
626	},
627	.probe		= max44000_probe,
628	.remove		= max44000_remove,
629	.id_table	= max44000_id,
630};
631
632module_i2c_driver(max44000_driver);
633
634MODULE_AUTHOR("Crestez Dan Leonard <leonard.crestez@intel.com>");
635MODULE_DESCRIPTION("MAX44000 Ambient and Infrared Proximity Sensor");
636MODULE_LICENSE("GPL v2");