mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 19:29:37 +00:00
ALSA: hda - Add a workaround for ASUS A7K
ASUS A7K needs additional GPIO1 bit setup; it has to be cleared. Added a new fixup hook for this laptop so that it works as is. Refernece: Novell bnc#494309 http://bugzilla.novell.com/show_bug.cgi?id=494309 Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
15870f05e9
commit
f8f25ba356
1 changed files with 48 additions and 11 deletions
|
@ -1362,7 +1362,7 @@ static void alc_ssid_check(struct hda_codec *codec,
|
|||
}
|
||||
|
||||
/*
|
||||
* Fix-up pin default configurations
|
||||
* Fix-up pin default configurations and add default verbs
|
||||
*/
|
||||
|
||||
struct alc_pincfg {
|
||||
|
@ -1370,9 +1370,14 @@ struct alc_pincfg {
|
|||
u32 val;
|
||||
};
|
||||
|
||||
static void alc_fix_pincfg(struct hda_codec *codec,
|
||||
struct alc_fixup {
|
||||
const struct alc_pincfg *pins;
|
||||
const struct hda_verb *verbs;
|
||||
};
|
||||
|
||||
static void alc_pick_fixup(struct hda_codec *codec,
|
||||
const struct snd_pci_quirk *quirk,
|
||||
const struct alc_pincfg **pinfix)
|
||||
const struct alc_fixup *fix)
|
||||
{
|
||||
const struct alc_pincfg *cfg;
|
||||
|
||||
|
@ -1380,9 +1385,14 @@ static void alc_fix_pincfg(struct hda_codec *codec,
|
|||
if (!quirk)
|
||||
return;
|
||||
|
||||
cfg = pinfix[quirk->value];
|
||||
fix += quirk->value;
|
||||
cfg = fix->pins;
|
||||
if (cfg) {
|
||||
for (; cfg->nid; cfg++)
|
||||
snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
|
||||
}
|
||||
if (fix->verbs)
|
||||
add_verb(codec->spec, fix->verbs);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -9593,11 +9603,13 @@ static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
|
|||
{ }
|
||||
};
|
||||
|
||||
static const struct alc_pincfg *alc882_pin_fixes[] = {
|
||||
[PINFIX_ABIT_AW9D_MAX] = alc882_abit_aw9d_pinfix,
|
||||
static const struct alc_fixup alc882_fixups[] = {
|
||||
[PINFIX_ABIT_AW9D_MAX] = {
|
||||
.pins = alc882_abit_aw9d_pinfix
|
||||
},
|
||||
};
|
||||
|
||||
static struct snd_pci_quirk alc882_pinfix_tbl[] = {
|
||||
static struct snd_pci_quirk alc882_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
|
||||
{}
|
||||
};
|
||||
|
@ -9869,7 +9881,7 @@ static int patch_alc882(struct hda_codec *codec)
|
|||
board_config = ALC882_AUTO;
|
||||
}
|
||||
|
||||
alc_fix_pincfg(codec, alc882_pinfix_tbl, alc882_pin_fixes);
|
||||
alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups);
|
||||
|
||||
if (board_config == ALC882_AUTO) {
|
||||
/* automatic parse from the BIOS config */
|
||||
|
@ -15159,7 +15171,7 @@ static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
|
||||
SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
|
||||
SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
|
||||
SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),
|
||||
/*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
|
||||
SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
|
||||
SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
|
||||
SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
|
||||
|
@ -15552,6 +15564,29 @@ static void alc861vd_auto_init(struct hda_codec *codec)
|
|||
alc_inithook(codec);
|
||||
}
|
||||
|
||||
enum {
|
||||
ALC660VD_FIX_ASUS_GPIO1
|
||||
};
|
||||
|
||||
/* reset GPIO1 */
|
||||
static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = {
|
||||
{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
|
||||
{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
|
||||
{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct alc_fixup alc861vd_fixups[] = {
|
||||
[ALC660VD_FIX_ASUS_GPIO1] = {
|
||||
.verbs = alc660vd_fix_asus_gpio1_verbs,
|
||||
},
|
||||
};
|
||||
|
||||
static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
|
||||
{}
|
||||
};
|
||||
|
||||
static int patch_alc861vd(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec;
|
||||
|
@ -15573,6 +15608,8 @@ static int patch_alc861vd(struct hda_codec *codec)
|
|||
board_config = ALC861VD_AUTO;
|
||||
}
|
||||
|
||||
alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups);
|
||||
|
||||
if (board_config == ALC861VD_AUTO) {
|
||||
/* automatic parse from the BIOS config */
|
||||
err = alc861vd_parse_auto_config(codec);
|
||||
|
|
Loading…
Reference in a new issue