[alsa-devel] [PATCH] ALSA: HDA: Realtek: Take vmaster dac from multiout dac list

Takashi Iwai tiwai at suse.de
Mon Dec 12 10:48:10 CET 2011


At Mon, 12 Dec 2011 13:37:41 +0800,
David Henningsson wrote:
> 
> With the auto-parser we can choose the dac nid for vmaster from
> the DACs we already know, instead of hard-coding it. This is more
> future-proof and was actually wrong on one machine.
> 
> Reported-by: David Chen <david.chen at canonical.com>
> Signed-off-by: David Henningsson <david.henningsson at canonical.com>

Unfortunately this doesn't work correctly for some codecs.
Codecs like ALC262 have no volume in DAC (e.g. 0x02) but only in mixer
(e.g. 0x0c).

In future, we should build up the I/O paths like in patch_via.c,
so that such info can be checked more easily.


thanks,

Takashi

> ---
>  sound/pci/hda/patch_realtek.c |   32 ++++++++++----------------------
>  1 files changed, 10 insertions(+), 22 deletions(-)
> 
> diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
> index 8a74c1e..31dd675 100644
> --- a/sound/pci/hda/patch_realtek.c
> +++ b/sound/pci/hda/patch_realtek.c
> @@ -3153,6 +3153,7 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec)
>  		}
>  	}
>  
> +	spec->vmaster_nid = spec->multiout.dac_nids[0];
>  	return 0;
>  }
>  
> @@ -4175,8 +4176,10 @@ static int patch_alc880(struct hda_codec *codec)
>  #endif
>  	}
>  
> -	if (board_config != ALC_MODEL_AUTO)
> +	if (board_config != ALC_MODEL_AUTO) {
> +		spec->vmaster_nid = 0x0c;
>  		setup_preset(codec, &alc880_presets[board_config]);
> +	}
>  
>  	if (!spec->no_analog && !spec->adc_nids) {
>  		alc_auto_fill_adc_caps(codec);
> @@ -4196,8 +4199,6 @@ static int patch_alc880(struct hda_codec *codec)
>  
>  	alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
>  
> -	spec->vmaster_nid = 0x0c;
> -
>  	codec->patch_ops = alc_patch_ops;
>  	if (board_config == ALC_MODEL_AUTO)
>  		spec->init_hook = alc_auto_init_std;
> @@ -4304,8 +4305,10 @@ static int patch_alc260(struct hda_codec *codec)
>  #endif
>  	}
>  
> -	if (board_config != ALC_MODEL_AUTO)
> +	if (board_config != ALC_MODEL_AUTO) {
>  		setup_preset(codec, &alc260_presets[board_config]);
> +		spec->vmaster_nid = 0x08;
> +	}
>  
>  	if (!spec->no_analog && !spec->adc_nids) {
>  		alc_auto_fill_adc_caps(codec);
> @@ -4325,8 +4328,6 @@ static int patch_alc260(struct hda_codec *codec)
>  
>  	alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
>  
> -	spec->vmaster_nid = 0x08;
> -
>  	codec->patch_ops = alc_patch_ops;
>  	if (board_config == ALC_MODEL_AUTO)
>  		spec->init_hook = alc_auto_init_std;
> @@ -4698,8 +4699,10 @@ static int patch_alc882(struct hda_codec *codec)
>  			goto error;
>  	}
>  
> -	if (board_config != ALC_MODEL_AUTO)
> +	if (board_config != ALC_MODEL_AUTO) {
>  		setup_preset(codec, &alc882_presets[board_config]);
> +		spec->vmaster_nid = 0x0c;
> +	}
>  
>  	if (!spec->no_analog && !spec->adc_nids) {
>  		alc_auto_fill_adc_caps(codec);
> @@ -4719,8 +4722,6 @@ static int patch_alc882(struct hda_codec *codec)
>  
>  	alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
>  
> -	spec->vmaster_nid = 0x0c;
> -
>  	codec->patch_ops = alc_patch_ops;
>  	if (board_config == ALC_MODEL_AUTO)
>  		spec->init_hook = alc_auto_init_std;
> @@ -4899,8 +4900,6 @@ static int patch_alc262(struct hda_codec *codec)
>  
>  	alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
>  
> -	spec->vmaster_nid = 0x0c;
> -
>  	codec->patch_ops = alc_patch_ops;
>  	spec->init_hook = alc_auto_init_std;
>  	spec->shutup = alc_eapd_shutup;
> @@ -5012,8 +5011,6 @@ static int patch_alc268(struct hda_codec *codec)
>  	if (!spec->no_analog && !spec->cap_mixer)
>  		set_capture_mixer(codec);
>  
> -	spec->vmaster_nid = 0x02;
> -
>  	codec->patch_ops = alc_patch_ops;
>  	spec->init_hook = alc_auto_init_std;
>  	spec->shutup = alc_eapd_shutup;
> @@ -5568,8 +5565,6 @@ static int patch_alc269(struct hda_codec *codec)
>  
>  	alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
>  
> -	spec->vmaster_nid = 0x02;
> -
>  	codec->patch_ops = alc_patch_ops;
>  #ifdef CONFIG_PM
>  	codec->patch_ops.resume = alc269_resume;
> @@ -5674,8 +5669,6 @@ static int patch_alc861(struct hda_codec *codec)
>  		set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
>  	}
>  
> -	spec->vmaster_nid = 0x03;
> -
>  	alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
>  
>  	codec->patch_ops = alc_patch_ops;
> @@ -5800,8 +5793,6 @@ static int patch_alc861vd(struct hda_codec *codec)
>  		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
>  	}
>  
> -	spec->vmaster_nid = 0x02;
> -
>  	alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
>  
>  	codec->patch_ops = alc_patch_ops;
> @@ -6184,7 +6175,6 @@ static int patch_alc662(struct hda_codec *codec)
>  			break;
>  		}
>  	}
> -	spec->vmaster_nid = 0x02;
>  
>  	alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
>  
> @@ -6240,8 +6230,6 @@ static int patch_alc680(struct hda_codec *codec)
>  	if (!spec->no_analog && !spec->cap_mixer)
>  		set_capture_mixer(codec);
>  
> -	spec->vmaster_nid = 0x02;
> -
>  	codec->patch_ops = alc_patch_ops;
>  	spec->init_hook = alc_auto_init_std;
>  
> -- 
> 1.7.5.4
> 


More information about the Alsa-devel mailing list