diff options
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index b5b36b893b1e..e1563f48243f 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -10389,6 +10389,18 @@ static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec, | |||
10389 | alc262_lenovo_3000_automute(codec, 1); | 10389 | alc262_lenovo_3000_automute(codec, 1); |
10390 | } | 10390 | } |
10391 | 10391 | ||
10392 | static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid, | ||
10393 | int dir, int idx, long *valp) | ||
10394 | { | ||
10395 | int i, change = 0; | ||
10396 | |||
10397 | for (i = 0; i < 2; i++, valp++) | ||
10398 | change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx, | ||
10399 | HDA_AMP_MUTE, | ||
10400 | *valp ? 0 : HDA_AMP_MUTE); | ||
10401 | return change; | ||
10402 | } | ||
10403 | |||
10392 | /* bind hp and internal speaker mute (with plug check) */ | 10404 | /* bind hp and internal speaker mute (with plug check) */ |
10393 | static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol, | 10405 | static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol, |
10394 | struct snd_ctl_elem_value *ucontrol) | 10406 | struct snd_ctl_elem_value *ucontrol) |
@@ -10397,13 +10409,8 @@ static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol, | |||
10397 | long *valp = ucontrol->value.integer.value; | 10409 | long *valp = ucontrol->value.integer.value; |
10398 | int change; | 10410 | int change; |
10399 | 10411 | ||
10400 | change = snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | 10412 | change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp); |
10401 | HDA_AMP_MUTE, | 10413 | change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp); |
10402 | valp ? 0 : HDA_AMP_MUTE); | ||
10403 | change |= snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, | ||
10404 | HDA_AMP_MUTE, | ||
10405 | valp ? 0 : HDA_AMP_MUTE); | ||
10406 | |||
10407 | if (change) | 10414 | if (change) |
10408 | alc262_fujitsu_automute(codec, 0); | 10415 | alc262_fujitsu_automute(codec, 0); |
10409 | return change; | 10416 | return change; |
@@ -10438,10 +10445,7 @@ static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol, | |||
10438 | long *valp = ucontrol->value.integer.value; | 10445 | long *valp = ucontrol->value.integer.value; |
10439 | int change; | 10446 | int change; |
10440 | 10447 | ||
10441 | change = snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, | 10448 | change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp); |
10442 | HDA_AMP_MUTE, | ||
10443 | valp ? 0 : HDA_AMP_MUTE); | ||
10444 | |||
10445 | if (change) | 10449 | if (change) |
10446 | alc262_lenovo_3000_automute(codec, 0); | 10450 | alc262_lenovo_3000_automute(codec, 0); |
10447 | return change; | 10451 | return change; |
@@ -11612,12 +11616,7 @@ static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol, | |||
11612 | long *valp = ucontrol->value.integer.value; | 11616 | long *valp = ucontrol->value.integer.value; |
11613 | int change; | 11617 | int change; |
11614 | 11618 | ||
11615 | change = snd_hda_codec_amp_update(codec, 0x14, 0, HDA_OUTPUT, 0, | 11619 | change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp); |
11616 | HDA_AMP_MUTE, | ||
11617 | valp[0] ? 0 : HDA_AMP_MUTE); | ||
11618 | change |= snd_hda_codec_amp_update(codec, 0x14, 1, HDA_OUTPUT, 0, | ||
11619 | HDA_AMP_MUTE, | ||
11620 | valp[1] ? 0 : HDA_AMP_MUTE); | ||
11621 | if (change) | 11620 | if (change) |
11622 | alc268_acer_automute(codec, 0); | 11621 | alc268_acer_automute(codec, 0); |
11623 | return change; | 11622 | return change; |