• Linus Walleij's avatar
    iio: light: add driver for Capella CM3605 · 8afa505c
    Linus Walleij authored
    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: default avatarLinus Walleij <linus.walleij@linaro.org>
    Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
    8afa505c
cm3605.c 7.98 KB