ALSA: intelhdmi - probe for monitor/eld presence at module init time
authorWu Fengguang <fengguang.wu@intel.com>
Wed, 18 Nov 2009 04:38:03 +0000 (12:38 +0800)
committerTakashi Iwai <tiwai@suse.de>
Wed, 18 Nov 2009 06:42:07 +0000 (07:42 +0100)
This avoids lost of presence info on module reloading.
The presence info used to be only updated at the (rare) hotplug events.

Proposed by David, thanks!

CC: David Härdeman <david@hardeman.nu>
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/patch_intelhdmi.c

index 095c993f4b76834a48efaae853d8817111e73ef0..c5fd011567fb2d554a215599a5c899dedd9d9c47 100644 (file)
@@ -259,6 +259,25 @@ static int intel_hdmi_read_pin_conn(struct hda_codec *codec, hda_nid_t pin_nid)
        return 0;
 }
 
+static void hdmi_get_show_eld(struct hda_codec *codec, hda_nid_t pin_nid,
+                             struct hdmi_eld *eld)
+{
+       if (!snd_hdmi_get_eld(eld, codec, pin_nid))
+               snd_hdmi_show_eld(eld);
+}
+
+static void hdmi_present_sense(struct hda_codec *codec, hda_nid_t pin_nid,
+                              struct hdmi_eld *eld)
+{
+       int present = snd_hda_pin_sense(codec, pin_nid);
+
+       eld->monitor_present    = !!(present & AC_PINSENSE_PRESENCE);
+       eld->eld_valid          = !!(present & AC_PINSENSE_ELDV);
+
+       if (present & AC_PINSENSE_ELDV)
+               hdmi_get_show_eld(codec, pin_nid, eld);
+}
+
 static int intel_hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid)
 {
        struct intel_hdmi_spec *spec = codec->spec;
@@ -269,6 +288,8 @@ static int intel_hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid)
                return -EINVAL;
        }
 
+       hdmi_present_sense(codec, pin_nid, &spec->sink_eld[spec->num_pins]);
+
        spec->pin[spec->num_pins] = pin_nid;
        spec->num_pins++;
 
@@ -436,15 +457,6 @@ static void hdmi_debug_channel_mapping(struct hda_codec *codec, hda_nid_t nid)
 #endif
 }
 
-static void hdmi_parse_eld(struct hda_codec *codec, int index)
-{
-       struct intel_hdmi_spec *spec = codec->spec;
-       struct hdmi_eld *eld = &spec->sink_eld[index];
-
-       if (!snd_hdmi_get_eld(eld, codec, spec->pin[index]))
-               snd_hdmi_show_eld(eld);
-}
-
 
 /*
  * Audio InfoFrame routines
@@ -677,7 +689,7 @@ static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res)
        spec->sink_eld[index].eld_valid = eldv;
 
        if (pind && eldv) {
-               hdmi_parse_eld(codec, index);
+               hdmi_get_show_eld(codec, spec->pin[index], &spec->sink_eld[index]);
                /* TODO: do real things about ELD */
        }
 }