Re: [PATCH v3 4/9] iio: adc: ti-ads1262: support per-channel reference and gain
"Kurt Borja" <[email protected]>
| Newsgroups | org.kernel.vger.linux-gpio,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-iio,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