lkml.org 
[lkml]   [2016]   [Apr]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3/5] max44000: Support controlling LED current output
    Date
    This is exposed as an output channel with "led" as an extend_name.

    Other sensors also have support for controlling an external LED. It's
    not clear that simply exposing an undecorated output channel is the
    correct approach.

    Signed-off-by: Crestez Dan Leonard <leonard.crestez@intel.com>
    ---
    drivers/iio/light/max44000.c | 53 ++++++++++++++++++++++++++++++++++++++++++++
    1 file changed, 53 insertions(+)

    diff --git a/drivers/iio/light/max44000.c b/drivers/iio/light/max44000.c
    index 10a0fe8..1dc10b9 100644
    --- a/drivers/iio/light/max44000.c
    +++ b/drivers/iio/light/max44000.c
    @@ -85,6 +85,13 @@ static const struct iio_chan_spec max44000_channels[] = {
    .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
    .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
    },
    + {
    + .type = IIO_CURRENT,
    + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
    + BIT(IIO_CHAN_INFO_SCALE),
    + .extend_name = "led",
    + .output = 1,
    + },
    };

    static inline int max44000_read_alsval(struct max44000_data *data)
    @@ -124,6 +131,20 @@ static inline int max44000_write_led_current_raw(struct max44000_data *data, int
    MAX44000_LED_CURRENT_MASK, val);
    }

    +static inline int max44000_read_led_current_raw(struct max44000_data *data)
    +{
    + unsigned int regval;
    + int ret;
    +
    + ret = regmap_read(data->regmap, MAX44000_REG_CFG_TX, &regval);
    + if (ret < 0)
    + return ret;
    + regval &= MAX44000_LED_CURRENT_MASK;
    + if (regval >= 8)
    + regval -= 4;
    + return regval;
    +}
    +
    static int max44000_read_raw(struct iio_dev *indio_dev,
    struct iio_chan_spec const *chan,
    int *val, int *val2, long mask)
    @@ -153,12 +174,26 @@ static int max44000_read_raw(struct iio_dev *indio_dev,
    *val = regval;
    return IIO_VAL_INT;

    + case IIO_CURRENT:
    + mutex_lock(&data->lock);
    + ret = max44000_read_led_current_raw(data);
    + mutex_unlock(&data->lock);
    + if (ret < 0)
    + return ret;
    + *val = ret;
    + return IIO_VAL_INT;
    +
    default:
    return -EINVAL;
    }

    case IIO_CHAN_INFO_SCALE:
    switch (chan->type) {
    + case IIO_CURRENT:
    + /* Output register is in 10s of miliamps */
    + *val = 10;
    + return IIO_VAL_INT;
    +
    case IIO_LIGHT:
    *val = 1;
    *val2 = MAX44000_ALS_TO_LUX_DEFAULT_FRACTION_LOG2;
    @@ -173,9 +208,27 @@ static int max44000_read_raw(struct iio_dev *indio_dev,
    }
    }

    +static int max44000_write_raw(struct iio_dev *indio_dev,
    + struct iio_chan_spec const *chan,
    + int val, int val2, long mask)
    +{
    + struct max44000_data *data = iio_priv(indio_dev);
    + int ret;
    +
    + if (mask == IIO_CHAN_INFO_RAW && chan->type == IIO_CURRENT) {
    + mutex_lock(&data->lock);
    + ret = max44000_write_led_current_raw(data, val);
    + mutex_unlock(&data->lock);
    + return ret;
    + }
    +
    + return -EINVAL;
    +}
    +
    static const struct iio_info max44000_info = {
    .driver_module = THIS_MODULE,
    .read_raw = max44000_read_raw,
    + .write_raw = max44000_write_raw,
    };

    static bool max44000_readable_reg(struct device *dev, unsigned int reg)
    --
    2.8.0.rc3
    \
     
     \ /
      Last update: 2016-04-07 18:41    [W:4.224 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site