summaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/hda_generic.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2015-04-09 10:21:30 +0200
committerTakashi Iwai <tiwai@suse.de>2015-04-09 10:33:44 +0200
commitd5ac0100a9027bdf488cf20247b1041f26f796f3 (patch)
tree0ff84a125b7a94f929824cd3dca9873e1c3271d8 /sound/pci/hda/hda_generic.c
parentALSA: hda/generic - Check power state cap at updating the widget power (diff)
downloadlinux-d5ac0100a9027bdf488cf20247b1041f26f796f3.tar.xz
linux-d5ac0100a9027bdf488cf20247b1041f26f796f3.zip
ALSA: hda/generic - Fix wrong initial power state for fixed pins
When the widget power-saving is enabled, the first automute hook invocation checks through the whole pins and it also tries to synchronize the power state. However, this results in a wrong state because it calls unconditionally snd_hda_jack_detect_state(). This patch adds a check of jack detectability before the actual jack detection call. Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/hda/hda_generic.c')
-rw-r--r--sound/pci/hda/hda_generic.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c
index afc6b1b0898c..46b559832d2c 100644
--- a/sound/pci/hda/hda_generic.c
+++ b/sound/pci/hda/hda_generic.c
@@ -3959,6 +3959,14 @@ static hda_nid_t set_path_power(struct hda_codec *codec, hda_nid_t nid,
return changed;
}
+/* check the jack status for power control */
+static bool detect_pin_state(struct hda_codec *codec, hda_nid_t pin)
+{
+ if (!is_jack_detectable(codec, pin))
+ return true;
+ return snd_hda_jack_detect_state(codec, pin) != HDA_JACK_NOT_PRESENT;
+}
+
/* power up/down the paths of the given pin according to the jack state;
* power = 0/1 : only power up/down if it matches with the jack state,
* < 0 : force power up/down to follow the jack sate
@@ -3973,7 +3981,8 @@ static hda_nid_t set_pin_power_jack(struct hda_codec *codec, hda_nid_t pin,
if (!codec->power_save_node)
return 0;
- on = snd_hda_jack_detect_state(codec, pin) != HDA_JACK_NOT_PRESENT;
+ on = detect_pin_state(codec, pin);
+
if (power >= 0 && on != power)
return 0;
return set_path_power(codec, pin, on, -1);
@@ -4225,8 +4234,7 @@ static void do_automute(struct hda_codec *codec, int num_pins, hda_nid_t *pins,
if (codec->power_save_node) {
bool on = !mute;
if (on)
- on = snd_hda_jack_detect_state(codec, nid)
- != HDA_JACK_NOT_PRESENT;
+ on = detect_pin_state(codec, nid);
set_path_power(codec, nid, on, -1);
}
}