On 10/25/24 9:29 AM, David Lechner wrote: > On 10/25/24 6:35 AM, Miclaus, Antoniu wrote: >>> > ... > >>> >>> See the ad7380 driver as an example of how to impelemt this. [2] >>> >>> [2]: https://urldefense.com/v3/__https://lore.kernel.org/linux- >>> iio/20240530-iio-add-support-for-multiple-scan-types-v3-5- >>> cbc4acea2cfa@xxxxxxxxxxxx/__;!!A3Ni8CS0y2Y!4LS7UI11XqIHRgT3ckx76VYn >>> CyeikpTumyjO0qDTn7eF7Fd- >>> jFFL8yqpYcMAxP_u3VC09bfIAB7gW_rvGoM_sEA$ >>> >>> Also, I would expect the .sign value to depend on how the >>> input is being used. If it is differential or single-ended >>> bipolar, then it is signed, but if it is signle-ended unipoloar >>> then it is unsiged. >>> >>> Typically, this is coming from the devicetree because it >>> depends on what is wired up to the input. >> >> This topic is mentioned in the cover letter, maybe not argued enough there. >> Yes, the go-to approach is to specify the unipolar/bipolar configuration in the devicetree. >> But this is a request from the actual users of the driver: to have the softspan fully >> controlled from userspace. That's why the offset and scale implementations were added. >> Both these attributes are influencing the softspan. >> >>>> + }, \ >>>> +} >>> > > The cover letter did not get sent, so we did not see this. So please resend it so we can get the full explanation. > > Still, I have doubts about using the offset attribute for > this since a 0 raw value is always 0V for both unipolar > and bipolar cases. There is never an offset to apply to > the raw value. > > So I think we will need to find a different way to control > this other than the offset attribute. I thought about this some more and I have an idea to solve the issue without using devicetree or the offset attribute. But we should see what Jonathan thinks before implementing this in case it isn't a good idea. We can expose each voltage input to userspace as two different channels, a single-ended channel and a differential channel. For an 8 channel chip, we would have 16 IIO channels (in order of scan_index): in_voltage0_raw in_voltage0-voltage8_raw in_voltage1_raw in_voltage1-voltage9_raw ... in_voltage7_raw in_voltage7-voltage15_raw If you read the voltage using in_voltageX_raw, then the SoftSpan for that channel gets set to the 0V to +V value based on in_voltageX_scale. Likewise, if you read the in_voltageX-voltageY_raw attribute, the SoftSpan gets set to -V to +V according to in_voltageX-voltageY_scale. For buffered reads, only one of each in_voltageX_raw/in_voltageX-voltageY_raw pair can be enabled at the same time (because the chip is simultaneous sampling).