|
|
|
@ -303,6 +303,8 @@ struct alc_customize_define { |
|
|
|
|
unsigned int fixup:1; /* Means that this sku is set by driver, not read from hw */ |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
struct alc_fixup; |
|
|
|
|
|
|
|
|
|
struct alc_spec { |
|
|
|
|
/* codec parameterization */ |
|
|
|
|
struct snd_kcontrol_new *mixers[5]; /* mixer arrays */ |
|
|
|
@ -404,6 +406,11 @@ struct alc_spec { |
|
|
|
|
/* for PLL fix */ |
|
|
|
|
hda_nid_t pll_nid; |
|
|
|
|
unsigned int pll_coef_idx, pll_coef_bit; |
|
|
|
|
|
|
|
|
|
/* fix-up list */ |
|
|
|
|
int fixup_id; |
|
|
|
|
const struct alc_fixup *fixup_list; |
|
|
|
|
const char *fixup_name; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -1683,88 +1690,131 @@ struct alc_model_fixup { |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
struct alc_fixup { |
|
|
|
|
unsigned int sku; |
|
|
|
|
const struct alc_pincfg *pins; |
|
|
|
|
const struct hda_verb *verbs; |
|
|
|
|
void (*func)(struct hda_codec *codec, const struct alc_fixup *fix, |
|
|
|
|
int pre_init); |
|
|
|
|
int type; |
|
|
|
|
bool chained; |
|
|
|
|
int chain_id; |
|
|
|
|
union { |
|
|
|
|
unsigned int sku; |
|
|
|
|
const struct alc_pincfg *pins; |
|
|
|
|
const struct hda_verb *verbs; |
|
|
|
|
void (*func)(struct hda_codec *codec, |
|
|
|
|
const struct alc_fixup *fix, |
|
|
|
|
int action); |
|
|
|
|
} v; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static void __alc_pick_fixup(struct hda_codec *codec, |
|
|
|
|
const struct alc_fixup *fix, |
|
|
|
|
const char *modelname, |
|
|
|
|
int pre_init) |
|
|
|
|
enum { |
|
|
|
|
ALC_FIXUP_INVALID, |
|
|
|
|
ALC_FIXUP_SKU, |
|
|
|
|
ALC_FIXUP_PINS, |
|
|
|
|
ALC_FIXUP_VERBS, |
|
|
|
|
ALC_FIXUP_FUNC, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
enum { |
|
|
|
|
ALC_FIXUP_ACT_PRE_PROBE, |
|
|
|
|
ALC_FIXUP_ACT_PROBE, |
|
|
|
|
ALC_FIXUP_ACT_INIT, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static void alc_apply_fixup(struct hda_codec *codec, int action) |
|
|
|
|
{ |
|
|
|
|
const struct alc_pincfg *cfg; |
|
|
|
|
struct alc_spec *spec; |
|
|
|
|
struct alc_spec *spec = codec->spec; |
|
|
|
|
int id = spec->fixup_id; |
|
|
|
|
const char *modelname = spec->fixup_name; |
|
|
|
|
int depth = 0; |
|
|
|
|
|
|
|
|
|
cfg = fix->pins; |
|
|
|
|
if (pre_init && fix->sku) { |
|
|
|
|
#ifdef CONFIG_SND_DEBUG_VERBOSE |
|
|
|
|
snd_printdd(KERN_INFO "hda_codec: %s: Apply sku override for %s\n", |
|
|
|
|
codec->chip_name, modelname); |
|
|
|
|
#endif |
|
|
|
|
spec = codec->spec; |
|
|
|
|
spec->cdefine.sku_cfg = fix->sku; |
|
|
|
|
spec->cdefine.fixup = 1; |
|
|
|
|
} |
|
|
|
|
if (pre_init && cfg) { |
|
|
|
|
#ifdef CONFIG_SND_DEBUG_VERBOSE |
|
|
|
|
snd_printdd(KERN_INFO "hda_codec: %s: Apply pincfg for %s\n", |
|
|
|
|
codec->chip_name, modelname); |
|
|
|
|
#endif |
|
|
|
|
for (; cfg->nid; cfg++) |
|
|
|
|
snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val); |
|
|
|
|
} |
|
|
|
|
if (!pre_init && fix->verbs) { |
|
|
|
|
#ifdef CONFIG_SND_DEBUG_VERBOSE |
|
|
|
|
snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-verbs for %s\n", |
|
|
|
|
codec->chip_name, modelname); |
|
|
|
|
#endif |
|
|
|
|
add_verb(codec->spec, fix->verbs); |
|
|
|
|
} |
|
|
|
|
if (fix->func) { |
|
|
|
|
#ifdef CONFIG_SND_DEBUG_VERBOSE |
|
|
|
|
snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-func for %s\n", |
|
|
|
|
codec->chip_name, modelname); |
|
|
|
|
#endif |
|
|
|
|
fix->func(codec, fix, pre_init); |
|
|
|
|
if (!spec->fixup_list) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
while (id >= 0) { |
|
|
|
|
const struct alc_fixup *fix = spec->fixup_list + id; |
|
|
|
|
const struct alc_pincfg *cfg; |
|
|
|
|
|
|
|
|
|
switch (fix->type) { |
|
|
|
|
case ALC_FIXUP_SKU: |
|
|
|
|
if (action != ALC_FIXUP_ACT_PRE_PROBE || !fix->v.sku) |
|
|
|
|
break;; |
|
|
|
|
snd_printdd(KERN_INFO "hda_codec: %s: " |
|
|
|
|
"Apply sku override for %s\n", |
|
|
|
|
codec->chip_name, modelname); |
|
|
|
|
spec->cdefine.sku_cfg = fix->v.sku; |
|
|
|
|
spec->cdefine.fixup = 1; |
|
|
|
|
break; |
|
|
|
|
case ALC_FIXUP_PINS: |
|
|
|
|
cfg = fix->v.pins; |
|
|
|
|
if (action != ALC_FIXUP_ACT_PRE_PROBE || !cfg) |
|
|
|
|
break; |
|
|
|
|
snd_printdd(KERN_INFO "hda_codec: %s: " |
|
|
|
|
"Apply pincfg for %s\n", |
|
|
|
|
codec->chip_name, modelname); |
|
|
|
|
for (; cfg->nid; cfg++) |
|
|
|
|
snd_hda_codec_set_pincfg(codec, cfg->nid, |
|
|
|
|
cfg->val); |
|
|
|
|
break; |
|
|
|
|
case ALC_FIXUP_VERBS: |
|
|
|
|
if (action != ALC_FIXUP_ACT_PROBE || !fix->v.verbs) |
|
|
|
|
break; |
|
|
|
|
snd_printdd(KERN_INFO "hda_codec: %s: " |
|
|
|
|
"Apply fix-verbs for %s\n", |
|
|
|
|
codec->chip_name, modelname); |
|
|
|
|
add_verb(codec->spec, fix->v.verbs); |
|
|
|
|
break; |
|
|
|
|
case ALC_FIXUP_FUNC: |
|
|
|
|
if (!fix->v.func) |
|
|
|
|
break; |
|
|
|
|
snd_printdd(KERN_INFO "hda_codec: %s: " |
|
|
|
|
"Apply fix-func for %s\n", |
|
|
|
|
codec->chip_name, modelname); |
|
|
|
|
fix->v.func(codec, fix, action); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
snd_printk(KERN_ERR "hda_codec: %s: " |
|
|
|
|
"Invalid fixup type %d\n", |
|
|
|
|
codec->chip_name, fix->type); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if (!fix[id].chained) |
|
|
|
|
break; |
|
|
|
|
if (++depth > 10) |
|
|
|
|
break; |
|
|
|
|
id = fix[id].chain_id; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void alc_pick_fixup(struct hda_codec *codec, |
|
|
|
|
const struct snd_pci_quirk *quirk, |
|
|
|
|
const struct alc_fixup *fix, |
|
|
|
|
int pre_init) |
|
|
|
|
const struct alc_model_fixup *models, |
|
|
|
|
const struct snd_pci_quirk *quirk, |
|
|
|
|
const struct alc_fixup *fixlist) |
|
|
|
|
{ |
|
|
|
|
quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk); |
|
|
|
|
if (quirk) { |
|
|
|
|
fix += quirk->value; |
|
|
|
|
#ifdef CONFIG_SND_DEBUG_VERBOSE |
|
|
|
|
__alc_pick_fixup(codec, fix, quirk->name, pre_init); |
|
|
|
|
#else |
|
|
|
|
__alc_pick_fixup(codec, fix, NULL, pre_init); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
struct alc_spec *spec = codec->spec; |
|
|
|
|
int id = -1; |
|
|
|
|
const char *name = NULL; |
|
|
|
|
|
|
|
|
|
static void alc_pick_fixup_model(struct hda_codec *codec, |
|
|
|
|
const struct alc_model_fixup *models, |
|
|
|
|
const struct snd_pci_quirk *quirk, |
|
|
|
|
const struct alc_fixup *fix, |
|
|
|
|
int pre_init) |
|
|
|
|
{ |
|
|
|
|
if (codec->modelname && models) { |
|
|
|
|
while (models->name) { |
|
|
|
|
if (!strcmp(codec->modelname, models->name)) { |
|
|
|
|
fix += models->id; |
|
|
|
|
id = models->id; |
|
|
|
|
name = models->name; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
models++; |
|
|
|
|
} |
|
|
|
|
__alc_pick_fixup(codec, fix, codec->modelname, pre_init); |
|
|
|
|
} else { |
|
|
|
|
alc_pick_fixup(codec, quirk, fix, pre_init); |
|
|
|
|
} |
|
|
|
|
if (id < 0) { |
|
|
|
|
quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk); |
|
|
|
|
if (quirk) { |
|
|
|
|
id = quirk->value; |
|
|
|
|
#ifdef CONFIG_SND_DEBUG_VERBOSE |
|
|
|
|
name = quirk->name; |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
spec->fixup_id = id; |
|
|
|
|
if (id >= 0) { |
|
|
|
|
spec->fixup_list = fixlist; |
|
|
|
|
spec->fixup_name = name; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -2866,7 +2916,7 @@ static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = { |
|
|
|
|
/*
|
|
|
|
|
* slave controls for virtual master |
|
|
|
|
*/ |
|
|
|
|
static const char *alc_slave_vols[] = { |
|
|
|
|
static const char * const alc_slave_vols[] = { |
|
|
|
|
"Front Playback Volume", |
|
|
|
|
"Surround Playback Volume", |
|
|
|
|
"Center Playback Volume", |
|
|
|
@ -2880,7 +2930,7 @@ static const char *alc_slave_vols[] = { |
|
|
|
|
NULL, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static const char *alc_slave_sws[] = { |
|
|
|
|
static const char * const alc_slave_sws[] = { |
|
|
|
|
"Front Playback Switch", |
|
|
|
|
"Surround Playback Switch", |
|
|
|
|
"Center Playback Switch", |
|
|
|
@ -3861,6 +3911,8 @@ static int alc_init(struct hda_codec *codec) |
|
|
|
|
if (spec->init_hook) |
|
|
|
|
spec->init_hook(codec); |
|
|
|
|
|
|
|
|
|
alc_apply_fixup(codec, ALC_FIXUP_ACT_INIT); |
|
|
|
|
|
|
|
|
|
hda_call_check_power_status(codec, 0x01); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
@ -4559,7 +4611,7 @@ static struct hda_verb alc880_test_init_verbs[] = { |
|
|
|
|
/*
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
static const char *alc880_models[ALC880_MODEL_LAST] = { |
|
|
|
|
static const char * const alc880_models[ALC880_MODEL_LAST] = { |
|
|
|
|
[ALC880_3ST] = "3stack", |
|
|
|
|
[ALC880_TCL_S700] = "tcl", |
|
|
|
|
[ALC880_3ST_DIG] = "3stack-digout", |
|
|
|
@ -5092,7 +5144,7 @@ static const char *alc_get_line_out_pfx(const struct auto_pin_cfg *cfg, |
|
|
|
|
static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec, |
|
|
|
|
const struct auto_pin_cfg *cfg) |
|
|
|
|
{ |
|
|
|
|
static const char *chname[4] = { |
|
|
|
|
static const char * const chname[4] = { |
|
|
|
|
"Front", "Surround", NULL /*CLFE*/, "Side" |
|
|
|
|
}; |
|
|
|
|
const char *pfx = alc_get_line_out_pfx(cfg, false); |
|
|
|
@ -7090,7 +7142,8 @@ enum { |
|
|
|
|
|
|
|
|
|
static const struct alc_fixup alc260_fixups[] = { |
|
|
|
|
[PINFIX_HP_DC5750] = { |
|
|
|
|
.pins = (const struct alc_pincfg[]) { |
|
|
|
|
.type = ALC_FIXUP_PINS, |
|
|
|
|
.v.pins = (const struct alc_pincfg[]) { |
|
|
|
|
{ 0x11, 0x90130110 }, /* speaker */ |
|
|
|
|
{ } |
|
|
|
|
} |
|
|
|
@ -7105,7 +7158,7 @@ static struct snd_pci_quirk alc260_fixup_tbl[] = { |
|
|
|
|
/*
|
|
|
|
|
* ALC260 configurations |
|
|
|
|
*/ |
|
|
|
|
static const char *alc260_models[ALC260_MODEL_LAST] = { |
|
|
|
|
static const char * const alc260_models[ALC260_MODEL_LAST] = { |
|
|
|
|
[ALC260_BASIC] = "basic", |
|
|
|
|
[ALC260_HP] = "hp", |
|
|
|
|
[ALC260_HP_3013] = "hp-3013", |
|
|
|
@ -7301,8 +7354,10 @@ static int patch_alc260(struct hda_codec *codec) |
|
|
|
|
board_config = ALC260_AUTO; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (board_config == ALC260_AUTO) |
|
|
|
|
alc_pick_fixup(codec, alc260_fixup_tbl, alc260_fixups, 1); |
|
|
|
|
if (board_config == ALC260_AUTO) { |
|
|
|
|
alc_pick_fixup(codec, NULL, alc260_fixup_tbl, alc260_fixups); |
|
|
|
|
alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (board_config == ALC260_AUTO) { |
|
|
|
|
/* automatic parse from the BIOS config */ |
|
|
|
@ -7350,8 +7405,7 @@ static int patch_alc260(struct hda_codec *codec) |
|
|
|
|
set_capture_mixer(codec); |
|
|
|
|
set_beep_amp(spec, 0x07, 0x05, HDA_INPUT); |
|
|
|
|
|
|
|
|
|
if (board_config == ALC260_AUTO) |
|
|
|
|
alc_pick_fixup(codec, alc260_fixup_tbl, alc260_fixups, 0); |
|
|
|
|
alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
|
|
|
|
|
|
|
|
|
spec->vmaster_nid = 0x08; |
|
|
|
|
|
|
|
|
@ -9727,7 +9781,7 @@ static hda_nid_t alc1200_slave_dig_outs[] = { |
|
|
|
|
/*
|
|
|
|
|
* configuration and preset |
|
|
|
|
*/ |
|
|
|
|
static const char *alc882_models[ALC882_MODEL_LAST] = { |
|
|
|
|
static const char * const alc882_models[ALC882_MODEL_LAST] = { |
|
|
|
|
[ALC882_3ST_DIG] = "3stack-dig", |
|
|
|
|
[ALC882_6ST_DIG] = "6stack-dig", |
|
|
|
|
[ALC882_ARIMA] = "arima", |
|
|
|
@ -10678,7 +10732,8 @@ enum { |
|
|
|
|
|
|
|
|
|
static const struct alc_fixup alc882_fixups[] = { |
|
|
|
|
[PINFIX_ABIT_AW9D_MAX] = { |
|
|
|
|
.pins = (const struct alc_pincfg[]) { |
|
|
|
|
.type = ALC_FIXUP_PINS, |
|
|
|
|
.v.pins = (const struct alc_pincfg[]) { |
|
|
|
|
{ 0x15, 0x01080104 }, /* side */ |
|
|
|
|
{ 0x16, 0x01011012 }, /* rear */ |
|
|
|
|
{ 0x17, 0x01016011 }, /* clfe */ |
|
|
|
@ -10686,13 +10741,15 @@ static const struct alc_fixup alc882_fixups[] = { |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
[PINFIX_PB_M5210] = { |
|
|
|
|
.verbs = (const struct hda_verb[]) { |
|
|
|
|
.type = ALC_FIXUP_VERBS, |
|
|
|
|
.v.verbs = (const struct hda_verb[]) { |
|
|
|
|
{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 }, |
|
|
|
|
{} |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
[PINFIX_ACER_ASPIRE_7736] = { |
|
|
|
|
.sku = ALC_FIXUP_SKU_IGNORE, |
|
|
|
|
.type = ALC_FIXUP_SKU, |
|
|
|
|
.v.sku = ALC_FIXUP_SKU_IGNORE, |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -10984,8 +11041,10 @@ static int patch_alc882(struct hda_codec *codec) |
|
|
|
|
board_config = ALC882_AUTO; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (board_config == ALC882_AUTO) |
|
|
|
|
alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 1); |
|
|
|
|
if (board_config == ALC882_AUTO) { |
|
|
|
|
alc_pick_fixup(codec, NULL, alc882_fixup_tbl, alc882_fixups); |
|
|
|
|
alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
alc_auto_parse_customize_define(codec); |
|
|
|
|
|
|
|
|
@ -11061,8 +11120,7 @@ static int patch_alc882(struct hda_codec *codec) |
|
|
|
|
if (has_cdefine_beep(codec)) |
|
|
|
|
set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); |
|
|
|
|
|
|
|
|
|
if (board_config == ALC882_AUTO) |
|
|
|
|
alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 0); |
|
|
|
|
alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
|
|
|
|
|
|
|
|
|
spec->vmaster_nid = 0x0c; |
|
|
|
|
|
|
|
|
@ -12452,19 +12510,14 @@ enum { |
|
|
|
|
|
|
|
|
|
static const struct alc_fixup alc262_fixups[] = { |
|
|
|
|
[PINFIX_FSC_H270] = { |
|
|
|
|
.pins = (const struct alc_pincfg[]) { |
|
|
|
|
.type = ALC_FIXUP_PINS, |
|
|
|
|
.v.pins = (const struct alc_pincfg[]) { |
|
|
|
|
{ 0x14, 0x99130110 }, /* speaker */ |
|
|
|
|
{ 0x15, 0x0221142f }, /* front HP */ |
|
|
|
|
{ 0x1b, 0x0121141f }, /* rear HP */ |
|
|
|
|
{ } |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
[PINFIX_PB_M5210] = { |
|
|
|
|
.verbs = (const struct hda_verb[]) { |
|
|
|
|
{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 }, |
|
|
|
|
{} |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static struct snd_pci_quirk alc262_fixup_tbl[] = { |
|
|
|
@ -12554,7 +12607,7 @@ static void alc262_auto_init(struct hda_codec *codec) |
|
|
|
|
/*
|
|
|
|
|
* configuration and preset |
|
|
|
|
*/ |
|
|
|
|
static const char *alc262_models[ALC262_MODEL_LAST] = { |
|
|
|
|
static const char * const alc262_models[ALC262_MODEL_LAST] = { |
|
|
|
|
[ALC262_BASIC] = "basic", |
|
|
|
|
[ALC262_HIPPO] = "hippo", |
|
|
|
|
[ALC262_HIPPO_1] = "hippo_1", |
|
|
|
@ -12895,8 +12948,10 @@ static int patch_alc262(struct hda_codec *codec) |
|
|
|
|
board_config = ALC262_AUTO; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (board_config == ALC262_AUTO) |
|
|
|
|
alc_pick_fixup(codec, alc262_fixup_tbl, alc262_fixups, 1); |
|
|
|
|
if (board_config == ALC262_AUTO) { |
|
|
|
|
alc_pick_fixup(codec, NULL, alc262_fixup_tbl, alc262_fixups); |
|
|
|
|
alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (board_config == ALC262_AUTO) { |
|
|
|
|
/* automatic parse from the BIOS config */ |
|
|
|
@ -12966,8 +13021,7 @@ static int patch_alc262(struct hda_codec *codec) |
|
|
|
|
if (!spec->no_analog && has_cdefine_beep(codec)) |
|
|
|
|
set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); |
|
|
|
|
|
|
|
|
|
if (board_config == ALC262_AUTO) |
|
|
|
|
alc_pick_fixup(codec, alc262_fixup_tbl, alc262_fixups, 0); |
|
|
|
|
alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
|
|
|
|
|
|
|
|
|
spec->vmaster_nid = 0x0c; |
|
|
|
|
|
|
|
|
@ -13741,7 +13795,7 @@ static void alc268_auto_init(struct hda_codec *codec) |
|
|
|
|
/*
|
|
|
|
|
* configuration and preset |
|
|
|
|
*/ |
|
|
|
|
static const char *alc268_models[ALC268_MODEL_LAST] = { |
|
|
|
|
static const char * const alc268_models[ALC268_MODEL_LAST] = { |
|
|
|
|
[ALC267_QUANTA_IL1] = "quanta-il1", |
|
|
|
|
[ALC268_3ST] = "3stack", |
|
|
|
|
[ALC268_TOSHIBA] = "toshiba", |
|
|
|
@ -14822,17 +14876,19 @@ static int alc269_resume(struct hda_codec *codec) |
|
|
|
|
#endif /* SND_HDA_NEEDS_RESUME */ |
|
|
|
|
|
|
|
|
|
static void alc269_fixup_hweq(struct hda_codec *codec, |
|
|
|
|
const struct alc_fixup *fix, int pre_init) |
|
|
|
|
const struct alc_fixup *fix, int action) |
|
|
|
|
{ |
|
|
|
|
int coef; |
|
|
|
|
|
|
|
|
|
if (action != ALC_FIXUP_ACT_INIT) |
|
|
|
|
return; |
|
|
|
|
coef = alc_read_coef_idx(codec, 0x1e); |
|
|
|
|
alc_write_coef_idx(codec, 0x1e, coef | 0x80); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
enum { |
|
|
|
|
ALC269_FIXUP_SONY_VAIO, |
|
|
|
|
ALC275_FIX_SONY_VAIO_GPIO2, |
|
|
|
|
ALC275_FIXUP_SONY_VAIO_GPIO2, |
|
|
|
|
ALC269_FIXUP_DELL_M101Z, |
|
|
|
|
ALC269_FIXUP_SKU_IGNORE, |
|
|
|
|
ALC269_FIXUP_ASUS_G73JW, |
|
|
|
@ -14842,22 +14898,26 @@ enum { |
|
|
|
|
|
|
|
|
|
static const struct alc_fixup alc269_fixups[] = { |
|
|
|
|
[ALC269_FIXUP_SONY_VAIO] = { |
|
|
|
|
.verbs = (const struct hda_verb[]) { |
|
|
|
|
.type = ALC_FIXUP_VERBS, |
|
|
|
|
.v.verbs = (const struct hda_verb[]) { |
|
|
|
|
{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD}, |
|
|
|
|
{} |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
[ALC275_FIX_SONY_VAIO_GPIO2] = { |
|
|
|
|
.verbs = (const struct hda_verb[]) { |
|
|
|
|
[ALC275_FIXUP_SONY_VAIO_GPIO2] = { |
|
|
|
|
.type = ALC_FIXUP_VERBS, |
|
|
|
|
.v.verbs = (const struct hda_verb[]) { |
|
|
|
|
{0x01, AC_VERB_SET_GPIO_MASK, 0x04}, |
|
|
|
|
{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04}, |
|
|
|
|
{0x01, AC_VERB_SET_GPIO_DATA, 0x00}, |
|
|
|
|
{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD}, |
|
|
|
|
{ } |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
.chained = true, |
|
|
|
|
.chain_id = ALC269_FIXUP_SONY_VAIO |
|
|
|
|
}, |
|
|
|
|
[ALC269_FIXUP_DELL_M101Z] = { |
|
|
|
|
.verbs = (const struct hda_verb[]) { |
|
|
|
|
.type = ALC_FIXUP_VERBS, |
|
|
|
|
.v.verbs = (const struct hda_verb[]) { |
|
|
|
|
/* Enables internal speaker */ |
|
|
|
|
{0x20, AC_VERB_SET_COEF_INDEX, 13}, |
|
|
|
|
{0x20, AC_VERB_SET_PROC_COEF, 0x4040}, |
|
|
|
@ -14865,34 +14925,33 @@ static const struct alc_fixup alc269_fixups[] = { |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
[ALC269_FIXUP_SKU_IGNORE] = { |
|
|
|
|
.sku = ALC_FIXUP_SKU_IGNORE, |
|
|
|
|
.type = ALC_FIXUP_SKU, |
|
|
|
|
.v.sku = ALC_FIXUP_SKU_IGNORE, |
|
|
|
|
}, |
|
|
|
|
[ALC269_FIXUP_ASUS_G73JW] = { |
|
|
|
|
.pins = (const struct alc_pincfg[]) { |
|
|
|
|
.type = ALC_FIXUP_PINS, |
|
|
|
|
.v.pins = (const struct alc_pincfg[]) { |
|
|
|
|
{ 0x17, 0x99130111 }, /* subwoofer */ |
|
|
|
|
{ } |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
[ALC269_FIXUP_LENOVO_EAPD] = { |
|
|
|
|
.verbs = (const struct hda_verb[]) { |
|
|
|
|
.type = ALC_FIXUP_VERBS, |
|
|
|
|
.v.verbs = (const struct hda_verb[]) { |
|
|
|
|
{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0}, |
|
|
|
|
{} |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
[ALC275_FIXUP_SONY_HWEQ] = { |
|
|
|
|
.func = alc269_fixup_hweq, |
|
|
|
|
.verbs = (const struct hda_verb[]) { |
|
|
|
|
{0x01, AC_VERB_SET_GPIO_MASK, 0x04}, |
|
|
|
|
{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04}, |
|
|
|
|
{0x01, AC_VERB_SET_GPIO_DATA, 0x00}, |
|
|
|
|
{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD}, |
|
|
|
|
{ } |
|
|
|
|
} |
|
|
|
|
.type = ALC_FIXUP_FUNC, |
|
|
|
|
.v.func = alc269_fixup_hweq, |
|
|
|
|
.chained = true, |
|
|
|
|
.chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2 |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static struct snd_pci_quirk alc269_fixup_tbl[] = { |
|
|
|
|
SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIX_SONY_VAIO_GPIO2), |
|
|
|
|
SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2), |
|
|
|
|
SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ), |
|
|
|
|
SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ), |
|
|
|
|
SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), |
|
|
|
@ -14908,7 +14967,7 @@ static struct snd_pci_quirk alc269_fixup_tbl[] = { |
|
|
|
|
/*
|
|
|
|
|
* configuration and preset |
|
|
|
|
*/ |
|
|
|
|
static const char *alc269_models[ALC269_MODEL_LAST] = { |
|
|
|
|
static const char * const alc269_models[ALC269_MODEL_LAST] = { |
|
|
|
|
[ALC269_BASIC] = "basic", |
|
|
|
|
[ALC269_QUANTA_FL1] = "quanta", |
|
|
|
|
[ALC269_AMIC] = "laptop-amic", |
|
|
|
@ -15184,8 +15243,10 @@ static int patch_alc269(struct hda_codec *codec) |
|
|
|
|
board_config = ALC269_AUTO; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (board_config == ALC269_AUTO) |
|
|
|
|
alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 1); |
|
|
|
|
if (board_config == ALC269_AUTO) { |
|
|
|
|
alc_pick_fixup(codec, NULL, alc269_fixup_tbl, alc269_fixups); |
|
|
|
|
alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (board_config == ALC269_AUTO) { |
|
|
|
|
/* automatic parse from the BIOS config */ |
|
|
|
@ -15246,8 +15307,7 @@ static int patch_alc269(struct hda_codec *codec) |
|
|
|
|
if (has_cdefine_beep(codec)) |
|
|
|
|
set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); |
|
|
|
|
|
|
|
|
|
if (board_config == ALC269_AUTO) |
|
|
|
|
alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 0); |
|
|
|
|
alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
|
|
|
|
|
|
|
|
|
spec->vmaster_nid = 0x02; |
|
|
|
|
|
|
|
|
@ -15950,7 +16010,7 @@ static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec, |
|
|
|
|
const struct auto_pin_cfg *cfg) |
|
|
|
|
{ |
|
|
|
|
struct alc_spec *spec = codec->spec; |
|
|
|
|
static const char *chname[4] = { |
|
|
|
|
static const char * const chname[4] = { |
|
|
|
|
"Front", "Surround", NULL /*CLFE*/, "Side" |
|
|
|
|
}; |
|
|
|
|
const char *pfx = alc_get_line_out_pfx(cfg, true); |
|
|
|
@ -16156,7 +16216,7 @@ static struct hda_amp_list alc861_loopbacks[] = { |
|
|
|
|
/*
|
|
|
|
|
* configuration and preset |
|
|
|
|
*/ |
|
|
|
|
static const char *alc861_models[ALC861_MODEL_LAST] = { |
|
|
|
|
static const char * const alc861_models[ALC861_MODEL_LAST] = { |
|
|
|
|
[ALC861_3ST] = "3stack", |
|
|
|
|
[ALC660_3ST] = "3stack-660", |
|
|
|
|
[ALC861_3ST_DIG] = "3stack-dig", |
|
|
|
@ -16306,7 +16366,8 @@ enum { |
|
|
|
|
|
|
|
|
|
static const struct alc_fixup alc861_fixups[] = { |
|
|
|
|
[PINFIX_FSC_AMILO_PI1505] = { |
|
|
|
|
.pins = (const struct alc_pincfg[]) { |
|
|
|
|
.type = ALC_FIXUP_PINS, |
|
|
|
|
.v.pins = (const struct alc_pincfg[]) { |
|
|
|
|
{ 0x0b, 0x0221101f }, /* HP */ |
|
|
|
|
{ 0x0f, 0x90170310 }, /* speaker */ |
|
|
|
|
{ } |
|
|
|
@ -16341,8 +16402,10 @@ static int patch_alc861(struct hda_codec *codec) |
|
|
|
|
board_config = ALC861_AUTO; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (board_config == ALC861_AUTO) |
|
|
|
|
alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 1); |
|
|
|
|
if (board_config == ALC861_AUTO) { |
|
|
|
|
alc_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups); |
|
|
|
|
alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (board_config == ALC861_AUTO) { |
|
|
|
|
/* automatic parse from the BIOS config */ |
|
|
|
@ -16379,8 +16442,7 @@ static int patch_alc861(struct hda_codec *codec) |
|
|
|
|
|
|
|
|
|
spec->vmaster_nid = 0x03; |
|
|
|
|
|
|
|
|
|
if (board_config == ALC861_AUTO) |
|
|
|
|
alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 0); |
|
|
|
|
alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
|
|
|
|
|
|
|
|
|
codec->patch_ops = alc_patch_ops; |
|
|
|
|
if (board_config == ALC861_AUTO) { |
|
|
|
@ -16857,7 +16919,7 @@ static void alc861vd_dallas_setup(struct hda_codec *codec) |
|
|
|
|
/*
|
|
|
|
|
* configuration and preset |
|
|
|
|
*/ |
|
|
|
|
static const char *alc861vd_models[ALC861VD_MODEL_LAST] = { |
|
|
|
|
static const char * const alc861vd_models[ALC861VD_MODEL_LAST] = { |
|
|
|
|
[ALC660VD_3ST] = "3stack-660", |
|
|
|
|
[ALC660VD_3ST_DIG] = "3stack-660-digout", |
|
|
|
|
[ALC660VD_ASUS_V1S] = "asus-v1s", |
|
|
|
@ -17077,7 +17139,9 @@ static void alc861vd_auto_init_analog_input(struct hda_codec *codec) |
|
|
|
|
static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec, |
|
|
|
|
const struct auto_pin_cfg *cfg) |
|
|
|
|
{ |
|
|
|
|
static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"}; |
|
|
|
|
static const char * const chname[4] = { |
|
|
|
|
"Front", "Surround", "CLFE", "Side" |
|
|
|
|
}; |
|
|
|
|
const char *pfx = alc_get_line_out_pfx(cfg, true); |
|
|
|
|
hda_nid_t nid_v, nid_s; |
|
|
|
|
int i, err; |
|
|
|
@ -17262,7 +17326,8 @@ enum { |
|
|
|
|
/* reset GPIO1 */ |
|
|
|
|
static const struct alc_fixup alc861vd_fixups[] = { |
|
|
|
|
[ALC660VD_FIX_ASUS_GPIO1] = { |
|
|
|
|
.verbs = (const struct hda_verb[]) { |
|
|
|
|
.type = ALC_FIXUP_VERBS, |
|
|
|
|
.v.verbs = (const struct hda_verb[]) { |
|
|
|
|
{0x01, AC_VERB_SET_GPIO_MASK, 0x03}, |
|
|
|
|
{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, |
|
|
|
|
{0x01, AC_VERB_SET_GPIO_DATA, 0x01}, |
|
|
|
@ -17297,8 +17362,10 @@ static int patch_alc861vd(struct hda_codec *codec) |
|
|
|
|
board_config = ALC861VD_AUTO; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (board_config == ALC861VD_AUTO) |
|
|
|
|
alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 1); |
|
|
|
|
if (board_config == ALC861VD_AUTO) { |
|
|
|
|
alc_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups); |
|
|
|
|
alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (board_config == ALC861VD_AUTO) { |
|
|
|
|
/* automatic parse from the BIOS config */ |
|
|
|
@ -17346,8 +17413,7 @@ static int patch_alc861vd(struct hda_codec *codec) |
|
|
|
|
|
|
|
|
|
spec->vmaster_nid = 0x02; |
|
|
|
|
|
|
|
|
|
if (board_config == ALC861VD_AUTO) |
|
|
|
|
alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 0); |
|
|
|
|
alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
|
|
|
|
|
|
|
|
|
codec->patch_ops = alc_patch_ops; |
|
|
|
|
|
|
|
|
@ -18630,7 +18696,7 @@ static struct snd_kcontrol_new alc272_nc10_mixer[] = { |
|
|
|
|
/*
|
|
|
|
|
* configuration and preset |
|
|
|
|
*/ |
|
|
|
|
static const char *alc662_models[ALC662_MODEL_LAST] = { |
|
|
|
|
static const char * const alc662_models[ALC662_MODEL_LAST] = { |
|
|
|
|
[ALC662_3ST_2ch_DIG] = "3stack-dig", |
|
|
|
|
[ALC662_3ST_6ch_DIG] = "3stack-6ch-dig", |
|
|
|
|
[ALC662_3ST_6ch] = "3stack-6ch", |
|
|
|
@ -19145,7 +19211,7 @@ static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec, |
|
|
|
|
const struct auto_pin_cfg *cfg) |
|
|
|
|
{ |
|
|
|
|
struct alc_spec *spec = codec->spec; |
|
|
|
|
static const char *chname[4] = { |
|
|
|
|
static const char * const chname[4] = { |
|
|
|
|
"Front", "Surround", NULL /*CLFE*/, "Side" |
|
|
|
|
}; |
|
|
|
|
const char *pfx = alc_get_line_out_pfx(cfg, true); |
|
|
|
@ -19378,7 +19444,10 @@ static void alc662_auto_init(struct hda_codec *codec) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void alc272_fixup_mario(struct hda_codec *codec, |
|
|
|
|
const struct alc_fixup *fix, int pre_init) { |
|
|
|
|
const struct alc_fixup *fix, int action) |
|
|
|
|
{ |
|
|
|
|
if (action != ALC_FIXUP_ACT_PROBE) |
|
|
|
|
return; |
|
|
|
|
if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT, |
|
|
|
|
(0x3b << AC_AMPCAP_OFFSET_SHIFT) | |
|
|
|
|
(0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) | |
|
|
|
@ -19396,19 +19465,22 @@ enum { |
|
|
|
|
|
|
|
|
|
static const struct alc_fixup alc662_fixups[] = { |
|
|
|
|
[ALC662_FIXUP_ASPIRE] = { |
|
|
|
|
.pins = (const struct alc_pincfg[]) { |
|
|
|
|
.type = ALC_FIXUP_PINS, |
|
|
|
|
.v.pins = (const struct alc_pincfg[]) { |
|
|
|
|
{ 0x15, 0x99130112 }, /* subwoofer */ |
|
|
|
|
{ } |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
[ALC662_FIXUP_IDEAPAD] = { |
|
|
|
|
.pins = (const struct alc_pincfg[]) { |
|
|
|
|
.type = ALC_FIXUP_PINS, |
|
|
|
|
.v.pins = (const struct alc_pincfg[]) { |
|
|
|
|
{ 0x17, 0x99130112 }, /* subwoofer */ |
|
|
|
|
{ } |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
[ALC272_FIXUP_MARIO] = { |
|
|
|
|
.func = alc272_fixup_mario, |
|
|
|
|
.type = ALC_FIXUP_FUNC, |
|
|
|
|
.v.func = alc272_fixup_mario, |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -19462,7 +19534,9 @@ static int patch_alc662(struct hda_codec *codec) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (board_config == ALC662_AUTO) { |
|
|
|
|
alc_pick_fixup(codec, alc662_fixup_tbl, alc662_fixups, 1); |
|
|
|
|
alc_pick_fixup(codec, alc662_fixup_models, |
|
|
|
|
alc662_fixup_tbl, alc662_fixups); |
|
|
|
|
alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); |
|
|
|
|
/* automatic parse from the BIOS config */ |
|
|
|
|
err = alc662_parse_auto_config(codec); |
|
|
|
|
if (err < 0) { |
|
|
|
@ -19520,12 +19594,11 @@ static int patch_alc662(struct hda_codec *codec) |
|
|
|
|
} |
|
|
|
|
spec->vmaster_nid = 0x02; |
|
|
|
|
|
|
|
|
|
alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
|
|
|
|
|
|
|
|
|
codec->patch_ops = alc_patch_ops; |
|
|
|
|
if (board_config == ALC662_AUTO) { |
|
|
|
|
if (board_config == ALC662_AUTO) |
|
|
|
|
spec->init_hook = alc662_auto_init; |
|
|
|
|
alc_pick_fixup_model(codec, alc662_fixup_models, |
|
|
|
|
alc662_fixup_tbl, alc662_fixups, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
alc_init_jacks(codec); |
|
|
|
|
|
|
|
|
@ -19913,7 +19986,7 @@ static void alc680_auto_init(struct hda_codec *codec) |
|
|
|
|
/*
|
|
|
|
|
* configuration and preset |
|
|
|
|
*/ |
|
|
|
|
static const char *alc680_models[ALC680_MODEL_LAST] = { |
|
|
|
|
static const char * const alc680_models[ALC680_MODEL_LAST] = { |
|
|
|
|
[ALC680_BASE] = "base", |
|
|
|
|
[ALC680_AUTO] = "auto", |
|
|
|
|
}; |
|
|
|
|