diff options
author | Adriana Reus <adriana.reus@intel.com> | 2015-11-24 05:59:50 -0500 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2015-12-02 13:42:04 -0500 |
commit | a22a3c5c40deb31f03c2810a46e669bedbf476c5 (patch) | |
tree | 58779476bc1afcdf98f6d4ea6ecef88c9597af57 | |
parent | 023e30fb0d3a3b9d6b8dc9e47590aa544d58a22f (diff) |
iio: light: us5182d: Add functions for selectively enabling als and proximity
Keep track of the als and px enabled/disabled status in
order to enable them selectively.
Signed-off-by: Adriana Reus <adriana.reus@intel.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
-rw-r--r-- | drivers/iio/light/us5182d.c | 66 |
1 files changed, 62 insertions, 4 deletions
diff --git a/drivers/iio/light/us5182d.c b/drivers/iio/light/us5182d.c index 855f183ba216..e67956c1f296 100644 --- a/drivers/iio/light/us5182d.c +++ b/drivers/iio/light/us5182d.c | |||
@@ -119,6 +119,9 @@ struct us5182d_data { | |||
119 | u8 opmode; | 119 | u8 opmode; |
120 | u8 power_mode; | 120 | u8 power_mode; |
121 | 121 | ||
122 | bool als_enabled; | ||
123 | bool px_enabled; | ||
124 | |||
122 | bool default_continuous; | 125 | bool default_continuous; |
123 | }; | 126 | }; |
124 | 127 | ||
@@ -227,6 +230,50 @@ static int us5182d_set_opmode(struct us5182d_data *data, u8 mode) | |||
227 | return 0; | 230 | return 0; |
228 | } | 231 | } |
229 | 232 | ||
233 | static int us5182d_als_enable(struct us5182d_data *data) | ||
234 | { | ||
235 | int ret; | ||
236 | u8 mode; | ||
237 | |||
238 | if (data->power_mode == US5182D_ONESHOT) | ||
239 | return us5182d_set_opmode(data, US5182D_ALS_ONLY); | ||
240 | |||
241 | if (data->als_enabled) | ||
242 | return 0; | ||
243 | |||
244 | mode = data->px_enabled ? US5182D_ALS_PX : US5182D_ALS_ONLY; | ||
245 | |||
246 | ret = us5182d_set_opmode(data, mode); | ||
247 | if (ret < 0) | ||
248 | return ret; | ||
249 | |||
250 | data->als_enabled = true; | ||
251 | |||
252 | return 0; | ||
253 | } | ||
254 | |||
255 | static int us5182d_px_enable(struct us5182d_data *data) | ||
256 | { | ||
257 | int ret; | ||
258 | u8 mode; | ||
259 | |||
260 | if (data->power_mode == US5182D_ONESHOT) | ||
261 | return us5182d_set_opmode(data, US5182D_PX_ONLY); | ||
262 | |||
263 | if (data->px_enabled) | ||
264 | return 0; | ||
265 | |||
266 | mode = data->als_enabled ? US5182D_ALS_PX : US5182D_PX_ONLY; | ||
267 | |||
268 | ret = us5182d_set_opmode(data, mode); | ||
269 | if (ret < 0) | ||
270 | return ret; | ||
271 | |||
272 | data->px_enabled = true; | ||
273 | |||
274 | return 0; | ||
275 | } | ||
276 | |||
230 | static int us5182d_shutdown_en(struct us5182d_data *data, u8 state) | 277 | static int us5182d_shutdown_en(struct us5182d_data *data, u8 state) |
231 | { | 278 | { |
232 | int ret; | 279 | int ret; |
@@ -241,7 +288,16 @@ static int us5182d_shutdown_en(struct us5182d_data *data, u8 state) | |||
241 | ret = ret & ~US5182D_CFG0_SHUTDOWN_EN; | 288 | ret = ret & ~US5182D_CFG0_SHUTDOWN_EN; |
242 | ret = ret | state; | 289 | ret = ret | state; |
243 | 290 | ||
244 | return i2c_smbus_write_byte_data(data->client, US5182D_REG_CFG0, ret); | 291 | ret = i2c_smbus_write_byte_data(data->client, US5182D_REG_CFG0, ret); |
292 | if (ret < 0) | ||
293 | return ret; | ||
294 | |||
295 | if (state & US5182D_CFG0_SHUTDOWN_EN) { | ||
296 | data->als_enabled = false; | ||
297 | data->px_enabled = false; | ||
298 | } | ||
299 | |||
300 | return ret; | ||
245 | } | 301 | } |
246 | 302 | ||
247 | static int us5182d_read_raw(struct iio_dev *indio_dev, | 303 | static int us5182d_read_raw(struct iio_dev *indio_dev, |
@@ -261,7 +317,7 @@ static int us5182d_read_raw(struct iio_dev *indio_dev, | |||
261 | if (ret < 0) | 317 | if (ret < 0) |
262 | goto out_err; | 318 | goto out_err; |
263 | } | 319 | } |
264 | ret = us5182d_set_opmode(data, US5182D_OPMODE_ALS); | 320 | ret = us5182d_als_enable(data); |
265 | if (ret < 0) | 321 | if (ret < 0) |
266 | goto out_err; | 322 | goto out_err; |
267 | 323 | ||
@@ -278,7 +334,7 @@ static int us5182d_read_raw(struct iio_dev *indio_dev, | |||
278 | if (ret < 0) | 334 | if (ret < 0) |
279 | goto out_err; | 335 | goto out_err; |
280 | } | 336 | } |
281 | ret = us5182d_set_opmode(data, US5182D_OPMODE_PX); | 337 | ret = us5182d_px_enable(data); |
282 | if (ret < 0) | 338 | if (ret < 0) |
283 | goto out_err; | 339 | goto out_err; |
284 | 340 | ||
@@ -421,6 +477,9 @@ static int us5182d_init(struct iio_dev *indio_dev) | |||
421 | return ret; | 477 | return ret; |
422 | } | 478 | } |
423 | 479 | ||
480 | data->als_enabled = true; | ||
481 | data->px_enabled = true; | ||
482 | |||
424 | if (!data->default_continuous) { | 483 | if (!data->default_continuous) { |
425 | ret = us5182d_shutdown_en(data, US5182D_CFG0_SHUTDOWN_EN); | 484 | ret = us5182d_shutdown_en(data, US5182D_CFG0_SHUTDOWN_EN); |
426 | if (ret < 0) | 485 | if (ret < 0) |
@@ -428,7 +487,6 @@ static int us5182d_init(struct iio_dev *indio_dev) | |||
428 | data->power_mode = US5182D_ONESHOT; | 487 | data->power_mode = US5182D_ONESHOT; |
429 | } | 488 | } |
430 | 489 | ||
431 | |||
432 | return ret; | 490 | return ret; |
433 | } | 491 | } |
434 | 492 | ||