[ 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 FDTS:
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 = <®_audio_pwr>;
CPVDD-supply = <®_audio_pwr>;
DBVDD-supply = <®_audio_pwr>;
DCVDD-supply = <®_audio_pwr>;
MICVDD-supply = <®_audio_pwr>;
PLLVDD-supply = <®_audio_pwr>;
SPKVDD1-supply = <®_audio_pwr>;
SPKVDD2-supply = <®_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.c でプローブパス、以下を区別する:
例えば、概念的には:
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;
}
現在のマシンドライバーを使い続けるなら、これが最も直接的な解決策です。
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の両方が同じ互換文字列をバインドしようとするのは避けるべきです。推奨されるアプローチ:
コーデックノードは概ね想定どおりの形状です。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の設定不良が後のオーディオ故障の原因になることがあります。
WM8962のブリングアップ問題の中には、オーディオマシンドライバでコーデックMCLKを有効にする必要があることが知られています。imx_wm8962_probe()にclk_prepare_enable(codec_clk)を加えると、WM8962の音声が動作すると報告されています。コーデックのプローブが成功したにもかかわらず、その後の再生/キャプチャが失敗する場合は、コーデックの初期化時およびストリームの起動時に、SAI3 MCLKが実際にコーデックピンに存在していることを確認してください。
このコーデック/SAIペアをターゲットにしているアクティブなサウンドノードは1つだけ、モデル文字列が一意であることを確認しましょう。コーデックプラットフォームデバイスの見つかりに失敗した類似の失敗は、NXPコミュニティデバッグにおけるサウンドカード命名や重複カードの競合に関連していました。ノード名はsound-wm8960-forenexと表示されていますが、対応モデルはWM8962です。ノード名自体は通常機能しませんが、明確にするために名前を変更し、他に2つ目のSound-WM8962ノードがないか確認したほうがいいでしょう。
推奨される最小パス