<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: wm8962 on i.mx8M Plus error in i.MX Processors</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/wm8962-on-i-mx8M-Plus-error/m-p/2406070#M246441</link>
    <description>&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt; Return&amp;nbsp;-EPROBE_DEFER&amp;nbsp;when the codec or SAI platform device is not ready&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;In your&amp;nbsp;imx-wm8962.c&amp;nbsp;probe path, distinguish between:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;missing/invalid DT phandle → real error, return&amp;nbsp;-EINVAL&amp;nbsp;;&lt;/LI&gt;
&lt;LI&gt;phandle exists, but referenced device is not registered yet → dependency not ready, return&amp;nbsp;-EPROBE_DEFER&amp;nbsp;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;For example, conceptually:&lt;/P&gt;
&lt;P&gt;codec_np = of_parse_phandle(np, "audio-codec", 0);&lt;/P&gt;
&lt;P&gt;if (!codec_np) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dev_err(&amp;amp;pdev-&amp;gt;dev, "audio-codec missing or invalid\n");&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -EINVAL;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;codec_dev = of_find_i2c_device_by_node(codec_np);&lt;/P&gt;
&lt;P&gt;if (!codec_dev) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dev_info(&amp;amp;pdev-&amp;gt;dev, "codec device not ready, defer probe\n");&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; of_node_put(codec_np);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -EPROBE_DEFER;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;Similarly for the CPU DAI / SAI node:&lt;/P&gt;
&lt;P&gt;cpu_np = of_parse_phandle(np, "audio-cpu", 0);&lt;/P&gt;
&lt;P&gt;if (!cpu_np) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dev_err(&amp;amp;pdev-&amp;gt;dev, "audio-cpu missing or invalid\n");&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -EINVAL;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;cpu_pdev = of_find_device_by_node(cpu_np);&lt;/P&gt;
&lt;P&gt;if (!cpu_pdev) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dev_info(&amp;amp;pdev-&amp;gt;dev, "SAI platform device not ready, defer probe\n");&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; of_node_put(cpu_np);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -EPROBE_DEFER;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;This is the most direct fix if you keep your current machine driver.&lt;/P&gt;
&lt;OL start="2"&gt;
&lt;LI&gt;&lt;STRONG&gt; Prefer the Linux 5.4&amp;nbsp;fsl-asoc-card&amp;nbsp;path if available&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;For Linux 5.4-era NXP kernels,&amp;nbsp;compatible = "fsl,imx-audio-wm8962"&amp;nbsp;is handled by&amp;nbsp;sound/soc/fsl/fsl-asoc-card.c&amp;nbsp;, which has explicit WM8962 handling, including codec DAI name&amp;nbsp;"wm8962"&amp;nbsp;and WM8962 clock/FLL IDs&amp;nbsp;. Also verify that&amp;nbsp;snd-soc-fsl-asoc-card.ko&amp;nbsp;is loaded or built in&amp;nbsp;.&lt;/P&gt;
&lt;P&gt;That means you should avoid having both a legacy/custom&amp;nbsp;imx-wm8962&amp;nbsp;machine driver and&amp;nbsp;fsl-asoc-card&amp;nbsp;trying to bind the same compatible string. Recommended approach:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;enable/use&amp;nbsp;CONFIG_SND_SOC_FSL_ASOC_CARD&amp;nbsp;;&lt;/LI&gt;
&lt;LI&gt;ensure your sound node uses&amp;nbsp;compatible = "fsl,imx-audio-wm8962";&amp;nbsp;;&lt;/LI&gt;
&lt;LI&gt;remove or disable the legacy/custom&amp;nbsp;imx-wm8962&amp;nbsp;binding for that compatible string, unless you intentionally maintain it.&lt;/LI&gt;
&lt;/UL&gt;
&lt;OL start="3"&gt;
&lt;LI&gt;&lt;STRONG&gt; Make sure the DTS has the required SAI and codec DAI properties&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Your codec node is broadly in the expected shape: examples for WM8962 use&amp;nbsp;compatible = "wlf,wm8962"&amp;nbsp;,&amp;nbsp;reg = &amp;lt;0x1a&amp;gt;&amp;nbsp;,&amp;nbsp;clocks&amp;nbsp;, supply properties, and&amp;nbsp;gpio-cfg&amp;nbsp;. However, confirm the parts not shown in your DTS:&lt;/P&gt;
&lt;P&gt;&amp;amp;sai3 {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #sound-dai-cells = &amp;lt;0&amp;gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pinctrl-names = "default";&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pinctrl-0 = &amp;lt;&amp;amp;pinctrl_sai3&amp;gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assigned-clocks = &amp;lt;&amp;amp;clk IMX8MP_CLK_SAI3&amp;gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assigned-clock-parents = &amp;lt;&amp;amp;clk IMX8MP_AUDIO_PLL1_OUT&amp;gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assigned-clock-rates = &amp;lt;12288000&amp;gt;; &lt;EM&gt;/* or board-required MCLK */&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = "okay";&lt;/P&gt;
&lt;P&gt;};&lt;/P&gt;
&lt;P&gt;And the codec should also normally expose:&lt;/P&gt;
&lt;P&gt;codec: wm8962@1a {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compatible = "wlf,wm8962";&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reg = &amp;lt;0x1a&amp;gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #sound-dai-cells = &amp;lt;0&amp;gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clocks = &amp;lt;&amp;amp;audiomix_clk IMX8MP_CLK_AUDIOMIX_SAI3_MCLK1&amp;gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clock-names = "mclk";&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/P&gt;
&lt;P&gt;};&lt;/P&gt;
&lt;P&gt;Also ensure the regulator referenced by&amp;nbsp;reg_audio_pwr&amp;nbsp;is defined, enabled, and has a valid voltage range. Your codec is being detected, so the supplies are probably not the cause of this specific error, but bad supply or MCLK setup can cause later audio failures.&lt;/P&gt;
&lt;OL start="4"&gt;
&lt;LI&gt;&lt;STRONG&gt; Verify MCLK enablement&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;There is a known class of WM8962 bring-up issues where enabling the codec MCLK in the audio machine driver was required; adding&amp;nbsp;clk_prepare_enable(codec_clk)&amp;nbsp;in&amp;nbsp;imx_wm8962_probe()&amp;nbsp;was reported to make WM8962 audio work&amp;nbsp;. If your codec probe succeeds but playback/capture later fails, check that SAI3 MCLK is actually present at the codec pin during codec initialization and stream startup.&lt;/P&gt;
&lt;OL start="5"&gt;
&lt;LI&gt;&lt;STRONG&gt; Check for duplicate or conflicting sound-card nodes&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Make sure only one active sound node targets this codec/SAI pair and that the&amp;nbsp;model&amp;nbsp;string is unique. A similar failure involving&amp;nbsp;failed to find codec platform device&amp;nbsp;was also associated with sound-card naming / duplicate-card conflicts in NXP community debugging&amp;nbsp;. Your node name says&amp;nbsp;sound-wm8960-forenex&amp;nbsp;while the compatible/model are WM8962; the node name itself is not normally functional, but I would rename it for clarity and verify there is no second enabled&amp;nbsp;sound-wm8962&amp;nbsp;node elsewhere.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Recommended minimal path&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Use&amp;nbsp;fsl-asoc-card&amp;nbsp;for Linux 5.4 if possible.&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;Add&amp;nbsp;#sound-dai-cells = &amp;lt;0&amp;gt;;&amp;nbsp;to the WM8962 node if missing.&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;Confirm&amp;nbsp;&amp;amp;sai3&amp;nbsp;is enabled and has clocks/pinctrl configured.&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;If keeping your custom&amp;nbsp;imx-wm8962&amp;nbsp;driver, patch the failed codec/CPU lookup paths to return&amp;nbsp;-EPROBE_DEFER&amp;nbsp;instead of&amp;nbsp;-EINVAL&amp;nbsp;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;Confirm MCLK is enabled and present.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Tue, 18 Aug 2026 08:41:46 GMT</pubDate>
    <dc:creator>yipingwang</dc:creator>
    <dc:date>2026-08-18T08:41:46Z</dc:date>
    <item>
      <title>wm8962 on i.mx8M Plus error</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/wm8962-on-i-mx8M-Plus-error/m-p/2406056#M246440</link>
      <description>&lt;DIV class=""&gt;&lt;DIV&gt;We are designing our custom board based on the NXP i.MX 8M Plus (i.MX8MP) processor with the Wolfson WM8962 audio codec. We are currently porting the driver to the &lt;STRONG&gt;Linux kernel 5.4.&lt;/STRONG&gt; Below are the error logs and our DTS (Device Tree Source) configuration.&lt;/DIV&gt;&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;LOG:&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;LI-CODE lang="markup"&gt;[    2.097680] imx-wm8962 sound-wm8962: 2111111111111111111111111
[    2.103533] imx-wm8962 sound-wm8962: 22222222222222222222222222
[    2.109467] imx-wm8962 sound-wm8962: 333333333333333333
[    2.114705] imx-wm8962 sound-wm8962: 888888888888888888
[    2.119953] imx-wm8962 sound-wm8962: failed to find codec platform device
[    2.126759] imx-wm8962: probe of sound-wm8962 failed with error -22
[    2.995796] wm8962 2-001a: afrrgrgtrggggggggggggggggggg
[    3.001038] wm8962 2-001a: bbbbbbbbbbbbbbbbbbbbbbbbb
[    3.008259] random: fast init done
[    3.011807] wm8962 2-001a: customer id 0 revision F​&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;DTS:&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;LI-CODE lang="markup"&gt;sound-wm8960-forenex {
		compatible = "fsl,imx-audio-wm8962";
		model = "wm8962-audio";
		audio-codec = &amp;lt;&amp;amp;codec&amp;gt;;
		audio-cpu = &amp;lt;&amp;amp;sai3&amp;gt;;
		audio-routing = "Headphone Jack", "HPOUTL",
			"Headphone Jack", "HPOUTR",
			"Ext Spk", "SPKOUTL",
			"Ext Spk", "SPKOUTR",
			"AMIC", "MICBIAS",
			"IN3R", "AMIC",
			"IN1R", "AMIC";
	};
&amp;amp;i2c3 {
	clock-frequency = &amp;lt;100000&amp;gt;;
	pinctrl-names = "default";
	pinctrl-0 = &amp;lt;&amp;amp;pinctrl_i2c3&amp;gt;;
	status = "okay";

	pca6416: gpio@20 {
		compatible = "ti,tca6416";
		reg = &amp;lt;0x20&amp;gt;;
		gpio-controller;
		#gpio-cells = &amp;lt;2&amp;gt;;
	};

	ov5640_1: ov5640_mipi@3c {
		compatible = "ovti,ov5640";
		reg = &amp;lt;0x3c&amp;gt;;
		pinctrl-names = "default";
		pinctrl-0 = &amp;lt;&amp;amp;pinctrl_csi0_pwn&amp;gt;, &amp;lt;&amp;amp;pinctrl_csi0_rst&amp;gt;, &amp;lt;&amp;amp;pinctrl_csi_mclk&amp;gt;;
		clocks = &amp;lt;&amp;amp;clk IMX8MP_CLK_IPP_DO_CLKO2&amp;gt;;
		clock-names = "xclk";
		assigned-clocks = &amp;lt;&amp;amp;clk IMX8MP_CLK_IPP_DO_CLKO2&amp;gt;;
		assigned-clock-parents = &amp;lt;&amp;amp;clk IMX8MP_CLK_24M&amp;gt;;
		assigned-clock-rates = &amp;lt;24000000&amp;gt;;
		csi_id = &amp;lt;0&amp;gt;;
		powerdown-gpios = &amp;lt;&amp;amp;gpio4 1 GPIO_ACTIVE_HIGH&amp;gt;;
		reset-gpios = &amp;lt;&amp;amp;gpio4 0 GPIO_ACTIVE_LOW&amp;gt;;
		mclk = &amp;lt;24000000&amp;gt;;
		mclk_source = &amp;lt;0&amp;gt;;
		mipi_csi;
		status = "disabled";

		port {
			ov5640_mipi_1_ep: endpoint {
				remote-endpoint = &amp;lt;&amp;amp;mipi_csi1_ep&amp;gt;;
				data-lanes = &amp;lt;1 2&amp;gt;;
				clock-lanes = &amp;lt;0&amp;gt;;
			};
		};
	};
	
	codec: wm8962@1a {
	  compatible = "wlf,wm8962";
		reg = &amp;lt;0x1a&amp;gt;;
		clocks = &amp;lt;&amp;amp;audiomix_clk IMX8MP_CLK_AUDIOMIX_SAI3_MCLK1&amp;gt;;
		clock-names = "mclk";
		wlf,shared-lrclk;
	  AVDD-supply = &amp;lt;&amp;amp;reg_audio_pwr&amp;gt;;
		CPVDD-supply = &amp;lt;&amp;amp;reg_audio_pwr&amp;gt;;
		DBVDD-supply = &amp;lt;&amp;amp;reg_audio_pwr&amp;gt;;
	  DCVDD-supply = &amp;lt;&amp;amp;reg_audio_pwr&amp;gt;;
	  MICVDD-supply = &amp;lt;&amp;amp;reg_audio_pwr&amp;gt;;
	  PLLVDD-supply = &amp;lt;&amp;amp;reg_audio_pwr&amp;gt;;
		SPKVDD1-supply = &amp;lt;&amp;amp;reg_audio_pwr&amp;gt;;
		SPKVDD2-supply = &amp;lt;&amp;amp;reg_audio_pwr&amp;gt;;
	  gpio-cfg = &amp;lt;
					0x0000 /* 0:Default */
					0x0000 /* 1:Default */
					0x0000 /* 2:FN_DMICCLK */
					0x0000 /* 3:Default */
					0x0000 /* 4:FN_DMICCDAT */
					0x0000 /* 5:Default */
				&amp;gt;;
	};
};​&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV&gt;Based on our analysis, when the kernel attempts to initialize the imx-wm8962 machine driver, the WM8962 codec on the I2C bus has not yet completed its probing/registration. The WM8962 only finishes its initialization afterward. This probe ordering discrepancy causes the driver initialization to fail with an error.&lt;/DIV&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV&gt;Could you please help analyze this issue and suggest solutions to resolve this behavior?&lt;/DIV&gt;&lt;DIV&gt;&lt;LI-PRODUCT title="IMX8MPLUS" id="IMX8MPLUS"&gt;&lt;/LI-PRODUCT&gt;&amp;nbsp;&lt;LI-PRODUCT title="AUDIO_SOFTWARE_NXP_MICR" id="AUDIO_SOFTWARE_NXP_MICR"&gt;&lt;/LI-PRODUCT&gt;&amp;nbsp;&lt;/DIV&gt;</description>
      <pubDate>Tue, 18 Aug 2026 07:35:27 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/wm8962-on-i-mx8M-Plus-error/m-p/2406056#M246440</guid>
      <dc:creator>VictorWang129</dc:creator>
      <dc:date>2026-08-18T07:35:27Z</dc:date>
    </item>
    <item>
      <title>Re: wm8962 on i.mx8M Plus error</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/wm8962-on-i-mx8M-Plus-error/m-p/2406070#M246441</link>
      <description>&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt; Return&amp;nbsp;-EPROBE_DEFER&amp;nbsp;when the codec or SAI platform device is not ready&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;In your&amp;nbsp;imx-wm8962.c&amp;nbsp;probe path, distinguish between:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;missing/invalid DT phandle → real error, return&amp;nbsp;-EINVAL&amp;nbsp;;&lt;/LI&gt;
&lt;LI&gt;phandle exists, but referenced device is not registered yet → dependency not ready, return&amp;nbsp;-EPROBE_DEFER&amp;nbsp;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;For example, conceptually:&lt;/P&gt;
&lt;P&gt;codec_np = of_parse_phandle(np, "audio-codec", 0);&lt;/P&gt;
&lt;P&gt;if (!codec_np) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dev_err(&amp;amp;pdev-&amp;gt;dev, "audio-codec missing or invalid\n");&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -EINVAL;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;codec_dev = of_find_i2c_device_by_node(codec_np);&lt;/P&gt;
&lt;P&gt;if (!codec_dev) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dev_info(&amp;amp;pdev-&amp;gt;dev, "codec device not ready, defer probe\n");&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; of_node_put(codec_np);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -EPROBE_DEFER;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;Similarly for the CPU DAI / SAI node:&lt;/P&gt;
&lt;P&gt;cpu_np = of_parse_phandle(np, "audio-cpu", 0);&lt;/P&gt;
&lt;P&gt;if (!cpu_np) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dev_err(&amp;amp;pdev-&amp;gt;dev, "audio-cpu missing or invalid\n");&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -EINVAL;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;cpu_pdev = of_find_device_by_node(cpu_np);&lt;/P&gt;
&lt;P&gt;if (!cpu_pdev) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dev_info(&amp;amp;pdev-&amp;gt;dev, "SAI platform device not ready, defer probe\n");&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; of_node_put(cpu_np);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -EPROBE_DEFER;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;This is the most direct fix if you keep your current machine driver.&lt;/P&gt;
&lt;OL start="2"&gt;
&lt;LI&gt;&lt;STRONG&gt; Prefer the Linux 5.4&amp;nbsp;fsl-asoc-card&amp;nbsp;path if available&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;For Linux 5.4-era NXP kernels,&amp;nbsp;compatible = "fsl,imx-audio-wm8962"&amp;nbsp;is handled by&amp;nbsp;sound/soc/fsl/fsl-asoc-card.c&amp;nbsp;, which has explicit WM8962 handling, including codec DAI name&amp;nbsp;"wm8962"&amp;nbsp;and WM8962 clock/FLL IDs&amp;nbsp;. Also verify that&amp;nbsp;snd-soc-fsl-asoc-card.ko&amp;nbsp;is loaded or built in&amp;nbsp;.&lt;/P&gt;
&lt;P&gt;That means you should avoid having both a legacy/custom&amp;nbsp;imx-wm8962&amp;nbsp;machine driver and&amp;nbsp;fsl-asoc-card&amp;nbsp;trying to bind the same compatible string. Recommended approach:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;enable/use&amp;nbsp;CONFIG_SND_SOC_FSL_ASOC_CARD&amp;nbsp;;&lt;/LI&gt;
&lt;LI&gt;ensure your sound node uses&amp;nbsp;compatible = "fsl,imx-audio-wm8962";&amp;nbsp;;&lt;/LI&gt;
&lt;LI&gt;remove or disable the legacy/custom&amp;nbsp;imx-wm8962&amp;nbsp;binding for that compatible string, unless you intentionally maintain it.&lt;/LI&gt;
&lt;/UL&gt;
&lt;OL start="3"&gt;
&lt;LI&gt;&lt;STRONG&gt; Make sure the DTS has the required SAI and codec DAI properties&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Your codec node is broadly in the expected shape: examples for WM8962 use&amp;nbsp;compatible = "wlf,wm8962"&amp;nbsp;,&amp;nbsp;reg = &amp;lt;0x1a&amp;gt;&amp;nbsp;,&amp;nbsp;clocks&amp;nbsp;, supply properties, and&amp;nbsp;gpio-cfg&amp;nbsp;. However, confirm the parts not shown in your DTS:&lt;/P&gt;
&lt;P&gt;&amp;amp;sai3 {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #sound-dai-cells = &amp;lt;0&amp;gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pinctrl-names = "default";&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pinctrl-0 = &amp;lt;&amp;amp;pinctrl_sai3&amp;gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assigned-clocks = &amp;lt;&amp;amp;clk IMX8MP_CLK_SAI3&amp;gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assigned-clock-parents = &amp;lt;&amp;amp;clk IMX8MP_AUDIO_PLL1_OUT&amp;gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assigned-clock-rates = &amp;lt;12288000&amp;gt;; &lt;EM&gt;/* or board-required MCLK */&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = "okay";&lt;/P&gt;
&lt;P&gt;};&lt;/P&gt;
&lt;P&gt;And the codec should also normally expose:&lt;/P&gt;
&lt;P&gt;codec: wm8962@1a {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compatible = "wlf,wm8962";&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reg = &amp;lt;0x1a&amp;gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #sound-dai-cells = &amp;lt;0&amp;gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clocks = &amp;lt;&amp;amp;audiomix_clk IMX8MP_CLK_AUDIOMIX_SAI3_MCLK1&amp;gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clock-names = "mclk";&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/P&gt;
&lt;P&gt;};&lt;/P&gt;
&lt;P&gt;Also ensure the regulator referenced by&amp;nbsp;reg_audio_pwr&amp;nbsp;is defined, enabled, and has a valid voltage range. Your codec is being detected, so the supplies are probably not the cause of this specific error, but bad supply or MCLK setup can cause later audio failures.&lt;/P&gt;
&lt;OL start="4"&gt;
&lt;LI&gt;&lt;STRONG&gt; Verify MCLK enablement&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;There is a known class of WM8962 bring-up issues where enabling the codec MCLK in the audio machine driver was required; adding&amp;nbsp;clk_prepare_enable(codec_clk)&amp;nbsp;in&amp;nbsp;imx_wm8962_probe()&amp;nbsp;was reported to make WM8962 audio work&amp;nbsp;. If your codec probe succeeds but playback/capture later fails, check that SAI3 MCLK is actually present at the codec pin during codec initialization and stream startup.&lt;/P&gt;
&lt;OL start="5"&gt;
&lt;LI&gt;&lt;STRONG&gt; Check for duplicate or conflicting sound-card nodes&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Make sure only one active sound node targets this codec/SAI pair and that the&amp;nbsp;model&amp;nbsp;string is unique. A similar failure involving&amp;nbsp;failed to find codec platform device&amp;nbsp;was also associated with sound-card naming / duplicate-card conflicts in NXP community debugging&amp;nbsp;. Your node name says&amp;nbsp;sound-wm8960-forenex&amp;nbsp;while the compatible/model are WM8962; the node name itself is not normally functional, but I would rename it for clarity and verify there is no second enabled&amp;nbsp;sound-wm8962&amp;nbsp;node elsewhere.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Recommended minimal path&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Use&amp;nbsp;fsl-asoc-card&amp;nbsp;for Linux 5.4 if possible.&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;Add&amp;nbsp;#sound-dai-cells = &amp;lt;0&amp;gt;;&amp;nbsp;to the WM8962 node if missing.&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;Confirm&amp;nbsp;&amp;amp;sai3&amp;nbsp;is enabled and has clocks/pinctrl configured.&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;If keeping your custom&amp;nbsp;imx-wm8962&amp;nbsp;driver, patch the failed codec/CPU lookup paths to return&amp;nbsp;-EPROBE_DEFER&amp;nbsp;instead of&amp;nbsp;-EINVAL&amp;nbsp;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;Confirm MCLK is enabled and present.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 18 Aug 2026 08:41:46 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/wm8962-on-i-mx8M-Plus-error/m-p/2406070#M246441</guid>
      <dc:creator>yipingwang</dc:creator>
      <dc:date>2026-08-18T08:41:46Z</dc:date>
    </item>
  </channel>
</rss>

