Commit c44da62b authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda - Fix inconsistent monitor_present state until repoll

While the previous commit fixed the missing monitor_present flag
update, it may be still in an inconsistent state while the driver
repolls: the flag itself is updated, but the eld_valid flag and the
contents don't follow until the repoll finishes (and may be repeated
for a few times).

The basic problem is that pin_eld->monitor_present is updated in the
caller side.  This should have been updated only in update_eld().  So,
the proper fix is to avoid accessing pin_eld but only spec->temp_eld.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 023d8218
...@@ -1396,7 +1396,6 @@ static bool hdmi_present_sense_via_verbs(struct hdmi_spec_per_pin *per_pin, ...@@ -1396,7 +1396,6 @@ static bool hdmi_present_sense_via_verbs(struct hdmi_spec_per_pin *per_pin,
struct hda_codec *codec = per_pin->codec; struct hda_codec *codec = per_pin->codec;
struct hdmi_spec *spec = codec->spec; struct hdmi_spec *spec = codec->spec;
struct hdmi_eld *eld = &spec->temp_eld; struct hdmi_eld *eld = &spec->temp_eld;
struct hdmi_eld *pin_eld = &per_pin->sink_eld;
hda_nid_t pin_nid = per_pin->pin_nid; hda_nid_t pin_nid = per_pin->pin_nid;
/* /*
* Always execute a GetPinSense verb here, even when called from * Always execute a GetPinSense verb here, even when called from
...@@ -1413,17 +1412,15 @@ static bool hdmi_present_sense_via_verbs(struct hdmi_spec_per_pin *per_pin, ...@@ -1413,17 +1412,15 @@ static bool hdmi_present_sense_via_verbs(struct hdmi_spec_per_pin *per_pin,
present = snd_hda_pin_sense(codec, pin_nid); present = snd_hda_pin_sense(codec, pin_nid);
mutex_lock(&per_pin->lock); mutex_lock(&per_pin->lock);
pin_eld->monitor_present = !!(present & AC_PINSENSE_PRESENCE); eld->monitor_present = !!(present & AC_PINSENSE_PRESENCE);
eld->monitor_present = pin_eld->monitor_present; if (eld->monitor_present)
if (pin_eld->monitor_present)
eld->eld_valid = !!(present & AC_PINSENSE_ELDV); eld->eld_valid = !!(present & AC_PINSENSE_ELDV);
else else
eld->eld_valid = false; eld->eld_valid = false;
codec_dbg(codec, codec_dbg(codec,
"HDMI status: Codec=%d Pin=%d Presence_Detect=%d ELD_Valid=%d\n", "HDMI status: Codec=%d Pin=%d Presence_Detect=%d ELD_Valid=%d\n",
codec->addr, pin_nid, pin_eld->monitor_present, eld->eld_valid); codec->addr, pin_nid, eld->monitor_present, eld->eld_valid);
if (eld->eld_valid) { if (eld->eld_valid) {
if (spec->ops.pin_get_eld(codec, pin_nid, eld->eld_buffer, if (spec->ops.pin_get_eld(codec, pin_nid, eld->eld_buffer,
...@@ -1443,7 +1440,7 @@ static bool hdmi_present_sense_via_verbs(struct hdmi_spec_per_pin *per_pin, ...@@ -1443,7 +1440,7 @@ static bool hdmi_present_sense_via_verbs(struct hdmi_spec_per_pin *per_pin,
else else
update_eld(codec, per_pin, eld); update_eld(codec, per_pin, eld);
ret = !repoll || !pin_eld->monitor_present || pin_eld->eld_valid; ret = !repoll || !eld->monitor_present || eld->eld_valid;
jack = snd_hda_jack_tbl_get(codec, pin_nid); jack = snd_hda_jack_tbl_get(codec, pin_nid);
if (jack) if (jack)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment