aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iio
diff options
context:
space:
mode:
authorCrestez Dan Leonard <leonard.crestez@intel.com>2016-04-18 10:31:55 -0400
committerJonathan Cameron <jic23@kernel.org>2016-04-24 05:21:32 -0400
commit237a378b3bde0b3c1d1c47f7a3982c86a6728cdf (patch)
treea65ed36e50f16c93f83d61755b9b05d87eca3d0e /drivers/iio
parent35b651f391909c80d705533d3e0f7228d42b98a0 (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.c53
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
90static int max44000_read_alsval(struct max44000_data *data) 97static 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
135static 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, &regval);
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
128static int max44000_read_raw(struct iio_dev *indio_dev, 149static 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
212static 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
177static const struct iio_info max44000_info = { 229static 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
182static bool max44000_readable_reg(struct device *dev, unsigned int reg) 235static bool max44000_readable_reg(struct device *dev, unsigned int reg)