Re: [PATCH v6 6/6] iio: dac: ad5504: support scale via output-range-microvolt property

David Lechner <[email protected]>
Newsgroups org.kernel.vger.linux-iio,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On 8/22/26 3:56 AM, Taha Ed-Dafili wrote:
> The AD5504 output range is set by the R_SEL pin, not the VCC supply.
> Add support for 'output-range-microvolt' to set vref_mv directly from
> firmware. Use device_property_present() to distinguish absent from
> malformed property rather than relying on the ambiguous -EINVAL from
> device_property_read_u32_array(). Fall back to the vcc regulator
> voltage for old DTs that predate this property.
> 
> Signed-off-by: Taha Ed-Dafili <[email protected]>
> ---
>  drivers/iio/dac/ad5504.c | 31 +++++++++++++++++++++++++------
>  1 file changed, 25 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/iio/dac/ad5504.c b/drivers/iio/dac/ad5504.c
> index 74679feea385..d0a3dd4b000d 100644
> --- a/drivers/iio/dac/ad5504.c
> +++ b/drivers/iio/dac/ad5504.c
> @@ -300,6 +300,7 @@ static int ad5504_probe(struct spi_device *spi)
>  	struct device *dev = &spi->dev;
>  	struct iio_dev *indio_dev;
>  	struct ad5504_state *st;
> +	u32 range[2];
>  	int ret;
>  
>  	indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
> @@ -315,12 +316,30 @@ static int ad5504_probe(struct spi_device *spi)
>  	if (is_acpi_device_node(dev_fwnode(dev))) {
>  		st->vref_mv = AD5504_VREF_ACPI_DEFAULT_mV;
>  	} else {
> -		ret = devm_regulator_get_enable_read_voltage(dev, "vcc");
> -		if (ret < 0)
> -			return dev_err_probe(dev, ret,
> -					     "Failed to get vcc regulator\n");
> -
> -		st->vref_mv = ret / 1000;
> +		if (device_property_present(dev, "output-range-microvolt")) {
> +			ret = device_property_read_u32_array(dev, "output-range-microvolt",
> +							     range, ARRAY_SIZE(range));
> +			if (ret)
> +				return dev_err_probe(dev, ret,
> +							"Error parsing output-range-microvolt\n");
> +
> +			if (range[0] != 0 || (range[1] != 30 * MICRO && range[1] != 60 * MICRO))
> +				return dev_err_probe(dev, -EINVAL,
> +					"Invalid output-range-microvolt\n");
> +
> +			st->vref_mv = range[1] / (MICRO / MILLI);
> +
> +			ret = devm_regulator_get_enable(dev, "vcc");
> +			if (ret < 0)
> +				return dev_err_probe(dev, ret, "Failed to enable vcc regulator\n");

We should probably handle range-sel-gpios here. Otherwise, if a new DT tries
to use it, it will end up falling back to this old wrong behavior.

		} else if (device_property_present("range-sel-gpios")) {
			
Either return an error here that it is not supported. Or implement it by
making IIO_CHAN_INFO_SCALE writable.

> +		} else {
> +			/* Backward compat: old DTs without output-range-microvolt */
> +			ret = devm_regulator_get_enable_read_voltage(dev, "vcc");
> +			if (ret < 0)
> +				return dev_err_probe(dev, ret, "Failed to get vcc regulator\n");
> +
> +			st->vref_mv = ret / (MICRO / MILLI);
> +		}
>  	}
>  
>  	st->spi = spi;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.