Lines Matching +full:adc +full:- +full:diff +full:- +full:channels
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Texas Instruments ADS1119 ADC driver.
121 unsigned int config = st->cached_config; in ads1119_upd_cfg_reg()
127 ret = i2c_smbus_write_byte_data(st->client, ADS1119_CMD_WREG, config); in ads1119_upd_cfg_reg()
131 st->cached_config = config; in ads1119_upd_cfg_reg()
140 status = i2c_smbus_read_byte_data(st->client, ADS1119_CMD_RREG_STATUS); in ads1119_data_ready()
149 st->cached_config = 0; in ads1119_reset()
151 if (!st->reset_gpio) in ads1119_reset()
152 return i2c_smbus_write_byte(st->client, ADS1119_CMD_RESET); in ads1119_reset()
154 gpiod_set_value_cansleep(st->reset_gpio, 1); in ads1119_reset()
156 gpiod_set_value_cansleep(st->reset_gpio, 0); in ads1119_reset()
222 unsigned int datarate = st->channels_cfg[chan->address].datarate; in ads1119_poll_data_ready()
243 if (!st->client->irq) { in ads1119_read_data()
247 } else if (!wait_for_completion_timeout(&st->completion, timeout)) { in ads1119_read_data()
248 return -ETIMEDOUT; in ads1119_read_data()
251 ret = i2c_smbus_read_word_swapped(st->client, ADS1119_CMD_RDATA); in ads1119_read_data()
265 struct device *dev = &st->client->dev; in ads1119_single_conversion()
266 int mux = st->channels_cfg[chan->address].mux; in ads1119_single_conversion()
267 int gain = st->channels_cfg[chan->address].gain; in ads1119_single_conversion()
268 int datarate = st->channels_cfg[chan->address].datarate; in ads1119_single_conversion()
283 ret = i2c_smbus_write_byte(st->client, ADS1119_CMD_START_SYNC); in ads1119_single_conversion()
291 *val = sign_extend32(sample, chan->scan_type.realbits - 1); in ads1119_single_conversion()
308 return -EINVAL; in ads1119_validate_datarate()
329 return -EINVAL; in ads1119_read_avail()
338 unsigned int index = chan->address; in ads1119_read_raw()
341 if (index >= st->num_channels_cfg) in ads1119_read_raw()
342 return -EINVAL; in ads1119_read_raw()
347 return -EBUSY; in ads1119_read_raw()
353 return -EBUSY; in ads1119_read_raw()
358 *val = st->vref_uV / 1000; in ads1119_read_raw()
359 *val /= st->channels_cfg[index].gain; in ads1119_read_raw()
360 *val2 = chan->scan_type.realbits - 1; in ads1119_read_raw()
363 *val = st->channels_cfg[index].datarate; in ads1119_read_raw()
366 return -EINVAL; in ads1119_read_raw()
375 unsigned int index = chan->address; in ads1119_write_raw()
378 if (index >= st->num_channels_cfg) in ads1119_write_raw()
379 return -EINVAL; in ads1119_write_raw()
385 return -EINVAL; in ads1119_write_raw()
387 st->channels_cfg[index].gain = ret; in ads1119_write_raw()
394 st->channels_cfg[index].datarate = ret; in ads1119_write_raw()
397 return -EINVAL; in ads1119_write_raw()
409 return -EINVAL; in ads1119_debugfs_reg_access()
412 ret = i2c_smbus_read_byte_data(st->client, in ads1119_debugfs_reg_access()
422 return -EINVAL; in ads1119_debugfs_reg_access()
424 return i2c_smbus_write_byte_data(st->client, ADS1119_CMD_WREG, in ads1119_debugfs_reg_access()
438 struct device *dev = &st->client->dev; in ads1119_triggered_buffer_preenable()
442 index = find_first_bit(indio_dev->active_scan_mask, in ads1119_triggered_buffer_preenable()
450 st->channels_cfg[index].mux, in ads1119_triggered_buffer_preenable()
451 st->channels_cfg[index].gain, in ads1119_triggered_buffer_preenable()
452 st->channels_cfg[index].datarate); in ads1119_triggered_buffer_preenable()
460 return i2c_smbus_write_byte(st->client, ADS1119_CMD_START_SYNC); in ads1119_triggered_buffer_preenable()
466 struct device *dev = &st->client->dev; in ads1119_triggered_buffer_postdisable()
495 iio_trigger_poll(indio_dev->trig); in ads1119_irq_handler()
497 complete(&st->completion); in ads1119_irq_handler()
505 struct iio_dev *indio_dev = pf->indio_dev; in ads1119_trigger_handler()
517 index = find_first_bit(indio_dev->active_scan_mask, in ads1119_trigger_handler()
520 ret = ads1119_poll_data_ready(st, &indio_dev->channels[index]); in ads1119_trigger_handler()
522 dev_err(&st->client->dev, in ads1119_trigger_handler()
528 ret = i2c_smbus_read_word_swapped(st->client, ADS1119_CMD_RDATA); in ads1119_trigger_handler()
530 dev_err(&st->client->dev, in ads1119_trigger_handler()
540 iio_trigger_notify_done(indio_dev->trig); in ads1119_trigger_handler()
564 return -EINVAL; in ads1119_map_analog_inputs_mux()
576 return -EINVAL; in ads1119_map_analog_inputs_mux()
602 struct device *dev = &st->client->dev; in ads1119_alloc_and_config_channels()
608 st->num_channels_cfg = device_get_child_node_count(dev); in ads1119_alloc_and_config_channels()
609 if (st->num_channels_cfg > ADS1119_MAX_CHANNELS) in ads1119_alloc_and_config_channels()
610 return dev_err_probe(dev, -EINVAL, in ads1119_alloc_and_config_channels()
611 "Too many channels %d, max is %d\n", in ads1119_alloc_and_config_channels()
612 st->num_channels_cfg, in ads1119_alloc_and_config_channels()
615 st->channels_cfg = devm_kcalloc(dev, st->num_channels_cfg, in ads1119_alloc_and_config_channels()
616 sizeof(*st->channels_cfg), GFP_KERNEL); in ads1119_alloc_and_config_channels()
617 if (!st->channels_cfg) in ads1119_alloc_and_config_channels()
618 return -ENOMEM; in ads1119_alloc_and_config_channels()
621 num_channels = st->num_channels_cfg + 1; in ads1119_alloc_and_config_channels()
625 return -ENOMEM; in ads1119_alloc_and_config_channels()
632 differential = fwnode_property_present(child, "diff-channels"); in ads1119_alloc_and_config_channels()
635 "diff-channels", in ads1119_alloc_and_config_channels()
638 ret = fwnode_property_read_u32(child, "single-channel", in ads1119_alloc_and_config_channels()
651 st->channels_cfg[i].mux = ret; in ads1119_alloc_and_config_channels()
652 st->channels_cfg[i].gain = ADS1119_DEFAULT_GAIN; in ads1119_alloc_and_config_channels()
653 st->channels_cfg[i].datarate = ADS1119_DEFAULT_DATARATE; in ads1119_alloc_and_config_channels()
656 chan->channel = ain[0]; in ads1119_alloc_and_config_channels()
657 chan->address = i; in ads1119_alloc_and_config_channels()
658 chan->scan_index = i; in ads1119_alloc_and_config_channels()
661 chan->channel2 = ain[1]; in ads1119_alloc_and_config_channels()
662 chan->differential = 1; in ads1119_alloc_and_config_channels()
666 st->channels_cfg[i].mux); in ads1119_alloc_and_config_channels()
675 indio_dev->channels = iio_channels; in ads1119_alloc_and_config_channels()
676 indio_dev->num_channels = num_channels; in ads1119_alloc_and_config_channels()
685 i2c_smbus_write_byte(st->client, ADS1119_CMD_POWERDOWN); in ads1119_powerdown()
692 struct device *dev = &client->dev; in ads1119_probe()
698 return dev_err_probe(dev, -ENOMEM, in ads1119_probe()
702 st->client = client; in ads1119_probe()
704 indio_dev->name = "ads1119"; in ads1119_probe()
705 indio_dev->info = &ads1119_info; in ads1119_probe()
706 indio_dev->modes = INDIO_DIRECT_MODE; in ads1119_probe()
717 st->vref_uV = devm_regulator_get_enable_read_voltage(dev, "vref"); in ads1119_probe()
718 if (st->vref_uV == -ENODEV) { in ads1119_probe()
720 st->vref_uV = ADS1119_VREF_INTERNAL_VAL; in ads1119_probe()
721 } else if (st->vref_uV < 0) { in ads1119_probe()
722 return dev_err_probe(dev, st->vref_uV, "Failed to get vref\n"); in ads1119_probe()
725 st->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); in ads1119_probe()
726 if (IS_ERR(st->reset_gpio)) in ads1119_probe()
727 return dev_err_probe(dev, PTR_ERR(st->reset_gpio), in ads1119_probe()
734 init_completion(&st->completion); in ads1119_probe()
742 if (client->irq > 0) { in ads1119_probe()
743 ret = devm_request_threaded_irq(dev, client->irq, in ads1119_probe()
751 st->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", in ads1119_probe()
752 indio_dev->name, in ads1119_probe()
754 if (!st->trig) in ads1119_probe()
755 return dev_err_probe(dev, -ENOMEM, in ads1119_probe()
758 st->trig->ops = &ads1119_trigger_ops; in ads1119_probe()
759 iio_trigger_set_drvdata(st->trig, indio_dev); in ads1119_probe()
761 ret = devm_iio_trigger_register(dev, st->trig); in ads1119_probe()
794 return i2c_smbus_write_byte(st->client, ADS1119_CMD_POWERDOWN); in ads1119_runtime_suspend()
831 MODULE_DESCRIPTION("Texas Instruments ADS1119 ADC Driver");