diff options
| author | Takashi Iwai <tiwai@suse.de> | 2010-04-14 16:39:21 +0400 | 
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2010-04-14 16:39:21 +0400 | 
| commit | b265faed8c3ddac2aec8fffdbb3c2a40803e2bcc (patch) | |
| tree | f8acfc2fd4a0042267e1f69c13254a458698677d | |
| parent | 60508abe9b3d812affb2d70a35cd151fee766737 (diff) | |
| parent | 3d83e577a8206f0f3822a3840e12f76477142ba2 (diff) | |
| download | linux-b265faed8c3ddac2aec8fffdbb3c2a40803e2bcc.tar.xz | |
Merge branch 'fix/hda' into topic/hda
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 64 | ||||
| -rw-r--r-- | sound/pci/hda/patch_via.c | 41 | 
2 files changed, 80 insertions, 25 deletions
| diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 98cc465992f2..ba95039e8ca3 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -1459,22 +1459,31 @@ struct alc_fixup {  static void alc_pick_fixup(struct hda_codec *codec,  			   const struct snd_pci_quirk *quirk, -			   const struct alc_fixup *fix) +			   const struct alc_fixup *fix, +			   int pre_init)  {  	const struct alc_pincfg *cfg;  	quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);  	if (!quirk)  		return; -  	fix += quirk->value;  	cfg = fix->pins; -	if (cfg) { +	if (pre_init && cfg) { +#ifdef CONFIG_SND_DEBUG_VERBOSE +		snd_printdd(KERN_INFO "hda_codec: %s: Apply pincfg for %s\n", +			    codec->chip_name, quirk->name); +#endif  		for (; cfg->nid; cfg++)  			snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);  	} -	if (fix->verbs) +	if (!pre_init && fix->verbs) { +#ifdef CONFIG_SND_DEBUG_VERBOSE +		snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-verbs for %s\n", +			    codec->chip_name, quirk->name); +#endif  		add_verb(codec->spec, fix->verbs); +	}  }  static int alc_read_coef_idx(struct hda_codec *codec, @@ -10535,7 +10544,8 @@ static int patch_alc882(struct hda_codec *codec)  		board_config = ALC882_AUTO;  	} -	alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups); +	if (board_config == ALC882_AUTO) +		alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 1);  	if (board_config == ALC882_AUTO) {  		/* automatic parse from the BIOS config */ @@ -10610,6 +10620,9 @@ static int patch_alc882(struct hda_codec *codec)  	if (spec->cdefine.enable_pcbeep)  		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); +	if (board_config == ALC882_AUTO) +		alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 0); +  	spec->vmaster_nid = 0x0c;  	codec->patch_ops = alc_patch_ops; @@ -14192,6 +14205,27 @@ static void alc269_auto_init(struct hda_codec *codec)  		alc_inithook(codec);  } +enum { +	ALC269_FIXUP_SONY_VAIO, +}; + +const static struct hda_verb alc269_sony_vaio_fixup_verbs[] = { +	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD}, +	{} +}; + +static const struct alc_fixup alc269_fixups[] = { +	[ALC269_FIXUP_SONY_VAIO] = { +		.verbs = alc269_sony_vaio_fixup_verbs +	}, +}; + +static struct snd_pci_quirk alc269_fixup_tbl[] = { +	SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), +	{} +}; + +  /*   * configuration and preset   */ @@ -14251,7 +14285,7 @@ static struct snd_pci_quirk alc269_cfg_tbl[] = {  		      ALC269_DMIC),  	SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC),  	SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC), -	SND_PCI_QUIRK(0x104d, 0x9071, "SONY XTB", ALC269_DMIC), +	SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO),  	SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),  	SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),  	SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU), @@ -14405,6 +14439,9 @@ static int patch_alc269(struct hda_codec *codec)  		board_config = ALC269_AUTO;  	} +	if (board_config == ALC269_AUTO) +		alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 1); +  	if (board_config == ALC269_AUTO) {  		/* automatic parse from the BIOS config */  		err = alc269_parse_auto_config(codec); @@ -14458,6 +14495,9 @@ static int patch_alc269(struct hda_codec *codec)  	if (spec->cdefine.enable_pcbeep)  		set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); +	if (board_config == ALC269_AUTO) +		alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 0); +  	spec->vmaster_nid = 0x02;  	codec->patch_ops = alc_patch_ops; @@ -15548,7 +15588,8 @@ static int patch_alc861(struct hda_codec *codec)  		board_config = ALC861_AUTO;  	} -	alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups); +	if (board_config == ALC861_AUTO) +		alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 1);  	if (board_config == ALC861_AUTO) {  		/* automatic parse from the BIOS config */ @@ -15585,6 +15626,9 @@ static int patch_alc861(struct hda_codec *codec)  	spec->vmaster_nid = 0x03; +	if (board_config == ALC861_AUTO) +		alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 0); +  	codec->patch_ops = alc_patch_ops;  	if (board_config == ALC861_AUTO) {  		spec->init_hook = alc861_auto_init; @@ -16519,7 +16563,8 @@ static int patch_alc861vd(struct hda_codec *codec)  		board_config = ALC861VD_AUTO;  	} -	alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups); +	if (board_config == ALC861VD_AUTO) +		alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 1);  	if (board_config == ALC861VD_AUTO) {  		/* automatic parse from the BIOS config */ @@ -16567,6 +16612,9 @@ static int patch_alc861vd(struct hda_codec *codec)  	spec->vmaster_nid = 0x02; +	if (board_config == ALC861VD_AUTO) +		alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 0); +  	codec->patch_ops = alc_patch_ops;  	if (board_config == ALC861VD_AUTO) diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 9ddc37300f6b..73453814e098 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c @@ -476,7 +476,7 @@ static struct snd_kcontrol_new *via_clone_control(struct via_spec *spec,  	knew->name = kstrdup(tmpl->name, GFP_KERNEL);  	if (!knew->name)  		return NULL; -	return 0; +	return knew;  }  static void via_free_kctls(struct hda_codec *codec) @@ -1215,14 +1215,13 @@ static struct snd_kcontrol_new via_hp_mixer[2] = {  	},  }; -static int via_hp_build(struct via_spec *spec) +static int via_hp_build(struct hda_codec *codec)  { +	struct via_spec *spec = codec->spec;  	struct snd_kcontrol_new *knew;  	hda_nid_t nid; - -	knew = via_clone_control(spec, &via_hp_mixer[0]); -	if (knew == NULL) -		return -ENOMEM; +	int nums; +	hda_nid_t conn[HDA_MAX_CONNECTIONS];  	switch (spec->codec_type) {  	case VT1718S: @@ -1239,6 +1238,14 @@ static int via_hp_build(struct via_spec *spec)  		break;  	} +	nums = snd_hda_get_connections(codec, nid, conn, HDA_MAX_CONNECTIONS); +	if (nums <= 1) +		return 0; + +	knew = via_clone_control(spec, &via_hp_mixer[0]); +	if (knew == NULL) +		return -ENOMEM; +  	knew->subdevice = HDA_SUBDEV_NID_FLAG | nid;  	knew->private_value = nid; @@ -2561,7 +2568,7 @@ static int vt1708_parse_auto_config(struct hda_codec *codec)  	spec->input_mux = &spec->private_imux[0];  	if (spec->hp_mux) -		via_hp_build(spec); +		via_hp_build(codec);  	via_smart51_build(spec);  	return 1; @@ -3087,7 +3094,7 @@ static int vt1709_parse_auto_config(struct hda_codec *codec)  	spec->input_mux = &spec->private_imux[0];  	if (spec->hp_mux) -		via_hp_build(spec); +		via_hp_build(codec);  	via_smart51_build(spec);  	return 1; @@ -3654,7 +3661,7 @@ static int vt1708B_parse_auto_config(struct hda_codec *codec)  	spec->input_mux = &spec->private_imux[0];  	if (spec->hp_mux) -		via_hp_build(spec); +		via_hp_build(codec);  	via_smart51_build(spec);  	return 1; @@ -4140,7 +4147,7 @@ static int vt1708S_parse_auto_config(struct hda_codec *codec)  	spec->input_mux = &spec->private_imux[0];  	if (spec->hp_mux) -		via_hp_build(spec); +		via_hp_build(codec);  	via_smart51_build(spec);  	return 1; @@ -4510,7 +4517,7 @@ static int vt1702_parse_auto_config(struct hda_codec *codec)  	spec->input_mux = &spec->private_imux[0];  	if (spec->hp_mux) -		via_hp_build(spec); +		via_hp_build(codec);  	return 1;  } @@ -4930,7 +4937,7 @@ static int vt1718S_parse_auto_config(struct hda_codec *codec)  	spec->input_mux = &spec->private_imux[0];  	if (spec->hp_mux) -		via_hp_build(spec); +		via_hp_build(codec);  	via_smart51_build(spec); @@ -5425,7 +5432,7 @@ static int vt1716S_parse_auto_config(struct hda_codec *codec)  	spec->input_mux = &spec->private_imux[0];  	if (spec->hp_mux) -		via_hp_build(spec); +		via_hp_build(codec);  	via_smart51_build(spec); @@ -5781,7 +5788,7 @@ static int vt2002P_parse_auto_config(struct hda_codec *codec)  	spec->input_mux = &spec->private_imux[0];  	if (spec->hp_mux) -		via_hp_build(spec); +		via_hp_build(codec);  	return 1;  } @@ -6000,12 +6007,12 @@ static int vt1812_auto_create_multi_out_ctls(struct via_spec *spec,  	/* Line-Out: PortE */  	err = via_add_control(spec, VIA_CTL_WIDGET_VOL, -			      "Master Front Playback Volume", +			      "Front Playback Volume",  			      HDA_COMPOSE_AMP_VAL(0x8, 3, 0, HDA_OUTPUT));  	if (err < 0)  		return err;  	err = via_add_control(spec, VIA_CTL_WIDGET_BIND_PIN_MUTE, -			      "Master Front Playback Switch", +			      "Front Playback Switch",  			      HDA_COMPOSE_AMP_VAL(0x28, 3, 0, HDA_OUTPUT));  	if (err < 0)  		return err; @@ -6130,7 +6137,7 @@ static int vt1812_parse_auto_config(struct hda_codec *codec)  	spec->input_mux = &spec->private_imux[0];  	if (spec->hp_mux) -		via_hp_build(spec); +		via_hp_build(codec);  	return 1;  } | 
