ALSA: hda - Fix mute sound with STAC9227/9228 codecs

On FSC laptops, the sound gets muted gradually when the volume is chnaged.
This is due to the wrong volume-knob widget setup.  The delta bit (bit 7)
shouldn't be set for these devices.

This patch adds a new quirk to set the value 0x7f to the widget 0x24
instead of 0xff.

Reference: Novell bnc#546006
	http://bugzilla.novell.com/show_bug.cgi?id=546006

Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2009-10-11 17:38:29 +02:00
parent 2d9c648295
commit 54930531a0
2 changed files with 18 additions and 0 deletions

View file

@ -359,6 +359,7 @@ STAC9227/9228/9229/927x
5stack-no-fp D965 5stack without front panel 5stack-no-fp D965 5stack without front panel
dell-3stack Dell Dimension E520 dell-3stack Dell Dimension E520
dell-bios Fixes with Dell BIOS setup dell-bios Fixes with Dell BIOS setup
volknob Fixes with volume-knob widget 0x24
auto BIOS setup (default) auto BIOS setup (default)
STAC92HD71B* STAC92HD71B*

View file

@ -158,6 +158,7 @@ enum {
STAC_D965_5ST_NO_FP, STAC_D965_5ST_NO_FP,
STAC_DELL_3ST, STAC_DELL_3ST,
STAC_DELL_BIOS, STAC_DELL_BIOS,
STAC_927X_VOLKNOB,
STAC_927X_MODELS STAC_927X_MODELS
}; };
@ -915,6 +916,14 @@ static struct hda_verb stac927x_core_init[] = {
{} {}
}; };
static struct hda_verb stac927x_volknob_core_init[] = {
/* don't set delta bit */
{0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0x7f},
/* enable analog pc beep path */
{0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
{}
};
static struct hda_verb stac9205_core_init[] = { static struct hda_verb stac9205_core_init[] = {
/* set master volume and direct control */ /* set master volume and direct control */
{ 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
@ -1999,6 +2008,7 @@ static unsigned int *stac927x_brd_tbl[STAC_927X_MODELS] = {
[STAC_D965_5ST_NO_FP] = d965_5st_no_fp_pin_configs, [STAC_D965_5ST_NO_FP] = d965_5st_no_fp_pin_configs,
[STAC_DELL_3ST] = dell_3st_pin_configs, [STAC_DELL_3ST] = dell_3st_pin_configs,
[STAC_DELL_BIOS] = NULL, [STAC_DELL_BIOS] = NULL,
[STAC_927X_VOLKNOB] = NULL,
}; };
static const char *stac927x_models[STAC_927X_MODELS] = { static const char *stac927x_models[STAC_927X_MODELS] = {
@ -2010,6 +2020,7 @@ static const char *stac927x_models[STAC_927X_MODELS] = {
[STAC_D965_5ST_NO_FP] = "5stack-no-fp", [STAC_D965_5ST_NO_FP] = "5stack-no-fp",
[STAC_DELL_3ST] = "dell-3stack", [STAC_DELL_3ST] = "dell-3stack",
[STAC_DELL_BIOS] = "dell-bios", [STAC_DELL_BIOS] = "dell-bios",
[STAC_927X_VOLKNOB] = "volknob",
}; };
static struct snd_pci_quirk stac927x_cfg_tbl[] = { static struct snd_pci_quirk stac927x_cfg_tbl[] = {
@ -2045,6 +2056,8 @@ static struct snd_pci_quirk stac927x_cfg_tbl[] = {
"Intel D965", STAC_D965_5ST), "Intel D965", STAC_D965_5ST),
SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2500, SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2500,
"Intel D965", STAC_D965_5ST), "Intel D965", STAC_D965_5ST),
/* volume-knob fixes */
SND_PCI_QUIRK_VENDOR(0x10cf, "FSC", STAC_927X_VOLKNOB),
{} /* terminator */ {} /* terminator */
}; };
@ -5616,6 +5629,10 @@ static int patch_stac927x(struct hda_codec *codec)
spec->dmux_nids = stac927x_dmux_nids; spec->dmux_nids = stac927x_dmux_nids;
spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids); spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids);
break; break;
case STAC_927X_VOLKNOB:
spec->num_dmics = 0;
spec->init = stac927x_volknob_core_init;
break;
default: default:
spec->num_dmics = 0; spec->num_dmics = 0;
spec->init = stac927x_core_init; spec->init = stac927x_core_init;