Lines Matching +full:int +full:- +full:threshold
1 // SPDX-License-Identifier: GPL-2.0
3 * max44009.c - Support for MAX44009 Ambient Light Sensor
41 /* The maximum rising threshold for the max44009 */
51 /* The max44009 always scales raw readings by 0.045 and is non-configurable */
55 /* The fixed-point fractional multiplier for de-scaling threshold values */
109 static int max44009_read_int_time(struct max44009_data *data) in max44009_read_int_time()
112 int ret = i2c_smbus_read_byte_data(data->client, MAX44009_REG_CFG); in max44009_read_int_time()
120 static int max44009_write_int_time(struct max44009_data *data, in max44009_write_int_time()
121 int val, int val2) in max44009_write_int_time()
123 struct i2c_client *client = data->client; in max44009_write_int_time()
124 int ret, int_time, config; in max44009_write_int_time()
149 static int max44009_write_raw(struct iio_dev *indio_dev, in max44009_write_raw()
150 struct iio_chan_spec const *chan, int val, in max44009_write_raw()
151 int val2, long mask) in max44009_write_raw()
154 int ret; in max44009_write_raw()
156 if (mask == IIO_CHAN_INFO_INT_TIME && chan->type == IIO_LIGHT) { in max44009_write_raw()
157 mutex_lock(&data->lock); in max44009_write_raw()
159 mutex_unlock(&data->lock); in max44009_write_raw()
162 return -EINVAL; in max44009_write_raw()
165 static int max44009_write_raw_get_fmt(struct iio_dev *indio_dev, in max44009_write_raw_get_fmt()
172 static int max44009_lux_raw(u8 hi, u8 lo) in max44009_lux_raw()
174 int mantissa; in max44009_lux_raw()
175 int exponent; in max44009_lux_raw()
196 static int max44009_read_lux_raw(struct max44009_data *data) in max44009_read_lux_raw()
198 int ret; in max44009_read_lux_raw()
206 .addr = data->client->addr, in max44009_read_lux_raw()
212 .addr = data->client->addr, in max44009_read_lux_raw()
218 .addr = data->client->addr, in max44009_read_lux_raw()
224 .addr = data->client->addr, in max44009_read_lux_raw()
237 ret = i2c_transfer(data->client->adapter, in max44009_read_lux_raw()
241 return -EIO; in max44009_read_lux_raw()
246 static int max44009_read_raw(struct iio_dev *indio_dev, in max44009_read_raw()
247 struct iio_chan_spec const *chan, int *val, in max44009_read_raw()
248 int *val2, long mask) in max44009_read_raw()
251 int lux_raw; in max44009_read_raw()
252 int ret; in max44009_read_raw()
256 switch (chan->type) { in max44009_read_raw()
267 return -EINVAL; in max44009_read_raw()
270 switch (chan->type) { in max44009_read_raw()
280 return -EINVAL; in max44009_read_raw()
283 return -EINVAL; in max44009_read_raw()
299 static int max44009_threshold_byte_from_fraction(int integral, int fractional) in max44009_threshold_byte_from_fraction()
301 int mantissa, exp; in max44009_threshold_byte_from_fraction()
306 return -EINVAL; in max44009_threshold_byte_from_fraction()
308 /* Reverse scaling of fixed-point integral */ in max44009_threshold_byte_from_fraction()
312 /* Reverse scaling of fixed-point fractional */ in max44009_threshold_byte_from_fraction()
326 static int max44009_get_thr_reg(enum iio_event_direction dir) in max44009_get_thr_reg()
334 return -EINVAL; in max44009_get_thr_reg()
338 static int max44009_write_event_value(struct iio_dev *indio_dev, in max44009_write_event_value()
343 int val, int val2) in max44009_write_event_value()
346 int reg, threshold; in max44009_write_event_value() local
348 if (info != IIO_EV_INFO_VALUE || chan->type != IIO_LIGHT) in max44009_write_event_value()
349 return -EINVAL; in max44009_write_event_value()
351 threshold = max44009_threshold_byte_from_fraction(val, val2); in max44009_write_event_value()
352 if (threshold < 0) in max44009_write_event_value()
353 return threshold; in max44009_write_event_value()
359 return i2c_smbus_write_byte_data(data->client, reg, threshold); in max44009_write_event_value()
362 static int max44009_read_threshold(struct iio_dev *indio_dev, in max44009_read_threshold()
366 int byte, reg; in max44009_read_threshold()
367 int mantissa, exponent; in max44009_read_threshold()
373 byte = i2c_smbus_read_byte_data(data->client, reg); in max44009_read_threshold()
381 * To get the upper threshold, always adds the minimum upper threshold in max44009_read_threshold()
388 * Exponent is base 2 to the power of the threshold exponent byte in max44009_read_threshold()
397 static int max44009_read_event_value(struct iio_dev *indio_dev, in max44009_read_event_value()
402 int *val, int *val2) in max44009_read_event_value()
404 int ret; in max44009_read_event_value()
405 int threshold; in max44009_read_event_value() local
407 if (chan->type != IIO_LIGHT || type != IIO_EV_TYPE_THRESH) in max44009_read_event_value()
408 return -EINVAL; in max44009_read_event_value()
413 threshold = ret; in max44009_read_event_value()
415 *val = threshold * MAX44009_SCALE_NUMERATOR; in max44009_read_event_value()
421 static int max44009_write_event_config(struct iio_dev *indio_dev, in max44009_write_event_config()
428 int ret; in max44009_write_event_config()
430 if (chan->type != IIO_LIGHT || type != IIO_EV_TYPE_THRESH) in max44009_write_event_config()
431 return -EINVAL; in max44009_write_event_config()
433 ret = i2c_smbus_write_byte_data(data->client, in max44009_write_event_config()
440 * the threshold limit. in max44009_write_event_config()
442 return i2c_smbus_write_byte_data(data->client, in max44009_write_event_config()
446 static int max44009_read_event_config(struct iio_dev *indio_dev, in max44009_read_event_config()
453 if (chan->type != IIO_LIGHT || type != IIO_EV_TYPE_THRESH) in max44009_read_event_config()
454 return -EINVAL; in max44009_read_event_config()
456 return i2c_smbus_read_byte_data(data->client, MAX44009_REG_INT_EN); in max44009_read_event_config()
470 static irqreturn_t max44009_threaded_irq_handler(int irq, void *p) in max44009_threaded_irq_handler()
474 int ret; in max44009_threaded_irq_handler()
476 ret = i2c_smbus_read_byte_data(data->client, MAX44009_REG_INT_STATUS); in max44009_threaded_irq_handler()
490 static int max44009_probe(struct i2c_client *client) in max44009_probe()
494 int ret; in max44009_probe()
496 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in max44009_probe()
498 return -ENOMEM; in max44009_probe()
502 data->client = client; in max44009_probe()
503 indio_dev->info = &max44009_info; in max44009_probe()
504 indio_dev->modes = INDIO_DIRECT_MODE; in max44009_probe()
505 indio_dev->name = MAX44009_DRV_NAME; in max44009_probe()
506 indio_dev->channels = max44009_channels; in max44009_probe()
507 indio_dev->num_channels = ARRAY_SIZE(max44009_channels); in max44009_probe()
508 mutex_init(&data->lock); in max44009_probe()
515 if (client->irq > 0) { in max44009_probe()
516 ret = devm_request_threaded_irq(&client->dev, client->irq, in max44009_probe()
527 return devm_iio_device_register(&client->dev, indio_dev); in max44009_probe()