Lines Matching +full:- +full:- +full:enable +full:- +full:docs
1 // SPDX-License-Identifier: GPL-2.0+
8 * Datasheet: https://www.vishay.com/docs/84366/veml6030.pdf
9 * Appnote-84367: https://www.vishay.com/docs/84367/designingveml6030.pdf
12 * Datasheet: https://www.vishay.com/docs/84889/veml6035.pdf
13 * Appnote-84944: https://www.vishay.com/docs/84944/designingveml6035.pdf
16 * Datasheet: https://www.vishay.com/docs/84286/veml7700.pdf
17 * Appnote-84323: https://www.vishay.com/docs/84323/designingveml7700.pdf
32 #include <linux/iio/iio-gts-helper.h>
104 * in this table (0-3 for VEML6030, 0-5 for VEML6035) while the
105 * cur_integration_time holds index of integration time (0-5).
132 * iio-gts tables don't need corrections because the maximum value of
186 ret = regmap_read(data->regmap, VEML6030_REG_ALS_CONF, ®); in in_illuminance_period_available_show()
188 dev_err(&data->client->dev, in in_illuminance_period_available_show()
208 return -EINVAL; in in_illuminance_period_available_show()
229 ret = regmap_clear_bits(data->regmap, VEML6030_REG_ALS_CONF, in veml6030_als_pwr_on()
242 return regmap_set_bits(data->regmap, VEML6030_REG_ALS_CONF, in veml6030_als_shut_down()
397 ret = regmap_field_read(data->rf.it, &it_idx); in veml6030_get_it()
401 ret = iio_gts_find_int_time_by_sel(&data->gts, it_idx); in veml6030_get_it()
417 if (val || !iio_gts_valid_time(&data->gts, val2)) in veml6030_set_it()
418 return -EINVAL; in veml6030_set_it()
420 ret = regmap_field_read(data->rf.it, &it_idx); in veml6030_set_it()
424 ret = regmap_field_read(data->rf.gain, &gain_idx); in veml6030_set_it()
428 prev_it = iio_gts_find_int_time_by_sel(&data->gts, it_idx); in veml6030_set_it()
435 prev_gain = iio_gts_find_gain_by_sel(&data->gts, gain_idx); in veml6030_set_it()
439 ret = iio_gts_find_new_gain_by_gain_time_min(&data->gts, prev_gain, prev_it, in veml6030_set_it()
445 dev_dbg(&data->client->dev, "Optimal gain out of range\n"); in veml6030_set_it()
447 ret = iio_gts_find_sel_by_int_time(&data->gts, val2); in veml6030_set_it()
451 ret = regmap_field_write(data->rf.it, ret); in veml6030_set_it()
455 ret = iio_gts_find_sel_by_gain(&data->gts, new_gain); in veml6030_set_it()
459 return regmap_field_write(data->rf.gain, ret); in veml6030_set_it()
472 ret = regmap_read(data->regmap, VEML6030_REG_ALS_CONF, ®); in veml6030_read_persistence()
474 dev_err(&data->client->dev, in veml6030_read_persistence()
507 period = -1; in veml6030_write_persistence()
511 return -EINVAL; in veml6030_write_persistence()
513 ret = regmap_update_bits(data->regmap, VEML6030_REG_ALS_CONF, in veml6030_write_persistence()
514 VEML6030_ALS_PERS, (ffs(period) - 1) << 4); in veml6030_write_persistence()
516 dev_err(&data->client->dev, in veml6030_write_persistence()
527 ret = regmap_field_read(data->rf.it, &it_idx); in veml6030_set_scale()
531 ret = iio_gts_find_gain_time_sel_for_scale(&data->gts, val, val2, in veml6030_set_scale()
536 ret = regmap_field_write(data->rf.it, it_sel); in veml6030_set_scale()
540 ret = regmap_field_write(data->rf.gain, gain_sel); in veml6030_set_scale()
554 ret = regmap_read(data->regmap, VEML6030_REG_ALS_WH, ®); in veml6030_read_thresh()
556 ret = regmap_read(data->regmap, VEML6030_REG_ALS_WL, ®); in veml6030_read_thresh()
558 dev_err(&data->client->dev, in veml6030_read_thresh()
574 return -EINVAL; in veml6030_write_thresh()
577 ret = regmap_write(data->regmap, VEML6030_REG_ALS_WH, val); in veml6030_write_thresh()
579 dev_err(&data->client->dev, in veml6030_write_thresh()
582 ret = regmap_write(data->regmap, VEML6030_REG_ALS_WL, val); in veml6030_write_thresh()
584 dev_err(&data->client->dev, in veml6030_write_thresh()
595 ret = regmap_field_read(data->rf.gain, ®); in veml6030_get_total_gain()
599 gain = iio_gts_find_gain_by_sel(&data->gts, reg); in veml6030_get_total_gain()
603 ret = regmap_field_read(data->rf.it, ®); in veml6030_get_total_gain()
607 it = iio_gts_find_int_time_by_sel(&data->gts, reg); in veml6030_get_total_gain()
611 return iio_gts_get_total_gain(&data->gts, gain, it); in veml6030_get_total_gain()
618 ret = regmap_field_read(data->rf.gain, ®); in veml6030_get_scale()
622 gain = iio_gts_find_gain_by_sel(&data->gts, reg); in veml6030_get_scale()
626 ret = regmap_field_read(data->rf.it, ®); in veml6030_get_scale()
630 it = iio_gts_find_int_time_by_sel(&data->gts, reg); in veml6030_get_scale()
634 ret = iio_gts_get_scale(&data->gts, gain, it, val, val2); in veml6030_get_scale()
650 *val = raw * data->chip->max_scale / total_gain / 10000; in veml6030_process_als()
651 *val2 = raw * data->chip->max_scale / total_gain % 10000 * 100; in veml6030_process_als()
666 struct regmap *regmap = data->regmap; in veml6030_read_raw()
667 struct device *dev = &data->client->dev; in veml6030_read_raw()
672 switch (chan->type) { in veml6030_read_raw()
693 return -EINVAL; in veml6030_read_raw()
700 return -EINVAL; in veml6030_read_raw()
713 return iio_gts_avail_times(&data->gts, vals, type, length); in veml6030_read_avail()
715 return iio_gts_all_avail_scales(&data->gts, vals, type, length); in veml6030_read_avail()
718 return -EINVAL; in veml6030_read_avail()
731 return -EINVAL; in veml6030_write_raw()
745 return -EINVAL; in veml6030_write_raw_get_fmt()
761 return -EINVAL; in veml6030_read_event_val()
767 return -EINVAL; in veml6030_read_event_val()
782 return -EINVAL; in veml6030_write_event_val()
793 ret = regmap_read(data->regmap, VEML6030_REG_ALS_CONF, ®); in veml6030_read_interrupt_config()
795 dev_err(&data->client->dev, in veml6030_read_interrupt_config()
809 * shut down -> enable/disable interrupt -> power on
822 dev_err(&data->client->dev, in veml6030_write_interrupt_config()
827 /* enable interrupt + power on */ in veml6030_write_interrupt_config()
828 ret = regmap_update_bits(data->regmap, VEML6030_REG_ALS_CONF, in veml6030_write_interrupt_config()
831 dev_err(&data->client->dev, in veml6030_write_interrupt_config()
832 "can't enable interrupt & poweron als %d\n", ret); in veml6030_write_interrupt_config()
862 ret = regmap_read(data->regmap, VEML6030_REG_ALS_INT, ®); in veml6030_event_handler()
864 dev_err(&data->client->dev, in veml6030_event_handler()
888 struct iio_dev *iio = pf->indio_dev; in veml6030_trigger_handler()
900 ret = regmap_read(data->regmap, VEML6030_REG_DATA(ch), in veml6030_trigger_handler()
908 iio_push_to_buffers_with_timestamp(iio, &scan, pf->timestamp); in veml6030_trigger_handler()
911 iio_trigger_notify_done(iio->trig); in veml6030_trigger_handler()
919 struct i2c_client *client = data->client; in veml6030_set_info()
922 if (client->irq) { in veml6030_set_info()
923 ret = devm_request_threaded_irq(&client->dev, client->irq, in veml6030_set_info()
926 indio_dev->name, indio_dev); in veml6030_set_info()
928 return dev_err_probe(&client->dev, ret, in veml6030_set_info()
930 client->irq); in veml6030_set_info()
932 indio_dev->info = &veml6030_info; in veml6030_set_info()
934 indio_dev->info = &veml6030_info_no_irq; in veml6030_set_info()
942 indio_dev->info = &veml6030_info_no_irq; in veml7700_set_info()
950 struct regmap *regmap = data->regmap; in veml6030_regfield_init()
951 struct device *dev = &data->client->dev; in veml6030_regfield_init()
953 struct veml6030_rf *rf = &data->rf; in veml6030_regfield_init()
955 rm_field = devm_regmap_field_alloc(dev, regmap, data->chip->it_rf); in veml6030_regfield_init()
958 rf->it = rm_field; in veml6030_regfield_init()
960 rm_field = devm_regmap_field_alloc(dev, regmap, data->chip->gain_rf); in veml6030_regfield_init()
963 rf->gain = rm_field; in veml6030_regfield_init()
982 &data->gts); in veml6030_hw_init()
990 ret = regmap_write(data->regmap, VEML6030_REG_ALS_CONF, 0x1001); in veml6030_hw_init()
994 ret = regmap_update_bits(data->regmap, VEML6030_REG_ALS_PSM, in veml6030_hw_init()
999 ret = regmap_write(data->regmap, VEML6030_REG_ALS_WH, 0xFFFF); in veml6030_hw_init()
1003 ret = regmap_write(data->regmap, VEML6030_REG_ALS_WL, 0x0000); in veml6030_hw_init()
1016 ret = regmap_read(data->regmap, VEML6030_REG_ALS_INT, &val); in veml6030_hw_init()
1039 &data->gts); in veml6035_hw_init()
1047 ret = regmap_write(data->regmap, VEML6030_REG_ALS_CONF, in veml6035_hw_init()
1052 ret = regmap_update_bits(data->regmap, VEML6030_REG_ALS_PSM, in veml6035_hw_init()
1057 ret = regmap_write(data->regmap, VEML6030_REG_ALS_WH, 0xFFFF); in veml6035_hw_init()
1061 ret = regmap_write(data->regmap, VEML6030_REG_ALS_WL, 0x0000); in veml6035_hw_init()
1074 ret = regmap_read(data->regmap, VEML6030_REG_ALS_INT, &val); in veml6035_hw_init()
1089 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) in veml6030_probe()
1090 return dev_err_probe(&client->dev, -EOPNOTSUPP, in veml6030_probe()
1095 return dev_err_probe(&client->dev, PTR_ERR(regmap), in veml6030_probe()
1098 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in veml6030_probe()
1100 return -ENOMEM; in veml6030_probe()
1104 data->client = client; in veml6030_probe()
1105 data->regmap = regmap; in veml6030_probe()
1107 ret = devm_regulator_get_enable(&client->dev, "vdd"); in veml6030_probe()
1109 return dev_err_probe(&client->dev, ret, in veml6030_probe()
1110 "failed to enable regulator\n"); in veml6030_probe()
1112 data->chip = i2c_get_match_data(client); in veml6030_probe()
1113 if (!data->chip) in veml6030_probe()
1114 return -EINVAL; in veml6030_probe()
1116 indio_dev->name = data->chip->name; in veml6030_probe()
1117 indio_dev->channels = data->chip->channels; in veml6030_probe()
1118 indio_dev->num_channels = data->chip->num_channels; in veml6030_probe()
1119 indio_dev->modes = INDIO_DIRECT_MODE; in veml6030_probe()
1121 ret = data->chip->set_info(indio_dev); in veml6030_probe()
1127 return dev_err_probe(&client->dev, ret, in veml6030_probe()
1130 ret = data->chip->hw_init(indio_dev, &client->dev); in veml6030_probe()
1134 ret = devm_iio_triggered_buffer_setup(&client->dev, indio_dev, NULL, in veml6030_probe()
1137 return dev_err_probe(&client->dev, ret, in veml6030_probe()
1140 return devm_iio_device_register(&client->dev, indio_dev); in veml6030_probe()
1151 dev_err(&data->client->dev, "can't suspend als %d\n", ret); in veml6030_runtime_suspend()
1164 dev_err(&data->client->dev, "can't resume als %d\n", ret); in veml6030_runtime_resume()