[alsa-devel] [PATCH] ALSA: hda - Update HDMI monitor_present from a temporary structure

Hyungwon Hwang hyungwon.hwang7 at gmail.com
Wed Apr 13 16:53:59 CEST 2016


2016년 04월 13일 16:33에 Takashi Iwai 이(가) 쓴 글:
> On Wed, 13 Apr 2016 02:27:39 +0200,
> Hyungwon Hwang wrote:
>>
>> pin_eld is a temporary structure. So before calling update_eld(),
>> eld should be updated from pin_eld.
>>
>> Signed-off-by: Hyungwon Hwang <hyungwon.hwang7 at gmail.com>
> 
> It's not clear what you're trying to solve only by the description
> above alone.  It's about the inconsistent "monitor present" appearance
> in eld proc file, right?  You need to write "why your patch is
> necessary" in your patch description.
> 
> Now back to the code change:
> 
>> ---
>>  sound/pci/hda/patch_hdmi.c | 2 ++
>>  1 file changed, 2 insertions(+)
>>
>> diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
>> index 5af372d..9de114d 100644
>> --- a/sound/pci/hda/patch_hdmi.c
>> +++ b/sound/pci/hda/patch_hdmi.c
>> @@ -1414,6 +1414,8 @@ static bool hdmi_present_sense_via_verbs(struct hdmi_spec_per_pin *per_pin,
>>  
>>  	mutex_lock(&per_pin->lock);
>>  	pin_eld->monitor_present = !!(present & AC_PINSENSE_PRESENCE);
>> +	eld->monitor_present = pin_eld->monitor_present;
>> +
>>  	if (pin_eld->monitor_present)
>>  		eld->eld_valid  = !!(present & AC_PINSENSE_ELDV);
>>  	else
> 
> OK, this would work, but the fundamental problem is that pin_eld is
> modified in this function.  This used to work in the past casually due
> to a bug, but I plugged it in the commit bd48128539ab
>     ALSA: hda - Fix forgotten HDMI monitor_present update
> but overlooked the regression in non-component side.  My bad.
> 
> So, the real fix is to replace the all pin_eld with eld in this
> function.  The untested patch is below.  Could you check whether this
> works for you?

Your code works well in my case, and seems more reasonable even to me.
Thanks for your review and work.

Thanks,
Hyungwon Hwang


> 
> Though, as a stable fix, maybe applying your oneliner patch would be
> safer.  It restores to the old behavior, at least.  Then we can apply
> the patch below on the top.
> 
> 
> thanks,
> 
> Takashi
> 
> ---
> diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
> index 5af372d01834..c83c1a8d9742 100644
> --- a/sound/pci/hda/patch_hdmi.c
> +++ b/sound/pci/hda/patch_hdmi.c
> @@ -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 hdmi_spec *spec = codec->spec;
>  	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;
>  	/*
>  	 * Always execute a GetPinSense verb here, even when called from
> @@ -1413,15 +1412,15 @@ static bool hdmi_present_sense_via_verbs(struct hdmi_spec_per_pin *per_pin,
>  	present = snd_hda_pin_sense(codec, pin_nid);
>  
>  	mutex_lock(&per_pin->lock);
> -	pin_eld->monitor_present = !!(present & AC_PINSENSE_PRESENCE);
> -	if (pin_eld->monitor_present)
> +	eld->monitor_present = !!(present & AC_PINSENSE_PRESENCE);
> +	if (eld->monitor_present)
>  		eld->eld_valid  = !!(present & AC_PINSENSE_ELDV);
>  	else
>  		eld->eld_valid = false;
>  
>  	codec_dbg(codec,
>  		"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 (spec->ops.pin_get_eld(codec, pin_nid, eld->eld_buffer,
> @@ -1441,7 +1440,7 @@ static bool hdmi_present_sense_via_verbs(struct hdmi_spec_per_pin *per_pin,
>  	else
>  		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);
>  	if (jack)
> 


More information about the Alsa-devel mailing list