Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e1eb5f10 authored by Todd Broch's avatar Todd Broch Committed by Takashi Iwai
Browse files

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: default avatarTodd Broch <tbroch@chromium.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 116dcde6
Loading
Loading
Loading
Loading
+49 −12
Original line number Diff line number Diff line
@@ -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,
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)
{