forked from Minki/linux
ALSA: hda - Force to link down at runtime suspend on ATI/AMD HDMI
Henning Kühn reported that the discrete AMD GPU on his hybrid graphics laptop no longer runtime-suspends due to the recent commit07f4f97d7b
("vga_switcheroo: Use device link for HDA controller"). The root cause is that the HDMI codec on AMD GPU doesn't support CLKSTOP and EPSS, which are currently mandatory for powering down the HD-audio link at runtime suspend. Because the HD-audio link is still up, HD-audio controller driver blocks the transition to D3. For addressing the regression, this patch adds a new flag to indicate the forced link-down, and sets it for AMD HDMI codecs appropriately in the codec driver. Fixes:07f4f97d7b
("vga_switcheroo: Use device link for HDA controller") Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106957 Reported-by: Lukas Wunner <lukas@wunner.de> Reported-and-tested-by: Henning Kühn <prg@cooco.de> Cc: <stable@vger.kernel.org> # v4.17+ Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
f04684b4d8
commit
57cb54e53b
@ -2899,8 +2899,9 @@ static int hda_codec_runtime_suspend(struct device *dev)
|
|||||||
list_for_each_entry(pcm, &codec->pcm_list_head, list)
|
list_for_each_entry(pcm, &codec->pcm_list_head, list)
|
||||||
snd_pcm_suspend_all(pcm->pcm);
|
snd_pcm_suspend_all(pcm->pcm);
|
||||||
state = hda_call_codec_suspend(codec);
|
state = hda_call_codec_suspend(codec);
|
||||||
if (codec_has_clkstop(codec) && codec_has_epss(codec) &&
|
if (codec->link_down_at_suspend ||
|
||||||
(state & AC_PWRST_CLK_STOP_OK))
|
(codec_has_clkstop(codec) && codec_has_epss(codec) &&
|
||||||
|
(state & AC_PWRST_CLK_STOP_OK)))
|
||||||
snd_hdac_codec_link_down(&codec->core);
|
snd_hdac_codec_link_down(&codec->core);
|
||||||
snd_hdac_link_power(&codec->core, false);
|
snd_hdac_link_power(&codec->core, false);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -258,6 +258,7 @@ struct hda_codec {
|
|||||||
unsigned int power_save_node:1; /* advanced PM for each widget */
|
unsigned int power_save_node:1; /* advanced PM for each widget */
|
||||||
unsigned int auto_runtime_pm:1; /* enable automatic codec runtime pm */
|
unsigned int auto_runtime_pm:1; /* enable automatic codec runtime pm */
|
||||||
unsigned int force_pin_prefix:1; /* Add location prefix */
|
unsigned int force_pin_prefix:1; /* Add location prefix */
|
||||||
|
unsigned int link_down_at_suspend:1; /* link down at runtime suspend */
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
unsigned long power_on_acct;
|
unsigned long power_on_acct;
|
||||||
unsigned long power_off_acct;
|
unsigned long power_off_acct;
|
||||||
|
@ -3741,6 +3741,11 @@ static int patch_atihdmi(struct hda_codec *codec)
|
|||||||
|
|
||||||
spec->chmap.channels_max = max(spec->chmap.channels_max, 8u);
|
spec->chmap.channels_max = max(spec->chmap.channels_max, 8u);
|
||||||
|
|
||||||
|
/* AMD GPUs have neither EPSS nor CLKSTOP bits, hence preventing
|
||||||
|
* the link-down as is. Tell the core to allow it.
|
||||||
|
*/
|
||||||
|
codec->link_down_at_suspend = 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user