At Wed, 18 Nov 2009 12:38:03 +0800, Wu Fengguang wrote:
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
I think we should handle this also at resume. Typically, the codec resume callback calls the unsolicited event explicitly.
But, the resume callback can be used for resuming from the power-saving mode, too. Thus it should be optimized and less verbose, e.g. cache the ELD bytes, compare the new data with the cached data, and skip the procedure if it's the same content.
Anyway, all patches have been applied, so let's fix this on the current tree.
thanks,
Takashi
sound/pci/hda/patch_intelhdmi.c | 33 ++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-)
--- sound-2.6.orig/sound/pci/hda/patch_intelhdmi.c 2009-11-02 15:44:26.000000000 +0800 +++ sound-2.6/sound/pci/hda/patch_intelhdmi.c 2009-11-02 15:47:43.000000000 +0800 @@ -259,6 +259,25 @@ static int intel_hdmi_read_pin_conn(stru 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 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(s #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 +690,7 @@ static void hdmi_intrinsic_event(struct spec->sink_eld[index].eld_valid = eldv;
if (pind && eldv) {
hdmi_parse_eld(codec, index);
/* TODO: do real things about ELD */ }hdmi_get_show_eld(codec, spec->pin[index], &spec->sink_eld[index]);
}