Re: [PATCH 1/2] ASoC: refine ASoC hdmi audio suspend/resume

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Sorry, I forgot to add  and [RFC]. I will resend the patch. 
Sorry for the inconvenience

Regards,
Libin


>-----Original Message-----
>From: Yang, Libin
>Sent: Monday, January 7, 2019 10:12 AM
>To: alsa-devel@xxxxxxxxxxxxxxxx; tiwai@xxxxxxx; broonie@xxxxxxxxxx
>Cc: liam.r.girdwood@xxxxxxxxxxxxxxx; pierre-louis.bossart@xxxxxxxxxxxxxxx; Lin,
>Mengdong <mengdong.lin@xxxxxxxxx>; Yang, Libin <libin.yang@xxxxxxxxx>
>Subject: [PATCH 1/2] ASoC: refine ASoC hdmi audio suspend/resume
>
>From: Libin Yang <libin.yang@xxxxxxxxx>
>
>hdmi_codec_prepare() will trigger hdmi runtime resume, which will set the
>bitmask of hdev->addr. And skl_suspend() will clear the bitmask of
>HDA_CODEC_IDX_CONTROLLER. HDMI codec idx is not the same as
>HDA_CODEC_IDX_CONTROLLER, which means i915 power will not be released
>when suspend.
>
>On the other hand, hdmi_codec_prepare() don't need to call
>pm_runtime_get_sync() to wake up the audio subsystem (HDMI auido) for
>setting the codec registers. Turning display power on with
>snd_hdac_display_power() is enough.
>
>Let's use S3 without playback as an example:
>hdmi_codec_prepare() invokes the runtime resume of codec =>
>  snd_hdac_display_power(bus, hdev->addr, true) skl runtime resume
>skl_suspend() =>
>  snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, false);
>
>THis means hdev->addr will never release the display power when suspend.
>
>The new sequence will be:
>hdmi_codec_prepare() =>
>  snd_hdac_display_power(bus, hdev->addr, true)
>  snd_hdac_display_power(bus, hdev->addr, false) skl runtime resume skl
>suspned
>
>Signed-off-by: Libin Yang <libin.yang@xxxxxxxxx>
>---
> sound/soc/codecs/hdac_hdmi.c  | 6 ++++--  sound/soc/intel/skylake/skl.c | 7
>-------
> 2 files changed, 4 insertions(+), 9 deletions(-)
>
>diff --git a/sound/soc/codecs/hdac_hdmi.c b/sound/soc/codecs/hdac_hdmi.c
>index 3ab2949..782b323 100644
>--- a/sound/soc/codecs/hdac_hdmi.c
>+++ b/sound/soc/codecs/hdac_hdmi.c
>@@ -1895,7 +1895,7 @@ static int hdmi_codec_prepare(struct device *dev)  {
> 	struct hdac_device *hdev = dev_to_hdac_dev(dev);
>
>-	pm_runtime_get_sync(&hdev->dev);
>+	snd_hdac_display_power(hdev->bus, hdev->addr, true);
>
> 	/*
> 	 * Power down afg.
>@@ -1906,6 +1906,7 @@ static int hdmi_codec_prepare(struct device *dev)
> 	 */
> 	snd_hdac_codec_read(hdev, hdev->afg, 0,
>	AC_VERB_SET_POWER_STATE,
> 							AC_PWRST_D3);
>+	snd_hdac_display_power(hdev->bus, hdev->addr, false);
>
> 	return 0;
> }
>@@ -1915,6 +1916,7 @@ static void hdmi_codec_complete(struct device *dev)
> 	struct hdac_device *hdev = dev_to_hdac_dev(dev);
> 	struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
>
>+	snd_hdac_display_power(hdev->bus, hdev->addr, true);
> 	/* Power up afg */
> 	snd_hdac_codec_read(hdev, hdev->afg, 0,
>	AC_VERB_SET_POWER_STATE,
> 							AC_PWRST_D0);
>@@ -1930,7 +1932,7 @@ static void hdmi_codec_complete(struct device *dev)
> 	 */
> 	hdac_hdmi_present_sense_all_pins(hdev, hdmi, false);
>
>-	pm_runtime_put_sync(&hdev->dev);
>+	snd_hdac_display_power(hdev->bus, hdev->addr, false);
> }
> #else
> #define hdmi_codec_prepare NULL
>diff --git a/sound/soc/intel/skylake/skl.c b/sound/soc/intel/skylake/skl.c index
>60c9483..89f4d66 100644
>--- a/sound/soc/intel/skylake/skl.c
>+++ b/sound/soc/intel/skylake/skl.c
>@@ -336,9 +336,6 @@ static int skl_suspend(struct device *dev)
> 		skl->skl_sst->fw_loaded = false;
> 	}
>
>-	if (IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI))
>-		snd_hdac_display_power(bus,
>HDA_CODEC_IDX_CONTROLLER, false);
>-
> 	return 0;
> }
>
>@@ -350,10 +347,6 @@ static int skl_resume(struct device *dev)
> 	struct hdac_ext_link *hlink = NULL;
> 	int ret;
>
>-	/* Turned OFF in HDMI codec driver after codec reconfiguration */
>-	if (IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI))
>-		snd_hdac_display_power(bus,
>HDA_CODEC_IDX_CONTROLLER, true);
>-
> 	/*
> 	 * resume only when we are not in suspend active, otherwise need to
> 	 * restore the device
>--
>2.7.4

_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxx
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel



[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux