提交 d804ad92 编写于 作者: M Maxim Levitsky 提交者: Jaroslav Kysela

[ALSA] hda-intel - Fix resume logic, when dynamic power managment is on

Comment in hda_intel.c states that 'the explicit resume is needed only
when POWER_SAVE isn't set', but this is not true.
There is no code that will automaticly power up the codec on resume,
but only code that powers it up when user accesses it. So if user
leaves a sound playing, codec will not be powered
To fix that I check if there are any codecs that should be powered
codec->power_count, and if so I power them up together with main
controller.
Signed-off-by: NMaxim Levitsky <maximlevitsky@gmail.com>
Signed-off-by: NTakashi Iwai <tiwai@suse.de>
Signed-off-by: NJaroslav Kysela <perex@suse.cz>
上级 2e492462
......@@ -2787,7 +2787,6 @@ int snd_hda_suspend(struct hda_bus *bus, pm_message_t state)
return 0;
}
#ifndef CONFIG_SND_HDA_POWER_SAVE
/**
* snd_hda_resume - resume the codecs
* @bus: the HDA bus
......@@ -2803,10 +2802,21 @@ int snd_hda_resume(struct hda_bus *bus)
struct hda_codec *codec;
list_for_each_entry(codec, &bus->codec_list, list) {
hda_call_codec_resume(codec);
if (snd_hda_codec_needs_resume(codec))
hda_call_codec_resume(codec);
}
return 0;
}
#endif /* !CONFIG_SND_HDA_POWER_SAVE */
#ifdef CONFIG_SND_HDA_POWER_SAVE
int snd_hda_codecs_inuse(struct hda_bus *bus)
{
struct hda_codec *codec;
list_for_each_entry(codec, &bus->codec_list, list) {
if (snd_hda_codec_needs_resume(codec))
return 1;
}
return 0;
}
#endif
#endif
......@@ -686,9 +686,13 @@ int snd_hda_resume(struct hda_bus *bus);
#ifdef CONFIG_SND_HDA_POWER_SAVE
void snd_hda_power_up(struct hda_codec *codec);
void snd_hda_power_down(struct hda_codec *codec);
#define snd_hda_codec_needs_resume(codec) codec->power_count
int snd_hda_codecs_inuse(struct hda_bus *bus);
#else
static inline void snd_hda_power_up(struct hda_codec *codec) {}
static inline void snd_hda_power_down(struct hda_codec *codec) {}
#define snd_hda_codec_needs_resume(codec) 1
#define snd_hda_codecs_inuse(bus) 1
#endif
#endif /* __SOUND_HDA_CODEC_H */
......@@ -1586,11 +1586,11 @@ static int azx_resume(struct pci_dev *pci)
if (azx_acquire_irq(chip, 1) < 0)
return -EIO;
azx_init_pci(chip);
#ifndef CONFIG_SND_HDA_POWER_SAVE
/* the explicit resume is needed only when POWER_SAVE isn't set */
azx_init_chip(chip);
if (snd_hda_codecs_inuse(chip->bus))
azx_init_chip(chip);
snd_hda_resume(chip->bus);
#endif
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
return 0;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册