alsa-devel.alsa-project.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v8 1/2] ASoC: hdac_hdmi: Fix to wait for D3 before powering off codec
@ 2016-02-21  6:00 Subhransu S. Prusty
  2016-02-21  6:00 ` [PATCH v8 2/2] ASoC: hdac_hdmi: Add PM support Subhransu S. Prusty
  2016-02-24  3:53 ` Applied "ASoC: hdac_hdmi: Fix to wait for D3 before powering off codec" to the asoc tree Mark Brown
  0 siblings, 2 replies; 5+ messages in thread
From: Subhransu S. Prusty @ 2016-02-21  6:00 UTC (permalink / raw)
  To: alsa-devel
  Cc: tiwai, lgirdwood, patches.audio, broonie, Vinod Koul,
	Subhransu S. Prusty

Powering off codec immediately after sending D3 verb may not set
the node to D3 state. So wait for a confirmation response before
shutting down codec.

Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
---
 sound/soc/codecs/hdac_hdmi.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/sound/soc/codecs/hdac_hdmi.c b/sound/soc/codecs/hdac_hdmi.c
index 2445b43..aa953a5 100644
--- a/sound/soc/codecs/hdac_hdmi.c
+++ b/sound/soc/codecs/hdac_hdmi.c
@@ -1486,6 +1486,7 @@ static int hdac_hdmi_runtime_suspend(struct device *dev)
 	struct hdac_ext_device *edev = to_hda_ext_device(dev);
 	struct hdac_device *hdac = &edev->hdac;
 	struct hdac_bus *bus = hdac->bus;
+	unsigned long timeout;
 	int err;
 
 	dev_dbg(dev, "Enter: %s\n", __func__);
@@ -1495,10 +1496,19 @@ static int hdac_hdmi_runtime_suspend(struct device *dev)
 		return 0;
 
 	/* Power down afg */
-	if (!snd_hdac_check_power_state(hdac, hdac->afg, AC_PWRST_D3))
+	if (!snd_hdac_check_power_state(hdac, hdac->afg, AC_PWRST_D3)) {
 		snd_hdac_codec_write(hdac, hdac->afg, 0,
 			AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
 
+		/* Wait till power state is set to D3 */
+		timeout = jiffies + msecs_to_jiffies(1000);
+		while (!snd_hdac_check_power_state(hdac, hdac->afg, AC_PWRST_D3)
+				&& time_before(jiffies, timeout)) {
+
+			msleep(50);
+		}
+	}
+
 	err = snd_hdac_display_power(bus, false);
 	if (err < 0) {
 		dev_err(bus->dev, "Cannot turn on display power on i915\n");
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v8 2/2] ASoC: hdac_hdmi: Add PM support
  2016-02-21  6:00 [PATCH v8 1/2] ASoC: hdac_hdmi: Fix to wait for D3 before powering off codec Subhransu S. Prusty
@ 2016-02-21  6:00 ` Subhransu S. Prusty
  2016-02-21  8:18   ` Takashi Iwai
  2016-02-24  3:53 ` Applied "ASoC: hdac_hdmi: Fix to wait for D3 before powering off codec" to the asoc tree Mark Brown
  1 sibling, 1 reply; 5+ messages in thread
From: Subhransu S. Prusty @ 2016-02-21  6:00 UTC (permalink / raw)
  To: alsa-devel
  Cc: tiwai, lgirdwood, patches.audio, broonie, Jeeja KP, Vinod Koul,
	Subhransu S. Prusty

From: Jeeja KP <jeeja.kp@intel.com>

The codec registers are reset during S3. So need to reconfigure
all pins and DP1.2 feature again after resume from S3. Also
reprogram the required registers if the S3 was triggered during
playback.

In suspended state ELD notify callback is not processed, So add
ELD check for all pins as well.

Also turn the codec power domain OFF which is kept ON during
controller resequencing and codec reenumeration.

Signed-off-by: Jeeja KP <jeeja.kp@intel.com>
Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
---
 sound/soc/codecs/hdac_hdmi.c | 61 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 61 insertions(+)

diff --git a/sound/soc/codecs/hdac_hdmi.c b/sound/soc/codecs/hdac_hdmi.c
index aa953a5..ab75b4b 100644
--- a/sound/soc/codecs/hdac_hdmi.c
+++ b/sound/soc/codecs/hdac_hdmi.c
@@ -601,6 +601,26 @@ static int hdac_hdmi_pcm_open(struct snd_pcm_substream *substream,
 				pin->eld.eld_buffer);
 }
 
+static int hdac_hdmi_trigger(struct snd_pcm_substream *substream, int cmd,
+		struct snd_soc_dai *dai)
+{
+	struct hdac_hdmi_dai_pin_map *dai_map;
+	struct hdac_ext_device *hdac = snd_soc_dai_get_drvdata(dai);
+	struct hdac_hdmi_priv *hdmi = hdac->private_data;
+	int ret;
+
+	dai_map = &hdmi->dai_map[dai->id];
+	if (cmd == SNDRV_PCM_TRIGGER_RESUME) {
+		ret = hdac_hdmi_enable_pin(hdac, dai_map);
+		if (ret < 0)
+			return ret;
+
+		return hdac_hdmi_playback_prepare(substream, dai);
+	}
+
+	return 0;
+}
+
 static void hdac_hdmi_pcm_close(struct snd_pcm_substream *substream,
 		struct snd_soc_dai *dai)
 {
@@ -1154,6 +1174,7 @@ static struct snd_soc_dai_ops hdmi_dai_ops = {
 	.shutdown = hdac_hdmi_pcm_close,
 	.hw_params = hdac_hdmi_set_hw_params,
 	.prepare = hdac_hdmi_playback_prepare,
+	.trigger = hdac_hdmi_trigger,
 	.hw_free = hdac_hdmi_playback_cleanup,
 };
 
@@ -1399,9 +1420,49 @@ static int hdmi_codec_remove(struct snd_soc_codec *codec)
 	return 0;
 }
 
+#ifdef CONFIG_PM
+static int hdmi_codec_resume(struct snd_soc_codec *codec)
+{
+	struct hdac_ext_device *edev = snd_soc_codec_get_drvdata(codec);
+	struct hdac_hdmi_priv *hdmi = edev->private_data;
+	struct hdac_hdmi_pin *pin;
+	struct hdac_device *hdac = &edev->hdac;
+	struct hdac_bus *bus = hdac->bus;
+	int err;
+
+	hdac_hdmi_skl_enable_all_pins(&edev->hdac);
+	hdac_hdmi_skl_enable_dp12(&edev->hdac);
+
+	/* Power up afg */
+	if (!snd_hdac_check_power_state(hdac, hdac->afg, AC_PWRST_D0))
+		snd_hdac_codec_write(hdac, hdac->afg, 0,
+			AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
+
+	/*
+	 * As the ELD notify callback request is not entertained while the
+	 * device is in suspend state. Need to manually check detection of
+	 * all pins here.
+	 */
+	list_for_each_entry(pin, &hdmi->pin_list, head)
+		hdac_hdmi_present_sense(pin, 1);
+
+	/* Codec power is turned ON during controller resume */
+	err = snd_hdac_display_power(bus, false);
+	if (err < 0) {
+		dev_err(bus->dev, "Cannot turn on display power on i915\n");
+		return err;
+	}
+
+	return 0;
+}
+#else
+#define hdmi_codec_resume NULL
+#endif
+
 static struct snd_soc_codec_driver hdmi_hda_codec = {
 	.probe		= hdmi_codec_probe,
 	.remove		= hdmi_codec_remove,
+	.resume		= hdmi_codec_resume,
 	.idle_bias_off	= true,
 };
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v8 2/2] ASoC: hdac_hdmi: Add PM support
  2016-02-21  6:00 ` [PATCH v8 2/2] ASoC: hdac_hdmi: Add PM support Subhransu S. Prusty
@ 2016-02-21  8:18   ` Takashi Iwai
  2016-02-22  2:10     ` Subhransu S. Prusty
  0 siblings, 1 reply; 5+ messages in thread
From: Takashi Iwai @ 2016-02-21  8:18 UTC (permalink / raw)
  To: Subhransu S. Prusty
  Cc: alsa-devel, patches.audio, lgirdwood, Vinod Koul, broonie,
	Jeeja KP

On Sun, 21 Feb 2016 07:00:44 +0100,
Subhransu S. Prusty wrote:
> 
> From: Jeeja KP <jeeja.kp@intel.com>
> 
> The codec registers are reset during S3. So need to reconfigure
> all pins and DP1.2 feature again after resume from S3. Also
> reprogram the required registers if the S3 was triggered during
> playback.
> 
> In suspended state ELD notify callback is not processed, So add
> ELD check for all pins as well.
> 
> Also turn the codec power domain OFF which is kept ON during
> controller resequencing and codec reenumeration.
> 
> Signed-off-by: Jeeja KP <jeeja.kp@intel.com>
> Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
> ---
>  sound/soc/codecs/hdac_hdmi.c | 61 ++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 61 insertions(+)
> 
> diff --git a/sound/soc/codecs/hdac_hdmi.c b/sound/soc/codecs/hdac_hdmi.c
> index aa953a5..ab75b4b 100644
> --- a/sound/soc/codecs/hdac_hdmi.c
> +++ b/sound/soc/codecs/hdac_hdmi.c
> @@ -601,6 +601,26 @@ static int hdac_hdmi_pcm_open(struct snd_pcm_substream *substream,
>  				pin->eld.eld_buffer);
>  }
>  
> +static int hdac_hdmi_trigger(struct snd_pcm_substream *substream, int cmd,
> +		struct snd_soc_dai *dai)
> +{
> +	struct hdac_hdmi_dai_pin_map *dai_map;
> +	struct hdac_ext_device *hdac = snd_soc_dai_get_drvdata(dai);
> +	struct hdac_hdmi_priv *hdmi = hdac->private_data;
> +	int ret;
> +
> +	dai_map = &hdmi->dai_map[dai->id];
> +	if (cmd == SNDRV_PCM_TRIGGER_RESUME) {
> +		ret = hdac_hdmi_enable_pin(hdac, dai_map);
> +		if (ret < 0)
> +			return ret;
> +
> +		return hdac_hdmi_playback_prepare(substream, dai);
> +	}
> +
> +	return 0;
> +}
> +
>  static void hdac_hdmi_pcm_close(struct snd_pcm_substream *substream,
>  		struct snd_soc_dai *dai)
>  {
> @@ -1154,6 +1174,7 @@ static struct snd_soc_dai_ops hdmi_dai_ops = {
>  	.shutdown = hdac_hdmi_pcm_close,
>  	.hw_params = hdac_hdmi_set_hw_params,
>  	.prepare = hdac_hdmi_playback_prepare,
> +	.trigger = hdac_hdmi_trigger,
>  	.hw_free = hdac_hdmi_playback_cleanup,
>  };
>  
> @@ -1399,9 +1420,49 @@ static int hdmi_codec_remove(struct snd_soc_codec *codec)
>  	return 0;
>  }
>  
> +#ifdef CONFIG_PM
> +static int hdmi_codec_resume(struct snd_soc_codec *codec)
> +{
> +	struct hdac_ext_device *edev = snd_soc_codec_get_drvdata(codec);
> +	struct hdac_hdmi_priv *hdmi = edev->private_data;
> +	struct hdac_hdmi_pin *pin;
> +	struct hdac_device *hdac = &edev->hdac;
> +	struct hdac_bus *bus = hdac->bus;
> +	int err;
> +
> +	hdac_hdmi_skl_enable_all_pins(&edev->hdac);
> +	hdac_hdmi_skl_enable_dp12(&edev->hdac);
> +
> +	/* Power up afg */
> +	if (!snd_hdac_check_power_state(hdac, hdac->afg, AC_PWRST_D0))
> +		snd_hdac_codec_write(hdac, hdac->afg, 0,
> +			AC_VERB_SET_POWER_STATE, AC_PWRST_D0);

You don't have to wait for D0 power up unlike runtime resume?

> +	/*
> +	 * As the ELD notify callback request is not entertained while the
> +	 * device is in suspend state. Need to manually check detection of
> +	 * all pins here.
> +	 */
> +	list_for_each_entry(pin, &hdmi->pin_list, head)
> +		hdac_hdmi_present_sense(pin, 1);
> +
> +	/* Codec power is turned ON during controller resume */
> +	err = snd_hdac_display_power(bus, false);
> +	if (err < 0) {
> +		dev_err(bus->dev, "Cannot turn on display power on i915\n");

Make clear whether you're turning on or off...


Takashi

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v8 2/2] ASoC: hdac_hdmi: Add PM support
  2016-02-21  8:18   ` Takashi Iwai
@ 2016-02-22  2:10     ` Subhransu S. Prusty
  0 siblings, 0 replies; 5+ messages in thread
From: Subhransu S. Prusty @ 2016-02-22  2:10 UTC (permalink / raw)
  To: Takashi Iwai
  Cc: alsa-devel, patches.audio, lgirdwood, Vinod Koul, broonie,
	Jeeja KP

> >  
> > +#ifdef CONFIG_PM
> > +static int hdmi_codec_resume(struct snd_soc_codec *codec)
> > +{
> > +	struct hdac_ext_device *edev = snd_soc_codec_get_drvdata(codec);
> > +	struct hdac_hdmi_priv *hdmi = edev->private_data;
> > +	struct hdac_hdmi_pin *pin;
> > +	struct hdac_device *hdac = &edev->hdac;
> > +	struct hdac_bus *bus = hdac->bus;
> > +	int err;
> > +
> > +	hdac_hdmi_skl_enable_all_pins(&edev->hdac);
> > +	hdac_hdmi_skl_enable_dp12(&edev->hdac);
> > +
> > +	/* Power up afg */
> > +	if (!snd_hdac_check_power_state(hdac, hdac->afg, AC_PWRST_D0))
> > +		snd_hdac_codec_write(hdac, hdac->afg, 0,
> > +			AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
> 
> You don't have to wait for D0 power up unlike runtime resume?

Didn't see any issue yet. But yes, we should wait.

> 
> > +	/*
> > +	 * As the ELD notify callback request is not entertained while the
> > +	 * device is in suspend state. Need to manually check detection of
> > +	 * all pins here.
> > +	 */
> > +	list_for_each_entry(pin, &hdmi->pin_list, head)
> > +		hdac_hdmi_present_sense(pin, 1);
> > +
> > +	/* Codec power is turned ON during controller resume */
> > +	err = snd_hdac_display_power(bus, false);
> > +	if (err < 0) {
> > +		dev_err(bus->dev, "Cannot turn on display power on i915\n");
> 
> Make clear whether you're turning on or off...

Will fix it.

> 
> 
> Takashi

-- 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Applied "ASoC: hdac_hdmi: Fix to wait for D3 before powering off codec" to the asoc tree
  2016-02-21  6:00 [PATCH v8 1/2] ASoC: hdac_hdmi: Fix to wait for D3 before powering off codec Subhransu S. Prusty
  2016-02-21  6:00 ` [PATCH v8 2/2] ASoC: hdac_hdmi: Add PM support Subhransu S. Prusty
@ 2016-02-24  3:53 ` Mark Brown
  1 sibling, 0 replies; 5+ messages in thread
From: Mark Brown @ 2016-02-24  3:53 UTC (permalink / raw)
  To: Subhransu S. Prusty, Vinod Koul, Mark Brown; +Cc: alsa-devel

The patch

   ASoC: hdac_hdmi: Fix to wait for D3 before powering off codec

has been applied to the asoc tree at

   git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From 7ed49700c4d6959dbfdf174023a57fc15a97c9ab Mon Sep 17 00:00:00 2001
From: "Subhransu S. Prusty" <subhransu.s.prusty@intel.com>
Date: Mon, 22 Feb 2016 07:50:32 +0530
Subject: [PATCH] ASoC: hdac_hdmi: Fix to wait for D3 before powering off codec

Powering off codec immediately after sending D3 verb may not set
the node to D3 state. So wait for a confirmation response before
shutting down codec.

Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
 sound/soc/codecs/hdac_hdmi.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/sound/soc/codecs/hdac_hdmi.c b/sound/soc/codecs/hdac_hdmi.c
index 2445b4351efb..aa953a5b57d4 100644
--- a/sound/soc/codecs/hdac_hdmi.c
+++ b/sound/soc/codecs/hdac_hdmi.c
@@ -1486,6 +1486,7 @@ static int hdac_hdmi_runtime_suspend(struct device *dev)
 	struct hdac_ext_device *edev = to_hda_ext_device(dev);
 	struct hdac_device *hdac = &edev->hdac;
 	struct hdac_bus *bus = hdac->bus;
+	unsigned long timeout;
 	int err;
 
 	dev_dbg(dev, "Enter: %s\n", __func__);
@@ -1495,10 +1496,19 @@ static int hdac_hdmi_runtime_suspend(struct device *dev)
 		return 0;
 
 	/* Power down afg */
-	if (!snd_hdac_check_power_state(hdac, hdac->afg, AC_PWRST_D3))
+	if (!snd_hdac_check_power_state(hdac, hdac->afg, AC_PWRST_D3)) {
 		snd_hdac_codec_write(hdac, hdac->afg, 0,
 			AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
 
+		/* Wait till power state is set to D3 */
+		timeout = jiffies + msecs_to_jiffies(1000);
+		while (!snd_hdac_check_power_state(hdac, hdac->afg, AC_PWRST_D3)
+				&& time_before(jiffies, timeout)) {
+
+			msleep(50);
+		}
+	}
+
 	err = snd_hdac_display_power(bus, false);
 	if (err < 0) {
 		dev_err(bus->dev, "Cannot turn on display power on i915\n");
-- 
2.7.0

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2016-02-24  3:53 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-02-21  6:00 [PATCH v8 1/2] ASoC: hdac_hdmi: Fix to wait for D3 before powering off codec Subhransu S. Prusty
2016-02-21  6:00 ` [PATCH v8 2/2] ASoC: hdac_hdmi: Add PM support Subhransu S. Prusty
2016-02-21  8:18   ` Takashi Iwai
2016-02-22  2:10     ` Subhransu S. Prusty
2016-02-24  3:53 ` Applied "ASoC: hdac_hdmi: Fix to wait for D3 before powering off codec" to the asoc tree Mark Brown

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).