At Tue, 19 Feb 2013 13:23:05 +0100, David Henningsson wrote:
ELD validity can change during the lifetime of a presence detect, so we need to be able to listen for changes on the ELD control.
Signed-off-by: David Henningsson david.henningsson@canonical.com
sound/pci/hda/patch_hdmi.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index ec3ff3f..a6b5ad0 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c @@ -75,6 +75,7 @@ struct hdmi_spec_per_pin { struct hda_codec *codec; struct hdmi_eld sink_eld; struct delayed_work work;
- struct snd_kcontrol *eld_ctl; int repoll_count; bool non_pcm; bool chmap_set; /* channel-map override by ALSA API? */
@@ -411,6 +412,7 @@ static int hdmi_create_eld_ctl(struct hda_codec *codec, int pin_idx, if (err < 0) return err;
- spec->pins[pin_idx].eld_ctl = kctl; return 0;
}
@@ -1217,19 +1219,27 @@ static void hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll) }
mutex_lock(&pin_eld->lock);
- if (pin_eld->eld_valid && !eld->eld_valid)
- if (pin_eld->eld_valid && !eld->eld_valid) { update_eld = true;
eld_changed = true;
- } if (update_eld) { pin_eld->eld_valid = eld->eld_valid;
eld_changed = memcmp(pin_eld->eld_buffer, eld->eld_buffer,
if (eld_changed) memcpy(pin_eld->eld_buffer, eld->eld_buffer, eld->eld_size);eld_changed |= memcmp(pin_eld->eld_buffer, eld->eld_buffer, eld->eld_size) != 0;
eld_changed |= pin_eld->eld_size != eld->eld_size;
The size check should be done before memcmp(). memcmp() can be skipped if it's already set true.
if (update_eld) { pin_eld->eld_valid = eld->eld_valid; eld_changed |= pin_eld->eld_size != eld->eld_size; if (!eld_changed) eld_changed = memcmp(pin_eld->eld_buffer, eld->eld_buffer, eld->eld_size) != 0; if (eld_changed) memcpy(pin_eld->eld_buffer, eld->eld_buffer, eld->eld_size);
pin_eld->eld_size = eld->eld_size; pin_eld->info = eld->info; }
Takashi