diff options
author | Crestez Dan Leonard <leonard.crestez@intel.com> | 2016-04-18 10:31:55 -0400 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2016-04-24 05:21:32 -0400 |
commit | 237a378b3bde0b3c1d1c47f7a3982c86a6728cdf (patch) | |
tree | a65ed36e50f16c93f83d61755b9b05d87eca3d0e /drivers/iio | |
parent | 35b651f391909c80d705533d3e0f7228d42b98a0 (diff) |
max44000: Support controlling LED current output
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>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Diffstat (limited to 'drivers/iio')
-rw-r--r-- | drivers/iio/light/max44000.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/drivers/iio/light/max44000.c b/drivers/iio/light/max44000.c index 4bce7e152f9c..f0f1a8a6c615 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[] = { | |||
85 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), | 85 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), |
86 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | 86 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), |
87 | }, | 87 | }, |
88 | { | ||
89 | .type = IIO_CURRENT, | ||
90 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | | ||
91 | BIT(IIO_CHAN_INFO_SCALE), | ||
92 | .extend_name = "led", | ||
93 | .output = 1, | ||
94 | }, | ||
88 | }; | 95 | }; |
89 | 96 | ||
90 | static int max44000_read_alsval(struct max44000_data *data) | 97 | static int max44000_read_alsval(struct max44000_data *data) |
@@ -125,6 +132,20 @@ static int max44000_write_led_current_raw(struct max44000_data *data, int val) | |||
125 | MAX44000_LED_CURRENT_MASK, val); | 132 | MAX44000_LED_CURRENT_MASK, val); |
126 | } | 133 | } |
127 | 134 | ||
135 | static int max44000_read_led_current_raw(struct max44000_data *data) | ||
136 | { | ||
137 | unsigned int regval; | ||
138 | int ret; | ||
139 | |||
140 | ret = regmap_read(data->regmap, MAX44000_REG_CFG_TX, ®val); | ||
141 | if (ret < 0) | ||
142 | return ret; | ||
143 | regval &= MAX44000_LED_CURRENT_MASK; | ||
144 | if (regval >= 8) | ||
145 | regval -= 4; | ||
146 | return regval; | ||
147 | } | ||
148 | |||
128 | static int max44000_read_raw(struct iio_dev *indio_dev, | 149 | static int max44000_read_raw(struct iio_dev *indio_dev, |
129 | struct iio_chan_spec const *chan, | 150 | struct iio_chan_spec const *chan, |
130 | int *val, int *val2, long mask) | 151 | int *val, int *val2, long mask) |
@@ -154,12 +175,26 @@ static int max44000_read_raw(struct iio_dev *indio_dev, | |||
154 | *val = regval; | 175 | *val = regval; |
155 | return IIO_VAL_INT; | 176 | return IIO_VAL_INT; |
156 | 177 | ||
178 | case IIO_CURRENT: | ||
179 | mutex_lock(&data->lock); | ||
180 | ret = max44000_read_led_current_raw(data); | ||
181 | mutex_unlock(&data->lock); | ||
182 | if (ret < 0) | ||
183 | return ret; | ||
184 | *val = ret; | ||
185 | return IIO_VAL_INT; | ||
186 | |||
157 | default: | 187 | default: |
158 | return -EINVAL; | 188 | return -EINVAL; |
159 | } | 189 | } |
160 | 190 | ||
161 | case IIO_CHAN_INFO_SCALE: | 191 | case IIO_CHAN_INFO_SCALE: |
162 | switch (chan->type) { | 192 | switch (chan->type) { |
193 | case IIO_CURRENT: | ||
194 | /* Output register is in 10s of miliamps */ | ||
195 | *val = 10; | ||
196 | return IIO_VAL_INT; | ||
197 | |||
163 | case IIO_LIGHT: | 198 | case IIO_LIGHT: |
164 | *val = 1; | 199 | *val = 1; |
165 | *val2 = MAX44000_ALS_TO_LUX_DEFAULT_FRACTION_LOG2; | 200 | *val2 = MAX44000_ALS_TO_LUX_DEFAULT_FRACTION_LOG2; |
@@ -174,9 +209,27 @@ static int max44000_read_raw(struct iio_dev *indio_dev, | |||
174 | } | 209 | } |
175 | } | 210 | } |
176 | 211 | ||
212 | static int max44000_write_raw(struct iio_dev *indio_dev, | ||
213 | struct iio_chan_spec const *chan, | ||
214 | int val, int val2, long mask) | ||
215 | { | ||
216 | struct max44000_data *data = iio_priv(indio_dev); | ||
217 | int ret; | ||
218 | |||
219 | if (mask == IIO_CHAN_INFO_RAW && chan->type == IIO_CURRENT) { | ||
220 | mutex_lock(&data->lock); | ||
221 | ret = max44000_write_led_current_raw(data, val); | ||
222 | mutex_unlock(&data->lock); | ||
223 | return ret; | ||
224 | } | ||
225 | |||
226 | return -EINVAL; | ||
227 | } | ||
228 | |||
177 | static const struct iio_info max44000_info = { | 229 | static const struct iio_info max44000_info = { |
178 | .driver_module = THIS_MODULE, | 230 | .driver_module = THIS_MODULE, |
179 | .read_raw = max44000_read_raw, | 231 | .read_raw = max44000_read_raw, |
232 | .write_raw = max44000_write_raw, | ||
180 | }; | 233 | }; |
181 | 234 | ||
182 | static bool max44000_readable_reg(struct device *dev, unsigned int reg) | 235 | static bool max44000_readable_reg(struct device *dev, unsigned int reg) |