Re: [PATCH v10 0/6] mfd: Add support for NXP MC33978/MC34978 MSDI
From: Oleksij Rempel
Date: Thu Apr 02 2026 - 16:11:23 EST
https://sashiko.dev/#/patchset/20260402174349.3220518-1-o.rempel%40pengutronix.de
TL;DR: Sashiko's analysis of the phantom transient fault interrupt is
correct, but the behavior is an acceptable compromise given the hardware
limitations. I would be glad if this driver could be accepted without
additional modifications, as it has already passed human review and
addressed 99% of bot comments.
---
The MC33978/MC34978 hardware's interrupt architecture is problematic:
1. INT_B is clear-on-read for *any* SPI transaction.
2. For persistent faults, INT_B immediately re-asserts if the fault remains.
3. Fault flags are latched and only cleared when the hwmon child reads
the FAULT register.
If the core driver passed the raw hardware state, the system would hang
in an interrupt storm (INT_B low -> SPI read clears it -> hardware
re-asserts -> repeat).
To prevent this storm, the core implements a software edge-detection
cache. When the hwmon child finally clears the fault latch, the core's
cache gets out of sync. Re-syncing it requires the synthetic wake bit
mentioned in the report, which causes the spurious interrupt edge.
The result is just one extra hwmon wakeup/SPI read when a fault clears.
Working around this would require more complexity. Trading one spurious
interrupt to prevent a hardware interrupt storm is an acceptable cost
for this silicon.
On Thu, Apr 02, 2026 at 07:43:43PM +0200, Oleksij Rempel wrote:
> changes v7:
> - drop gpiolib irq fix and make pinctrl more robust against NULL point
> dereference.
>
> This series adds support for the NXP MC33978/MC34978 Multiple Switch Detection
> Interface (MSDI) via the MFD framework.
>
> Architecture overview:
> * mfd: Core driver handling 2-frame pipelined SPI, regulator sequencing, and
> linear irq_domain. Harvests status bits from SPI MISO MSB.
> * pinctrl: Exposes 22 physical switch inputs as standard GPIOs. Proxies IRQs to
> the MFD domain.
> * hwmon: Exposes thermal limits, VBATP/VDDQ voltage boundaries, and dynamic
> fault alarms.
> * mux: Controls the 24-to-1 AMUX routing analog signals (switch voltages,
> temperature, VBATP) to an external ADC.
>
> Initial pinctrl implementation by David Jander, reworked into this MFD
> architecture.
>
> Best regards,
> Oleksij
>
> David Jander (1):
> pinctrl: add NXP MC33978/MC34978 pinctrl driver
>
> Oleksij Rempel (5):
> dt-bindings: pinctrl: add NXP MC33978/MC34978 MSDI
> mfd: add NXP MC33978/MC34978 core driver
> pinctrl: core: Make pin group callbacks optional for pin-only drivers
> hwmon: add NXP MC33978/MC34978 driver
> mux: add NXP MC33978/MC34978 AMUX driver
>
> .../bindings/pinctrl/nxp,mc33978.yaml | 158 +++
> drivers/hwmon/Kconfig | 10 +
> drivers/hwmon/Makefile | 1 +
> drivers/hwmon/mc33978-hwmon.c | 549 +++++++++
> drivers/mfd/Kconfig | 15 +
> drivers/mfd/Makefile | 2 +
> drivers/mfd/mc33978.c | 1088 +++++++++++++++++
> drivers/mux/Kconfig | 14 +
> drivers/mux/Makefile | 2 +
> drivers/mux/mc33978-mux.c | 141 +++
> drivers/pinctrl/Kconfig | 16 +
> drivers/pinctrl/Makefile | 1 +
> drivers/pinctrl/core.c | 41 +-
> drivers/pinctrl/pinconf.c | 9 +-
> drivers/pinctrl/pinctrl-mc33978.c | 1008 +++++++++++++++
> include/linux/mfd/mc33978.h | 95 ++
> 16 files changed, 3143 insertions(+), 7 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/pinctrl/nxp,mc33978.yaml
> create mode 100644 drivers/hwmon/mc33978-hwmon.c
> create mode 100644 drivers/mfd/mc33978.c
> create mode 100644 drivers/mux/mc33978-mux.c
> create mode 100644 drivers/pinctrl/pinctrl-mc33978.c
> create mode 100644 include/linux/mfd/mc33978.h
>
> --
> 2.47.3
>
>
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |