2406056_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2406056_ja-JP

2406056_ja-JP

i.mx8M Plus の wm8962 エラー
NXP i.MX 8M Plus(i.MX8MP)プロセッサとWolfson WM8962オーディオコーデックをベースにカスタムボードを設計しています。現在、このドライバーをLinuxカーネル5.4に移植中です。以下に、エラーログとDTS(デバイスツリーソース)の設定を示します。
ログ:
[    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​

DTS:

 
sound-wm8960-forenex {
		compatible = "fsl,imx-audio-wm8962";
		model = "wm8962-audio";
		audio-codec = <&codec>;
		audio-cpu = <&sai3>;
		audio-routing = "Headphone Jack", "HPOUTL",
			"Headphone Jack", "HPOUTR",
			"Ext Spk", "SPKOUTL",
			"Ext Spk", "SPKOUTR",
			"AMIC", "MICBIAS",
			"IN3R", "AMIC",
			"IN1R", "AMIC";
	};
&i2c3 {
	clock-frequency = <100000>;
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_i2c3>;
	status = "okay";

	pca6416: gpio@20 {
		compatible = "ti,tca6416";
		reg = <0x20>;
		gpio-controller;
		#gpio-cells = <2>;
	};

	ov5640_1: ov5640_mipi@3c {
		compatible = "ovti,ov5640";
		reg = <0x3c>;
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_csi0_pwn>, <&pinctrl_csi0_rst>, <&pinctrl_csi_mclk>;
		clocks = <&clk IMX8MP_CLK_IPP_DO_CLKO2>;
		clock-names = "xclk";
		assigned-clocks = <&clk IMX8MP_CLK_IPP_DO_CLKO2>;
		assigned-clock-parents = <&clk IMX8MP_CLK_24M>;
		assigned-clock-rates = <24000000>;
		csi_id = <0>;
		powerdown-gpios = <&gpio4 1 GPIO_ACTIVE_HIGH>;
		reset-gpios = <&gpio4 0 GPIO_ACTIVE_LOW>;
		mclk = <24000000>;
		mclk_source = <0>;
		mipi_csi;
		status = "disabled";

		port {
			ov5640_mipi_1_ep: endpoint {
				remote-endpoint = <&mipi_csi1_ep>;
				data-lanes = <1 2>;
				clock-lanes = <0>;
			};
		};
	};
	
	codec: wm8962@1a {
	  compatible = "wlf,wm8962";
		reg = <0x1a>;
		clocks = <&audiomix_clk IMX8MP_CLK_AUDIOMIX_SAI3_MCLK1>;
		clock-names = "mclk";
		wlf,shared-lrclk;
	  AVDD-supply = <&reg_audio_pwr>;
		CPVDD-supply = <&reg_audio_pwr>;
		DBVDD-supply = <&reg_audio_pwr>;
	  DCVDD-supply = <&reg_audio_pwr>;
	  MICVDD-supply = <&reg_audio_pwr>;
	  PLLVDD-supply = <&reg_audio_pwr>;
		SPKVDD1-supply = <&reg_audio_pwr>;
		SPKVDD2-supply = <&reg_audio_pwr>;
	  gpio-cfg = <
					0x0000 /* 0:Default */
					0x0000 /* 1:Default */
					0x0000 /* 2:FN_DMICCLK */
					0x0000 /* 3:Default */
					0x0000 /* 4:FN_DMICCDAT */
					0x0000 /* 5:Default */
				>;
	};
};​

私たちの分析によれば、カーネルがimx-wm8962マシンドライバの初期化を試みる際、I2Cバス上のWM8962コーデックはまだプローブ/登録を完了していません。WM8962はその後になってようやく初期化を完了する。このプローブの順序不一致により、ドライバーの初期化がエラーで失敗します。

この問題を分析し、この行動を解決するための解決策を提案していただけませんか?
AndroidLinuxRe: wm8962 on i.mx8M Plus error
  1. コーデックやSAIプラットフォームデバイスが準備できない場合は-EPROBE_DEFER返します

imx-wm8962.c でプローブパス、以下を区別する:

  • DT phandle が欠落/無効です → 実際のエラー、-EINVAL を返します。
  • phandle は存在しますが、参照されているデバイスがまだ登録されていません → 依存関係が準備できていないため、-EPROBE_DEFER を返します。

例えば、概念的には:

codec_np = of_parse_phandle(np、「オーディオコーデック」、0);

if (!codec_np) {

dev_err(&pdev->dev、「オーディオ-codec missing またはinvalid\n」);

        -EINVAL を返します。

}

codec_dev = of_find_i2c_device_by_node(codec_np);

if (!codec_dev) {

dev_info(&pdev->dev, "codec device not ready, defer probe\n");

of_node_put(codec_np);

        return -EPROBE_DEFER;

}

CPU DAI / SAIノードについても同様です。

cpu_np = of_parse_phandle(np、「audio-cpu」、0);

if (!cpu_np) {

dev_err(&pdev->dev、「audio-cpu missing or invalid\n」);

        -EINVAL を返します。

}

cpu_pdev = of_find_device_by_node(cpu_np);

if (!cpu_pdev) {

dev_info(&pdev->dev、「SAIプラットフォームデバイスは準備完了、プローブを延期\n」);

of_node_put(cpu_np);

        return -EPROBE_DEFER;

}

現在のマシンドライバーを使い続けるなら、これが最も直接的な解決策です。

  1. 可能であればLinux 5.4のFSL-asoc-cardパスを推奨します

Linux 5.4時代のNXPカーネルでは、互換=「fsl,imx-audio-wm8962」はsound/soc/fsl/fsl-asoc-card.cによって処理され、コーデックDAI名「wm8962」やWM8962クロック/FLL IDを含む明示的なWM8962処理が行われます。また、snd-soc-fsl-asoc-card.ko がロードされているか、組み込まれていることを確認してください。

つまり、レガシー/カスタムのimx-wm8962マシンドライバーとFSL-ASOC-cardの両方が同じ互換文字列をバインドしようとするのは避けるべきです。推奨されるアプローチ:

  • CONFIG_SND_SOC_FSL_ASOC_CARD を有効化/使用する;
  • サウンドノードがCompatible = "FSL,IMX-オーディオ-WM8962";
  • 意図的に維持する場合を除き、その互換性のある文字列のレガシー/カスタム imx-wm8962 バインディングを削除または無効にします。
  1. DTSに必要なSAIとコーデックDAIプロパティが備わっていることを確認してください。

コーデックノードは概ね想定どおりの形状です。WM8962 の例では compatible = "wlf,wm8962"、reg =<0x1a> �、clocks、supply properties、gpio-cfg を使用します。ただし、DTSに表示されていない部品を確認してください。

&sai3 {

     #sound-dai-cells = <0>;

        pinctrl-names = "default";

     pinctrl-0 = <&pinctrl_sai3>;

        assignment-clocks = <&clk IMX8MP_CLK_SAI3>;

        assigned-clock-parents = <&clk IMX8MP_AUDIO_PLL1_OUT>;

assignment-clock-rates = <12288000>; /* またはボード指定のMCLK */

status = "オーケー";

};

また、コーデックは通常、以下の情報も公開する必要があります。

コーデック: wm8962@1a {

互換性 = "wlf,wm8962";

     reg = <0x1a>;

     #sound-dai-cells = <0>;

     clocks = <&audiomix_clk IMX8MP_CLK_AUDIOMIX_SAI3_MCLK1>;

     clock-names = "mclk";

     ...

};

また、reg_audio_pwr で参照されるレギュレータが定義され、有効になっており、有効な電圧範囲を持っていることを確認してください。コーデックが検出されているので、電源がこの特定のエラーの原因ではない可能性が高いですが、電源の不具合やMCLKの設定不良が後のオーディオ故障の原因になることがあります。

  1. MCLKイネーブルメントの検証

WM8962のブリングアップ問題の中には、オーディオマシンドライバでコーデックMCLKを有効にする必要があることが知られています。imx_wm8962_probe()にclk_prepare_enable(codec_clk)を加えると、WM8962の音声が動作すると報告されています。コーデックのプローブが成功したにもかかわらず、その後の再生/キャプチャが失敗する場合は、コーデックの初期化時およびストリームの起動時に、SAI3 MCLKが実際にコーデックピンに存在していることを確認してください。

  1. サウンドカードのノードに重複や競合がないか確認してください。

このコーデック/SAIペアをターゲットにしているアクティブなサウンドノードは1つだけ、モデル文字列が一意であることを確認しましょう。コーデックプラットフォームデバイスの見つかりに失敗した類似の失敗は、NXPコミュニティデバッグにおけるサウンドカード命名や重複カードの競合に関連していました。ノード名はsound-wm8960-forenexと表示されていますが、対応モデルはWM8962です。ノード名自体は通常機能しませんが、明確にするために名前を変更し、他に2つ目のSound-WM8962ノードがないか確認したほうがいいでしょう。

推奨される最小パス

  • 可能であればLinux 5.4用にFSL-asoc-cardを使いましょう。
  • WM8962 ノードに #sound-dai-cells = <0> が追加されている場合は、追加してください。
  • &sai3 が有効になっており、clocks/pinctrl が設定されていることを確認してください。
  • カスタムのimx-wm8962ドライバーを維持する場合は、失敗したコーデックやCPUの検索パスを-EINVALではなく-EPROBE_DEFERにパッチしてください。
  • MCLKが有効になっており、存在していることを確認してください。

Tags (1)
No ratings
Version history
Last update:
Wednesday
Updated by: