From mboxrd@z Thu Jan 1 00:00:00 1970 From: Takashi Iwai Subject: Re: [PATCH ALSA HDA 1/1] Fix alc662_dac_nid and change 6stack-dig to 5stack-dig Date: Wed, 06 Apr 2011 15:19:55 +0200 Message-ID: References: Mime-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by alsa0.perex.cz (Postfix) with ESMTP id 54E00103800 for ; Wed, 6 Apr 2011 15:20:00 +0200 (CEST) In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: alsa-devel-bounces@alsa-project.org Errors-To: alsa-devel-bounces@alsa-project.org To: Raymond Yau Cc: ALSA Development Mailing List List-Id: alsa-devel@alsa-project.org 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 > > > > > At Wed, 6 Apr 2011 16:29:56 +0800, > > > Raymond Yau wrote: > > > > > > > > 2011/4/6 Takashi Iwai > > > > > > > > > At Wed, 6 Apr 2011 15:35:16 +0800, > > > > > Raymond Yau wrote: > > > > > > > > > > > > 2011/4/6 Takashi Iwai > > > > > > > > > > > > > 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 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 --- 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