ALSA: HDA: Virtual master gets wrong dB values on some Realtek codecs

Bug #974090 reported by David Henningsson
16
This bug affects 2 people
Affects Status Importance Assigned to Milestone
linux (Ubuntu)
Fix Released
Medium
David Henningsson

Bug Description

Please do not triage this bug, it's being used for tracking purposes.

What's happening here is that the wrong node is being used as a template when the vmaster ("Master" alsa mixer control) is created. This patch makes the parser use the mixer nid that the auto-parser has detected instead.

Changed in linux (Ubuntu):
assignee: nobody → David Henningsson (diwic)
status: New → In Progress
Revision history for this message
David Henningsson (diwic) wrote : [12.04, PATCH] ALSA: HDA: Realtek: Take vmaster dac from multiout dac list
Download full text (5.7 KiB)

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.

Signed-off-by: David Henningsson <email address hidden>
Signed-off-by: Takashi Iwai <email address hidden>
(backported from commit fde48a1f808e2bb6aaad5709d2470d814a157c86
Conflicts:
 sound/pci/hda/patch_realtek.c)

BugLink: https://bugs.launchpad.net/bugs/974090
---

After a quick chat with apw, I hope this patch can be committed. Feel free to
grab me on IRC if you have more questions - I know I'm late, sorry for that.
I wrote the patch a while back, but it did not make it into 3.2 (it is
in 3.3).

It fixes a volume slider problem for a machine we want to certify.
It has been tested on the actual hardware, and I've done a regression test
on one Realtek machine I have here.
Should you wish to do more regression tests, there is a ready-made DKMS package
here:
http://people.canonical.com/~diwic/temp/alsa-hda-dkms-vmaster-realtek_0.1_all.deb

 sound/pci/hda/patch_realtek.c | 42 ++++++++++++++++++----------------------
 1 files changed, 19 insertions(+), 23 deletions(-)

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 13fa5f2..91e767a 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -2937,6 +2937,8 @@ static int alc_auto_fill_extra_dacs(struct hda_codec *codec, int num_outs,

 static int alc_auto_fill_multi_ios(struct hda_codec *codec,
        unsigned int location);
+static hda_nid_t alc_look_for_out_vol_nid(struct hda_codec *codec,
+ hda_nid_t pin, hda_nid_t dac);

 /* fill in the dac_nids table from the parsed pin configuration */
 static int alc_auto_fill_dac_nids(struct hda_codec *codec)
@@ -3037,6 +3039,11 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec)
   }
  }

+ if (cfg->line_out_pins[0])
+ spec->vmaster_nid =
+ alc_look_for_out_vol_nid(codec, cfg->line_out_pins[0],
+ spec->multiout.dac_nids[0]);
+
  return 0;
 }

@@ -4000,8 +4007,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);
@@ -4019,8 +4028,6 @@ static int patch_alc880(struct hda_codec *codec)
   set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
  }

- spec->vmaster_nid = 0x0c;
-
  codec->patch_ops = alc_patch_ops;
  if (board_config == ALC_MODEL_AUTO)
   spec->init_hook = alc_auto_init_std;
@@ -4129,8 +4136,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);
@@ -4150,8 +4159,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)
   ...

Read more...

summary: - ALSA: HDA: some fixed vmaster nodes for realtek are wrong
+ ALSA: HDA: Virtual master gets wrong dB
description: updated
summary: - ALSA: HDA: Virtual master gets wrong dB
+ ALSA: HDA: Virtual master gets wrong dB values on some Realtek codecs
Changed in linux (Ubuntu):
importance: Undecided → Medium
Revision history for this message
Leann Ogasawara (leannogasawara) wrote : Ack:[12.04, PATCH] ALSA: HDA: Realtek: Take vmaster dac from multiout dac list
Download full text (6.3 KiB)

On Thu, 2012-04-05 at 13:56 +0200, 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.
>
> Signed-off-by: David Henningsson <email address hidden>
> Signed-off-by: Takashi Iwai <email address hidden>
> (backported from commit fde48a1f808e2bb6aaad5709d2470d814a157c86
> Conflicts:
> sound/pci/hda/patch_realtek.c)
>
> BugLink: https://bugs.launchpad.net/bugs/974090

Patch is upstream and tested.

Acked-by: Leann Ogasawara <email address hidden>

> ---
>
> After a quick chat with apw, I hope this patch can be committed. Feel free to
> grab me on IRC if you have more questions - I know I'm late, sorry for that.
> I wrote the patch a while back, but it did not make it into 3.2 (it is
> in 3.3).
>
> It fixes a volume slider problem for a machine we want to certify.
> It has been tested on the actual hardware, and I've done a regression test
> on one Realtek machine I have here.
> Should you wish to do more regression tests, there is a ready-made DKMS package
> here:
> http://people.canonical.com/~diwic/temp/alsa-hda-dkms-vmaster-realtek_0.1_all.deb
>
> sound/pci/hda/patch_realtek.c | 42 ++++++++++++++++++----------------------
> 1 files changed, 19 insertions(+), 23 deletions(-)
>
> diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
> index 13fa5f2..91e767a 100644
> --- a/sound/pci/hda/patch_realtek.c
> +++ b/sound/pci/hda/patch_realtek.c
> @@ -2937,6 +2937,8 @@ static int alc_auto_fill_extra_dacs(struct hda_codec *codec, int num_outs,
>
> static int alc_auto_fill_multi_ios(struct hda_codec *codec,
> unsigned int location);
> +static hda_nid_t alc_look_for_out_vol_nid(struct hda_codec *codec,
> + hda_nid_t pin, hda_nid_t dac);
>
> /* fill in the dac_nids table from the parsed pin configuration */
> static int alc_auto_fill_dac_nids(struct hda_codec *codec)
> @@ -3037,6 +3039,11 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec)
> }
> }
>
> + if (cfg->line_out_pins[0])
> + spec->vmaster_nid =
> + alc_look_for_out_vol_nid(codec, cfg->line_out_pins[0],
> + spec->multiout.dac_nids[0]);
> +
> return 0;
> }
>
> @@ -4000,8 +4007,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);
> @@ -4019,8 +4028,6 @@ static int patch_alc880(struct hda_codec *codec)
> set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
> }
>
> - spec->vmaster_nid = 0x0c;
> -
> codec->patch_ops = alc_patch_ops;
> if (board_config == ALC_MODEL_AUTO)
> spec->init_hook = alc_auto_init_std;
> @@ -4129,8 +4136,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;...

Read more...

Revision history for this message
Seth Forshee (sforshee) wrote : Ack: [12.04, PATCH] ALSA: HDA: Realtek: Take vmaster dac from multiout dac list
Download full text (6.3 KiB)

On Thu, Apr 05, 2012 at 01:56:28PM +0200, 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.
>
> Signed-off-by: David Henningsson <email address hidden>
> Signed-off-by: Takashi Iwai <email address hidden>
> (backported from commit fde48a1f808e2bb6aaad5709d2470d814a157c86
> Conflicts:
> sound/pci/hda/patch_realtek.c)
>
> BugLink: https://bugs.launchpad.net/bugs/974090
> ---
>
> After a quick chat with apw, I hope this patch can be committed. Feel free to
> grab me on IRC if you have more questions - I know I'm late, sorry for that.
> I wrote the patch a while back, but it did not make it into 3.2 (it is
> in 3.3).
>
> It fixes a volume slider problem for a machine we want to certify.
> It has been tested on the actual hardware, and I've done a regression test
> on one Realtek machine I have here.
> Should you wish to do more regression tests, there is a ready-made DKMS package
> here:
> http://people.canonical.com/~diwic/temp/alsa-hda-dkms-vmaster-realtek_0.1_all.deb
>
> sound/pci/hda/patch_realtek.c | 42 ++++++++++++++++++----------------------
> 1 files changed, 19 insertions(+), 23 deletions(-)
>
> diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
> index 13fa5f2..91e767a 100644
> --- a/sound/pci/hda/patch_realtek.c
> +++ b/sound/pci/hda/patch_realtek.c
> @@ -2937,6 +2937,8 @@ static int alc_auto_fill_extra_dacs(struct hda_codec *codec, int num_outs,
>
> static int alc_auto_fill_multi_ios(struct hda_codec *codec,
> unsigned int location);
> +static hda_nid_t alc_look_for_out_vol_nid(struct hda_codec *codec,
> + hda_nid_t pin, hda_nid_t dac);
>
> /* fill in the dac_nids table from the parsed pin configuration */
> static int alc_auto_fill_dac_nids(struct hda_codec *codec)
> @@ -3037,6 +3039,11 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec)
> }
> }
>
> + if (cfg->line_out_pins[0])
> + spec->vmaster_nid =
> + alc_look_for_out_vol_nid(codec, cfg->line_out_pins[0],
> + spec->multiout.dac_nids[0]);
> +
> return 0;
> }
>
> @@ -4000,8 +4007,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);
> @@ -4019,8 +4028,6 @@ static int patch_alc880(struct hda_codec *codec)
> set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
> }
>
> - spec->vmaster_nid = 0x0c;
> -
> codec->patch_ops = alc_patch_ops;
> if (board_config == ALC_MODEL_AUTO)
> spec->init_hook = alc_auto_init_std;
> @@ -4129,8 +4136,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_cap...

Read more...

Revision history for this message
Leann Ogasawara (leannogasawara) wrote : Applied: [12.04, PATCH] ALSA: HDA: Realtek: Take vmaster dac from multiout dac list
Download full text (6.2 KiB)

Applied to Precise master-next.

Thanks,
Leann

On Thu, 2012-04-05 at 13:56 +0200, 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.
>
> Signed-off-by: David Henningsson <email address hidden>
> Signed-off-by: Takashi Iwai <email address hidden>
> (backported from commit fde48a1f808e2bb6aaad5709d2470d814a157c86
> Conflicts:
> sound/pci/hda/patch_realtek.c)
>
> BugLink: https://bugs.launchpad.net/bugs/974090
> ---
>
> After a quick chat with apw, I hope this patch can be committed. Feel free to
> grab me on IRC if you have more questions - I know I'm late, sorry for that.
> I wrote the patch a while back, but it did not make it into 3.2 (it is
> in 3.3).
>
> It fixes a volume slider problem for a machine we want to certify.
> It has been tested on the actual hardware, and I've done a regression test
> on one Realtek machine I have here.
> Should you wish to do more regression tests, there is a ready-made DKMS package
> here:
> http://people.canonical.com/~diwic/temp/alsa-hda-dkms-vmaster-realtek_0.1_all.deb
>
> sound/pci/hda/patch_realtek.c | 42 ++++++++++++++++++----------------------
> 1 files changed, 19 insertions(+), 23 deletions(-)
>
> diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
> index 13fa5f2..91e767a 100644
> --- a/sound/pci/hda/patch_realtek.c
> +++ b/sound/pci/hda/patch_realtek.c
> @@ -2937,6 +2937,8 @@ static int alc_auto_fill_extra_dacs(struct hda_codec *codec, int num_outs,
>
> static int alc_auto_fill_multi_ios(struct hda_codec *codec,
> unsigned int location);
> +static hda_nid_t alc_look_for_out_vol_nid(struct hda_codec *codec,
> + hda_nid_t pin, hda_nid_t dac);
>
> /* fill in the dac_nids table from the parsed pin configuration */
> static int alc_auto_fill_dac_nids(struct hda_codec *codec)
> @@ -3037,6 +3039,11 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec)
> }
> }
>
> + if (cfg->line_out_pins[0])
> + spec->vmaster_nid =
> + alc_look_for_out_vol_nid(codec, cfg->line_out_pins[0],
> + spec->multiout.dac_nids[0]);
> +
> return 0;
> }
>
> @@ -4000,8 +4007,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);
> @@ -4019,8 +4028,6 @@ static int patch_alc880(struct hda_codec *codec)
> set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
> }
>
> - spec->vmaster_nid = 0x0c;
> -
> codec->patch_ops = alc_patch_ops;
> if (board_config == ALC_MODEL_AUTO)
> spec->init_hook = alc_auto_init_std;
> @@ -4129,8 +4136,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 && !spe...

Read more...

Changed in linux (Ubuntu):
status: In Progress → Fix Committed
Revision history for this message
Launchpad Janitor (janitor) wrote :

This bug was fixed in the package linux - 3.2.0-23.36

---------------
linux (3.2.0-23.36) precise-proposed; urgency=low

  [ Andy Whitcroft ]

  * tools/hv: add basic Makefile
    - LP: #977246
  * tools/hv: add basic manual pages
    - LP: #977246
  * Hyper-V KVP daemon -- add to the tools package
    - LP: #977246

  [ David Henningsson ]

  * SAUCE: (drop after 3.3) ALSA: HDA: Remove quirk for Gigabyte
    GA-H61M-S2PV
    - LP: #948360

  [ Leann Ogasawara ]

  * d-i: Add dm-mirror and dm-raid to md-modules
    - LP: #919281

  [ Tim Gardner ]

  * [Config] Fix invalid linux-headers link
    - LP: #974403
  * Remove headers asm symlink entirely
    - LP: #974403

  [ Upstream Kernel Changes ]

  * Revert "x86/ioapic: Add register level checks to detect bogus io-apic
    entries"
    - LP: #974982
  * ALSA: HDA: Realtek: Take vmaster dac from multiout dac list
    - LP: #974090
  * kexec: remove KMSG_DUMP_KEXEC
    - LP: #944772
  * kmsg_dump: don't run on non-error paths by default
    - LP: #944772
  * pstore: Introduce get_reason_str() to pstore
    - LP: #944772
 -- Leann Ogasawara <email address hidden> Tue, 10 Apr 2012 08:16:09 -0700

Changed in linux (Ubuntu):
status: Fix Committed → Fix Released
Revision history for this message
Aleksejs (zer0byte) wrote : They kill with wars, alcohol and abortions. Save us!!!

They kill with wars, alcohol and abortions. Save us!!!

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Duplicates of this bug

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.