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@xxxxxxxxxxxx> > > > > This creates pcmC0D2p for the HDMI playback in the same card. > > > > Signed-off-by: Koro Chen <koro.chen@xxxxxxxxxxxx> > > Signed-off-by: Philipp Zabel <p.zabel@xxxxxxxxxxxxxx> > > --- > > .../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@xxxxxxxxxxxxxxxx > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel