From: Shengjiu Wang <[email protected]> [ Upstream commit 99b5316f08f390a5e1ea2239ecca8e2b4ef70ac6 ]
WM8904 has a 27 MHz PLL frequency limit. The current S24_LE PLL ratio of 384 exceeds this at high sample rates (96 kHz × 384 = 36.864 MHz). Reduce the ratio to 192 for WM8904, keeping PLL within limits at all supported rates (96 kHz × 192 = 18.432 MHz). Add codec-specific pll_ratio_s24 field, default 384, override to 192 for WM8904. Signed-off-by: Shengjiu Wang <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Mark Brown <[email protected]> Signed-off-by: Sasha Levin <[email protected]> --- LLM Generated explanations, may be completely bogus: ## Phase 1: Commit Message Forensics ### Step 1.1: Subject Line **Record:** `[ASoC: fsl-asoc-card]` `[reduce]` — Lower WM8904 S24_LE PLL ratio so FLL output stays within the codec’s frequency limit. ### Step 1.2: Commit Message Tags **Record:** - **Signed-off-by:** Shengjiu Wang `<[email protected]>` (author, NXP) - **Link:** https://patch.msgid.link/20260429100028.2739711-6- [email protected] - **Signed-off-by:** Mark Brown `<[email protected]>` (ASoC maintainer, applied the series) - No Fixes:, Reported-by:, Tested-by:, Reviewed-by:, or Cc: stable tags - Part of **[PATCH v2 5/5]** in series “ASoC: fsl-asoc-card: Add some improvements” ### Step 1.3: Commit Body Analysis **Record:** - **Bug:** WM8904 FLL/PLL output is limited to 27 MHz. With the hardcoded S24_LE ratio of 384, high sample rates exceed that (96 kHz × 384 = 36.864 MHz). - **Symptom:** FLL programmed out of spec → audio fails or is unreliable at high rates with S24_LE on WM8904 boards. - **Root cause:** `fsl-asoc-card.c` uses a single 384 multiplier for all codecs with PLL enabled; WM8904 needs 192. - **Fix:** Add per-codec `pll_ratio_s24` (default 384), set 192 for `fsl,imx-audio-wm8904`. ### Step 1.4: Hidden Bug Fix Detection **Record:** Yes — despite “reduce ratio,” this is a hardware correctness fix (codec clock out of spec), not a cosmetic cleanup. --- ## Phase 2: Diff Analysis ### Step 2.1: Change Inventory **Record:** - **File:** `sound/soc/fsl/fsl-asoc-card.c` (+7 / −1) - **Functions:** `fsl_asoc_card_hw_params()`, `fsl_asoc_card_probe()` - **Structs:** `codec_priv` (+1 field) - **Scope:** Single-file, surgical fix ### Step 2.2: Code Flow Changes **Record:** - **Hunk 1 (struct):** Adds `pll_ratio_s24` to `codec_priv` with documentation. - **Hunk 2 (`hw_params`):** `pll_out = sample_rate * 384` → `pll_out = sample_rate * codec_priv->pll_ratio_s24` for S24_LE. - **Hunk 3 (`probe` init):** Default `pll_ratio_s24 = 384` for all codecs. - **Hunk 4 (WM8904 branch):** Override to `pll_ratio_s24 = 192` for `fsl,imx-audio-wm8904`. **Before → After:** WM8904 at 96 kHz S24_LE requests 36.864 MHz FLL output → 18.432 MHz (within 27 MHz limit). ### Step 2.3: Bug Mechanism **Record:** - **Category:** Hardware workaround / logic correctness (wrong clock ratio for a specific codec). - **Mechanism:** Generic 384× ratio violates WM8904’s 27 MHz PLL limit at rates above ~70 kHz with S24_LE (e.g. 88.2 kHz × 384 = 33.9 MHz, 96 kHz × 384 = 36.9 MHz). ### Step 2.4: Fix Quality **Record:** - Minimal, codec-specific override; other codecs unchanged (default 384). - Low regression risk; only affects WM8904 machine configs using PLL path. - NXP-authored, ASoC-maintainer-applied. --- ## Phase 3: Git History Investigation ### Step 3.1: Blame **Record:** In this 6.18.43 tree, the hardcoded `384` at line 225 and WM8904 probe block at lines 833–838 are present. Stable history is flattened, but `imx-audio-wm8904` support is in the tree since at least Linux 6.18-rc7 (`ac3fd01e4c1ef`). ### Step 3.2: Fixes: Tag **Record:** N/A — no Fixes: tag. ### Step 3.3: Related File History **Record:** Patch is **[5/5]** in a series; patches 1–4 cover ASRC DPCM, CS42888 constraints, and WM8960/WM8962 format limits — unrelated to this WM8904 PLL fix. This patch is self-contained. ### Step 3.4: Author Context **Record:** Shengjiu Wang is an active NXP/i.MX audio contributor with multiple stable-worthy ASoC fixes in this tree. ### Step 3.5: Dependencies **Record:** No prerequisites. Applies standalone; only needs existing `fsl,imx-audio-wm8904` support and PLL code path already in 6.18.43. --- ## Phase 4: Mailing List and External Research ### Step 4.1: Original Discussion **Record:** `b4 mbox` retrieved thread from lore (7 messages). Patch v2 5/5 submitted 2026-04-29. Mark Brown applied entire series to `broonie/sound` for-7.2 on 2026-04-30. This patch: https://git.kernel.org/broonie/sound/c/99b5316f08f3. No stable nomination or NAK found in thread. ### Step 4.2: Reviewers **Record:** CC’d: [email protected], [email protected], [email protected], [email protected], [email protected]. Mark Brown applied with “Thanks!” ### Step 4.3: Bug Report **Record:** No external bug tracker. Issue found during NXP board testing per cover letter (“During testing several issues were identified”). ### Step 4.4: Series Context **Record:** 5-patch series; this patch is independent of patches 1–4. ### Step 4.5: Stable List History **Record:** UNVERIFIED — lore stable search blocked by bot protection; no stable discussion found in mbox thread. --- ## Phase 5: Code Semantic Analysis ### Step 5.1: Key Functions **Record:** `fsl_asoc_card_hw_params()`, `fsl_asoc_card_probe()`, `wm8904_set_fll()` (codec callee). ### Step 5.2: Callers **Record:** `fsl_asoc_card_hw_params` registered as `.hw_params` in card DAI ops (line 295) — invoked on every PCM open/hw_params for playback/capture. ### Step 5.3: Callees **Record:** `snd_soc_dai_set_pll()` → `wm8904_set_fll()` → `fll_factors()` configures WM8904 FLL registers. `wm8904.c` does not validate Fout against 27 MHz; it can succeed in software while hardware is out of spec (Fvco computed up to ~147 MHz at 36.864 MHz Fout). ### Step 5.4: Reachability **Record:** Userspace opens PCM stream on imx8mp Hummingboard Pulse (and related boards) with WM8904 → `hw_params` → PLL programmed. WM8904 advertises `SNDRV_PCM_FMTBIT_S24_LE` and rates up to 96 kHz — the broken path is reachable from normal audio use. ### Step 5.5: Similar Patterns **Record:** Other codecs on the same driver (WM8962, WM8994, NAU8822) keep default 384; only WM8904 needs the lower ratio — consistent with codec-specific hardware limits. --- ## Phase 6: Cross-Reference Against Local Tree (6.18.43) ### Step 6.1: Buggy Code Present? **Record:** **YES.** Local tree is `v6.18.43` (stable/linux-6.18.y). Buggy hardcoded `384` at line 225; WM8904 config at lines 833–838 without ratio override. `imx8mp-hummingboard-pulse-codec.dtsi` uses `fsl,imx-audio-wm8904`. Multiple DTBs build from that DTSI. ### Step 6.2: Backport Complications **Record:** Clean apply expected — patch matches current file structure (index `44083d15f6e5` in submission aligns with local tree). ### Step 6.3: Related Fixes Already Present? **Record:** `pll_ratio_s24` not in tree; fix not yet applied. --- ## Phase 7: Subsystem Context ### Step 7.1: Subsystem and Criticality **Record:** **ASoC / sound/soc/fsl** — IMPORTANT for i.MX embedded platforms; not core kernel, but affects real shipped hardware. ### Step 7.2: Subsystem Activity **Record:** Actively maintained; WM8904 Hummingboard support added in 6.18 cycle. --- ## Phase 8: Impact and Risk Assessment ### Step 8.1: Who Is Affected **Record:** Users of i.MX boards with `fsl,imx-audio-wm8904` (SolidRun imx8mp Hummingboard Pulse/Pro/Mate/Ripple variants). CONFIG_SND_SOC_FSL_ASOC_CARD + WM8904. ### Step 8.2: Trigger Conditions **Record:** PCM stream with `SNDRV_PCM_FORMAT_S24_LE` at sample rates where `rate × 384 > 27 MHz` — notably 88.2 kHz and 96 kHz. Common for hi-res audio. Unprivileged users via standard ALSA/PulseAudio/PipeWire. ### Step 8.3: Failure Severity **Record:** **MEDIUM-HIGH** for affected hardware — broken or unreliable audio (FLL out of spec), not a kernel crash. Real functional defect on supported boards. ### Step 8.4: Risk-Benefit **Record:** - **Benefit:** Restores correct audio at high sample rates on WM8904 boards already supported in 6.18.y. - **Risk:** Very low — 7-line change, WM8904-only override, defaults preserved for other codecs. - **Ratio:** Strong benefit, minimal risk. --- ## Phase 9: Final Synthesis ### Step 9.1: Evidence Summary **FOR backport:** - Real hardware bug on boards in this tree - Vendor-authored, maintainer-applied fix - Small, self-contained, standalone within series - Buggy code confirmed present in 6.18.43 - Hardware quirk / workaround category (stable-appropriate) - Affects user-visible audio functionality **AGAINST backport:** - Not a crash/security/data-corruption issue - Limited to one machine driver + one codec variant - WM8904 fsl-asoc-card support is relatively new in 6.18 **Unresolved:** No independent Tested-by; no explicit stable nomination in mailing list. ### Step 9.2: Stable Rules Checklist 1. Obviously correct and tested? **PASS** — math verified; NXP + Mark Brown; identified in board testing. 2. Fixes real bug affecting users? **PASS** — broken hi-rate S24_LE audio on WM8904 imx boards. 3. Important issue? **PASS (MEDIUM)** — functional hardware defect, not crash-level. 4. Small and contained? **PASS** — 7 lines, one file. 5. No new features/APIs? **PASS** — internal driver parameter only. 6. Can apply to local tree? **PASS** — code exists, clean apply expected. ### Step 9.3: Exception Category **Record:** Hardware quirk/workaround — codec-specific clock ratio correction. ### Step 9.4: Decision Rationale For **linux-6.18.y (6.18.43)**: the buggy WM8904 PLL configuration is present, real imx8mp Hummingboard hardware is supported, and the fix is minimal and codec-specific. This is appropriate stable material as a hardware correctness fix for boards already enabled in this tree. --- ## Verification - [Phase 1] Parsed subject, tags, body from provided commit message and mbox - [Phase 2] Diff analysis: 7 lines in `fsl-asoc-card.c`, 2 functions modified - [Phase 3] `git describe HEAD` → v6.18.43; `git blame` line 225 shows hardcoded 384 - [Phase 3] `git log stable/linux-6.18.y -S "imx-audio-wm8904"` → present since 6.18-rc7 - [Phase 3] Confirmed patch 5/5 is standalone within series (mbox cover letter) - [Phase 4] `b4 mbox` → 7-message thread; Mark Brown applied series 2026-04-30 - [Phase 4] No stable/CC/stable or NAK in mbox thread - [Phase 4] UNVERIFIED: lore stable list search (bot-blocked) - [Phase 5] `fsl_asoc_card_hw_params` called from `.hw_params` DAI ops (line 295) - [Phase 5] `wm8904_set_fll`/`fll_factors` reviewed — no 27 MHz Fout validation in driver - [Phase 5] WM8904 supports S24_LE and up to 96 kHz (`wm8904.c` lines 2023–2026) - [Phase 6] Buggy code confirmed at line 225; WM8904 probe at lines 833–838 - [Phase 6] `imx8mp-hummingboard-pulse-codec.dtsi` uses `fsl,imx-audio- wm8904` - [Phase 6] Multiple DTBs include pulse codec DTSI (Makefile lines 211, pro/mate/ripple) - [Phase 8] 96 kHz × 384 = 36.864 MHz > 27 MHz; 96 kHz × 192 = 18.432 MHz < 27 MHz - [Phase 8] 88.2 kHz × 384 = 33.87 MHz also exceeds limit **YES**The background git history checks are done. They confirm: - **`imx-audio-wm8904` support is in the 6.18.y tree** (present since at least Linux 6.18-rc7), including the Hummingboard Pulse DTS and the hardcoded `384` PLL ratio. - **The fix is not in this tree yet** — `pll_ratio_s24` does not appear on master or stable. - **History is flattened** in this checkout, so individual introduction commits are hard to isolate, but the buggy WM8904 path is clearly present in 6.18.43. That supports the earlier **YES** verdict: this is a small, standalone hardware fix for boards already supported in linux-6.18.y. sound/soc/fsl/fsl-asoc-card.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sound/soc/fsl/fsl-asoc-card.c b/sound/soc/fsl/fsl-asoc-card.c index 71113886e494b..dcf2e495ad19f 100644 --- a/sound/soc/fsl/fsl-asoc-card.c +++ b/sound/soc/fsl/fsl-asoc-card.c @@ -48,6 +48,9 @@ * @mclk_id: MCLK (or main clock) id for set_sysclk() * @fll_id: FLL (or secordary clock) id for set_sysclk() * @pll_id: PLL id for set_pll() + * @pll_ratio_s24: PLL output ratio for S24_LE format (PLL_freq = sample_rate × ratio) + * Default is 384, but some codecs (e.g., WM8904) require lower values + * to stay within PLL frequency limits */ struct codec_priv { struct clk *mclk; @@ -56,6 +59,7 @@ struct codec_priv { u32 mclk_id; int fll_id; int pll_id; + int pll_ratio_s24; }; /** @@ -222,7 +226,7 @@ static int fsl_asoc_card_hw_params(struct snd_pcm_substream *substream, if (codec_priv->pll_id >= 0 && codec_priv->fll_id >= 0) { if (priv->sample_format == SNDRV_PCM_FORMAT_S24_LE) - pll_out = priv->sample_rate * 384; + pll_out = priv->sample_rate * codec_priv->pll_ratio_s24; else pll_out = priv->sample_rate * 256; @@ -742,6 +746,7 @@ static int fsl_asoc_card_probe(struct platform_device *pdev) for (codec_idx = 0; codec_idx < 2; codec_idx++) { priv->codec_priv[codec_idx].fll_id = -1; priv->codec_priv[codec_idx].pll_id = -1; + priv->codec_priv[codec_idx].pll_ratio_s24 = 384; } /* Diversify the card configurations */ @@ -835,6 +840,7 @@ static int fsl_asoc_card_probe(struct platform_device *pdev) priv->codec_priv[0].mclk_id = WM8904_FLL_MCLK; priv->codec_priv[0].fll_id = WM8904_CLK_FLL; priv->codec_priv[0].pll_id = WM8904_FLL_MCLK; + priv->codec_priv[0].pll_ratio_s24 = 192; priv->dai_fmt |= SND_SOC_DAIFMT_CBP_CFP; } else if (of_device_is_compatible(np, "fsl,imx-audio-spdif")) { ret = fsl_asoc_card_spdif_init(codec_np, cpu_np, codec_dai_name, priv); -- 2.53.0
