[alsa-devel] [PATCH] ASoC: cAVS: add device_link to HDMI audio

Ranjani Sridharan ranjani.sridharan at linux.intel.com
Mon Apr 8 16:36:29 CEST 2019


On Mon, 2019-04-08 at 08:14 -0500, Pierre-Louis Bossart wrote:
> 
> On 4/7/19 8:21 PM, libin.yang at intel.com wrote:
> > From: Libin Yang <libin.yang at intel.com>
> > 
> > In resume from S3, HDAC HDMI codec driver dapm event callback may
> > be
> > operated before HDMI codec driver turns on the display audio power
> > domain because of the contest between display driver and hdmi codec
> > driver.
> > 
> > This patch adds the device_link between cAVS generic machine device
> > (consumer) and hdmi codec device (supplier) to make sure the
> > sequence is
> > always correct.
> > 
> > Signed-off-by: Libin Yang <libin.yang at intel.com>
> > ---
> >   sound/soc/intel/boards/skl_hda_dsp_common.c  | 15 +++++++++++++++
> >   sound/soc/intel/boards/skl_hda_dsp_common.h  |  1 +
> >   sound/soc/intel/boards/skl_hda_dsp_generic.c | 12 ++++++++++++
> 
> It's Monday morning and I have mixed feelings about this fix.
> 
> 0. What does 'resume from S3' mean? from the description it looks
> like 
> the application was playing already before entering S3? I am ready
> to 
> bet it's a use case that was never tested in the past given that 
> Chromebooks tend to stop all streams before entering S3...
> 
> 1. As discussed in other threads, Takashi suggested that maybe the 
> INFO_RESUME flag should be removed?  What would be the impact should
> we 
> indeed remove this flag, is this patch still necessary?
Hi Pierre,

I can confirm that this patch is necessary even if INFO_RESUME is not
set.

Thanks,
Ranjani
> 
> 2. if this is really a generic issue then shouldn't it be fixed for
> all 
> users of the iDISP link? Why stop at the HDAudio machine driver?
> 
> 3. we already have the component model to deal with interaction
> between 
> i915 and audio, now we are adding a second layer. That looks clunky.
> 
> Thanks
> -Pierre
> 
> >   3 files changed, 28 insertions(+)
> > 
> > diff --git a/sound/soc/intel/boards/skl_hda_dsp_common.c
> > b/sound/soc/intel/boards/skl_hda_dsp_common.c
> > index 9b30c0e..01c8937 100644
> > --- a/sound/soc/intel/boards/skl_hda_dsp_common.c
> > +++ b/sound/soc/intel/boards/skl_hda_dsp_common.c
> > @@ -17,6 +17,18 @@
> >   
> >   #define NAME_SIZE	32
> >   
> > +static int skl_hdmi_init(struct snd_soc_pcm_runtime *rtd)
> > +{
> > +	struct skl_hda_private *ctx = snd_soc_card_get_drvdata(rtd-
> > >card);
> > +	struct snd_soc_dai *dai = rtd->codec_dai;
> > +
> > +	if (!ctx->link)
> > +		ctx->link = device_link_add(rtd->card->dev, dai->dev,
> > +					    DL_FLAG_RPM_ACTIVE);
> > +
> > +	return 0;
> > +}
> > +
> >   int skl_hda_hdmi_add_pcm(struct snd_soc_card *card, int device)
> >   {
> >   	struct skl_hda_private *ctx = snd_soc_card_get_drvdata(card);
> > @@ -48,6 +60,7 @@ struct snd_soc_dai_link
> > skl_hda_be_dai_links[HDA_DSP_MAX_BE_DAI_LINKS] = {
> >   		.cpu_dai_name = "iDisp1 Pin",
> >   		.codec_name = "ehdaudio0D2",
> >   		.codec_dai_name = "intel-hdmi-hifi1",
> > +		.init = skl_hdmi_init,
> >   		.dpcm_playback = 1,
> >   		.no_pcm = 1,
> >   		.trigger[0] = SND_SOC_DPCM_TRIGGER_POST,
> > @@ -58,6 +71,7 @@ struct snd_soc_dai_link
> > skl_hda_be_dai_links[HDA_DSP_MAX_BE_DAI_LINKS] = {
> >   		.cpu_dai_name = "iDisp2 Pin",
> >   		.codec_name = "ehdaudio0D2",
> >   		.codec_dai_name = "intel-hdmi-hifi2",
> > +		.init = skl_hdmi_init,
> >   		.dpcm_playback = 1,
> >   		.no_pcm = 1,
> >   		.trigger[0] = SND_SOC_DPCM_TRIGGER_POST,
> > @@ -68,6 +82,7 @@ struct snd_soc_dai_link
> > skl_hda_be_dai_links[HDA_DSP_MAX_BE_DAI_LINKS] = {
> >   		.cpu_dai_name = "iDisp3 Pin",
> >   		.codec_name = "ehdaudio0D2",
> >   		.codec_dai_name = "intel-hdmi-hifi3",
> > +		.init = skl_hdmi_init,
> >   		.dpcm_playback = 1,
> >   		.no_pcm = 1,
> >   		.trigger[0] = SND_SOC_DPCM_TRIGGER_POST,
> > diff --git a/sound/soc/intel/boards/skl_hda_dsp_common.h
> > b/sound/soc/intel/boards/skl_hda_dsp_common.h
> > index 87c50af..df5cc6b 100644
> > --- a/sound/soc/intel/boards/skl_hda_dsp_common.h
> > +++ b/sound/soc/intel/boards/skl_hda_dsp_common.h
> > @@ -29,6 +29,7 @@ struct skl_hda_private {
> >   	int pcm_count;
> >   	int dai_index;
> >   	const char *platform_name;
> > +	struct device_link *link;
> >   };
> >   
> >   extern struct snd_soc_dai_link
> > skl_hda_be_dai_links[HDA_DSP_MAX_BE_DAI_LINKS];
> > diff --git a/sound/soc/intel/boards/skl_hda_dsp_generic.c
> > b/sound/soc/intel/boards/skl_hda_dsp_generic.c
> > index b9a21e6..ceca11e 100644
> > --- a/sound/soc/intel/boards/skl_hda_dsp_generic.c
> > +++ b/sound/soc/intel/boards/skl_hda_dsp_generic.c
> > @@ -166,8 +166,20 @@ static int skl_hda_audio_probe(struct
> > platform_device *pdev)
> >   	return devm_snd_soc_register_card(&pdev->dev, &hda_soc_card);
> >   }
> >   
> > +static int skl_hda_audio_remove(struct platform_device *pdev)
> > +{
> > +	struct snd_soc_card *card = platform_get_drvdata(pdev);
> > +	struct skl_hda_private *ctx = snd_soc_card_get_drvdata(card);
> > +
> > +	if (ctx->link)
> > +		device_link_del(ctx->link);
> > +
> > +	return 0;
> > +}
> > +
> >   static struct platform_driver skl_hda_audio = {
> >   	.probe = skl_hda_audio_probe,
> > +	.remove = skl_hda_audio_remove,
> >   	.driver = {
> >   		.name = "skl_hda_dsp_generic",
> >   		.pm = &snd_soc_pm_ops,
> > 
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> https://mailman.alsa-project.org/mailman/listinfo/alsa-devel



More information about the Alsa-devel mailing list