linux/drivers/iio
Linus Walleij 8afa505c12 iio: light: add driver for Capella CM3605
This adds a driver for the Capella Microsystems CM3605 Ambient
Light Sensor and proximity sensor. This is a pretty simple entirely
analog device that is interfaced with the target system using
the POUT (proximity out) and AOUT (ambient light out) signals.

The POUT signal is a simple high/low signal that indicates whether
an object is in proximity, most typically used to detect a face
in front of a mobile device. The signal requires that an infrared
LED is mounted next to the device, making IR light reflect off
the object in proximity and triggering the POUT signal. We grab
a GPIO pin to handle the POUT signal as an interrupt line and
register this as an event channel for the sensor.

Since the proximity sensor requires an IR LED, we add a LED trigger
named "cm3605" so that the infrared LED can just associate with
this trigger to be sure it is always on when the proximity sensor
needs it.

The AOUT is an analog voltage between 0 and 1550 mV that indicate
the LUX value in the ambient light: this is orthogonal to the
proximity sensor functionality. Since this analog voltage needs
to be converted into a digital value, the driver grabs an IIO
channel named "aout" associated with the device.

This patch created a combined ALS and proximity sensor driver.
The former supports raw reads of the LUX value and the latter
will generate proximity events.

To integrate this properly with Linux we also add a supply
regulator for the VDD pin (driving both functions) and add device
tree bindings to define the RSET resistor that in turn configures
the luminosity range of the ALS sensor.

Since the sensor needs to be on more or less constantly, we
restrict the power management to system suspend/resume: we
disable the IR LED and disable the regulator for VDD on suspend
and take them back up on resume.

Tests:
cd /sys/bus/iio/devices/iio:device1
cat in_illuminance_raw
304
(hold hand over sensor)
cat in_illuminance_raw
17
iio_event_monitor cm3605
Found IIO device with name cm3605 with device number 1
(hold hand over sensor)
Event: time: 2444842301447, type: proximity, channel: 0,
  evtype: thresh, direction: falling
(remove hand over sensor)
Event: time: 2445583440706, type: proximity, channel: 0,
  evtype: thresh, direction: rising

Cc: Capella Microsystems <capellamicro@gmail.com>
Cc: Kevin Tsai <ktsai@capellamicro.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
2016-12-30 17:17:39 +00:00
..
accel iio: accel: hid-sensor-accel-3d: Add timestamp 2016-12-03 10:06:13 +00:00
adc iio: adc: spmi-vadc: Changes to support different scaling 2016-12-10 17:28:21 +00:00
amplifiers
buffer iio: add resource managed triggered buffer init helpers 2016-09-04 15:42:46 +01:00
chemical iio:chemical:atlas-ph-sensor: Fix use of 32 bit int to hold 16 bit big endian value 2016-10-23 22:18:27 +01:00
common iio: accel: hid-sensor-accel-3d: Add timestamp 2016-12-03 10:06:13 +00:00
counter iio: 104-quad-8: Add IIO support for the ACCES 104-QUAD-8 2016-10-01 17:06:21 +01:00
dac iio: dpot-dac: DAC driver based on a digital potentiometer 2016-11-13 13:07:15 +00:00
dummy iio:core: timestamping clock selection support 2016-06-30 19:41:38 +01:00
frequency iio: frequency: ad9523: use unsigned int rather then bare unsigned 2016-04-17 10:31:03 +01:00
gyro iio: gyro: st_gyro: inline per-sensor data 2016-11-12 15:38:09 +00:00
health First round of IIO new device support, features and cleanups for the 4.8 cycle. 2016-06-09 09:15:58 -07:00
humidity iio: humidity: Support acpi probe for hts211 2016-12-03 08:56:28 +00:00
imu iio: bmi160: Add of device table for spi 2016-12-30 10:38:19 +00:00
light iio: light: add driver for Capella CM3605 2016-12-30 17:17:39 +00:00
magnetometer iio: magnetometer: separate the values of attributes based on their usage type for HID compass sensor 2016-11-24 20:41:30 +00:00
orientation iio: orientation: hid-sensor-rotation: Add PM function (fix non working driver) 2016-11-05 17:47:47 +00:00
potentiometer iio: mcp4531: provide range of available raw values 2016-11-13 11:40:26 +00:00
potentiostat iio: potentiostat: add LMP91000 support 2016-09-27 20:33:03 +01:00
pressure iio: st_pressure: Export sampling frequency for lps25h and lps331ap 2016-12-30 11:33:56 +00:00
proximity iio: proximity: pulsedlight-lidar-lite-v2: cleanup power management 2016-10-23 19:34:26 +01:00
temperature iio: maxim_thermocouple: detect invalid storage size in read() 2016-11-13 10:08:32 +01:00
trigger iio:trigger: Experimental kthread tight loop trigger (thread only) 2016-06-03 13:18:44 +01:00
iio_core_trigger.h
iio_core.h iio:core: timestamping clock selection support 2016-06-30 19:41:38 +01:00
industrialio-buffer.c iio: Use kmalloc_array() in iio_scan_mask_set() 2016-09-24 16:35:24 +01:00
industrialio-configfs.c
industrialio-core.c iio:core: add a callback to allow drivers to provide _available attributes 2016-11-13 11:40:25 +00:00
industrialio-event.c iio: iio_push_event(): Don't crash if the event interface is not registered 2016-09-10 16:40:44 +01:00
industrialio-sw-device.c iio: Add support for creating IIO devices via configfs 2016-05-04 11:43:54 +01:00
industrialio-sw-trigger.c
industrialio-trigger.c iio:trigger: Add helper function to verify that a trigger belongs to the same device 2016-09-27 20:32:55 +01:00
industrialio-triggered-event.c
inkern.c iio: inkern: add helpers to query available values from channels 2016-11-13 11:40:26 +00:00
Kconfig iio: 104-quad-8: Add IIO support for the ACCES 104-QUAD-8 2016-10-01 17:06:21 +01:00
Makefile iio: 104-quad-8: Add IIO support for the ACCES 104-QUAD-8 2016-10-01 17:06:21 +01:00