Skip to content

Commit

Permalink
ALSA: hda - Refactor quirk picking and change quirk priority
Browse files Browse the repository at this point in the history
Previously, calling one quirk function first and another later
would make the latter one take priority, this is now changed
to make the former take priority.

By adding two special values for fixup_id we can also get rid of the
fixup_forced flag.

Signed-off-by: David Henningsson <david.henningsson@canonical.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
David Henningsson authored and Takashi Iwai committed Jul 22, 2014
1 parent 9dc1286 commit f5662e1
Show file tree
Hide file tree
Showing 6 changed files with 17 additions and 10 deletions.
15 changes: 8 additions & 7 deletions sound/pci/hda/hda_auto_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -854,7 +854,7 @@ void snd_hda_pick_pin_fixup(struct hda_codec *codec,
{
const struct snd_hda_pin_quirk *pq;

if (codec->fixup_forced)
if (codec->fixup_id != HDA_FIXUP_ID_NOT_SET)
return;

for (pq = pin_quirk; pq->subvendor; pq++) {
Expand All @@ -880,14 +880,17 @@ void snd_hda_pick_fixup(struct hda_codec *codec,
const struct hda_fixup *fixlist)
{
const struct snd_pci_quirk *q;
int id = -1;
int id = HDA_FIXUP_ID_NOT_SET;
const char *name = NULL;

if (codec->fixup_id != HDA_FIXUP_ID_NOT_SET)
return;

/* when model=nofixup is given, don't pick up any fixups */
if (codec->modelname && !strcmp(codec->modelname, "nofixup")) {
codec->fixup_list = NULL;
codec->fixup_id = -1;
codec->fixup_forced = 1;
codec->fixup_name = NULL;
codec->fixup_id = HDA_FIXUP_ID_NO_FIXUP;
return;
}

Expand All @@ -897,13 +900,12 @@ void snd_hda_pick_fixup(struct hda_codec *codec,
codec->fixup_id = models->id;
codec->fixup_name = models->name;
codec->fixup_list = fixlist;
codec->fixup_forced = 1;
return;
}
models++;
}
}
if (id < 0 && quirk) {
if (quirk) {
q = snd_pci_quirk_lookup(codec->bus->pci, quirk);
if (q) {
id = q->value;
Expand All @@ -927,7 +929,6 @@ void snd_hda_pick_fixup(struct hda_codec *codec,
}
}

codec->fixup_forced = 0;
codec->fixup_id = id;
if (id >= 0) {
codec->fixup_list = fixlist;
Expand Down
1 change: 1 addition & 0 deletions sound/pci/hda/hda_codec.c
Original file line number Diff line number Diff line change
Expand Up @@ -1476,6 +1476,7 @@ int snd_hda_codec_new(struct hda_bus *bus,

INIT_DELAYED_WORK(&codec->jackpoll_work, hda_jackpoll_work);
codec->depop_delay = -1;
codec->fixup_id = HDA_FIXUP_ID_NOT_SET;

#ifdef CONFIG_PM
spin_lock_init(&codec->power_lock);
Expand Down
1 change: 0 additions & 1 deletion sound/pci/hda/hda_codec.h
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,6 @@ struct hda_codec {

/* fix-up list */
int fixup_id;
unsigned int fixup_forced:1; /* fixup explicitly set by user */
const struct hda_fixup *fixup_list;
const char *fixup_name;

Expand Down
2 changes: 2 additions & 0 deletions sound/pci/hda/hda_local.h
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,8 @@ struct snd_hda_pin_quirk {

#endif

#define HDA_FIXUP_ID_NOT_SET -1
#define HDA_FIXUP_ID_NO_FIXUP -2

/* fixup types */
enum {
Expand Down
4 changes: 3 additions & 1 deletion sound/pci/hda/patch_cirrus.c
Original file line number Diff line number Diff line change
Expand Up @@ -657,8 +657,10 @@ static void cs4208_fixup_mac(struct hda_codec *codec,
{
if (action != HDA_FIXUP_ACT_PRE_PROBE)
return;

codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
snd_hda_pick_fixup(codec, NULL, cs4208_mac_fixup_tbl, cs4208_fixups);
if (codec->fixup_id < 0 || codec->fixup_id == CS4208_MAC_AUTO)
if (codec->fixup_id == HDA_FIXUP_ID_NOT_SET)
codec->fixup_id = CS4208_GPIO0; /* default fixup */
snd_hda_apply_fixup(codec, action);
}
Expand Down
4 changes: 3 additions & 1 deletion sound/pci/hda/patch_sigmatel.c
Original file line number Diff line number Diff line change
Expand Up @@ -3449,9 +3449,11 @@ static void stac922x_fixup_intel_mac_auto(struct hda_codec *codec,
{
if (action != HDA_FIXUP_ACT_PRE_PROBE)
return;

codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
snd_hda_pick_fixup(codec, NULL, stac922x_intel_mac_fixup_tbl,
stac922x_fixups);
if (codec->fixup_id != STAC_INTEL_MAC_AUTO)
if (codec->fixup_id != HDA_FIXUP_ID_NOT_SET)
snd_hda_apply_fixup(codec, action);
}

Expand Down

0 comments on commit f5662e1

Please sign in to comment.