On Thu, 1 Oct 2026 16:56:46 +0200 Olivier Moysan olivier.moysan@foss.st.com wrote:
Add the STM32 Multi-function Digital Filter (MDF) core, serial interface and digital filter drivers. The MDF converts bitstreams from sigma-delta modulators or digital microphones into samples exposed through IIO.
Audio: capture PDM microphones via cyclic DMA for an ASoC consumer. Support CIC scaling and filtering, synchronized and interleaving modes. Audio use case requires a DMIC filter, and a separate ASoC DAI.
Analog: expose sigma-delta modulators as IIO voltage channels with direct reads or DMA buffering mode. STM32 timer triggers can be used as clock source. Analog use case requires an IIO backend for the SD modulator.
Signed-off-by: Olivier Moysan olivier.moysan@foss.st.com
I'm not going to spend long on this today, but a few trivial things noted from a quick glance.
diff --git a/drivers/iio/adc/stm32-mdf-serial.c b/drivers/iio/adc/stm32-mdf-serial.c new file mode 100644 index 000000000000..15a58cf833be --- /dev/null +++ b/drivers/iio/adc/stm32-mdf-serial.c
...
+int stm32_mdf_sitf_stop(struct stm32_mdf_sitf *sitf) +{
- int ret = 0;
- spin_lock(&sitf->lock);
Use guard() for cases like this. Simplifies the flow and helps readabilty as a result. Everyone loves an early return.
- if (!sitf->refcnt) {
dev_err(sitf->dev, "Unbalanced serial interface stop ?\n");ret = -EPERM;goto out;- } else {
sitf->refcnt--;- }
- if (!sitf->refcnt)
ret = regmap_clear_bits(sitf->regmap, MDF_SITFCR_REG, MDF_SITFCR_SITFEN);+out:
- spin_unlock(&sitf->lock);
- return ret;
+} +EXPORT_SYMBOL_GPL(stm32_mdf_sitf_stop);
+static int stm32_mdf_sitf_runtime_suspend(struct device *dev) +{
Add a comment on why you need these.
- return 0;
+}
+static int stm32_mdf_sitf_runtime_resume(struct device *dev) +{
- return 0;
+}
diff --git a/drivers/iio/adc/stm32-mdf.h b/drivers/iio/adc/stm32-mdf.h new file mode 100644 index 000000000000..7e403c26d4dc --- /dev/null +++ b/drivers/iio/adc/stm32-mdf.h @@ -0,0 +1,312 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/*
- This file is part of STM32 MDF driver
- Copyright (C) 2023, STMicroelectronics - All Rights Reserved
I'd guess you'll modify it enough that this might need an update!
+/* MDF_SIDR: Size Identification Register */ +#define MDF_SIDR_SID_MASK GENMASK(31, 0) +#define MDF_SIDR_SID(v) FIELD_PREP(MDF_SIDR_SID_MASK, v)
I'd not bother with the second macro. It is only a little shorter than FIELD_PREP() in most case.