summaryrefslogtreecommitdiff
path: root/sound/soc
diff options
context:
space:
mode:
authorShengjiu Wang <shengjiu.wang@nxp.com>2018-08-08 16:00:46 +0800
committerLeonard Crestez <leonard.crestez@nxp.com>2018-08-24 12:41:33 +0300
commitb416bb271b632bee4e387bd68f2cbeebf290fcbc (patch)
treeb55f076c3a0881c448ce441dfb13c7b8180534cd /sound/soc
parent3094c7facddd7477538329f8bc48f723839f1a1e (diff)
MLK-19168-7: ASoC: imx-wm8960: support codec over rpmsg
support codec over rpmsg Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
Diffstat (limited to 'sound/soc')
-rw-r--r--sound/soc/fsl/imx-wm8960.c82
1 files changed, 57 insertions, 25 deletions
diff --git a/sound/soc/fsl/imx-wm8960.c b/sound/soc/fsl/imx-wm8960.c
index 0951e4740584..276f10a7a81a 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;