ALSA: hda - Add the support for VIA HDMI pin detection

This patch adds the hotplug unsol event handling to simple_hdmi*().
It works on VIA VX900.  If AMD or Nvidia chips support the
pin-detection similarly, it can be added easily, too.

Reported-by: Annie Liu <annieliu@viatech.com.cn>
Tested-by: Annie Liu <annieliu@viatech.com.cn>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
index 6966818..8e7333b 100644
--- a/sound/pci/hda/patch_hdmi.c
+++ b/sound/pci/hda/patch_hdmi.c
@@ -1377,6 +1377,19 @@
 	return 0;
 }
 
+/* unsolicited event for jack sensing */
+static void simple_hdmi_unsol_event(struct hda_codec *codec,
+				    unsigned int res)
+{
+	snd_hda_jack_get_action(codec, res >> AC_UNSOL_RES_TAG_SHIFT);
+	snd_hda_jack_report_sync(codec);
+}
+
+/* generic_hdmi_build_jack can be used for simple_hdmi, too,
+ * as long as spec->pins[] is set correctly
+ */
+#define simple_hdmi_build_jack	generic_hdmi_build_jack
+
 static int simple_playback_build_controls(struct hda_codec *codec)
 {
 	struct hdmi_spec *spec = codec->spec;
@@ -1389,6 +1402,11 @@
 						    spec->cvts[i].cvt_nid);
 		if (err < 0)
 			return err;
+		if (codec->patch_ops.unsol_event) {
+			err = simple_hdmi_build_jack(codec, i);
+			if (err < 0)
+				return err;
+		}
 	}
 
 	return 0;
@@ -1876,6 +1894,7 @@
 static int via_hdmi_init(struct hda_codec *codec)
 {
 	snd_hda_sequence_write(codec, viahdmi_basic_init);
+	snd_hda_jack_report_sync(codec);
 	return 0;
 }
 
@@ -1884,6 +1903,7 @@
 	.build_pcms = simple_playback_build_pcms,
 	.init = via_hdmi_init,
 	.free = simple_playback_free,
+	.unsol_event = simple_hdmi_unsol_event,
 };
 
 static struct hda_pcm_stream via_hdmi_digital_playback = {