ALSA: hda - Support rereading widgets under the function group
authorMengdong Lin <mengdong.lin@intel.com>
Fri, 8 Feb 2013 22:09:31 +0000 (17:09 -0500)
committerTakashi Iwai <tiwai@suse.de>
Fri, 8 Feb 2013 11:22:50 +0000 (12:22 +0100)
A codec may allow software to hide some unused pin/cvt widgets.

Sometimes BIOS does not enable the hidden widgets properly although they are
needed for the board. Thus the driver need to enable them as a board-specific
fixup and the whole tree will change.

This patch implements a common code for rereading codec widgets. So the fixup
code can call it after enabling the hidden widgets.

Signed-off-by: Mengdong Lin <mengdong.lin@intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.h

index 3c925145c119570842e71189f0fd03d10bfd56b6..e80f835682918c1f809d0d3a732fc16ee4dc6b2a 100644 (file)
@@ -1441,6 +1441,30 @@ int snd_hda_codec_new(struct hda_bus *bus,
 }
 EXPORT_SYMBOL_HDA(snd_hda_codec_new);
 
+int snd_hda_codec_update_widgets(struct hda_codec *codec)
+{
+       hda_nid_t fg;
+       int err;
+
+       /* Assume the function group node does not change,
+        * only the widget nodes may change.
+        */
+       kfree(codec->wcaps);
+       fg = codec->afg ? codec->afg : codec->mfg;
+       err = read_widget_caps(codec, fg);
+       if (err < 0) {
+               snd_printk(KERN_ERR "hda_codec: cannot malloc\n");
+               return err;
+       }
+
+       snd_array_free(&codec->init_pins);
+       err = read_pin_defaults(codec);
+
+       return err;
+}
+EXPORT_SYMBOL_HDA(snd_hda_codec_update_widgets);
+
+
 /**
  * snd_hda_codec_configure - (Re-)configure the HD-audio codec
  * @codec: the HDA codec
index 0be18263801b9136728e395ee1457091d9188509..e8c9442d27adae86f836dc1ce700436e1b605176 100644 (file)
@@ -935,6 +935,7 @@ int snd_hda_bus_new(struct snd_card *card, const struct hda_bus_template *temp,
 int snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr,
                      struct hda_codec **codecp);
 int snd_hda_codec_configure(struct hda_codec *codec);
+int snd_hda_codec_update_widgets(struct hda_codec *codec);
 
 /*
  * low level functions