[alsa-devel] [PATCH ALSA HDA 1/1] Fix alc662_dac_nid and change 6stack-dig to 5stack-dig

Takashi Iwai tiwai at suse.de
Wed Apr 6 15:19:55 CEST 2011


At Wed, 06 Apr 2011 15:07:33 +0200,
Takashi Iwai wrote:
> 
> At Wed, 6 Apr 2011 20:59:58 +0800,
> Raymond Yau wrote:
> > 
> > 2011/4/6 Takashi Iwai <tiwai at suse.de>
> > 
> > > At Wed, 6 Apr 2011 16:29:56 +0800,
> > > Raymond Yau wrote:
> > > >
> > > > 2011/4/6 Takashi Iwai <tiwai at suse.de>
> > > >
> > > > > At Wed, 6 Apr 2011 15:35:16 +0800,
> > > > > Raymond Yau wrote:
> > > > > >
> > > > > > 2011/4/6 Takashi Iwai <tiwai at suse.de>
> > > > > >
> > > > > > > At Tue, 5 Apr 2011 22:59:29 +0800,
> > > > > > > Raymond Yau wrote:
> > > > > > > >
> > > > > > > > Fix alc662_dac_nid and change "6stack-dig" to "5stack-dig"
> > > > > > > >
> > > > > > > > alc662 series only have 3 stereo DAC , so it can only support
> > > > > 5stack-dig
> > > > > > > > instead of 6stack-dig
> > > > > > >
> > > > > > > Applied now.  Thanks.
> > > > > > >
> > > > > > >
> > > > > > > Takashi
> > > > > > >
> > > > > >
> > > > > > The other problem is this patch
> > > > > >
> > > > > >    { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
> > > > > >
> > > > > >
> > > > >
> > > http://git.alsa-project.org/?p=alsa-kernel.git;a=commit;h=274693f37090ada2cadd09944ab883f05ea6ebe6
> > > > > >
> > > > > > ALC892 provides ten DAC channels that simultaneously support 7.1
> > > channel
> > > > > > sound playback, plus 2 channels of independent stereo sound output
> > > > > (multiple
> > > > > > streaming) through the front panel stereo outputs.
> > > > > >
> > > > > > It seem  that there is no specific code to distinguish a 10 channels
> > > > > alc892
> > > > > > from those 6 channels alc6xx
> > > > >
> > > > > Yeah, but there is no quirks specific to alc892.
> > > > >
> > > > > Remember that the final goal is to remove all model-quirks from the
> > > > > driver.
> > > > >
> > > > >
> > > > > Takashi
> > > > >
> > > >
> > > > My patch reduce the size of alc662_dac_nid may be wrong if the driver
> > > intend
> > > > to use  alc662_auto_fill_dac_nids()  to handle 6, 8 , 10 channels
> > >
> > > Don't worry, alc662_dac_nids is used only for the fixed quirks.
> > > The auto-parser doesn't use these fixed defined pin arrays.
> > >
> > >
> > > Takashi
> > >
> > 
> > The bug for 10 channels alc892 is in alc662_mix_to_dac, it should return
> > [Audio Output ]0x5 for [Audiomixer 0x0f] -- side channel if model=auto is
> > used for 6stack
> 
> OK, but it's irrelevant with your patch :)
> I'll fix it later.

The fix patch is below.


Takashi

---
From: Takashi Iwai <tiwai at suse.de>
Subject: [PATCH] ALSA: hda - Fix mix->DAC deduction for ALC892

The current alc662 parser doesn't set the DAC for the mixer 0x0f
properly for ALC892, which has 4 DACs while ALC662 has 3.
Fixed by implementing alc662_mix_to_dac() more genericly with the
dynamic widget list.

Signed-off-by: Takashi Iwai <tiwai at suse.de>
---
 sound/pci/hda/patch_realtek.c |   27 ++++++++++++++-------------
 1 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index e62fe7f..d566eac 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -19105,16 +19105,17 @@ static struct alc_config_preset alc662_presets[] = {
  */
 
 /* convert from MIX nid to DAC */
-static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
-{
-	if (nid == 0x0f)
-		return 0x02;
-	else if (nid >= 0x0c && nid <= 0x0e)
-		return nid - 0x0c + 0x02;
-	else if (nid == 0x26) /* ALC887-VD has this DAC too */
-		return 0x25;
-	else
-		return 0;
+static hda_nid_t alc662_mix_to_dac(struct hda_codec *codec, hda_nid_t nid)
+{
+	hda_nid_t list[4];
+	int i, num;
+
+	num = snd_hda_get_connections(codec, nid, list, ARRAY_SIZE(list));
+	for (i = 0; i < num; i++) {
+		if (get_wcaps_type(get_wcaps(codec, list[i])) == AC_WID_AUD_OUT)
+			return list[i];
+	}
+	return 0;
 }
 
 /* get MIX nid connected to the given pin targeted to DAC */
@@ -19126,7 +19127,7 @@ static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
 
 	num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
 	for (i = 0; i < num; i++) {
-		if (alc662_mix_to_dac(mix[i]) == dac)
+		if (alc662_mix_to_dac(codec, mix[i]) == dac)
 			return mix[i];
 	}
 	return 0;
@@ -19143,7 +19144,7 @@ static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
 	if (num < 0)
 		return 0;
 	for (i = 0; i < num; i++) {
-		hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
+		hda_nid_t nid = alc662_mix_to_dac(codec, srcs[i]);
 		if (!nid)
 			continue;
 		for (j = 0; j < spec->multiout.num_dacs; j++)
@@ -19297,7 +19298,7 @@ static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
 	if (num <= 1)
 		return;
 	for (i = 0; i < num; i++) {
-		if (alc662_mix_to_dac(srcs[i]) != dac)
+		if (alc662_mix_to_dac(codec, srcs[i]) != dac)
 			continue;
 		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
 		return;
-- 
1.7.4.2



More information about the Alsa-devel mailing list