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)
199 return -EINVAL;
201 if (data->conv_invalid) {
205 /* Allow 10% for internal clock inaccuracy. */
208 data->conv_invalid = false;
211 ret = regmap_raw_read(data->regmap, ADS7924_AUTO_INCREMENT_BIT |
212 chan->address, &be_val, sizeof(be_val));
230 mutex_lock(&data->lock);
232 mutex_unlock(&data->lock);
238 vref_uv = regulator_get_voltage(data->vref_reg);
246 return -EINVAL;
279 return -EINVAL;
288 struct device *dev = data->dev;
299 ret = regmap_update_bits(data->regmap, ADS7924_MODECNTRL_REG,
311 ret = regmap_update_bits(data->regmap, ADS7924_MODECNTRL_REG,
324 if (data->reset_gpio) {
325 gpiod_set_value(data->reset_gpio, 1); /* Assert. */
328 gpiod_set_value(data->reset_gpio, 0); /* Deassert. */
336 return regmap_write(data->regmap, ADS7924_RESET_REG, 0b10101010);
353 struct device *dev = &client->dev;
356 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
358 return dev_err_probe(dev, -ENOMEM,
363 data->dev = dev;
366 data->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
367 if (IS_ERR(data->reset_gpio))
368 return dev_err_probe(dev, PTR_ERR(data->reset_gpio),
371 mutex_init(&data->lock);
373 indio_dev->name = "ads7924";
374 indio_dev->modes = INDIO_DIRECT_MODE;
376 indio_dev->channels = ads7924_channels;
377 indio_dev->num_channels = ARRAY_SIZE(ads7924_channels);
378 indio_dev->info = &ads7924_info;
385 data->regmap = devm_regmap_init_i2c(client, &ads7924_regmap_config);
386 if (IS_ERR(data->regmap))
387 return dev_err_probe(dev, PTR_ERR(data->regmap),
390 data->vref_reg = devm_regulator_get(dev, "vref");
391 if (IS_ERR(data->vref_reg))
392 return dev_err_probe(dev, PTR_ERR(data->vref_reg),
393 "failed to get vref regulator\n");
395 ret = regulator_enable(data->vref_reg);
398 "failed to enable regulator\n");
400 ret = devm_add_action_or_reset(dev, ads7924_reg_disable, data->vref_reg);
403 "failed to add regulator disable action\n");
421 ret = regmap_update_bits(data->regmap, ADS7924_ACQCONFIG_REG,
428 /* Disable power-up time. */
429 ret = regmap_update_bits(data->regmap, ADS7924_PWRCONFIG_REG,
434 "failed to configure power-up time\n");
436 data->conv_invalid = true;