Lines Matching +full:regulator +full:- +full:allow +full:- +full:bypass

1 // SPDX-License-Identifier: GPL-2.0
3 * IIO driver for Texas Instruments ADS7924 ADC, 12-bit, 4-Channels, I2C
8 * based on iio/adc/ti-ads1015.c
23 #include <linux/regulator/consumer.h>
98 * The power-up time is allowed to elapse whenever the device has been shutdown
99 * in idle mode. Power-up time can allow external circuits, such as an
103 * If a power-up time is not required, set the bits to '0' to effectively bypass.
105 #define ADS7924_PWRUPTIME_US 0 /* Bypass (0us). */
135 struct regulator *vref_reg;
137 /* GPIO descriptor for device hard-reset pin. */
147 * Set to true when the ADC is switched to the continuous-conversion
148 * mode and exits from a power-down state. This flag is used to avoid
198 if (chan->channel < 0 || chan->channel >= ADS7924_CHANNELS) in ads7924_get_adc_result()
199 return -EINVAL; in ads7924_get_adc_result()
201 if (data->conv_invalid) { in ads7924_get_adc_result()
205 /* Allow 10% for internal clock inaccuracy. */ in ads7924_get_adc_result()
208 data->conv_invalid = false; in ads7924_get_adc_result()
211 ret = regmap_raw_read(data->regmap, ADS7924_AUTO_INCREMENT_BIT | in ads7924_get_adc_result()
212 chan->address, &be_val, sizeof(be_val)); in ads7924_get_adc_result()
230 mutex_lock(&data->lock); in ads7924_read_raw()
232 mutex_unlock(&data->lock); in ads7924_read_raw()
238 vref_uv = regulator_get_voltage(data->vref_reg); in ads7924_read_raw()
246 return -EINVAL; in ads7924_read_raw()
279 return -EINVAL; in ads7924_get_channels_config()
288 struct device *dev = data->dev; in ads7924_set_conv_mode()
299 ret = regmap_update_bits(data->regmap, ADS7924_MODECNTRL_REG, in ads7924_set_conv_mode()
311 ret = regmap_update_bits(data->regmap, ADS7924_MODECNTRL_REG, in ads7924_set_conv_mode()
324 if (data->reset_gpio) { in ads7924_reset()
325 gpiod_set_value(data->reset_gpio, 1); /* Assert. */ in ads7924_reset()
328 gpiod_set_value(data->reset_gpio, 0); /* Deassert. */ in ads7924_reset()
336 return regmap_write(data->regmap, ADS7924_RESET_REG, 0b10101010); in ads7924_reset()
353 struct device *dev = &client->dev; in ads7924_probe()
356 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in ads7924_probe()
358 return dev_err_probe(dev, -ENOMEM, in ads7924_probe()
363 data->dev = dev; in ads7924_probe()
366 data->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); in ads7924_probe()
367 if (IS_ERR(data->reset_gpio)) in ads7924_probe()
368 return dev_err_probe(dev, PTR_ERR(data->reset_gpio), in ads7924_probe()
371 mutex_init(&data->lock); in ads7924_probe()
373 indio_dev->name = "ads7924"; in ads7924_probe()
374 indio_dev->modes = INDIO_DIRECT_MODE; in ads7924_probe()
376 indio_dev->channels = ads7924_channels; in ads7924_probe()
377 indio_dev->num_channels = ARRAY_SIZE(ads7924_channels); in ads7924_probe()
378 indio_dev->info = &ads7924_info; in ads7924_probe()
385 data->regmap = devm_regmap_init_i2c(client, &ads7924_regmap_config); in ads7924_probe()
386 if (IS_ERR(data->regmap)) in ads7924_probe()
387 return dev_err_probe(dev, PTR_ERR(data->regmap), in ads7924_probe()
390 data->vref_reg = devm_regulator_get(dev, "vref"); in ads7924_probe()
391 if (IS_ERR(data->vref_reg)) in ads7924_probe()
392 return dev_err_probe(dev, PTR_ERR(data->vref_reg), in ads7924_probe()
393 "failed to get vref regulator\n"); in ads7924_probe()
395 ret = regulator_enable(data->vref_reg); in ads7924_probe()
398 "failed to enable regulator\n"); in ads7924_probe()
400 ret = devm_add_action_or_reset(dev, ads7924_reg_disable, data->vref_reg); in ads7924_probe()
403 "failed to add regulator disable action\n"); in ads7924_probe()
421 ret = regmap_update_bits(data->regmap, ADS7924_ACQCONFIG_REG, in ads7924_probe()
428 /* Disable power-up time. */ in ads7924_probe()
429 ret = regmap_update_bits(data->regmap, ADS7924_PWRCONFIG_REG, in ads7924_probe()
434 "failed to configure power-up time\n"); in ads7924_probe()
436 data->conv_invalid = true; in ads7924_probe()