On Fri, 23 Jun 2023 16:09:36 +0200 Olivier Moysan <olivier.moysan@xxxxxxxxxxx> wrote: > This RFC re-opens an old discussion regarding channel scaling > management in STM32 DFSDM driver [1] > > The DFSDM is a peripheral provided by the STM32MP1x SoC family. > One objective is also to prepare the introduction of its successor in > the STM32MP12x SoC family: the MDF (Multi-function Digital Filter). > The MDF driver will have the same requirements as the DFSDM regarding > channel scaling management. So, the solution proposed here will apply > also for the future MDF driver. > > [1] > https://patchwork.kernel.org/project/linux-iio/patch/20200204101008.11411-5-olivier.moysan@xxxxxx/ > > As a short reminder of our previous discussion, the two main options > emerging were the following ones: > > - Option1: Use the DFSDM as an hardware accelerator and expose the > scaled channels on SD modulator side. > Drawbak: this solution is leading to an very complex datapath, especially > for scan mode. > > - Option2: Introduce a new IIO device type (so-called backend) > Retrieve scaling information from SD modulator scaling to expose a single > IIO device on DFSDM side. This solution is derivated from rcar-gyroadc > example, but with a more standard approach. > This was discussed in > https://lore.kernel.org/lkml/20210919191414.09270f4e@jic23-huawei/ Naming probably needs a rethink given the actual hardware we are talking about here is normally called a frontend and so people will be confused... I'm traveling at the moment, so only going to take a fairly superficial first look at what you have here. Jonathan > > The patchset proposed in this RFC implements option2 (backend) solution. > These patches provide a minimal API implemented as a template. > The intented use of this API is illustrated through the DFSDM channel > scaling support basic implementation. > > For sake of simplicity I did not include the related DT binding > in this serie. > > Below are some use case examples. > > * DFSDM with SD modulator backend: > ------------------------------- > This use case corresponds to the example implemented in this RFC. > The channel attributes are retrieved from backend by the dfsdm, and > the resulting scaling is exposed through DFSDM IIO device sysfs > > - Single channel: > +-------------+ ch attr +--------+ sysfs (compound scaling) > | sd0 backend | ---------> | dfsdm0 | --------------------------> > +-------------+ +--------+ > > - Scan mode: > +-------------+ ch attr +-------------+ sysfs (compound scaling) > | sd1 backend | ---------> | dfsdm1 | --------------------------> > +-------------+ +-------------+ > ^ > | > +-------------+ ch attr | > | sd2 backend |--------------+ > +-------------+ > > > * Voltage divider in front of an adc: > ---------------------------------- > By way of example, here is a comparison on scaling management with > a iio-rescale device, and how it could be managed with a backend device. > > - iio-rescale implementation > Scaling is exposed both on ADC and iio-rescale IIO devices. > On iio-rescale device we get the compound scaling > > +---------------------------+ ch attr +------+ sysfs > | iio-rescale (div) | <--------- | adc0 | -------> > +---------------------------+ +------+ > | > | sysfs (compound scaling) > v > > - Backend implementation: > Compound scaling is exposed on ADC IIO device. > No scaling exposed on backend device > > +---------------+ ch attr +------+ sysfs (compound scaling) > | backend (div) | ---------> | adc0 | --------------------------> > +---------------+ +------+ > > > * Cascaded backends: > ----------------- > Backends may be cascaded to allow computation of the whole chain scaling > This is not part of this RFC, but it is identified as a potential > future use case. > > +---------------+ attr +-------------+ attr +--------+ sysfs > | backend (div) | ------> | sd0 backend | ------> | dfsdm0 | -------> > +---------------+ +-------------+ +--------+ > > Olivier Moysan (7): > iio: introduce iio backend device > of: property: add device link support for io-backends > iio: adc: stm32-dfsdm: manage dfsdm as a channel provider > iio: adc: stm32-dfsdm: adopt generic channel bindings > iio: adc: sd_adc_modulator: change to iio backend device > iio: adc: stm32-dfsdm: add scaling support to dfsdm > ARM: dts: stm32: add dfsdm iio suppport > > arch/arm/boot/dts/stm32mp157c-ev1.dts | 62 +++++++++ > drivers/iio/Makefile | 2 + > drivers/iio/adc/sd_adc_modulator.c | 92 +++++++++++--- > drivers/iio/adc/stm32-dfsdm-adc.c | 176 ++++++++++++++++---------- > drivers/iio/industrialio-backend.c | 59 +++++++++ > drivers/of/property.c | 2 + > include/linux/iio/backend.h | 29 +++++ > 7 files changed, 336 insertions(+), 86 deletions(-) > create mode 100644 drivers/iio/industrialio-backend.c > create mode 100644 include/linux/iio/backend.h >