diff --git a/sound/soc/fsl/imx-rpmsg.c b/sound/soc/fsl/imx-rpmsg.c index 9db5f190bc4f..043e4900befc 100644 --- a/sound/soc/fsl/imx-rpmsg.c +++ b/sound/soc/fsl/imx-rpmsg.c @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -39,6 +40,7 @@ static const struct snd_soc_dapm_widget imx_wm8960_dapm_widgets[] = { static int imx_rpmsg_probe(struct platform_device *pdev) { struct device_node *cpu_np; + struct device_node *codec_np = NULL; struct platform_device *cpu_pdev; struct imx_rpmsg_data *data; struct fsl_rpmsg_i2s *rpmsg_i2s; @@ -69,8 +71,21 @@ static int imx_rpmsg_probe(struct platform_device *pdev) goto fail; } + ret = of_reserved_mem_device_init_by_idx(&pdev->dev, pdev->dev.of_node, 0); + if (ret) + dev_warn(&pdev->dev, "no reserved DMA memory for rpmsg device\n"); + rpmsg_i2s = platform_get_drvdata(cpu_pdev); + if (rpmsg_i2s->codec_in_dt) { + codec_np = of_parse_phandle(pdev->dev.of_node, "audio-codec", 0); + if (!codec_np) { + dev_err(&pdev->dev, "phandle missing or invalid\n"); + ret = -EINVAL; + goto fail; + } + } + data->dai[0].cpus = &dlc[0]; data->dai[0].num_cpus = 1; data->dai[0].platforms = &dlc[1]; @@ -82,11 +97,16 @@ static int imx_rpmsg_probe(struct platform_device *pdev) data->dai[0].stream_name = "rpmsg hifi"; data->dai[0].dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | - SND_SOC_DAIFMT_CBM_CFM; + SND_SOC_DAIFMT_CBS_CFS; if (rpmsg_i2s->codec_wm8960) { - data->dai[0].codecs->dai_name = "rpmsg-wm8960-hifi"; - data->dai[0].codecs->name = "rpmsg-audio-codec-wm8960"; + if (rpmsg_i2s->codec_in_dt) { + data->dai[0].codecs->of_node = codec_np; + data->dai[0].codecs->dai_name = "rpmsg-wm8960-hifi"; + } else { + data->dai[0].codecs->dai_name = "rpmsg-wm8960-hifi"; + data->dai[0].codecs->name = "rpmsg-audio-codec-wm8960"; + } } if (rpmsg_i2s->codec_dummy) {