diff options
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 43 | 
1 files changed, 28 insertions, 15 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index fcb11af9ad2..7a73621a890 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -168,7 +168,7 @@ struct alc_spec {  	unsigned int auto_mic_valid_imux:1;	/* valid imux for auto-mic */  	unsigned int automute:1;	/* HP automute enabled */  	unsigned int detect_line:1;	/* Line-out detection enabled */ -	unsigned int automute_lines:1;	/* automute line-out as well */ +	unsigned int automute_lines:1;	/* automute line-out as well; NOP when automute_hp_lo isn't set */  	unsigned int automute_hp_lo:1;	/* both HP and LO available */  	/* other flags */ @@ -551,7 +551,7 @@ static void update_speakers(struct hda_codec *codec)  	if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0] ||  	    spec->autocfg.line_out_pins[0] == spec->autocfg.speaker_pins[0])  		return; -	if (!spec->automute_lines || !spec->automute) +	if (!spec->automute || (spec->automute_hp_lo && !spec->automute_lines))  		on = 0;  	else  		on = spec->jack_present; @@ -565,11 +565,11 @@ static void alc_hp_automute(struct hda_codec *codec)  {  	struct alc_spec *spec = codec->spec; -	if (!spec->automute) -		return;  	spec->jack_present =  		detect_jacks(codec, ARRAY_SIZE(spec->autocfg.hp_pins),  			     spec->autocfg.hp_pins); +	if (!spec->automute) +		return;  	update_speakers(codec);  } @@ -578,11 +578,15 @@ static void alc_line_automute(struct hda_codec *codec)  {  	struct alc_spec *spec = codec->spec; -	if (!spec->automute || !spec->detect_line) +	/* check LO jack only when it's different from HP */ +	if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0])  		return; +  	spec->line_jack_present =  		detect_jacks(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),  			     spec->autocfg.line_out_pins); +	if (!spec->automute || !spec->detect_line) +		return;  	update_speakers(codec);  } @@ -803,7 +807,7 @@ static int alc_automute_mode_get(struct snd_kcontrol *kcontrol,  	unsigned int val;  	if (!spec->automute)  		val = 0; -	else if (!spec->automute_lines) +	else if (!spec->automute_hp_lo || !spec->automute_lines)  		val = 1;  	else  		val = 2; @@ -824,7 +828,8 @@ static int alc_automute_mode_put(struct snd_kcontrol *kcontrol,  		spec->automute = 0;  		break;  	case 1: -		if (spec->automute && !spec->automute_lines) +		if (spec->automute && +		    (!spec->automute_hp_lo || !spec->automute_lines))  			return 0;  		spec->automute = 1;  		spec->automute_lines = 0; @@ -1320,7 +1325,9 @@ do_sku:  	 * 15   : 1 --> enable the function "Mute internal speaker  	 *	        when the external headphone out jack is plugged"  	 */ -	if (!spec->autocfg.hp_pins[0]) { +	if (!spec->autocfg.hp_pins[0] && +	    !(spec->autocfg.line_out_pins[0] && +	      spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)) {  		hda_nid_t nid;  		tmp = (ass >> 11) & 0x3;	/* HP to chassis */  		if (tmp == 0) @@ -3083,16 +3090,22 @@ static void alc_auto_init_multi_out(struct hda_codec *codec)  static void alc_auto_init_extra_out(struct hda_codec *codec)  {  	struct alc_spec *spec = codec->spec; -	hda_nid_t pin; +	hda_nid_t pin, dac;  	pin = spec->autocfg.hp_pins[0]; -	if (pin) -		alc_auto_set_output_and_unmute(codec, pin, PIN_HP, -						  spec->multiout.hp_nid); +	if (pin) { +		dac = spec->multiout.hp_nid; +		if (!dac) +			dac = spec->multiout.dac_nids[0]; +		alc_auto_set_output_and_unmute(codec, pin, PIN_HP, dac); +	}  	pin = spec->autocfg.speaker_pins[0]; -	if (pin) -		alc_auto_set_output_and_unmute(codec, pin, PIN_OUT, -					spec->multiout.extra_out_nid[0]); +	if (pin) { +		dac = spec->multiout.extra_out_nid[0]; +		if (!dac) +			dac = spec->multiout.dac_nids[0]; +		alc_auto_set_output_and_unmute(codec, pin, PIN_OUT, dac); +	}  }  /*  |