Re: [PATCH v3 4/9] iio: adc: ti-ads1262: support per-channel reference and gain

"Kurt Borja" <[email protected]>
Newsgroups org.kernel.vger.linux-iio,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-gpio,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On Sat Aug 8, 2026 at 1:39 PM -05, David Lechner wrote:
> On 8/7/26 10:58 PM, Kurt Borja wrote:
>> Allow each channel to select its voltage reference through the
>> "reference-sources" firmware property. Then, use the reference voltage
>> to calculate available scales.
>
> It looks like this is also implementing PGA gain at the same time, but
> isn't mentioned in ght commit messsage. I would also expect something
> here about how we should handle PGA bypass (even if it just says default
> works always and we can consdier controlling it later).

I forgot about the PGA bypass stuff. I do believe it should belong in
devicetree because it changes the voltage range of the analog inputs.
See datasheet section 10.3 and 7.3.

>
>> 
>> The ADS1262 allows single-ended supply configurations or bipolar supply
>> configurations. In single ended configurations both the analog and
>> digital rails share the same ground, i.e. AVSS = DGND = 0 V. In bipolar
>> supply configurations, AVSS can go below ground, e.g. AVSS = -2.5 V.
>> 
>> If AVSS is below ground, the ADC can achieve true bipolar measurements
>> and the external references can also have voltage levels below ground.
>> This is currently an issue because the regulator subsystem doesn't
>> support negative voltages.
>> 
>> The ad4170-4 driver faces this problem too and the same workaround is
>> used in this case: assume every regulator reports magnitudes (absolute
>> values). If the chip has a bipolar supply configuration, then assume
>> positive references are above ground (>= 0 V) and negative references
>> are below ground (<= 0 V). This is not a hardware constraint, but it is
>> the most common wiring.
>> 
>> Signed-off-by: Kurt Borja <[email protected]>
>> ---
>>  drivers/iio/adc/ti-ads1262.c | 417 +++++++++++++++++++++++++++++++++++++++++--
>>  1 file changed, 406 insertions(+), 11 deletions(-)
>> 
>> diff --git a/drivers/iio/adc/ti-ads1262.c b/drivers/iio/adc/ti-ads1262.c
>> index b3b7b1249102..360ce01a5871 100644
>> --- a/drivers/iio/adc/ti-ads1262.c
>> +++ b/drivers/iio/adc/ti-ads1262.c

[...]

>> @@ -688,6 +818,91 @@ static const struct regmap_bus ads1262_regmap_bus = {
>>  	.max_raw_write = ADS1262_MAX_REGMAP_WRITE,
>>  };
>>  
>> +static void ads1262_calculate_scales(int (*scales)[2], size_t num_scales,
>> +				     u32 full_scale, u64 mult,
>> +				     u32 resolution)
>> +{
>> +	unsigned int i;
>> +	s64 val;
>> +
>> +	for (i = 0; i < num_scales; i++) {
>
> This could use a comment explaining the relasionship of the index in the
> array to the PGA multipier.
>
>> +		val = mul_u64_u64_shr(full_scale, mult, resolution - 1 + i);
>> +		iio_val_s64_decompose(val, &scales[i][0], &scales[i][1]);
>> +	}
>> +}
>> +
>> +static int ads1262_populate_scales_resistance(struct ads1262 *st,
>> +					      const struct iio_chan_spec *spec)
>> +{
>> +	struct ads1262_channel *chan = &st->channels[spec->scan_index];
>> +	u32 full_scale;
>> +
>> +	if (WARN_ON(!ads1262_ref_is_external(chan->ref_p, chan->ref_n)))
>> +		return -EINVAL;
>
> WARN_ON() is a bit strong for something that is coming from the devicetree.
> I would just fail the parse() function with an appropriate error message
> so that we don't have to check here.

Actually, an IIO_RESISTANCE channel without external reference is just a
bug and would read past the end of buffer below, which is the only
reason I verify it one last time. We should never actually hit this
warning. I'll add a comment explaining that.


>
>> +
>> +	full_scale = st->rref_ohms[chan->ref_p - 1][chan->ref_n - 1];
>> +
>> +	chan->num_scales = ARRAY_SIZE(chan->scales);
>> +
>> +	ads1262_calculate_scales(chan->scales, chan->num_scales, full_scale,
>> +				 PICO, ADS1262_ADC1_RESOLUTION);
>> +
>> +	return 0;
>> +}

-- 
Thanks,
 ~ Kurt
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.