OpenCloudOS-Kernel/drivers/iio/light
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
..
Kconfig iio: light: add driver for Capella CM3605 2016-12-30 17:17:39 +00:00
Makefile iio: light: add driver for Capella CM3605 2016-12-30 17:17:39 +00:00
acpi-als.c iio:core: timestamping clock selection support 2016-06-30 19:41:38 +01:00
adjd_s311.c iio:core: timestamping clock selection support 2016-06-30 19:41:38 +01:00
al3320a.c iio: Add Dyna-Image AL3320A ambient light sensor driver 2014-09-10 20:25:56 +01:00
apds9300.c iio:core: timestamping clock selection support 2016-06-30 19:41:38 +01:00
apds9960.c iio:core: timestamping clock selection support 2016-06-30 19:41:38 +01:00
bh1750.c iio: convert to common i2c_check_functionality() return value 2016-02-27 17:17:43 +00:00
bh1780.c iio: light: bh1780: assign a static name 2016-05-29 19:51:29 +01:00
cm3232.c iio: light: fix improper return value 2016-12-04 10:56:26 +00:00
cm3323.c Merge 4.2-rc3 into staging-next 2015-07-20 13:21:28 -07:00
cm3605.c iio: light: add driver for Capella CM3605 2016-12-30 17:17:39 +00:00
cm32181.c iio: Export OF module alias information in missing drivers 2015-08-02 16:36:00 +01:00
cm36651.c iio:core: timestamping clock selection support 2016-06-30 19:41:38 +01:00
gp2ap020a00f.c iio:core: timestamping clock selection support 2016-06-30 19:41:38 +01:00
hid-sensor-als.c iio: light: hid-sensor-als: Add duplicate IIO_LIGHT channel 2016-12-30 17:06:34 +00:00
hid-sensor-prox.c iio: light: hid-sensor-prox: Fit assignment in one line 2015-06-14 15:03:53 +01:00
isl29018.c staging: iio: isl29018: move out of staging 2016-10-23 19:33:56 +01:00
isl29125.c drivers:iio:light:isl29125: added macros for sensing range 2016-07-03 10:19:54 +01:00
jsa1212.c iio: light: jsa1212: remove unneeded i2c check functionality test 2016-05-21 20:18:05 +01:00
lm3533-als.c iio:core: timestamping clock selection support 2016-06-30 19:41:38 +01:00
ltr501.c iio: light: ltr501: claim direct mode during raw writes 2016-10-23 19:34:08 +01:00
max44000.c drivers: iio: light: Fix sparse warnings 2016-09-27 20:33:01 +01:00
opt3001.c iio:core: timestamping clock selection support 2016-06-30 19:41:38 +01:00
pa12203001.c iio: light: pa12203001: Poweroff chip if register fails 2015-11-08 15:34:40 +00:00
rpr0521.c iio: Reconcile operation order between iio_register/unregister and pm functions 2015-11-08 15:36:53 +00:00
si1145.c iio: light: Add driver for Silabs si1132, si1141/2/3 and si1145/6/7 ambient light, uv index and proximity sensors 2016-09-18 19:56:39 +01:00
stk3310.c iio:core: timestamping clock selection support 2016-06-30 19:41:38 +01:00
tcs3414.c iio:core: timestamping clock selection support 2016-06-30 19:41:38 +01:00
tcs3472.c iio:core: timestamping clock selection support 2016-06-30 19:41:38 +01:00
tsl2563.c iio:core: timestamping clock selection support 2016-06-30 19:41:38 +01:00
tsl2583.c iio: tsl2583: make array large enough 2016-11-24 20:09:55 +00:00
tsl4531.c iio: tsl4531: fix error handling in tsl4531_check_id() 2015-08-31 16:29:52 +01:00
us5182d.c iio: light: us5182d: Add missing error code assignment before test 2016-08-15 16:49:43 +01:00
vcnl4000.c iio: light: vcnl4000: Add missing locking 2016-07-10 14:44:06 +01:00
veml6070.c iio: Add Vishay VEML6070 UV A light sensor driver 2016-04-19 19:58:16 +01:00