mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-13 09:20:17 +00:00
[ALSA] hda-codec - Check PINCAP only for PIN widgets
The recent addition of checking PINCAP for EAPD seems to break some systems due to unexpected response from the codec chip. We shouldn't issue GET_PINCAP verb to non-PIN widgets. Now checks the widget type before checking EAPD bit. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
60fac85fff
commit
7eba5c9dc3
@ -1625,19 +1625,26 @@ static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg,
|
|||||||
|
|
||||||
nid = codec->start_nid;
|
nid = codec->start_nid;
|
||||||
for (i = 0; i < codec->num_nodes; i++, nid++) {
|
for (i = 0; i < codec->num_nodes; i++, nid++) {
|
||||||
if (get_wcaps(codec, nid) & AC_WCAP_POWER) {
|
unsigned int wcaps = get_wcaps(codec, nid);
|
||||||
unsigned int pincap;
|
if (wcaps & AC_WCAP_POWER) {
|
||||||
/*
|
unsigned int wid_type = (wcaps & AC_WCAP_TYPE) >>
|
||||||
* don't power down the widget if it controls eapd
|
AC_WCAP_TYPE_SHIFT;
|
||||||
* and EAPD_BTLENABLE is set.
|
if (wid_type == AC_WID_PIN) {
|
||||||
*/
|
unsigned int pincap;
|
||||||
pincap = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP);
|
/*
|
||||||
if (pincap & AC_PINCAP_EAPD) {
|
* don't power down the widget if it controls
|
||||||
int eapd = snd_hda_codec_read(codec, nid,
|
* eapd and EAPD_BTLENABLE is set.
|
||||||
0, AC_VERB_GET_EAPD_BTLENABLE, 0);
|
*/
|
||||||
eapd &= 0x02;
|
pincap = snd_hda_param_read(codec, nid,
|
||||||
if (power_state == AC_PWRST_D3 && eapd)
|
AC_PAR_PIN_CAP);
|
||||||
continue;
|
if (pincap & AC_PINCAP_EAPD) {
|
||||||
|
int eapd = snd_hda_codec_read(codec,
|
||||||
|
nid, 0,
|
||||||
|
AC_VERB_GET_EAPD_BTLENABLE, 0);
|
||||||
|
eapd &= 0x02;
|
||||||
|
if (power_state == AC_PWRST_D3 && eapd)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
snd_hda_codec_write(codec, nid, 0,
|
snd_hda_codec_write(codec, nid, 0,
|
||||||
AC_VERB_SET_POWER_STATE,
|
AC_VERB_SET_POWER_STATE,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user