diff options
| -rw-r--r-- | Documentation/sound/alsa/HD-Audio.txt | 2 | ||||
| -rw-r--r-- | sound/pci/hda/hda_generic.c | 14 | ||||
| -rw-r--r-- | sound/pci/hda/hda_generic.h | 1 | ||||
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 4 | 
4 files changed, 16 insertions, 5 deletions
diff --git a/Documentation/sound/alsa/HD-Audio.txt b/Documentation/sound/alsa/HD-Audio.txt index c3c912d023cc..42a0a39b77e6 100644 --- a/Documentation/sound/alsa/HD-Audio.txt +++ b/Documentation/sound/alsa/HD-Audio.txt @@ -454,6 +454,8 @@ The generic parser supports the following hints:  - need_dac_fix (bool): limits the DACs depending on the channel count  - primary_hp (bool): probe headphone jacks as the primary outputs;    default true +- multi_io (bool): try probing multi-I/O config (e.g. shared +  line-in/surround, mic/clfe jacks)  - multi_cap_vol (bool): provide multiple capture volumes  - inv_dmic_split (bool): provide split internal mic volume/switch for    phase-inverted digital mics diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index f5c2d1ff1a09..f6c0344258ac 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c @@ -142,6 +142,9 @@ static void parse_user_hints(struct hda_codec *codec)  	val = snd_hda_get_bool_hint(codec, "primary_hp");  	if (val >= 0)  		spec->no_primary_hp = !val; +	val = snd_hda_get_bool_hint(codec, "multi_io"); +	if (val >= 0) +		spec->no_multi_io = !val;  	val = snd_hda_get_bool_hint(codec, "multi_cap_vol");  	if (val >= 0)  		spec->multi_cap_vol = !!val; @@ -1541,7 +1544,8 @@ static int fill_and_eval_dacs(struct hda_codec *codec,  					      cfg->speaker_pins,  					      spec->multiout.extra_out_nid,  					      spec->speaker_paths); -			if (fill_mio_first && cfg->line_outs == 1 && +			if (!spec->no_multi_io && +			    fill_mio_first && cfg->line_outs == 1 &&  			    cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {  				err = fill_multi_ios(codec, cfg->line_out_pins[0], true);  				if (!err) @@ -1554,7 +1558,7 @@ static int fill_and_eval_dacs(struct hda_codec *codec,  				   spec->private_dac_nids, spec->out_paths,  				   spec->main_out_badness); -	if (fill_mio_first && +	if (!spec->no_multi_io && fill_mio_first &&  	    cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {  		/* try to fill multi-io first */  		err = fill_multi_ios(codec, cfg->line_out_pins[0], false); @@ -1582,7 +1586,8 @@ static int fill_and_eval_dacs(struct hda_codec *codec,  			return err;  		badness += err;  	} -	if (cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { +	if (!spec->no_multi_io && +	    cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {  		err = fill_multi_ios(codec, cfg->line_out_pins[0], false);  		if (err < 0)  			return err; @@ -1600,7 +1605,8 @@ static int fill_and_eval_dacs(struct hda_codec *codec,  				check_aamix_out_path(codec, spec->speaker_paths[0]);  	} -	if (cfg->hp_outs && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) +	if (!spec->no_multi_io && +	    cfg->hp_outs && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)  		if (count_multiio_pins(codec, cfg->hp_pins[0]) >= 2)  			spec->multi_ios = 1; /* give badness */ diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h index e199a852388b..48d44026705b 100644 --- a/sound/pci/hda/hda_generic.h +++ b/sound/pci/hda/hda_generic.h @@ -220,6 +220,7 @@ struct hda_gen_spec {  	unsigned int hp_mic:1; /* Allow HP as a mic-in */  	unsigned int suppress_hp_mic_detect:1; /* Don't detect HP/mic */  	unsigned int no_primary_hp:1; /* Don't prefer HP pins to speaker pins */ +	unsigned int no_multi_io:1; /* Don't try multi I/O config */  	unsigned int multi_cap_vol:1; /* allow multiple capture xxx volumes */  	unsigned int inv_dmic_split:1; /* inverted dmic w/a for conexant */  	unsigned int own_eapd_ctl:1; /* set EAPD by own function */ diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 04a69e3fca47..ad7a0985edfe 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -1845,8 +1845,10 @@ static void alc882_fixup_no_primary_hp(struct hda_codec *codec,  				       const struct hda_fixup *fix, int action)  {  	struct alc_spec *spec = codec->spec; -	if (action == HDA_FIXUP_ACT_PRE_PROBE) +	if (action == HDA_FIXUP_ACT_PRE_PROBE) {  		spec->gen.no_primary_hp = 1; +		spec->gen.no_multi_io = 1; +	}  }  static const struct hda_fixup alc882_fixups[] = {  | 
