[alsa-devel] [PATCH] ALSA: hda - Remove temporary buffer for ELD update

Hyungwon Hwang hyungwon.hwang7 at gmail.com
Wed Apr 13 02:26:29 CEST 2016


Dear Takashi,

2016년 04월 12일 18:32에 Takashi Iwai 이(가) 쓴 글:
> On Mon, 11 Apr 2016 19:10:51 +0200,
> Hyungwon Hwang wrote:
>>
>> With the introduce of pcm_lock and per_pin->lock, this temporary buffer
>> is not needed anymore.
> 
> The use of a temporary buffer is not only to avoid the race.  It's
> also for avoiding the corruption due to an erroneous read.  That is,
> pin_get_eld() might overwrite some bogus data while it returns an
> error.  Since the driver retries upon the error, we need to keep the
> old good data as much as possible.

I missed that pin_get_eld() can ruin the structure. I agree with you.
Then I will send another patch which set eld->monitor_present by the
value of pin_eld->monitor_present. So proc can show the correct current
status.

Thanks,
Hyungwon Hwang

> 
> 
> thanks,
> 
> Takashi
> 
>>
>> Signed-off-by: Hyungwon Hwang <hyungwon.hwang7 at gmail.com>
>> ---
>>  sound/pci/hda/patch_hdmi.c | 11 +++++------
>>  1 file changed, 5 insertions(+), 6 deletions(-)
>>
>> diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
>> index 5af372d..a24d5b4 100644
>> --- a/sound/pci/hda/patch_hdmi.c
>> +++ b/sound/pci/hda/patch_hdmi.c
>> @@ -1395,8 +1395,7 @@ static bool hdmi_present_sense_via_verbs(struct hdmi_spec_per_pin *per_pin,
>>  	struct hda_jack_tbl *jack;
>>  	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;
>> +	struct hdmi_eld *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)
>> -- 
>> 2.5.0
>>
>>


More information about the Alsa-devel mailing list