On Wed, 8 Sep 2021 17:25:24 +0200 Florian Boor <florian.boor@xxxxxxxxxxxxxxxxx> wrote: > Make use of the AD7991_REF_SEL bit and support using the external > reference voltage if 'vref-supply' is present. > > Signed-off-by: Florian Boor <florian.boor@xxxxxxxxxxxxxxxxx> Hi Florian, > --- > > Changes in v2: > - Check if a provided external vref regulator is provided. > - Drop unused setting > - Add ad79xx documentation (second patch) > > drivers/iio/adc/ad799x.c | 21 +++++++++++++++++++-- > 1 file changed, 19 insertions(+), 2 deletions(-) > > diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c > index 18bf8386d50a..2ff926a4e9b3 100644 > --- a/drivers/iio/adc/ad799x.c > +++ b/drivers/iio/adc/ad799x.c > @@ -770,6 +770,8 @@ static int ad799x_probe(struct i2c_client *client, > const struct i2c_device_id *id) > { > int ret; > + int extra_config = 0; > + bool vref_external = true; > struct ad799x_state *st; > struct iio_dev *indio_dev; > const struct ad799x_chip_info *chip_info = > @@ -797,7 +799,15 @@ static int ad799x_probe(struct i2c_client *client, > ret = regulator_enable(st->reg); > if (ret) > return ret; > - st->vref = devm_regulator_get(&client->dev, "vref"); > + > + /* check if an external reference is supplied */ > + st->vref = devm_regulator_get_optional(&client->dev, "vref"); > + > + if (PTR_ERR(st->vref) == -ENODEV) { > + vref_external = false; > + /* get dummy */ > + st->vref = devm_regulator_get(&client->dev, "vref"); Why? Instead of doing this add if (st->vref) around the regulator enable and disable. We don't want to pretend there is a regulator when there isn't one connected and we are using VDD as the reference. If we are in that mode, we need to change which regulator is read in read_raw() > + } > if (IS_ERR(st->vref)) { > ret = PTR_ERR(st->vref); > goto error_disable_reg; > @@ -806,6 +816,13 @@ static int ad799x_probe(struct i2c_client *client, > if (ret) > goto error_disable_reg; > > + /* use external reference voltage, optional if regulator present */ > + if (vref_external && > + ((st->id == ad7991) || (st->id == ad7995) || (st->id == ad7999))) { > + dev_info(&client->dev, "Using external reference voltage\n"); > + extra_config |= AD7991_REF_SEL; > + } > + > st->client = client; > > indio_dev->name = id->name; > @@ -815,7 +832,7 @@ static int ad799x_probe(struct i2c_client *client, > indio_dev->channels = st->chip_config->channel; > indio_dev->num_channels = chip_info->num_channels; > > - ret = ad799x_update_config(st, st->chip_config->default_config); > + ret = ad799x_update_config(st, st->chip_config->default_config | extra_config); > if (ret) > goto error_disable_vref; >