ALSA: hda - Refactor quirk picking and change quirk priority
authorDavid Henningsson <david.henningsson@canonical.com>
Tue, 22 Jul 2014 12:09:34 +0000 (14:09 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 22 Jul 2014 12:26:50 +0000 (14:26 +0200)
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>
sound/pci/hda/hda_auto_parser.c
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.h
sound/pci/hda/hda_local.h
sound/pci/hda/patch_cirrus.c
sound/pci/hda/patch_sigmatel.c

index a9790198aa179fac1d53a262924ca4138ed12044..51dea49aadd4212b83263766d01f44a40bc0ac75 100644 (file)
@@ -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++) {
@@ -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;
        }
 
@@ -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;
@@ -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;
index 47a617786fcacd87ebee2f95fed266c280197808..ec6a7d0d1886c691fc5cf356c6d078e4cea435c0 100644 (file)
@@ -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);
index f84a40ef42afa44980524973c46fd12953192832..bbc5a1392c7522ce1cd961064d972a4e60c49561 100644 (file)
@@ -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;
 
index aa374ad4b5d01349bdea16282cb4002434a3a691..364bb413e02aa9d934bd970f1c4a0d0bd5c61be5 100644 (file)
@@ -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 {
index 387f0b55188914d3081444d1b573ea15ad1bab2c..3db724eaa53c1e154cb550b52bb0e245b2eca2e4 100644 (file)
@@ -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);
 }
index 946ae4094aa3175996b45bbd6d50855debb00469..8dc6815939202166b3f1874ae74fd7a5397a90e1 100644 (file)
@@ -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);
 }