[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1518683739-4448-1-git-send-email-abhijeet.kumar@intel.com>
Date: Thu, 15 Feb 2018 14:05:38 +0530
From: abhijeet.kumar@...el.com
To: Liam Girdwood <lgirdwood@...il.com>,
Mark Brown <broonie@...nel.org>,
Jaroslav Kysela <perex@...ex.cz>,
Takashi Iwai <tiwai@...e.com>,
Vinod Koul <vinod.koul@...el.com>,
Jeeja KP <jeeja.kp@...el.com>,
Guneshwor Singh <guneshwor.o.singh@...el.com>,
"Subhransu S. Prusty" <subhransu.s.prusty@...el.com>,
"Ughreja, Rakesh A" <rakesh.a.ughreja@...el.com>,
Puneeth Prabhu <puneethx.prabhu@...el.com>,
alsa-devel@...a-project.org, linux-kernel@...r.kernel.org
Cc: abhijeet.kumar@...el.com
Subject: [PATCH] ASoC: hdac_hdmi : Ensuring proper setting of output widget power state
From: Abhijeet Kumar <abhijeet.kumar@...el.com>
In usecases like hot plug-unplug DP panel or modeset during a playback,
sometimes we observe no audio after codec resets. During no audio
condition, we have noticed that the power state of the pin or the
connector is D3. Optimizing the way we set the power mitigates the
issue. With this changes the verb is sent to set the power state and
waits until actual state reaches target state. Thus ensuring power
state is set.
Signed-off-by: Abhijeet Kumar <abhijeet.kumar@...el.com>
---
sound/soc/codecs/hdac_hdmi.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/sound/soc/codecs/hdac_hdmi.c b/sound/soc/codecs/hdac_hdmi.c
index dba6f4c5074a..0483afc40db6 100644
--- a/sound/soc/codecs/hdac_hdmi.c
+++ b/sound/soc/codecs/hdac_hdmi.c
@@ -718,10 +718,22 @@ static struct hdac_hdmi_pcm *hdac_hdmi_get_pcm(struct hdac_ext_device *edev,
static void hdac_hdmi_set_power_state(struct hdac_ext_device *edev,
hda_nid_t nid, unsigned int pwr_state)
{
+ int count;
+ unsigned int state;
+
if (get_wcaps(&edev->hdev, nid) & AC_WCAP_POWER) {
- if (!snd_hdac_check_power_state(&edev->hdev, nid, pwr_state))
- snd_hdac_codec_write(&edev->hdev, nid, 0,
- AC_VERB_SET_POWER_STATE, pwr_state);
+ if (!snd_hdac_check_power_state(&edev->hdac, nid, pwr_state)) {
+ for (count = 0; count < 10; count++) {
+ snd_hdac_codec_read(&edev->hdac, nid, 0,
+ AC_VERB_SET_POWER_STATE,
+ pwr_state);
+ state = snd_hdac_sync_power_state(&edev->hdac,
+ nid, pwr_state);
+ if (!(state & AC_PWRST_ERROR))
+ break;
+ }
+ }
+
}
}
--
1.9.1
Powered by blists - more mailing lists