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)pull/10/head
parent
60462b7813
commit
a8df3bcefc
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue