ALSA: HDA: Add jack detection for HDMI
David Henningsson [Thu, 19 May 2011 09:46:03 +0000 (11:46 +0200)]
Just as for headphones and microphone jacks, this patch adds reporting
of HDMI jack status through the input layer.

Signed-off-by: David Henningsson <david.henningsson@canonical.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>

sound/pci/hda/hda_codec.c
sound/pci/hda/patch_hdmi.c

index c63f376..8edd998 100644 (file)
@@ -5055,6 +5055,8 @@ static const char *get_jack_default_name(struct hda_codec *codec, hda_nid_t nid,
                return "Line-out";
        case SND_JACK_HEADSET:
                return "Headset";
+       case SND_JACK_VIDEOOUT:
+               return "HDMI/DP";
        default:
                return "Misc";
        }
index 6eb209d..7348296 100644 (file)
@@ -33,6 +33,7 @@
 #include <linux/slab.h>
 #include <linux/moduleparam.h>
 #include <sound/core.h>
+#include <sound/jack.h>
 #include "hda_codec.h"
 #include "hda_local.h"
 
@@ -720,6 +721,8 @@ static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res)
                                  &spec->sink_eld[index]);
                /* TODO: do real things about ELD */
        }
+
+       snd_hda_input_jack_report(codec, tag);
 }
 
 static void hdmi_non_intrinsic_event(struct hda_codec *codec, unsigned int res)
@@ -912,6 +915,7 @@ static void hdmi_present_sense(struct hda_codec *codec, hda_nid_t pin_nid,
 static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid)
 {
        struct hdmi_spec *spec = codec->spec;
+       int err;
 
        if (spec->num_pins >= MAX_HDMI_PINS) {
                snd_printk(KERN_WARNING
@@ -919,6 +923,12 @@ static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid)
                return -E2BIG;
        }
 
+       err = snd_hda_input_jack_add(codec, pin_nid,
+                                    SND_JACK_VIDEOOUT, NULL);
+       if (err < 0)
+               return err;
+       snd_hda_input_jack_report(codec, pin_nid);
+
        hdmi_present_sense(codec, pin_nid, &spec->sink_eld[spec->num_pins]);
 
        spec->pin[spec->num_pins] = pin_nid;
@@ -1120,6 +1130,7 @@ static void generic_hdmi_free(struct hda_codec *codec)
 
        for (i = 0; i < spec->num_pins; i++)
                snd_hda_eld_proc_free(codec, &spec->sink_eld[i]);
+       snd_hda_input_jack_free(codec);
 
        kfree(spec);
 }