From: Arnd Bergmann arnd@arndb.de
[ Upstream commit 364752aa0c6ab0a06a2d5bfdb362c1ca407f1a30 ]
clang-21 warns about one uninitialized variable getting dereferenced in madera_dev_init:
drivers/mfd/madera-core.c:739:10: error: variable 'mfd_devs' is uninitialized when used here [-Werror,-Wuninitialized] 739 | mfd_devs, n_devs, | ^~~~~~~~ drivers/mfd/madera-core.c:459:33: note: initialize the variable 'mfd_devs' to silence this warning 459 | const struct mfd_cell *mfd_devs; | ^ | = NULL
The code is actually correct here because n_devs is only nonzero when mfd_devs is a valid pointer, but this is impossible for the compiler to see reliably.
Change the logic to check for the pointer as well, to make this easier for the compiler to follow.
Signed-off-by: Arnd Bergmann arnd@arndb.de Reviewed-by: Richard Fitzgerald rf@opensource.cirrus.com Link: https://lore.kernel.org/r/20250807071932.4085458-1-arnd@kernel.org Signed-off-by: Lee Jones lee@kernel.org Signed-off-by: Sasha Levin sashal@kernel.org ---
LLM Generated explanations, may be completely bogus:
YES
- What changed - Initializes `mfd_devs` to a known value to placate clang-21’s -Wuninitialized: - drivers/mfd/madera-core.c:459 initializes `const struct mfd_cell *mfd_devs = NULL;` - Hardens the validity check before use: - drivers/mfd/madera-core.c:673 expands the guard from `if (!n_devs)` to `if (!n_devs || !mfd_devs)` - The pointer is later passed to `mfd_add_devices()`: - drivers/mfd/madera-core.c:739 uses `mfd_devs, n_devs`
- Why it matters - Fixes a real build failure with newer toolchains: clang-21 flags the potential uninitialized use as an error (`-Werror,-Wuninitialized`) when passing `mfd_devs` to `mfd_add_devices()` (as described in the commit message and evidenced by the code at drivers/mfd/madera- core.c:739 and the declaration at drivers/mfd/madera-core.c:459). - The code’s intended invariant is that `n_devs` is set nonzero iff `mfd_devs` points to a valid array; this is enforced by setting them together in each supported device case, e.g.: - drivers/mfd/madera-core.c:603/604 (`cs47l15` case) - drivers/mfd/madera-core.c:616/617 (`cs47l35` case) - drivers/mfd/madera-core.c:630/631 (`cs47l85`/`WM1840` case) - drivers/mfd/madera-core.c:644/645 (`cs47l90`/`CS47L91` case) - drivers/mfd/madera-core.c:659/660 (`cs42l92`/`cs47l92`/`cs47l93` case) - Compilers cannot always see this invariant, leading to the false positive. Initializing the pointer and checking it explicitly makes the intent obvious and restores buildability with strict warning-as- error configurations.
- Stability and risk - Minimal, localized change confined to MFD madera core; no architectural changes. - No functional behavior change in the valid paths: when any supported device is matched, both `mfd_devs` and `n_devs` are set together (see examples above), so the new check behaves identically to the old one. - If an unexpected code path ever sets `n_devs` without a valid `mfd_devs`, the new guard fails fast with `-ENODEV` rather than risking undefined behavior at `mfd_add_devices()`—arguably safer. - Does not introduce new features; purely a correctness/build fix for newer compilers.
- Stable backport criteria - Fixes a user-affecting bug: builds with newer clang (and with `CONFIG_WERROR=y` or similar settings) break; this unblocks those builds. - The fix is small, contained, and low risk. - No cross-subsystem or architectural changes. - While there’s no explicit “Cc: stable” tag, stable trees routinely accept trivial, obviously-correct build fixes for widely used toolchains.
Given the above, this is a good candidate for stable backporting.
drivers/mfd/madera-core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/mfd/madera-core.c b/drivers/mfd/madera-core.c index bdbd5bfc97145..2f74a8c644a32 100644 --- a/drivers/mfd/madera-core.c +++ b/drivers/mfd/madera-core.c @@ -456,7 +456,7 @@ int madera_dev_init(struct madera *madera) struct device *dev = madera->dev; unsigned int hwid; int (*patch_fn)(struct madera *) = NULL; - const struct mfd_cell *mfd_devs; + const struct mfd_cell *mfd_devs = NULL; int n_devs = 0; int i, ret;
@@ -670,7 +670,7 @@ int madera_dev_init(struct madera *madera) goto err_reset; }
- if (!n_devs) { + if (!n_devs || !mfd_devs) { dev_err(madera->dev, "Device ID 0x%x not a %s\n", hwid, madera->type_name); ret = -ENODEV;