Lines Matching +full:vref +full:- +full:n +full:- +full:supply
1 // SPDX-License-Identifier: GPL-2.0-only
4 * multi-channel Digital to Analog Converters driver
35 * struct ad5380_chip_info - chip specific information
38 * @int_vref: internal vref in uV
48 * struct ad5380_state - driver instance specific data
51 * @vref_reg: vref supply regulator
52 * @vref: actual reference voltage used in uA
61 int vref; member
88 return sprintf(buf, "%d\n", st->pwr_down); in ad5380_read_dac_powerdown()
103 mutex_lock(&st->lock); in ad5380_write_dac_powerdown()
106 ret = regmap_write(st->regmap, AD5380_REG_SF_PWR_DOWN, 0); in ad5380_write_dac_powerdown()
108 ret = regmap_write(st->regmap, AD5380_REG_SF_PWR_UP, 0); in ad5380_write_dac_powerdown()
110 st->pwr_down = pwr_down; in ad5380_write_dac_powerdown()
112 mutex_unlock(&st->lock); in ad5380_write_dac_powerdown()
129 ret = regmap_read(st->regmap, AD5380_REG_SF_CTRL, &mode); in ad5380_get_powerdown_mode()
144 ret = regmap_update_bits(st->regmap, AD5380_REG_SF_CTRL, in ad5380_set_powerdown_mode()
163 return AD5380_REG_DATA(chan->address); in ad5380_info_to_reg()
165 return AD5380_REG_OFFSET(chan->address); in ad5380_info_to_reg()
167 return AD5380_REG_GAIN(chan->address); in ad5380_info_to_reg()
178 const unsigned int max_val = (1 << chan->scan_type.realbits); in ad5380_write_raw()
185 return -EINVAL; in ad5380_write_raw()
187 return regmap_write(st->regmap, in ad5380_write_raw()
189 val << chan->scan_type.shift); in ad5380_write_raw()
191 val += (1 << chan->scan_type.realbits) / 2; in ad5380_write_raw()
193 return -EINVAL; in ad5380_write_raw()
195 return regmap_write(st->regmap, in ad5380_write_raw()
196 AD5380_REG_OFFSET(chan->address), in ad5380_write_raw()
197 val << chan->scan_type.shift); in ad5380_write_raw()
201 return -EINVAL; in ad5380_write_raw()
213 ret = regmap_read(st->regmap, ad5380_info_to_reg(chan, info), in ad5380_read_raw()
217 *val >>= chan->scan_type.shift; in ad5380_read_raw()
220 ret = regmap_read(st->regmap, AD5380_REG_OFFSET(chan->address), in ad5380_read_raw()
224 *val >>= chan->scan_type.shift; in ad5380_read_raw()
225 *val -= (1 << chan->scan_type.realbits) / 2; in ad5380_read_raw()
228 *val = 2 * st->vref; in ad5380_read_raw()
229 *val2 = chan->scan_type.realbits; in ad5380_read_raw()
235 return -EINVAL; in ad5380_read_raw()
268 .shift = 14 - (_bits), \
352 channels = kcalloc(st->chip_info->num_channels, in ad5380_alloc_channels()
356 return -ENOMEM; in ad5380_alloc_channels()
358 for (i = 0; i < st->chip_info->num_channels; ++i) { in ad5380_alloc_channels()
359 channels[i] = st->chip_info->channel_template; in ad5380_alloc_channels()
364 indio_dev->channels = channels; in ad5380_alloc_channels()
379 dev_err(dev, "Failed to allocate iio device\n"); in ad5380_probe()
380 return -ENOMEM; in ad5380_probe()
386 st->chip_info = &ad5380_chip_info_tbl[type]; in ad5380_probe()
387 st->regmap = regmap; in ad5380_probe()
389 indio_dev->name = name; in ad5380_probe()
390 indio_dev->info = &ad5380_info; in ad5380_probe()
391 indio_dev->modes = INDIO_DIRECT_MODE; in ad5380_probe()
392 indio_dev->num_channels = st->chip_info->num_channels; in ad5380_probe()
394 mutex_init(&st->lock); in ad5380_probe()
398 dev_err(dev, "Failed to allocate channel spec: %d\n", ret); in ad5380_probe()
402 if (st->chip_info->int_vref == 2500) in ad5380_probe()
405 st->vref_reg = devm_regulator_get(dev, "vref"); in ad5380_probe()
406 if (!IS_ERR(st->vref_reg)) { in ad5380_probe()
407 ret = regulator_enable(st->vref_reg); in ad5380_probe()
409 dev_err(dev, "Failed to enable vref regulators: %d\n", in ad5380_probe()
414 ret = regulator_get_voltage(st->vref_reg); in ad5380_probe()
418 st->vref = ret / 1000; in ad5380_probe()
420 st->vref = st->chip_info->int_vref; in ad5380_probe()
424 ret = regmap_write(st->regmap, AD5380_REG_SF_CTRL, ctrl); in ad5380_probe()
426 dev_err(dev, "Failed to write to device: %d\n", ret); in ad5380_probe()
432 dev_err(dev, "Failed to register iio device: %d\n", ret); in ad5380_probe()
439 if (!IS_ERR(st->vref_reg)) in ad5380_probe()
440 regulator_disable(st->vref_reg); in ad5380_probe()
442 kfree(indio_dev->channels); in ad5380_probe()
454 kfree(indio_dev->channels); in ad5380_remove()
456 if (!IS_ERR(st->vref_reg)) { in ad5380_remove()
457 regulator_disable(st->vref_reg); in ad5380_remove()
491 return ad5380_probe(&spi->dev, regmap, id->driver_data, id->name); in ad5380_spi_probe()
496 return ad5380_remove(&spi->dev); in ad5380_spi_remove()
500 { "ad5380-3", ID_AD5380_3 },
501 { "ad5380-5", ID_AD5380_5 },
502 { "ad5381-3", ID_AD5381_3 },
503 { "ad5381-5", ID_AD5381_5 },
504 { "ad5382-3", ID_AD5382_3 },
505 { "ad5382-5", ID_AD5382_5 },
506 { "ad5383-3", ID_AD5383_3 },
507 { "ad5383-5", ID_AD5383_5 },
508 { "ad5384-3", ID_AD5380_3 },
509 { "ad5384-5", ID_AD5380_5 },
510 { "ad5390-3", ID_AD5390_3 },
511 { "ad5390-5", ID_AD5390_5 },
512 { "ad5391-3", ID_AD5391_3 },
513 { "ad5391-5", ID_AD5391_5 },
514 { "ad5392-3", ID_AD5392_3 },
515 { "ad5392-5", ID_AD5392_5 },
564 return ad5380_probe(&i2c->dev, regmap, id->driver_data, id->name); in ad5380_i2c_probe()
569 return ad5380_remove(&i2c->dev); in ad5380_i2c_remove()
573 { "ad5380-3", ID_AD5380_3 },
574 { "ad5380-5", ID_AD5380_5 },
575 { "ad5381-3", ID_AD5381_3 },
576 { "ad5381-5", ID_AD5381_5 },
577 { "ad5382-3", ID_AD5382_3 },
578 { "ad5382-5", ID_AD5382_5 },
579 { "ad5383-3", ID_AD5383_3 },
580 { "ad5383-5", ID_AD5383_5 },
581 { "ad5384-3", ID_AD5380_3 },
582 { "ad5384-5", ID_AD5380_5 },
583 { "ad5390-3", ID_AD5390_3 },
584 { "ad5390-5", ID_AD5390_5 },
585 { "ad5391-3", ID_AD5391_3 },
586 { "ad5391-5", ID_AD5391_5 },
587 { "ad5392-3", ID_AD5392_3 },
588 { "ad5392-5", ID_AD5392_5 },
651 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");