[alsa-devel] [PATCH 4/4] ALSA: hda/hdmi: Move ELD parse and jack reporting into update_eld()
Nikhil Mahale
nmahale at nvidia.com
Mon Feb 10 06:16:20 CET 2020
Looks good to me.
Reviewed-by: Nikhil Mahale <nmahale at nvidia.com>
On 2/6/20 9:58 PM, Takashi Iwai wrote:
> External email: Use caution opening links or attachments
>
>
> This is a final step of the cleanup series: move the HDMI ELD parser
> call into update_eld() function so that we can unify the calls.
> The ELD validity check is unified in update_eld(), too.
>
> Along with it, the repoll scheduling is moved to update_eld() as well,
> where sync_eld_via_acomp() just passes 0 for skipping it.
>
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
> ---
> sound/pci/hda/patch_hdmi.c | 110 ++++++++++++++++++++-------------------------
> 1 file changed, 48 insertions(+), 62 deletions(-)
>
> diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
> index 437177294d78..bb287a916dae 100644
> --- a/sound/pci/hda/patch_hdmi.c
> +++ b/sound/pci/hda/patch_hdmi.c
> @@ -1466,21 +1466,60 @@ static void hdmi_pcm_reset_pin(struct hdmi_spec *spec,
> per_pin->channels = 0;
> }
>
> +static struct snd_jack *pin_idx_to_pcm_jack(struct hda_codec *codec,
> + struct hdmi_spec_per_pin *per_pin)
> +{
> + struct hdmi_spec *spec = codec->spec;
> +
> + if (per_pin->pcm_idx >= 0)
> + return spec->pcm_rec[per_pin->pcm_idx].jack;
> + else
> + return NULL;
> +}
> +
> /* update per_pin ELD from the given new ELD;
> * setup info frame and notification accordingly
> + * also notify ELD kctl and report jack status changes
> */
> -static bool update_eld(struct hda_codec *codec,
> +static void update_eld(struct hda_codec *codec,
> struct hdmi_spec_per_pin *per_pin,
> - struct hdmi_eld *eld)
> + struct hdmi_eld *eld,
> + int repoll)
> {
> struct hdmi_eld *pin_eld = &per_pin->sink_eld;
> struct hdmi_spec *spec = codec->spec;
> + struct snd_jack *pcm_jack;
> bool old_eld_valid = pin_eld->eld_valid;
> bool eld_changed;
> int pcm_idx;
>
> + if (eld->eld_valid) {
> + if (eld->eld_size <= 0 ||
> + snd_hdmi_parse_eld(codec, &eld->info, eld->eld_buffer,
> + eld->eld_size) < 0) {
> + eld->eld_valid = false;
> + if (repoll) {
> + schedule_delayed_work(&per_pin->work,
> + msecs_to_jiffies(300));
> + return;
> + }
> + }
> + }
> +
> + if (!eld->eld_valid || eld->eld_size <= 0) {
> + eld->eld_valid = false;
> + eld->eld_size = 0;
> + }
> +
> /* for monitor disconnection, save pcm_idx firstly */
> pcm_idx = per_pin->pcm_idx;
> +
> + /*
> + * pcm_idx >=0 before update_eld() means it is in monitor
> + * disconnected event. Jack must be fetched before update_eld().
> + */
> + pcm_jack = pin_idx_to_pcm_jack(codec, per_pin);
> +
> if (spec->dyn_pcm_assign) {
> if (eld->eld_valid) {
> hdmi_attach_hda_pcm(spec, per_pin);
> @@ -1495,6 +1534,8 @@ static bool update_eld(struct hda_codec *codec,
> */
> if (pcm_idx == -1)
> pcm_idx = per_pin->pcm_idx;
> + if (!pcm_jack)
> + pcm_jack = pin_idx_to_pcm_jack(codec, per_pin);
>
> if (eld->eld_valid)
> snd_hdmi_show_eld(codec, &eld->info);
> @@ -1533,36 +1574,8 @@ static bool update_eld(struct hda_codec *codec,
> SNDRV_CTL_EVENT_MASK_VALUE |
> SNDRV_CTL_EVENT_MASK_INFO,
> &get_hdmi_pcm(spec, pcm_idx)->eld_ctl->id);
> - return eld_changed;
> -}
> -
> -static struct snd_jack *pin_idx_to_pcm_jack(struct hda_codec *codec,
> - struct hdmi_spec_per_pin *per_pin)
> -{
> - struct hdmi_spec *spec = codec->spec;
>
> - if (per_pin->pcm_idx >= 0)
> - return spec->pcm_rec[per_pin->pcm_idx].jack;
> - else
> - return NULL;
> -}
> -
> -static void do_update_eld(struct hda_codec *codec,
> - struct hdmi_spec_per_pin *per_pin,
> - struct hdmi_eld *eld)
> -{
> - struct snd_jack *pcm_jack;
> - bool changed;
> -
> - /*
> - * pcm_idx >=0 before update_eld() means it is in monitor
> - * disconnected event. Jack must be fetched before update_eld().
> - */
> - pcm_jack = pin_idx_to_pcm_jack(codec, per_pin);
> - changed = update_eld(codec, per_pin, eld);
> - if (!pcm_jack)
> - pcm_jack = pin_idx_to_pcm_jack(codec, per_pin);
> - if (changed && pcm_jack)
> + if (eld_changed && pcm_jack)
> snd_jack_report(pcm_jack,
> (eld->monitor_present && eld->eld_valid) ?
> SND_JACK_AVOUT : 0);
> @@ -1586,7 +1599,6 @@ static void hdmi_present_sense_via_verbs(struct hdmi_spec_per_pin *per_pin,
> * the unsolicited response to avoid custom WARs.
> */
> int present;
> - bool do_repoll = false;
> int ret;
>
> ret = snd_hda_power_up_pm(codec);
> @@ -1610,20 +1622,9 @@ static void hdmi_present_sense_via_verbs(struct hdmi_spec_per_pin *per_pin,
> if (spec->ops.pin_get_eld(codec, pin_nid, dev_id,
> eld->eld_buffer, &eld->eld_size) < 0)
> eld->eld_valid = false;
> - else {
> - if (snd_hdmi_parse_eld(codec, &eld->info, eld->eld_buffer,
> - eld->eld_size) < 0)
> - eld->eld_valid = false;
> - }
> - if (!eld->eld_valid && repoll)
> - do_repoll = true;
> }
>
> - if (do_repoll)
> - schedule_delayed_work(&per_pin->work, msecs_to_jiffies(300));
> - else
> - do_update_eld(codec, per_pin, eld);
> -
> + update_eld(codec, per_pin, eld, repoll);
> mutex_unlock(&per_pin->lock);
> out:
> snd_hda_power_down_pm(codec);
> @@ -1635,29 +1636,14 @@ static void sync_eld_via_acomp(struct hda_codec *codec,
> {
> struct hdmi_spec *spec = codec->spec;
> struct hdmi_eld *eld = &spec->temp_eld;
> - int size;
>
> mutex_lock(&per_pin->lock);
> eld->monitor_present = false;
> - size = snd_hdac_acomp_get_eld(&codec->core, per_pin->pin_nid,
> + eld->eld_size = snd_hdac_acomp_get_eld(&codec->core, per_pin->pin_nid,
> per_pin->dev_id, &eld->monitor_present,
> eld->eld_buffer, ELD_MAX_SIZE);
> - if (size > 0) {
> - size = min(size, ELD_MAX_SIZE);
> - if (snd_hdmi_parse_eld(codec, &eld->info,
> - eld->eld_buffer, size) < 0)
> - size = -EINVAL;
> - }
> -
> - if (size > 0) {
> - eld->eld_valid = true;
> - eld->eld_size = size;
> - } else {
> - eld->eld_valid = false;
> - eld->eld_size = 0;
> - }
> -
> - do_update_eld(codec, per_pin, eld);
> + eld->eld_valid = (eld->eld_size > 0);
> + update_eld(codec, per_pin, eld, 0);
> mutex_unlock(&per_pin->lock);
> }
>
> --
> 2.16.4
>
More information about the Alsa-devel
mailing list