Lines Matching +full:buffered +full:- +full:positive
2 * ADS1015 - Texas Instruments Analog-to-Digital Converter
10 * IIO driver for ADS1015 ADC 7-bit I2C slave address:
11 * * 0x48 - ADDR connected to Ground
12 * * 0x49 - ADDR connected to Vdd
13 * * 0x4A - ADDR connected to SDA
14 * * 0x4B - ADDR connected to SCL
108 * Translation from PGA bits to full-scale positive and negative input voltage
180 .datasheet_name = "AIN"#_chan"-AIN"#_chan2, \
222 .datasheet_name = "AIN"#_chan"-AIN"#_chan2, \
234 * Protects ADC ops, e.g: concurrent sysfs/buffered
246 * Set to true when the ADC is switched to the continuous-conversion
247 * mode and exits from a power-down state. This flag is used to avoid
255 return (data->event_channel != ADS1015_CHANNELS); in ads1015_event_channel_enabled()
263 data->event_channel = chan; in ads1015_event_channel_enable()
264 data->comp_mode = comp_mode; in ads1015_event_channel_enable()
269 data->event_channel = ADS1015_CHANNELS; in ads1015_event_channel_disable()
319 struct device *dev = regmap_get_device(data->regmap); in ads1015_set_power_state()
349 return -EINVAL; in ads1015_get_adc_result()
351 ret = regmap_read(data->regmap, ADS1015_CFG_REG, &old); in ads1015_get_adc_result()
355 pga = data->channel_data[chan].pga; in ads1015_get_adc_result()
356 dr = data->channel_data[chan].data_rate; in ads1015_get_adc_result()
364 cfg |= data->thresh_data[chan].comp_queue << in ads1015_get_adc_result()
366 data->comp_mode << in ads1015_get_adc_result()
372 ret = regmap_write(data->regmap, ADS1015_CFG_REG, cfg); in ads1015_get_adc_result()
375 data->conv_invalid = true; in ads1015_get_adc_result()
377 if (data->conv_invalid) { in ads1015_get_adc_result()
379 conv_time = DIV_ROUND_UP(USEC_PER_SEC, data->data_rate[dr_old]); in ads1015_get_adc_result()
380 conv_time += DIV_ROUND_UP(USEC_PER_SEC, data->data_rate[dr]); in ads1015_get_adc_result()
383 data->conv_invalid = false; in ads1015_get_adc_result()
386 return regmap_read(data->regmap, ADS1015_CONV_REG, val); in ads1015_get_adc_result()
392 struct iio_dev *indio_dev = pf->indio_dev; in ads1015_trigger_handler()
399 mutex_lock(&data->lock); in ads1015_trigger_handler()
400 chan = find_first_bit(indio_dev->active_scan_mask, in ads1015_trigger_handler()
401 indio_dev->masklength); in ads1015_trigger_handler()
404 mutex_unlock(&data->lock); in ads1015_trigger_handler()
409 mutex_unlock(&data->lock); in ads1015_trigger_handler()
415 iio_trigger_notify_done(indio_dev->trig); in ads1015_trigger_handler()
426 (chan->scan_type.realbits - 1), 1000000); in ads1015_set_scale()
430 data->channel_data[chan->address].pga = i; in ads1015_set_scale()
435 return -EINVAL; in ads1015_set_scale()
443 if (data->data_rate[i] == rate) { in ads1015_set_data_rate()
444 data->channel_data[chan].data_rate = i; in ads1015_set_data_rate()
449 return -EINVAL; in ads1015_set_data_rate()
459 mutex_lock(&data->lock); in ads1015_read_raw()
462 int shift = chan->scan_type.shift; in ads1015_read_raw()
469 data->event_channel != chan->address) { in ads1015_read_raw()
470 ret = -EBUSY; in ads1015_read_raw()
478 ret = ads1015_get_adc_result(data, chan->address, val); in ads1015_read_raw()
484 *val = sign_extend32(*val >> shift, 15 - shift); in ads1015_read_raw()
496 idx = data->channel_data[chan->address].pga; in ads1015_read_raw()
498 *val2 = chan->scan_type.realbits - 1; in ads1015_read_raw()
502 idx = data->channel_data[chan->address].data_rate; in ads1015_read_raw()
503 *val = data->data_rate[idx]; in ads1015_read_raw()
507 ret = -EINVAL; in ads1015_read_raw()
510 mutex_unlock(&data->lock); in ads1015_read_raw()
522 mutex_lock(&data->lock); in ads1015_write_raw()
528 ret = ads1015_set_data_rate(data, chan->address, val); in ads1015_write_raw()
531 ret = -EINVAL; in ads1015_write_raw()
534 mutex_unlock(&data->lock); in ads1015_write_raw()
550 mutex_lock(&data->lock); in ads1015_read_event()
555 data->thresh_data[chan->address].high_thresh : in ads1015_read_event()
556 data->thresh_data[chan->address].low_thresh; in ads1015_read_event()
560 dr = data->channel_data[chan->address].data_rate; in ads1015_read_event()
561 comp_queue = data->thresh_data[chan->address].comp_queue; in ads1015_read_event()
563 USEC_PER_SEC / data->data_rate[dr]; in ads1015_read_event()
570 ret = -EINVAL; in ads1015_read_event()
574 mutex_unlock(&data->lock); in ads1015_read_event()
585 int realbits = chan->scan_type.realbits; in ads1015_write_event()
591 mutex_lock(&data->lock); in ads1015_write_event()
595 if (val >= 1 << (realbits - 1) || val < -1 << (realbits - 1)) { in ads1015_write_event()
596 ret = -EINVAL; in ads1015_write_event()
600 data->thresh_data[chan->address].high_thresh = val; in ads1015_write_event()
602 data->thresh_data[chan->address].low_thresh = val; in ads1015_write_event()
605 dr = data->channel_data[chan->address].data_rate; in ads1015_write_event()
608 for (i = 0; i < ARRAY_SIZE(ads1015_comp_queue) - 1; i++) { in ads1015_write_event()
610 USEC_PER_SEC / data->data_rate[dr]) in ads1015_write_event()
613 data->thresh_data[chan->address].comp_queue = i; in ads1015_write_event()
616 ret = -EINVAL; in ads1015_write_event()
620 mutex_unlock(&data->lock); in ads1015_write_event()
632 mutex_lock(&data->lock); in ads1015_read_event_config()
633 if (data->event_channel == chan->address) { in ads1015_read_event_config()
639 ret = (data->comp_mode == ADS1015_CFG_COMP_MODE_WINDOW); in ads1015_read_event_config()
642 ret = -EINVAL; in ads1015_read_event_config()
646 mutex_unlock(&data->lock); in ads1015_read_event_config()
654 int low_thresh = data->thresh_data[chan->address].low_thresh; in ads1015_enable_event_config()
655 int high_thresh = data->thresh_data[chan->address].high_thresh; in ads1015_enable_event_config()
660 if (data->event_channel != chan->address || in ads1015_enable_event_config()
661 (data->comp_mode == ADS1015_CFG_COMP_MODE_TRAD && in ads1015_enable_event_config()
663 return -EBUSY; in ads1015_enable_event_config()
669 low_thresh = max(-1 << (chan->scan_type.realbits - 1), in ads1015_enable_event_config()
670 high_thresh - 1); in ads1015_enable_event_config()
672 ret = regmap_write(data->regmap, ADS1015_LO_THRESH_REG, in ads1015_enable_event_config()
673 low_thresh << chan->scan_type.shift); in ads1015_enable_event_config()
677 ret = regmap_write(data->regmap, ADS1015_HI_THRESH_REG, in ads1015_enable_event_config()
678 high_thresh << chan->scan_type.shift); in ads1015_enable_event_config()
686 ads1015_event_channel_enable(data, chan->address, comp_mode); in ads1015_enable_event_config()
688 ret = ads1015_get_adc_result(data, chan->address, &val); in ads1015_enable_event_config()
690 ads1015_event_channel_disable(data, chan->address); in ads1015_enable_event_config()
705 if (data->event_channel != chan->address) in ads1015_disable_event_config()
708 if (data->comp_mode == ADS1015_CFG_COMP_MODE_TRAD && in ads1015_disable_event_config()
712 ret = regmap_update_bits(data->regmap, ADS1015_CFG_REG, in ads1015_disable_event_config()
719 ads1015_event_channel_disable(data, chan->address); in ads1015_disable_event_config()
733 mutex_lock(&data->lock); in ads1015_write_event_config()
738 mutex_unlock(&data->lock); in ads1015_write_event_config()
748 mutex_unlock(&data->lock); in ads1015_write_event_config()
761 ret = regmap_read(data->regmap, ADS1015_CONV_REG, &val); in ads1015_event_handler()
769 dir = data->comp_mode == ADS1015_CFG_COMP_MODE_TRAD ? in ads1015_event_handler()
771 code = IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, data->event_channel, in ads1015_event_handler()
785 return -EBUSY; in ads1015_buffer_preenable()
860 if (!client->dev.of_node || in ads1015_get_channels_config_of()
861 !of_get_next_child(client->dev.of_node, NULL)) in ads1015_get_channels_config_of()
862 return -EINVAL; in ads1015_get_channels_config_of()
864 for_each_child_of_node(client->dev.of_node, node) { in ads1015_get_channels_config_of()
871 dev_err(&client->dev, "invalid reg on %pOF\n", in ads1015_get_channels_config_of()
878 dev_err(&client->dev, in ads1015_get_channels_config_of()
887 dev_err(&client->dev, "invalid gain on %pOF\n", in ads1015_get_channels_config_of()
890 return -EINVAL; in ads1015_get_channels_config_of()
897 dev_err(&client->dev, in ads1015_get_channels_config_of()
901 return -EINVAL; in ads1015_get_channels_config_of()
905 data->channel_data[channel].pga = pga; in ads1015_get_channels_config_of()
906 data->channel_data[channel].data_rate = data_rate; in ads1015_get_channels_config_of()
919 struct ads1015_platform_data *pdata = dev_get_platdata(&client->dev); in ads1015_get_channels_config()
923 memcpy(data->channel_data, pdata->channel_data, in ads1015_get_channels_config()
924 sizeof(data->channel_data)); in ads1015_get_channels_config()
934 data->channel_data[k].pga = ADS1015_DEFAULT_PGA; in ads1015_get_channels_config()
935 data->channel_data[k].data_rate = ADS1015_DEFAULT_DATA_RATE; in ads1015_get_channels_config()
941 return regmap_update_bits(data->regmap, ADS1015_CFG_REG, in ads1015_set_conv_mode()
955 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in ads1015_probe()
957 return -ENOMEM; in ads1015_probe()
962 mutex_init(&data->lock); in ads1015_probe()
964 indio_dev->dev.parent = &client->dev; in ads1015_probe()
965 indio_dev->dev.of_node = client->dev.of_node; in ads1015_probe()
966 indio_dev->name = ADS1015_DRV_NAME; in ads1015_probe()
967 indio_dev->modes = INDIO_DIRECT_MODE; in ads1015_probe()
969 if (client->dev.of_node) in ads1015_probe()
970 chip = (enum chip_ids)of_device_get_match_data(&client->dev); in ads1015_probe()
972 chip = id->driver_data; in ads1015_probe()
975 indio_dev->channels = ads1015_channels; in ads1015_probe()
976 indio_dev->num_channels = ARRAY_SIZE(ads1015_channels); in ads1015_probe()
977 indio_dev->info = &ads1015_info; in ads1015_probe()
978 data->data_rate = (unsigned int *) &ads1015_data_rate; in ads1015_probe()
981 indio_dev->channels = ads1115_channels; in ads1015_probe()
982 indio_dev->num_channels = ARRAY_SIZE(ads1115_channels); in ads1015_probe()
983 indio_dev->info = &ads1115_info; in ads1015_probe()
984 data->data_rate = (unsigned int *) &ads1115_data_rate; in ads1015_probe()
988 data->event_channel = ADS1015_CHANNELS; in ads1015_probe()
994 int realbits = indio_dev->channels[i].scan_type.realbits; in ads1015_probe()
996 data->thresh_data[i].low_thresh = -1 << (realbits - 1); in ads1015_probe()
997 data->thresh_data[i].high_thresh = (1 << (realbits - 1)) - 1; in ads1015_probe()
1003 data->regmap = devm_regmap_init_i2c(client, &ads1015_regmap_config); in ads1015_probe()
1004 if (IS_ERR(data->regmap)) { in ads1015_probe()
1005 dev_err(&client->dev, "Failed to allocate register map\n"); in ads1015_probe()
1006 return PTR_ERR(data->regmap); in ads1015_probe()
1009 ret = devm_iio_triggered_buffer_setup(&client->dev, indio_dev, NULL, in ads1015_probe()
1013 dev_err(&client->dev, "iio triggered buffer setup failed\n"); in ads1015_probe()
1017 if (client->irq) { in ads1015_probe()
1019 irqd_get_trigger_type(irq_get_irq_data(client->irq)); in ads1015_probe()
1036 return -EINVAL; in ads1015_probe()
1039 ret = regmap_update_bits(data->regmap, ADS1015_CFG_REG, in ads1015_probe()
1044 ret = devm_request_threaded_irq(&client->dev, client->irq, in ads1015_probe()
1047 client->name, indio_dev); in ads1015_probe()
1056 data->conv_invalid = true; in ads1015_probe()
1058 ret = pm_runtime_set_active(&client->dev); in ads1015_probe()
1061 pm_runtime_set_autosuspend_delay(&client->dev, ADS1015_SLEEP_DELAY_MS); in ads1015_probe()
1062 pm_runtime_use_autosuspend(&client->dev); in ads1015_probe()
1063 pm_runtime_enable(&client->dev); in ads1015_probe()
1067 dev_err(&client->dev, "Failed to register IIO device\n"); in ads1015_probe()
1081 pm_runtime_disable(&client->dev); in ads1015_remove()
1082 pm_runtime_set_suspended(&client->dev); in ads1015_remove()
1083 pm_runtime_put_noidle(&client->dev); in ads1015_remove()
1106 data->conv_invalid = true; in ads1015_runtime_resume()