diff options
author | Subhransu S. Prusty <subhransu.s.prusty@intel.com> | 2016-02-22 07:50:32 +0530 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2016-02-23 06:25:49 +0900 |
commit | 7ed49700c4d6959dbfdf174023a57fc15a97c9ab (patch) | |
tree | d9693b428a618366b1521381c2dab5bd33e77aa2 /sound/soc/codecs/hdac_hdmi.c | |
parent | ab85f5b36ea3474622303a36293e63cf78f4a797 (diff) | |
download | lwn-7ed49700c4d6959dbfdf174023a57fc15a97c9ab.tar.gz lwn-7ed49700c4d6959dbfdf174023a57fc15a97c9ab.zip |
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>
Diffstat (limited to 'sound/soc/codecs/hdac_hdmi.c')
-rw-r--r-- | sound/soc/codecs/hdac_hdmi.c | 12 |
1 files changed, 11 insertions, 1 deletions
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"); |