Lines Matching +full:colour +full:- +full:sensor

1 // SPDX-License-Identifier: GPL-2.0
3 * ROHM BH1745 digital colour sensor driver
7 * 7-bit I2C slave addresses:
25 #include <linux/iio/iio-gts-helper.h>
227 return regmap_set_bits(data->regmap, BH1745_SYS_CTRL, in bh1745_reset()
234 return regmap_set_bits(data->regmap, BH1745_MODE_CTRL2, in bh1745_power_on()
241 struct device *dev = data->dev; in bh1745_power_off()
244 ret = regmap_clear_bits(data->regmap, BH1745_MODE_CTRL2, in bh1745_power_off()
258 ret = regmap_read(data->regmap, BH1745_MODE_CTRL2, &value); in bh1745_get_scale()
263 gain = iio_gts_find_gain_by_sel(&data->gts, gain_sel); in bh1745_get_scale()
265 ret = regmap_read(data->regmap, BH1745_MODE_CTRL1, &value); in bh1745_get_scale()
270 int_time = iio_gts_find_itime_by_sel(&data->gts, int_time_sel); in bh1745_get_scale()
272 return iio_gts_get_scale(&data->gts, gain, int_time->time_us, val, in bh1745_get_scale()
278 struct device *dev = data->dev; in bh1745_set_scale()
283 ret = regmap_read(data->regmap, BH1745_MODE_CTRL1, &value); in bh1745_set_scale()
289 ret = iio_gts_find_gain_sel_for_scale_using_time(&data->gts, in bh1745_set_scale()
293 for (int i = 0; i < data->gts.num_itime; i++) { in bh1745_set_scale()
294 new_int_time_sel = data->gts.itime_table[i].sel; in bh1745_set_scale()
299 ret = iio_gts_find_gain_sel_for_scale_using_time(&data->gts, in bh1745_set_scale()
310 return -EINVAL; in bh1745_set_scale()
313 ret = regmap_write_bits(data->regmap, BH1745_MODE_CTRL1, in bh1745_set_scale()
320 return regmap_write_bits(data->regmap, BH1745_MODE_CTRL2, in bh1745_set_scale()
330 ret = regmap_read(data->regmap, BH1745_MODE_CTRL1, &value); in bh1745_get_int_time()
335 int_time = iio_gts_find_int_time_by_sel(&data->gts, int_time_sel); in bh1745_get_int_time()
346 struct device *dev = data->dev; in bh1745_set_int_time()
353 if (!iio_gts_valid_time(&data->gts, req_int_time)) { in bh1745_set_int_time()
356 return -EINVAL; in bh1745_set_int_time()
366 ret = regmap_read(data->regmap, BH1745_MODE_CTRL2, &value); in bh1745_set_int_time()
371 current_hwgain = iio_gts_find_gain_by_sel(&data->gts, in bh1745_set_int_time()
373 ret = iio_gts_find_new_gain_by_old_gain_time(&data->gts, current_hwgain, in bh1745_set_int_time()
385 new_hwgain = iio_find_closest_gain_low(&data->gts, new_hwgain, in bh1745_set_int_time()
388 new_hwgain = iio_gts_get_min_gain(&data->gts); in bh1745_set_int_time()
399 new_hwgain_sel = iio_gts_find_sel_by_gain(&data->gts, new_hwgain); in bh1745_set_int_time()
403 ret = regmap_write_bits(data->regmap, BH1745_MODE_CTRL2, in bh1745_set_int_time()
409 new_int_time_sel = iio_gts_find_sel_by_int_time(&data->gts, in bh1745_set_int_time()
414 return regmap_write_bits(data->regmap, BH1745_MODE_CTRL1, in bh1745_set_int_time()
429 iio_device_claim_direct_scoped(return -EBUSY, indio_dev) { in bh1745_read_raw()
430 ret = regmap_bulk_read(data->regmap, chan->address, in bh1745_read_raw()
441 guard(mutex)(&data->lock); in bh1745_read_raw()
450 guard(mutex)(&data->lock); in bh1745_read_raw()
460 return -EINVAL; in bh1745_read_raw()
470 guard(mutex)(&data->lock); in bh1745_write_raw()
479 return -EINVAL; in bh1745_write_raw()
495 return -EINVAL; in bh1745_write_raw_get_fmt()
512 ret = regmap_bulk_read(data->regmap, BH1745_TH_LSB, in bh1745_read_thresh()
520 ret = regmap_bulk_read(data->regmap, BH1745_TL_LSB, in bh1745_read_thresh()
528 return -EINVAL; in bh1745_read_thresh()
532 ret = regmap_read(data->regmap, BH1745_PERSISTENCE, val); in bh1745_read_thresh()
539 return -EINVAL; in bh1745_read_thresh()
555 return -EINVAL; in bh1745_write_thresh()
559 ret = regmap_bulk_write(data->regmap, BH1745_TH_LSB, in bh1745_write_thresh()
567 ret = regmap_bulk_write(data->regmap, BH1745_TL_LSB, in bh1745_write_thresh()
575 return -EINVAL; in bh1745_write_thresh()
581 return -EINVAL; in bh1745_write_thresh()
582 ret = regmap_write(data->regmap, BH1745_PERSISTENCE, val); in bh1745_write_thresh()
589 return -EINVAL; in bh1745_write_thresh()
603 ret = regmap_read(data->regmap, BH1745_INTR, &value); in bh1745_read_event_config()
612 switch (chan->channel2) { in bh1745_read_event_config()
634 return -EINVAL; in bh1745_read_event_config()
647 return regmap_clear_bits(data->regmap, in bh1745_write_event_config()
653 switch (chan->channel2) { in bh1745_write_event_config()
655 return regmap_write(data->regmap, BH1745_INTR, in bh1745_write_event_config()
660 return regmap_write(data->regmap, BH1745_INTR, in bh1745_write_event_config()
665 return regmap_write(data->regmap, BH1745_INTR, in bh1745_write_event_config()
670 return regmap_write(data->regmap, BH1745_INTR, in bh1745_write_event_config()
675 return -EINVAL; in bh1745_write_event_config()
687 return iio_gts_avail_times(&data->gts, vals, type, length); in bh1745_read_avail()
690 return iio_gts_all_avail_scales(&data->gts, vals, type, length); in bh1745_read_avail()
693 return -EINVAL; in bh1745_read_avail()
716 ret = regmap_read(data->regmap, BH1745_INTR, &value); in bh1745_interrupt_handler()
738 struct iio_dev *indio_dev = pf->indio_dev; in bh1745_trigger_handler()
752 ret = regmap_bulk_read(data->regmap, BH1745_RED_LSB + 2 * i, in bh1745_trigger_handler()
764 iio_trigger_notify_done(indio_dev->trig); in bh1745_trigger_handler()
774 struct device *dev = data->dev; in bh1745_setup_triggered_buffer()
799 struct device *dev = data->dev; in bh1745_init()
801 mutex_init(&data->lock); in bh1745_init()
805 ARRAY_SIZE(bh1745_itimes), &data->gts); in bh1745_init()
811 return dev_err_probe(dev, ret, "Failed to reset sensor\n"); in bh1745_init()
815 return dev_err_probe(dev, ret, "Failed to turn on sensor\n"); in bh1745_init()
832 struct device *dev = &client->dev; in bh1745_probe()
836 return -ENOMEM; in bh1745_probe()
838 indio_dev->info = &bh1745_info; in bh1745_probe()
839 indio_dev->name = "bh1745"; in bh1745_probe()
840 indio_dev->channels = bh1745_channels; in bh1745_probe()
841 indio_dev->modes = INDIO_DIRECT_MODE; in bh1745_probe()
842 indio_dev->num_channels = ARRAY_SIZE(bh1745_channels); in bh1745_probe()
844 data->dev = &client->dev; in bh1745_probe()
845 data->regmap = devm_regmap_init_i2c(client, &bh1745_regmap); in bh1745_probe()
846 if (IS_ERR(data->regmap)) in bh1745_probe()
847 return dev_err_probe(dev, PTR_ERR(data->regmap), in bh1745_probe()
850 ret = regmap_read(data->regmap, BH1745_SYS_CTRL, &value); in bh1745_probe()
867 ret = bh1745_setup_triggered_buffer(indio_dev, indio_dev->dev.parent, in bh1745_probe()
868 client->irq); in bh1745_probe()
903 MODULE_DESCRIPTION("BH1745 colour sensor driver");