]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ENGR00307635-5 ASoC: imx-wm8962: Add non-SSI cpu dai support
authorNicolin Chen <Guangyu.Chen@freescale.com>
Tue, 8 Apr 2014 11:13:15 +0000 (19:13 +0800)
committerNitin Garg <nitin.garg@freescale.com>
Fri, 16 Jan 2015 03:17:49 +0000 (21:17 -0600)
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)

Documentation/devicetree/bindings/sound/imx-audio-wm8962.txt
arch/arm/boot/dts/imx6qdl-sabresd.dtsi
sound/soc/fsl/imx-wm8962.c

index 5d4222e725856afb91511f801b3fb999ebaedc41..fe1e119d75728c491896a7d343f216277e5897b7 100644 (file)
@@ -3,7 +3,7 @@ Freescale i.MX audio complex with WM8962 codec
 Required properties:
 - compatible : "fsl,imx-audio-wm8962"
 - 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
 - audio-routing : A list of the connections between audio components.
   Each entry is a pair of strings, the first being the connection's sink,
@@ -36,7 +36,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",
index 7e5f7e2a433e59aa9327385aa7b1378b91880baa..6475c24fa2e01e04a167c6864282ef092d04b5c1 100644 (file)
                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",
index 569e436341d2cd55a27e2c81c210c75505504241..706c448ab0b213a8a2876b0501cd1640b2b0c850 100644 (file)
@@ -493,8 +493,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;
@@ -504,6 +504,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");
@@ -540,16 +550,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;
@@ -591,8 +601,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;
@@ -653,8 +663,8 @@ fail_mic:
        driver_remove_file(pdev->dev.driver, &driver_attr_headphone);
 fail_hp:
 fail:
-       if (ssi_np)
-               of_node_put(ssi_np);
+       if (cpu_np)
+               of_node_put(cpu_np);
        if (codec_np)
                of_node_put(codec_np);