diff mbox

[v5,3/9] ASoC: mediatek: Add HDMI dai-links in the mt8173-rt5650-rt5676 machine driver

Message ID 1456930153-11853-4-git-send-email-p.zabel@pengutronix.de (mailing list archive)
State New, archived
Headers show

Commit Message

Philipp Zabel March 2, 2016, 2:49 p.m. UTC
From: Koro Chen <koro.chen@mediatek.com>

This creates pcmC0D2p for the HDMI playback in the same card.

Signed-off-by: Koro Chen <koro.chen@mediatek.com>
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
---
 .../bindings/sound/mt8173-rt5650-rt5676.txt        |  5 ++-
 sound/soc/mediatek/mt8173-rt5650-rt5676.c          | 48 ++++++++++++++++++++++
 2 files changed, 51 insertions(+), 2 deletions(-)

Comments

Matthias Brugger March 14, 2016, 11:36 p.m. UTC | #1
On 02/03/16 15:49, Philipp Zabel wrote:
> From: Koro Chen <koro.chen@mediatek.com>
>
> This creates pcmC0D2p for the HDMI playback in the same card.
>
> Signed-off-by: Koro Chen <koro.chen@mediatek.com>
> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
> ---
>   .../bindings/sound/mt8173-rt5650-rt5676.txt        |  5 ++-
>   sound/soc/mediatek/mt8173-rt5650-rt5676.c          | 48 ++++++++++++++++++++++
>   2 files changed, 51 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt b/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt
> index f205ce9..ac28cdb 100644
> --- a/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt
> +++ b/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt
> @@ -1,15 +1,16 @@
> -MT8173 with RT5650 RT5676 CODECS
> +MT8173 with RT5650 RT5676 CODECS and HDMI via I2S
>
>   Required properties:
>   - compatible : "mediatek,mt8173-rt5650-rt5676"
>   - mediatek,audio-codec: the phandles of rt5650 and rt5676 codecs
> +			and of the hdmi encoder node
>   - mediatek,platform: the phandle of MT8173 ASoC platform
>
>   Example:
>
>   	sound {
>   		compatible = "mediatek,mt8173-rt5650-rt5676";
> -		mediatek,audio-codec = <&rt5650 &rt5676>;
> +		mediatek,audio-codec = <&rt5650 &rt5676 &hdmi0>;
>   		mediatek,platform = <&afe>;
>   	};
>
> diff --git a/sound/soc/mediatek/mt8173-rt5650-rt5676.c b/sound/soc/mediatek/mt8173-rt5650-rt5676.c
> index 5c4c58c..def9d95 100644
> --- a/sound/soc/mediatek/mt8173-rt5650-rt5676.c
> +++ b/sound/soc/mediatek/mt8173-rt5650-rt5676.c
> @@ -18,6 +18,7 @@
>   #include <linux/gpio.h>
>   #include <linux/of_gpio.h>
>   #include <sound/soc.h>
> +#include <sound/hdmi-codec.h>
>   #include <sound/jack.h>
>   #include "../codecs/rt5645.h"
>   #include "../codecs/rt5677.h"
> @@ -131,10 +132,31 @@ static struct snd_soc_dai_link_component mt8173_rt5650_rt5676_codecs[] = {
>   	},
>   };
>
> +static struct snd_soc_jack mt8173_hdmi_card_jack;
> +
> +static int mt8173_hdmi_init(struct snd_soc_pcm_runtime *runtime)
> +{
> +	struct snd_soc_card *card = runtime->card;
> +	struct snd_soc_codec *codec = runtime->codec;
> +	int ret;
> +
> +	/* enable jack detection */
> +	ret = snd_soc_card_jack_new(card, "HDMI Jack", SND_JACK_LINEOUT,
> +				    &mt8173_hdmi_card_jack, NULL, 0);
> +	if (ret) {
> +		dev_err(card->dev, "Can't new HDMI Jack %d\n", ret);
> +		return ret;
> +	}
> +
> +	return hdmi_codec_set_jack_detect(codec, &mt8173_hdmi_card_jack);
> +}
> +
>   enum {
>   	DAI_LINK_PLAYBACK,
>   	DAI_LINK_CAPTURE,
> +	DAI_LINK_HDMI,
>   	DAI_LINK_CODEC_I2S,
> +	DAI_LINK_HDMI_I2S,
>   	DAI_LINK_INTERCODEC
>   };
>
> @@ -161,6 +183,16 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = {
>   		.dynamic = 1,
>   		.dpcm_capture = 1,
>   	},
> +	[DAI_LINK_HDMI] = {
> +		.name = "HDMI",
> +		.stream_name = "HDMI PCM",
> +		.cpu_dai_name = "HDMI",
> +		.codec_name = "snd-soc-dummy",
> +		.codec_dai_name = "snd-soc-dummy-dai",
> +		.trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
> +		.dynamic = 1,
> +		.dpcm_playback = 1,
> +	},
>
>   	/* Back End DAI links */
>   	[DAI_LINK_CODEC_I2S] = {
> @@ -177,6 +209,14 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = {
>   		.dpcm_playback = 1,
>   		.dpcm_capture = 1,
>   	},
> +	[DAI_LINK_HDMI_I2S] = {
> +		.name = "HDMI BE",
> +		.cpu_dai_name = "HDMIO",
> +		.no_pcm = 1,
> +		.codec_dai_name = "i2s-hifi",
> +		.dpcm_playback = 1,
> +		.init = mt8173_hdmi_init,
> +	},
>   	/* rt5676 <-> rt5650 intercodec link: Sets rt5676 I2S2 as master */
>   	[DAI_LINK_INTERCODEC] = {
>   		.name = "rt5650_rt5676 intercodec",
> @@ -251,6 +291,14 @@ static int mt8173_rt5650_rt5676_dev_probe(struct platform_device *pdev)
>   	mt8173_rt5650_rt5676_dais[DAI_LINK_INTERCODEC].codec_of_node =
>   		mt8173_rt5650_rt5676_codecs[1].of_node;
>
> +	mt8173_rt5650_rt5676_dais[DAI_LINK_HDMI_I2S].codec_of_node =
> +		of_parse_phandle(pdev->dev.of_node, "mediatek,audio-codec", 2);
> +	if (!mt8173_rt5650_rt5676_dais[DAI_LINK_HDMI_I2S].codec_of_node) {
> +		dev_err(&pdev->dev,
> +			"Property 'audio-codec' missing or invalid\n");
> +		return -EINVAL;

Do we really need to break the old dts binding?
Can't we just drop the return and keep add the audio-codec as optional?

Regards,
Matthias

> +	}
> +
>   	card->dev = &pdev->dev;
>   	platform_set_drvdata(pdev, card);
>
>
PC Liao March 15, 2016, 3:22 a.m. UTC | #2
Hi Matthias,

On Tue, 2016-03-15 at 07:36 +0800, Matthias Brugger wrote:
> 
> On 02/03/16 15:49, Philipp Zabel wrote:
> > From: Koro Chen <koro.chen@mediatek.com>
> >
> > This creates pcmC0D2p for the HDMI playback in the same card.
> >
> > Signed-off-by: Koro Chen <koro.chen@mediatek.com>
> > Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
> > ---
> >   .../bindings/sound/mt8173-rt5650-rt5676.txt        |  5 ++-
> >   sound/soc/mediatek/mt8173-rt5650-rt5676.c          | 48 ++++++++++++++++++++++
> >   2 files changed, 51 insertions(+), 2 deletions(-)
> >
> > diff --git a/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt b/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt
> > index f205ce9..ac28cdb 100644
> > --- a/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt
> > +++ b/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt
> > @@ -1,15 +1,16 @@
> > -MT8173 with RT5650 RT5676 CODECS
> > +MT8173 with RT5650 RT5676 CODECS and HDMI via I2S
> >
> >   Required properties:
> >   - compatible : "mediatek,mt8173-rt5650-rt5676"
> >   - mediatek,audio-codec: the phandles of rt5650 and rt5676 codecs
> > +			and of the hdmi encoder node
> >   - mediatek,platform: the phandle of MT8173 ASoC platform
> >
> >   Example:
> >
> >   	sound {
> >   		compatible = "mediatek,mt8173-rt5650-rt5676";
> > -		mediatek,audio-codec = <&rt5650 &rt5676>;
> > +		mediatek,audio-codec = <&rt5650 &rt5676 &hdmi0>;
> >   		mediatek,platform = <&afe>;
> >   	};
> >
> > diff --git a/sound/soc/mediatek/mt8173-rt5650-rt5676.c b/sound/soc/mediatek/mt8173-rt5650-rt5676.c
> > index 5c4c58c..def9d95 100644
> > --- a/sound/soc/mediatek/mt8173-rt5650-rt5676.c
> > +++ b/sound/soc/mediatek/mt8173-rt5650-rt5676.c
> > @@ -18,6 +18,7 @@
> >   #include <linux/gpio.h>
> >   #include <linux/of_gpio.h>
> >   #include <sound/soc.h>
> > +#include <sound/hdmi-codec.h>
> >   #include <sound/jack.h>
> >   #include "../codecs/rt5645.h"
> >   #include "../codecs/rt5677.h"
> > @@ -131,10 +132,31 @@ static struct snd_soc_dai_link_component mt8173_rt5650_rt5676_codecs[] = {
> >   	},
> >   };
> >
> > +static struct snd_soc_jack mt8173_hdmi_card_jack;
> > +
> > +static int mt8173_hdmi_init(struct snd_soc_pcm_runtime *runtime)
> > +{
> > +	struct snd_soc_card *card = runtime->card;
> > +	struct snd_soc_codec *codec = runtime->codec;
> > +	int ret;
> > +
> > +	/* enable jack detection */
> > +	ret = snd_soc_card_jack_new(card, "HDMI Jack", SND_JACK_LINEOUT,
> > +				    &mt8173_hdmi_card_jack, NULL, 0);
> > +	if (ret) {
> > +		dev_err(card->dev, "Can't new HDMI Jack %d\n", ret);
> > +		return ret;
> > +	}
> > +
> > +	return hdmi_codec_set_jack_detect(codec, &mt8173_hdmi_card_jack);
> > +}
> > +
> >   enum {
> >   	DAI_LINK_PLAYBACK,
> >   	DAI_LINK_CAPTURE,
> > +	DAI_LINK_HDMI,
> >   	DAI_LINK_CODEC_I2S,
> > +	DAI_LINK_HDMI_I2S,
> >   	DAI_LINK_INTERCODEC
> >   };
> >
> > @@ -161,6 +183,16 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = {
> >   		.dynamic = 1,
> >   		.dpcm_capture = 1,
> >   	},
> > +	[DAI_LINK_HDMI] = {
> > +		.name = "HDMI",
> > +		.stream_name = "HDMI PCM",
> > +		.cpu_dai_name = "HDMI",
> > +		.codec_name = "snd-soc-dummy",
> > +		.codec_dai_name = "snd-soc-dummy-dai",
> > +		.trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
> > +		.dynamic = 1,
> > +		.dpcm_playback = 1,
> > +	},
> >
> >   	/* Back End DAI links */
> >   	[DAI_LINK_CODEC_I2S] = {
> > @@ -177,6 +209,14 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = {
> >   		.dpcm_playback = 1,
> >   		.dpcm_capture = 1,
> >   	},
> > +	[DAI_LINK_HDMI_I2S] = {
> > +		.name = "HDMI BE",
> > +		.cpu_dai_name = "HDMIO",
> > +		.no_pcm = 1,
> > +		.codec_dai_name = "i2s-hifi",
> > +		.dpcm_playback = 1,
> > +		.init = mt8173_hdmi_init,
> > +	},
> >   	/* rt5676 <-> rt5650 intercodec link: Sets rt5676 I2S2 as master */
> >   	[DAI_LINK_INTERCODEC] = {
> >   		.name = "rt5650_rt5676 intercodec",
> > @@ -251,6 +291,14 @@ static int mt8173_rt5650_rt5676_dev_probe(struct platform_device *pdev)
> >   	mt8173_rt5650_rt5676_dais[DAI_LINK_INTERCODEC].codec_of_node =
> >   		mt8173_rt5650_rt5676_codecs[1].of_node;
> >
> > +	mt8173_rt5650_rt5676_dais[DAI_LINK_HDMI_I2S].codec_of_node =
> > +		of_parse_phandle(pdev->dev.of_node, "mediatek,audio-codec", 2);
> > +	if (!mt8173_rt5650_rt5676_dais[DAI_LINK_HDMI_I2S].codec_of_node) {
> > +		dev_err(&pdev->dev,
> > +			"Property 'audio-codec' missing or invalid\n");
> > +		return -EINVAL;
> 
> Do we really need to break the old dts binding?
> Can't we just drop the return and keep add the audio-codec as optional?
> 
> Regards,
> Matthias

I think that it really needs to break dts binding, because it has
declared DAI_LINK_HDMI_I2S in static struct snd_soc_dai_link
mt8173_rt5650_rt5676_dais[].

If I just remove this line: 
	return -EINVAL;
it will probe failed like:
[    2.498403] mtk-rt5650-rt5676 sound: Property 'audio-codec' missing
or invalid
[    2.505031] mtk-rt5650-rt5676 sound: ASoC: Neither/both codec
name/of_node are set for HDMI BE
[    2.513090] mtk-rt5650-rt5676 sound: mt8173_rt5650_rt5676_dev_probe
snd_soc_register_card fail -22
[    2.520896] mtk-rt5650-rt5676: probe of sound failed with error -22

Thanks!

> 
> > +	}
> > +
> >   	card->dev = &pdev->dev;
> >   	platform_set_drvdata(pdev, card);
> >
> >
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel@alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt b/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt
index f205ce9..ac28cdb 100644
--- a/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt
+++ b/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt
@@ -1,15 +1,16 @@ 
-MT8173 with RT5650 RT5676 CODECS
+MT8173 with RT5650 RT5676 CODECS and HDMI via I2S
 
 Required properties:
 - compatible : "mediatek,mt8173-rt5650-rt5676"
 - mediatek,audio-codec: the phandles of rt5650 and rt5676 codecs
+			and of the hdmi encoder node
 - mediatek,platform: the phandle of MT8173 ASoC platform
 
 Example:
 
 	sound {
 		compatible = "mediatek,mt8173-rt5650-rt5676";
-		mediatek,audio-codec = <&rt5650 &rt5676>;
+		mediatek,audio-codec = <&rt5650 &rt5676 &hdmi0>;
 		mediatek,platform = <&afe>;
 	};
 
diff --git a/sound/soc/mediatek/mt8173-rt5650-rt5676.c b/sound/soc/mediatek/mt8173-rt5650-rt5676.c
index 5c4c58c..def9d95 100644
--- a/sound/soc/mediatek/mt8173-rt5650-rt5676.c
+++ b/sound/soc/mediatek/mt8173-rt5650-rt5676.c
@@ -18,6 +18,7 @@ 
 #include <linux/gpio.h>
 #include <linux/of_gpio.h>
 #include <sound/soc.h>
+#include <sound/hdmi-codec.h>
 #include <sound/jack.h>
 #include "../codecs/rt5645.h"
 #include "../codecs/rt5677.h"
@@ -131,10 +132,31 @@  static struct snd_soc_dai_link_component mt8173_rt5650_rt5676_codecs[] = {
 	},
 };
 
+static struct snd_soc_jack mt8173_hdmi_card_jack;
+
+static int mt8173_hdmi_init(struct snd_soc_pcm_runtime *runtime)
+{
+	struct snd_soc_card *card = runtime->card;
+	struct snd_soc_codec *codec = runtime->codec;
+	int ret;
+
+	/* enable jack detection */
+	ret = snd_soc_card_jack_new(card, "HDMI Jack", SND_JACK_LINEOUT,
+				    &mt8173_hdmi_card_jack, NULL, 0);
+	if (ret) {
+		dev_err(card->dev, "Can't new HDMI Jack %d\n", ret);
+		return ret;
+	}
+
+	return hdmi_codec_set_jack_detect(codec, &mt8173_hdmi_card_jack);
+}
+
 enum {
 	DAI_LINK_PLAYBACK,
 	DAI_LINK_CAPTURE,
+	DAI_LINK_HDMI,
 	DAI_LINK_CODEC_I2S,
+	DAI_LINK_HDMI_I2S,
 	DAI_LINK_INTERCODEC
 };
 
@@ -161,6 +183,16 @@  static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = {
 		.dynamic = 1,
 		.dpcm_capture = 1,
 	},
+	[DAI_LINK_HDMI] = {
+		.name = "HDMI",
+		.stream_name = "HDMI PCM",
+		.cpu_dai_name = "HDMI",
+		.codec_name = "snd-soc-dummy",
+		.codec_dai_name = "snd-soc-dummy-dai",
+		.trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
+		.dynamic = 1,
+		.dpcm_playback = 1,
+	},
 
 	/* Back End DAI links */
 	[DAI_LINK_CODEC_I2S] = {
@@ -177,6 +209,14 @@  static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = {
 		.dpcm_playback = 1,
 		.dpcm_capture = 1,
 	},
+	[DAI_LINK_HDMI_I2S] = {
+		.name = "HDMI BE",
+		.cpu_dai_name = "HDMIO",
+		.no_pcm = 1,
+		.codec_dai_name = "i2s-hifi",
+		.dpcm_playback = 1,
+		.init = mt8173_hdmi_init,
+	},
 	/* rt5676 <-> rt5650 intercodec link: Sets rt5676 I2S2 as master */
 	[DAI_LINK_INTERCODEC] = {
 		.name = "rt5650_rt5676 intercodec",
@@ -251,6 +291,14 @@  static int mt8173_rt5650_rt5676_dev_probe(struct platform_device *pdev)
 	mt8173_rt5650_rt5676_dais[DAI_LINK_INTERCODEC].codec_of_node =
 		mt8173_rt5650_rt5676_codecs[1].of_node;
 
+	mt8173_rt5650_rt5676_dais[DAI_LINK_HDMI_I2S].codec_of_node =
+		of_parse_phandle(pdev->dev.of_node, "mediatek,audio-codec", 2);
+	if (!mt8173_rt5650_rt5676_dais[DAI_LINK_HDMI_I2S].codec_of_node) {
+		dev_err(&pdev->dev,
+			"Property 'audio-codec' missing or invalid\n");
+		return -EINVAL;
+	}
+
 	card->dev = &pdev->dev;
 	platform_set_drvdata(pdev, card);