Hi Takashi, >-----Original Message----- >From: Takashi Iwai [mailto:tiwai@xxxxxxx] >Sent: Monday, April 8, 2019 8:35 PM >To: Yang, Libin <libin.yang@xxxxxxxxx> >Cc: alsa-devel@xxxxxxxxxxxxxxxx; broonie@xxxxxxxxxx; pierre- >louis.bossart@xxxxxxxxxxxxxxx >Subject: Re: [PATCH] ASoC: cAVS: add device_link to HDMI audio > >On Mon, 08 Apr 2019 03:21:53 +0200, >libin.yang@xxxxxxxxx wrote: >> >> From: Libin Yang <libin.yang@xxxxxxxxx> >> >> 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@xxxxxxxxx> > >Looks good to me. Maybe it's worth to put a brief comment in >skl_hdmi_init() why this device link is needed, though. I will do it. Thanks for the review and the advice. Regards, Libin > >Feel free to take my ack: > Reviewed-by: Takashi Iwai <tiwai@xxxxxxx> > > >thanks, > >Takashi > >> --- >> 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 ++++++++++++ >> 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, >> -- >> 2.7.4 >> >> _______________________________________________ >> Alsa-devel mailing list >> Alsa-devel@xxxxxxxxxxxxxxxx >> https://mailman.alsa-project.org/mailman/listinfo/alsa-devel >> _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx https://mailman.alsa-project.org/mailman/listinfo/alsa-devel