mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-25 08:50:53 +07:00
ALSA: hda: Add modelname lookup and fixup for realtek codecs
Facilitate fixup for realtek codecs via modelname lookup of fixup data. Fallback to quirk based lookup in absence of model definition. Signed-off-by: Todd Broch <tbroch@chromium.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
116dcde638
commit
e1eb5f1006
@ -1677,6 +1677,11 @@ struct alc_pincfg {
|
||||
u32 val;
|
||||
};
|
||||
|
||||
struct alc_model_fixup {
|
||||
const int id;
|
||||
const char *name;
|
||||
};
|
||||
|
||||
struct alc_fixup {
|
||||
unsigned int sku;
|
||||
const struct alc_pincfg *pins;
|
||||
@ -1685,23 +1690,19 @@ struct alc_fixup {
|
||||
int pre_init);
|
||||
};
|
||||
|
||||
static void alc_pick_fixup(struct hda_codec *codec,
|
||||
const struct snd_pci_quirk *quirk,
|
||||
const struct alc_fixup *fix,
|
||||
int pre_init)
|
||||
static void __alc_pick_fixup(struct hda_codec *codec,
|
||||
const struct alc_fixup *fix,
|
||||
const char *modelname,
|
||||
int pre_init)
|
||||
{
|
||||
const struct alc_pincfg *cfg;
|
||||
struct alc_spec *spec;
|
||||
|
||||
quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
|
||||
if (!quirk)
|
||||
return;
|
||||
fix += quirk->value;
|
||||
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, quirk->name);
|
||||
codec->chip_name, modelname);
|
||||
#endif
|
||||
spec = codec->spec;
|
||||
spec->cdefine.sku_cfg = fix->sku;
|
||||
@ -1710,7 +1711,7 @@ static void alc_pick_fixup(struct hda_codec *codec,
|
||||
if (pre_init && cfg) {
|
||||
#ifdef CONFIG_SND_DEBUG_VERBOSE
|
||||
snd_printdd(KERN_INFO "hda_codec: %s: Apply pincfg for %s\n",
|
||||
codec->chip_name, quirk->name);
|
||||
codec->chip_name, modelname);
|
||||
#endif
|
||||
for (; cfg->nid; cfg++)
|
||||
snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
|
||||
@ -1718,19 +1719,55 @@ static void alc_pick_fixup(struct hda_codec *codec,
|
||||
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, quirk->name);
|
||||
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, quirk->name);
|
||||
codec->chip_name, modelname);
|
||||
#endif
|
||||
fix->func(codec, fix, pre_init);
|
||||
}
|
||||
}
|
||||
|
||||
static void alc_pick_fixup(struct hda_codec *codec,
|
||||
const struct snd_pci_quirk *quirk,
|
||||
const struct alc_fixup *fix,
|
||||
int pre_init)
|
||||
{
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
break;
|
||||
}
|
||||
models++;
|
||||
}
|
||||
__alc_pick_fixup(codec, fix, codec->modelname, pre_init);
|
||||
} else {
|
||||
alc_pick_fixup(codec, quirk, fix, pre_init);
|
||||
}
|
||||
}
|
||||
|
||||
static int alc_read_coef_idx(struct hda_codec *codec,
|
||||
unsigned int coef_idx)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user