On Thu, 6 Jan 2022 17:31:27 +0000Hi Jonathan,
Caleb Connolly <caleb.connolly@xxxxxxxxxx> wrote:
The Round Robin ADC is responsible for reading data about the rate ofHi Calib,
charge from the USB or DC in jacks, it can also read the battery
ID (resistence) and some temperatures. It is found on the PMI8998 and
PM660 Qualcomm PMICs.
Signed-off-by: Caleb Connolly <caleb.connolly@xxxxxxxxxx>
Various things inline but biggest is probably that in IIO we prefer
if possible to make application of offsets and scales a job for the caller,
either userspace or in kernel callers. This allows them to maintain precision
better if they need to further transform the data.
Jonathan
---
drivers/iio/adc/Kconfig | 13 +
drivers/iio/adc/Makefile | 1 +
drivers/iio/adc/qcom-spmi-rradc.c | 1070 +++++++++++++++++++++++++++++
3 files changed, 1084 insertions(+)
create mode 100644 drivers/iio/adc/qcom-spmi-rradc.c
+static int rradc_post_process_chg_temp(struct rradc_chip *chip, u16 adc_code,
+ int *result_millidegc)
+{
+ int64_t uv, offset, slope;
+ int ret;
+
+ ret = rradc_get_fab_coeff(chip, &offset, &slope);
+ if (ret < 0) {
+ dev_err(chip->dev, "Unable to get fab id coefficients\n");
+ return -EINVAL;
+ }
+
+ uv = ((int64_t)adc_code * RR_ADC_TEMP_FS_VOLTAGE_NUM);
+ uv = div64_s64(uv,
+ (RR_ADC_TEMP_FS_VOLTAGE_DEN * RR_ADC_CHAN_MAX_VALUE));
+ uv = offset - uv;
+ uv = div64_s64((uv * MILLI), slope);
+ uv += RR_ADC_CHG_TEMP_OFFSET_MILLI_DEGC;
+ *result_millidegc = (int)uv;
Marginally harder than the one below, but this is still looking like it can
be well expressed as an offset + scale. Thus making the tedious maths
userspaces or callers problem. I'm working backwards hence won't comment on
similar before this point. Key is to transform whatever maths you have into
(adc_code + offset) * scale then expose offset and scale as well as the
raw value. The right maths will get done for in kernel users and
userspace can do it nicely with floating point.
+
+ return 0;
+}
+static const struct iio_chan_spec rradc_iio_chans[RR_ADC_CHAN_MAX] = {
+ {
+ .extend_name = "batt_id",
We recently introduced channel labels to try and avoid the need for
extend_name. The problem with extend_name is that generic software then
has trouble parsing the resulting sysfs files as they can have very
freeform naming. Moving it to label makes that much easier. Note that
there is code to give a default label of extend_name to work around
this problem for older drivers.
+ .type = IIO_RESISTANCE,
+ .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),
+ .address = RR_ADC_BATT_ID,
+ },
Thanks,
Jonathan