Lines Matching +full:trim +full:- +full:data +full:- +full:valid

1 // SPDX-License-Identifier: GPL-2.0-only
7 * Data sheet: https://datasheets.maximintegrated.com/en/ds/MAX44000.pdf
9 * 7-bit I2C slave address 0x4a
165 .scan_index = -1,
169 static int max44000_read_alstim(struct max44000_data *data)
174 ret = regmap_read(data->regmap, MAX44000_REG_CFG_RX, &val);
180 static int max44000_write_alstim(struct max44000_data *data, int val)
182 return regmap_write_bits(data->regmap, MAX44000_REG_CFG_RX,
187 static int max44000_read_alspga(struct max44000_data *data)
192 ret = regmap_read(data->regmap, MAX44000_REG_CFG_RX, &val);
198 static int max44000_write_alspga(struct max44000_data *data, int val)
200 return regmap_write_bits(data->regmap, MAX44000_REG_CFG_RX,
205 static int max44000_read_alsval(struct max44000_data *data)
211 ret = regmap_bulk_read(data->regmap, MAX44000_REG_ALS_DATA_HI,
215 alstim = ret = max44000_read_alstim(data);
236 static int max44000_write_led_current_raw(struct max44000_data *data, int val)
240 return -ERANGE;
243 return regmap_write_bits(data->regmap, MAX44000_REG_CFG_TX,
247 static int max44000_read_led_current_raw(struct max44000_data *data)
252 ret = regmap_read(data->regmap, MAX44000_REG_CFG_TX, &regval);
257 regval -= 4;
265 struct max44000_data *data = iio_priv(indio_dev);
272 switch (chan->type) {
274 mutex_lock(&data->lock);
275 ret = max44000_read_alsval(data);
276 mutex_unlock(&data->lock);
283 mutex_lock(&data->lock);
284 ret = regmap_read(data->regmap, MAX44000_REG_PRX_DATA, &regval);
285 mutex_unlock(&data->lock);
292 mutex_lock(&data->lock);
293 ret = max44000_read_led_current_raw(data);
294 mutex_unlock(&data->lock);
301 return -EINVAL;
305 switch (chan->type) {
312 mutex_lock(&data->lock);
313 alspga = ret = max44000_read_alspga(data);
314 mutex_unlock(&data->lock);
322 - max44000_alspga_shift[alspga];
326 return -EINVAL;
330 mutex_lock(&data->lock);
331 alstim = ret = max44000_read_alstim(data);
332 mutex_unlock(&data->lock);
341 return -EINVAL;
349 struct max44000_data *data = iio_priv(indio_dev);
352 if (mask == IIO_CHAN_INFO_RAW && chan->type == IIO_CURRENT) {
353 mutex_lock(&data->lock);
354 ret = max44000_write_led_current_raw(data, val);
355 mutex_unlock(&data->lock);
357 } else if (mask == IIO_CHAN_INFO_INT_TIME && chan->type == IIO_LIGHT) {
362 mutex_lock(&data->lock);
363 ret = max44000_write_alstim(data, alstim);
364 mutex_unlock(&data->lock);
366 } else if (mask == IIO_CHAN_INFO_SCALE && chan->type == IIO_LIGHT) {
371 mutex_lock(&data->lock);
372 ret = max44000_write_alspga(data, alspga);
373 mutex_unlock(&data->lock);
377 return -EINVAL;
384 if (mask == IIO_CHAN_INFO_INT_TIME && chan->type == IIO_LIGHT)
386 else if (mask == IIO_CHAN_INFO_SCALE && chan->type == IIO_LIGHT)
494 struct iio_dev *indio_dev = pf->indio_dev;
495 struct max44000_data *data = iio_priv(indio_dev);
500 mutex_lock(&data->lock);
501 if (test_bit(MAX44000_SCAN_INDEX_ALS, indio_dev->active_scan_mask)) {
502 ret = max44000_read_alsval(data);
505 data->scan.channels[index++] = ret;
507 if (test_bit(MAX44000_SCAN_INDEX_PRX, indio_dev->active_scan_mask)) {
508 ret = regmap_read(data->regmap, MAX44000_REG_PRX_DATA, &regval);
511 data->scan.channels[index] = regval;
513 mutex_unlock(&data->lock);
515 iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
517 iio_trigger_notify_done(indio_dev->trig);
521 mutex_unlock(&data->lock);
522 iio_trigger_notify_done(indio_dev->trig);
528 struct max44000_data *data;
532 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
534 return -ENOMEM;
535 data = iio_priv(indio_dev);
536 data->regmap = devm_regmap_init_i2c(client, &max44000_regmap_config);
537 if (IS_ERR(data->regmap)) {
538 dev_err(&client->dev, "regmap_init failed!\n");
539 return PTR_ERR(data->regmap);
542 mutex_init(&data->lock);
543 indio_dev->info = &max44000_info;
544 indio_dev->name = MAX44000_DRV_NAME;
545 indio_dev->channels = max44000_channels;
546 indio_dev->num_channels = ARRAY_SIZE(max44000_channels);
553 * not important. We also don't touch trim values.
557 ret = regmap_write(data->regmap, MAX44000_REG_CFG_RX,
560 dev_err(&client->dev, "failed to write default CFG_RX: %d\n",
567 * Set a middle value so that we get some sort of valid data by default.
569 ret = max44000_write_led_current_raw(data, MAX44000_LED_CURRENT_DEFAULT);
571 dev_err(&client->dev, "failed to write init config: %d\n", ret);
577 ret = regmap_write(data->regmap, MAX44000_REG_CFG_MAIN, reg);
579 dev_err(&client->dev, "failed to write init config: %d\n", ret);
584 ret = regmap_read(data->regmap, MAX44000_REG_STATUS, &reg);
586 dev_err(&client->dev, "failed to read init status: %d\n", ret);
590 ret = devm_iio_triggered_buffer_setup(&client->dev, indio_dev, NULL,
593 dev_err(&client->dev, "iio triggered buffer setup failed\n");
597 return devm_iio_device_register(&client->dev, indio_dev);