diff options
author | Shengjiu Wang <shengjiu.wang@nxp.com> | 2018-08-08 16:00:46 +0800 |
---|---|---|
committer | Jason Liu <jason.hui.liu@nxp.com> | 2019-02-12 10:33:23 +0800 |
commit | 661a9f0edec856717db2ade3acf7f4cf1eed27be (patch) | |
tree | 089d5b35abd8c7ae9a2259e7505621c3ef51606f /sound | |
parent | 9286fd236e54d322c19490b0fe796f76513731d2 (diff) |
MLK-19168-7: ASoC: imx-wm8960: support codec over rpmsg
support codec over rpmsg
Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
(cherry picked from commit 0b2238d0b88b19a1134aee54706b64a322c6e51b)
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/fsl/imx-wm8960.c | 82 |
1 files changed, 57 insertions, 25 deletions
diff --git a/sound/soc/fsl/imx-wm8960.c b/sound/soc/fsl/imx-wm8960.c index 8f9969b32a99..97548206cc89 100644 --- a/sound/soc/fsl/imx-wm8960.c +++ b/sound/soc/fsl/imx-wm8960.c @@ -31,6 +31,7 @@ struct imx_wm8960_data { struct clk *codec_clk; unsigned int clk_frequency; bool is_codec_master; + bool is_codec_rpmsg; bool is_stream_in_use[2]; bool is_stream_opened[2]; struct regmap *gpr; @@ -445,10 +446,9 @@ static int of_parse_gpr(struct platform_device *pdev, static int imx_wm8960_probe(struct platform_device *pdev) { - struct device_node *cpu_np, *codec_np = NULL; + struct device_node *cpu_np = NULL, *codec_np = NULL; struct platform_device *cpu_pdev; struct imx_priv *priv = &card_priv; - struct i2c_client *codec_dev; struct imx_wm8960_data *data; struct platform_device *asrc_pdev = NULL; struct device_node *asrc_np; @@ -457,16 +457,18 @@ static int imx_wm8960_probe(struct platform_device *pdev) priv->pdev = pdev; - cpu_np = of_parse_phandle(pdev->dev.of_node, "cpu-dai", 0); - if (!cpu_np) { - dev_err(&pdev->dev, "cpu dai phandle missing or invalid\n"); - ret = -EINVAL; + data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); + if (!data) { + ret = -ENOMEM; goto fail; } - codec_np = of_parse_phandle(pdev->dev.of_node, "audio-codec", 0); - if (!codec_np) { - dev_err(&pdev->dev, "phandle missing or invalid\n"); + if (of_property_read_bool(pdev->dev.of_node, "codec-rpmsg")) + data->is_codec_rpmsg = true; + + cpu_np = of_parse_phandle(pdev->dev.of_node, "cpu-dai", 0); + if (!cpu_np) { + dev_err(&pdev->dev, "cpu dai phandle missing or invalid\n"); ret = -EINVAL; goto fail; } @@ -478,29 +480,50 @@ static int imx_wm8960_probe(struct platform_device *pdev) goto fail; } - codec_dev = of_find_i2c_device_by_node(codec_np); - if (!codec_dev || !codec_dev->dev.driver) { - dev_err(&pdev->dev, "failed to find codec platform device\n"); + 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 = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); - if (!data) { - ret = -ENOMEM; - goto fail; + if (data->is_codec_rpmsg) { + struct platform_device *codec_dev; + + codec_dev = of_find_device_by_node(codec_np); + if (!codec_dev || !codec_dev->dev.driver) { + dev_err(&pdev->dev, "failed to find codec platform device\n"); + ret = -EINVAL; + goto fail; + } + + data->codec_clk = devm_clk_get(&codec_dev->dev, "mclk"); + if (IS_ERR(data->codec_clk)) { + ret = PTR_ERR(data->codec_clk); + dev_err(&pdev->dev, "failed to get codec clk: %d\n", ret); + goto fail; + } + } else { + struct i2c_client *codec_dev; + + codec_dev = of_find_i2c_device_by_node(codec_np); + if (!codec_dev || !codec_dev->dev.driver) { + dev_err(&pdev->dev, "failed to find codec platform device\n"); + ret = -EINVAL; + goto fail; + } + + data->codec_clk = devm_clk_get(&codec_dev->dev, "mclk"); + if (IS_ERR(data->codec_clk)) { + ret = PTR_ERR(data->codec_clk); + dev_err(&pdev->dev, "failed to get codec clk: %d\n", ret); + goto fail; + } } if (of_property_read_bool(pdev->dev.of_node, "codec-master")) data->is_codec_master = true; - data->codec_clk = devm_clk_get(&codec_dev->dev, "mclk"); - if (IS_ERR(data->codec_clk)) { - ret = PTR_ERR(data->codec_clk); - dev_err(&pdev->dev, "failed to get codec clk: %d\n", ret); - goto fail; - } - ret = of_parse_gpr(pdev, data); if (ret) goto fail; @@ -515,7 +538,12 @@ static int imx_wm8960_probe(struct platform_device *pdev) data->card.dai_link = imx_wm8960_dai; - imx_wm8960_dai[0].codec_of_node = codec_np; + if (data->is_codec_rpmsg) { + imx_wm8960_dai[0].codec_name = "rpmsg-audio-codec-wm8960"; + imx_wm8960_dai[0].codec_dai_name = "rpmsg-wm8960-hifi"; + } else + imx_wm8960_dai[0].codec_of_node = codec_np; + imx_wm8960_dai[0].cpu_dai_name = dev_name(&cpu_pdev->dev); imx_wm8960_dai[0].platform_of_node = cpu_np; @@ -524,7 +552,11 @@ static int imx_wm8960_probe(struct platform_device *pdev) } else { imx_wm8960_dai[1].cpu_of_node = asrc_np; imx_wm8960_dai[1].platform_of_node = asrc_np; - imx_wm8960_dai[2].codec_of_node = codec_np; + if (data->is_codec_rpmsg) { + imx_wm8960_dai[2].codec_name = "rpmsg-audio-codec-wm8960"; + imx_wm8960_dai[2].codec_dai_name = "rpmsg-wm8960-hifi"; + } else + imx_wm8960_dai[2].codec_of_node = codec_np; imx_wm8960_dai[2].cpu_dai_name = dev_name(&cpu_pdev->dev); data->card.num_links = 3; |