ALSA: hda - Make user_pin overriding the driver setup
authorTakashi Iwai <tiwai@suse.de>
Mon, 23 Feb 2009 08:45:59 +0000 (09:45 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 23 Feb 2009 08:45:59 +0000 (09:45 +0100)
Make user_pin overriding even the driver pincfg, e.g. the static / fixed
pin config table in patch_sigmatel.c.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Documentation/sound/alsa/HD-Audio.txt
sound/pci/hda/hda_codec.c

index f590850c149f5debb35be8e7890a65b9673079d7..a4e5ef87af6bbaa141524644bcdaa35e05269c65 100644 (file)
@@ -380,7 +380,8 @@ user_pin_configs::
   Shows the pin default config values to override the BIOS setup.
   Writing this (with two numbers, NID and value) appends the new
   value.  The given will be used instead of the initial BIOS value at
-  the next reconfiguration time.
+  the next reconfiguration time.  Note that this config will override
+  even the driver pin configs, too.
 reconfig::
   Triggers the codec re-configuration.  When any value is written to
   this file, the driver re-initialize and parses the codec tree
index df9453d0122ed08f32cec0eb72d4bfb5e7900490..a13480fa8e7429302c5a07a2211bd00bdd6fa8d4 100644 (file)
@@ -739,7 +739,9 @@ int snd_hda_add_pincfg(struct hda_codec *codec, struct snd_array *list,
                       hda_nid_t nid, unsigned int cfg)
 {
        struct hda_pincfg *pin;
+       unsigned int oldcfg;
 
+       oldcfg = snd_hda_codec_get_pincfg(codec, nid);
        pin = look_up_pincfg(codec, list, nid);
        if (!pin) {
                pin = snd_array_new(list);
@@ -748,7 +750,13 @@ int snd_hda_add_pincfg(struct hda_codec *codec, struct snd_array *list,
                pin->nid = nid;
        }
        pin->cfg = cfg;
-       set_pincfg(codec, nid, cfg);
+
+       /* change only when needed; e.g. if the pincfg is already present
+        * in user_pins[], don't write it
+        */
+       cfg = snd_hda_codec_get_pincfg(codec, nid);
+       if (oldcfg != cfg)
+               set_pincfg(codec, nid, cfg);
        return 0;
 }
 
@@ -764,14 +772,14 @@ unsigned int snd_hda_codec_get_pincfg(struct hda_codec *codec, hda_nid_t nid)
 {
        struct hda_pincfg *pin;
 
-       pin = look_up_pincfg(codec, &codec->driver_pins, nid);
-       if (pin)
-               return pin->cfg;
 #ifdef CONFIG_SND_HDA_HWDEP
        pin = look_up_pincfg(codec, &codec->user_pins, nid);
        if (pin)
                return pin->cfg;
 #endif
+       pin = look_up_pincfg(codec, &codec->driver_pins, nid);
+       if (pin)
+               return pin->cfg;
        pin = look_up_pincfg(codec, &codec->init_pins, nid);
        if (pin)
                return pin->cfg;