Browse Source

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 b6fca438dd)
isee-imx_3.14.28.y
Nicolin Chen 7 years ago
committed by Nitin Garg
parent
commit
77fd5dc6c0
3 changed files with 23 additions and 13 deletions
  1. +2
    -2
      Documentation/devicetree/bindings/sound/imx-audio-wm8962.txt
  2. +1
    -1
      arch/arm/boot/dts/imx6qdl-sabresd.dtsi
  3. +20
    -10
      sound/soc/fsl/imx-wm8962.c

+ 2
- 2
Documentation/devicetree/bindings/sound/imx-audio-wm8962.txt View 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",


+ 1
- 1
arch/arm/boot/dts/imx6qdl-sabresd.dtsi View File

@ -123,7 +123,7 @@
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",


+ 20
- 10
sound/soc/fsl/imx-wm8962.c View 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);


Loading…
Cancel
Save