MLK-11479-11 ASoC: imx-wm8962: Add non-SSI cpu dai support (part 1)
cherry-pick below patch from v3.14.y: ENGR00307635-5 ASoC: imx-wm8962: Add non-SSI cpu dai support The current imx-wm8962 machine driver is designed for SSI as CPU DAI only while as its name we should make the driver more generic to any other CPU DAI on i.MX serires -- ESAI, SAI for example. So this patch makes the driver more general so as to support those non-SSI cases. Acked-by: Wang Shengjiu <b02247@freescale.com> Signed-off-by: Nicolin Chen <Guangyu.Chen@freescale.com> (cherry picked from commit b6fca438dde1b4c0bbdee31729871d601f287dc9) [ Aisheng: split dts changes ] Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>5.4-rM2-2.2.x-imx-squashed
parent
62f5b5f0ca
commit
8139df52bd
|
@ -6,7 +6,7 @@ Required properties:
|
|||
|
||||
- model : The user-visible name of this sound complex
|
||||
|
||||
- ssi-controller : The phandle of the i.MX SSI controller
|
||||
- cpu-dai : The phandle of CPU DAI
|
||||
|
||||
- audio-codec : The phandle of the WM8962 audio codec
|
||||
|
||||
|
@ -43,7 +43,7 @@ sound {
|
|||
compatible = "fsl,imx6q-sabresd-wm8962",
|
||||
"fsl,imx-audio-wm8962";
|
||||
model = "wm8962-audio";
|
||||
ssi-controller = <&ssi2>;
|
||||
cpu-dai = <&ssi2>;
|
||||
audio-codec = <&codec>;
|
||||
audio-routing =
|
||||
"Headphone Jack", "HPOUTL",
|
||||
|
|
|
@ -500,8 +500,8 @@ static int imx_wm8962_late_probe(struct snd_soc_card *card)
|
|||
static int imx_wm8962_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct device_node *ssi_np, *codec_np;
|
||||
struct platform_device *ssi_pdev;
|
||||
struct device_node *cpu_np, *codec_np;
|
||||
struct platform_device *cpu_pdev;
|
||||
struct imx_priv *priv = &card_priv;
|
||||
struct i2c_client *codec_dev;
|
||||
struct imx_wm8962_data *data;
|
||||
|
@ -511,6 +511,16 @@ static int imx_wm8962_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;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (!strstr(cpu_np->name, "ssi"))
|
||||
goto audmux_bypass;
|
||||
|
||||
ret = of_property_read_u32(np, "mux-int-port", &int_port);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "mux-int-port missing or invalid\n");
|
||||
|
@ -547,16 +557,16 @@ static int imx_wm8962_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ssi_np = of_parse_phandle(pdev->dev.of_node, "ssi-controller", 0);
|
||||
audmux_bypass:
|
||||
codec_np = of_parse_phandle(pdev->dev.of_node, "audio-codec", 0);
|
||||
if (!ssi_np || !codec_np) {
|
||||
if (!codec_np) {
|
||||
dev_err(&pdev->dev, "phandle missing or invalid\n");
|
||||
ret = -EINVAL;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
ssi_pdev = of_find_device_by_node(ssi_np);
|
||||
if (!ssi_pdev) {
|
||||
cpu_pdev = of_find_device_by_node(cpu_np);
|
||||
if (!cpu_pdev) {
|
||||
dev_err(&pdev->dev, "failed to find SSI platform device\n");
|
||||
ret = -EINVAL;
|
||||
goto fail;
|
||||
|
@ -599,8 +609,8 @@ static int imx_wm8962_probe(struct platform_device *pdev)
|
|||
data->dai.stream_name = "HiFi";
|
||||
data->dai.codec_dai_name = "wm8962";
|
||||
data->dai.codec_of_node = codec_np;
|
||||
data->dai.cpu_dai_name = dev_name(&ssi_pdev->dev);
|
||||
data->dai.platform_of_node = ssi_np;
|
||||
data->dai.cpu_dai_name = dev_name(&cpu_pdev->dev);
|
||||
data->dai.platform_of_node = cpu_np;
|
||||
data->dai.ops = &imx_hifi_ops;
|
||||
data->dai.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
|
||||
SND_SOC_DAIFMT_CBM_CFM;
|
||||
|
@ -662,7 +672,7 @@ fail_mic:
|
|||
driver_remove_file(pdev->dev.driver, &driver_attr_headphone);
|
||||
fail_hp:
|
||||
fail:
|
||||
of_node_put(ssi_np);
|
||||
of_node_put(cpu_np);
|
||||
of_node_put(codec_np);
|
||||
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue