[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