All of lore.kernel.org
 help / color / mirror / Atom feed
From: Libin Yang <libin.yang@linux.intel.com>
To: Takashi Iwai <tiwai@suse.de>
Cc: libin.yang@intel.com, mengdong.lin@intel.com,
	alsa-devel@alsa-project.org
Subject: Re: [PATCH v4 4/5] ALSA: hda - hdmi dynamically bind PCM to pin when monitor hotplug
Date: Wed, 16 Dec 2015 15:47:04 +0800	[thread overview]
Message-ID: <567116F8.70705@linux.intel.com> (raw)
In-Reply-To: <s5hegemhm9b.wl-tiwai@suse.de>



On 12/16/2015 03:43 PM, Takashi Iwai wrote:
> On Wed, 16 Dec 2015 06:42:44 +0100,
> libin.yang@linux.intel.com wrote:
>>
>> From: Libin Yang <libin.yang@linux.intel.com>
>>
>> Dynamically bind/unbind the PCM to pin when HDMI/DP monitor hotplug.
>>
>> When monitor is connected, find a proper PCM for the monitor.
>> When monitor is disconnected, unbind the PCM from the pin.
>>
>> The binding policy (use Intel platform as example) is:
>> 1. Try to use the legacy pin-pcm mapping for the device entry 0
>>     of the pin.
>> 2. If step 1 fails, try to bind pin to the backup PCMs. For example,
>>     on Intel platform, if DP MST is enabled, 5 PCMs will be created.
>>     PCM 3, PCM 7, PCM 8 are supposed to be used by device entry 0 of
>>     pin 5, pin 6 and pin 7. PCM 9 and PCM 10 are the backup PCMs.
>> 3. If step 2 fails, try to find any PCM to bind to the pin.
>>
>> Signed-off-by: Libin Yang <libin.yang@linux.intel.com>
>
> This patch adds the code in sync_eld_via_acomp(), i.e. it's handled
> only with component.  As the dynamic HDA attach/detach itself is
> agnostic to the component, I'd suggest to put this rather in
> update_eld().
>
> Also pcm_lock can be put in hdmi_present_sense() to wrap both
> sync_eld_via_acomp() and hdmi_present_sense_via_verbs().

OK, I will put it in update_eld().

Best Regards,
Libin

>
>
> Takashi
>
>> ---
>>   sound/pci/hda/patch_hdmi.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 73 insertions(+)
>>
>> diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
>> index 19bf782..10edab8 100644
>> --- a/sound/pci/hda/patch_hdmi.c
>> +++ b/sound/pci/hda/patch_hdmi.c
>> @@ -73,6 +73,8 @@ struct hdmi_spec_per_cvt {
>>
>>   struct hdmi_spec_per_pin {
>>   	hda_nid_t pin_nid;
>> +	/* pin idx, different device entries on the same pin use the same idx */
>> +	int pin_nid_idx;
>>   	int num_mux_nids;
>>   	hda_nid_t mux_nids[HDA_MAX_CONNECTIONS];
>>   	int mux_idx;
>> @@ -85,6 +87,7 @@ struct hdmi_spec_per_pin {
>>   	struct snd_kcontrol *eld_ctl;
>>   	struct snd_jack *acomp_jack; /* jack via audio component */
>>   	struct hda_pcm *pcm; /* pointer to spec->pcm_rec[n] dynamically*/
>> +	int pcm_idx; /* which pcm is attached. -1 means no pcm is attached */
>>   	int repoll_count;
>>   	bool setup; /* the stream has been set up by prepare callback */
>>   	int channels; /* current number of channels */
>> @@ -138,6 +141,8 @@ struct hdmi_spec {
>>   	struct snd_array pins; /* struct hdmi_spec_per_pin */
>>   	struct hda_pcm *pcm_rec[16];
>>   	struct mutex pcm_lock;
>> +	/* pcm_bitmap means which pcms have been assigned to pins*/
>> +	unsigned long pcm_bitmap;
>>   	int pcm_used;	/* counter of pcm_rec[] */
>>   	unsigned int channels_max; /* max over all cvts */
>>
>> @@ -1786,6 +1791,60 @@ static bool hdmi_present_sense_via_verbs(struct hdmi_spec_per_pin *per_pin,
>>   	return ret;
>>   }
>>
>> +static int hdmi_find_pcm_slot(struct hdmi_spec *spec,
>> +				struct hdmi_spec_per_pin *per_pin)
>> +{
>> +	int i;
>> +
>> +	/* try the prefer PCM */
>> +	if (!test_bit(per_pin->pin_nid_idx, &spec->pcm_bitmap))
>> +		return per_pin->pin_nid_idx;
>> +
>> +	/* have a second try; check the "reserved area" over num_pins */
>> +	for (i = spec->num_pins; i < spec->pcm_used; i++) {
>> +		if (!test_bit(i, &spec->pcm_bitmap))
>> +			return i;
>> +	}
>> +
>> +	/* the last try; check the empty slots in pins */
>> +	for (i = 0; i < spec->num_pins; i++) {
>> +		if (!test_bit(i, &spec->pcm_bitmap))
>> +			return i;
>> +	}
>> +	return -EBUSY;
>> +}
>> +
>> +static void hdmi_attach_hda_pcm(struct hdmi_spec *spec,
>> +				struct hdmi_spec_per_pin *per_pin)
>> +{
>> +	int idx;
>> +
>> +	/* pcm already be attached to the pin */
>> +	if (per_pin->pcm)
>> +		return;
>> +	idx = hdmi_find_pcm_slot(spec, per_pin);
>> +	if (idx == -ENODEV)
>> +		return;
>> +	per_pin->pcm_idx = idx;
>> +	per_pin->pcm = spec->pcm_rec[idx];
>> +	set_bit(idx, &spec->pcm_bitmap);
>> +}
>> +
>> +static void hdmi_detach_hda_pcm(struct hdmi_spec *spec,
>> +				struct hdmi_spec_per_pin *per_pin)
>> +{
>> +	int idx;
>> +
>> +	/* pcm already be detached from the pin */
>> +	if (!per_pin->pcm)
>> +		return;
>> +	idx = per_pin->pcm_idx;
>> +	per_pin->pcm_idx = -1;
>> +	per_pin->pcm = NULL;
>> +	if (idx >= 0 && idx < spec->pcm_used)
>> +		clear_bit(idx, &spec->pcm_bitmap);
>> +}
>> +
>>   /* update ELD and jack state via audio component */
>>   static void sync_eld_via_acomp(struct hda_codec *codec,
>>   			       struct hdmi_spec_per_pin *per_pin)
>> @@ -1794,6 +1853,7 @@ static void sync_eld_via_acomp(struct hda_codec *codec,
>>   	struct hdmi_eld *eld = &spec->temp_eld;
>>   	int size;
>>
>> +	mutex_lock(&spec->pcm_lock);
>>   	mutex_lock(&per_pin->lock);
>>   	size = snd_hdac_acomp_get_eld(&codec->bus->core, per_pin->pin_nid,
>>   				      &eld->monitor_present, eld->eld_buffer,
>> @@ -1815,11 +1875,19 @@ static void sync_eld_via_acomp(struct hda_codec *codec,
>>   		eld->eld_size = 0;
>>   	}
>>
>> +	if (spec->dyn_pcm_assign) {
>> +		if (eld->eld_valid)
>> +			hdmi_attach_hda_pcm(spec, per_pin);
>> +		else
>> +			hdmi_detach_hda_pcm(spec, per_pin);
>> +	}
>> +
>>   	update_eld(codec, per_pin, eld);
>>   	snd_jack_report(per_pin->acomp_jack,
>>   			eld->monitor_present ? SND_JACK_AVOUT : 0);
>>    unlock:
>>   	mutex_unlock(&per_pin->lock);
>> +	mutex_unlock(&spec->pcm_lock);
>>   }
>>
>>   static bool hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll)
>> @@ -1875,6 +1943,11 @@ static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid)
>>
>>   	per_pin->pin_nid = pin_nid;
>>   	per_pin->non_pcm = false;
>> +	if (spec->dyn_pcm_assign)
>> +		per_pin->pcm_idx = -1;
>> +	else
>> +		per_pin->pcm_idx = pin_idx;
>> +	per_pin->pin_nid_idx = pin_idx;
>>
>>   	err = hdmi_read_pin_conn(codec, pin_idx);
>>   	if (err < 0)
>> --
>> 1.9.1
>>

  reply	other threads:[~2015-12-16  7:49 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-16  5:42 [PATCH v4 0/5] ALSA: hda - hdmi support dynamic pcm assignment libin.yang
2015-12-16  5:42 ` [PATCH v4 1/5] ALSA: hda - hdmi begin to support dynamic PCM assignment libin.yang
2015-12-16  5:42 ` [PATCH v4 2/5] ALSA: hda - hdmi playback without monitor in dynamic pcm bind mode libin.yang
2015-12-16  5:42 ` [PATCH v4 3/5] ALSA: hda - hdmi operate spdif based on pcm libin.yang
2015-12-16  5:42 ` [PATCH v4 4/5] ALSA: hda - hdmi dynamically bind PCM to pin when monitor hotplug libin.yang
2015-12-16  7:43   ` Takashi Iwai
2015-12-16  7:47     ` Libin Yang [this message]
2015-12-16  5:42 ` [PATCH v4 5/5] ALSA: hda - hdmi setup pin when monitor hotplug in pcm dynamic assignment mode libin.yang
2015-12-16  7:47 ` [PATCH v4 0/5] ALSA: hda - hdmi support dynamic pcm assignment Takashi Iwai
2015-12-16  7:54   ` Libin Yang
2015-12-16  7:59     ` Takashi Iwai
2015-12-16  7:59       ` Libin Yang
2015-12-18  2:53   ` Yang, Libin
2015-12-18 10:48     ` Takashi Iwai
2015-12-18 12:05       ` Takashi Iwai
2015-12-21  0:51         ` Libin Yang
2015-12-21  8:35           ` Takashi Iwai
2015-12-21  8:54             ` Libin Yang
2015-12-21  9:02               ` Takashi Iwai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=567116F8.70705@linux.intel.com \
    --to=libin.yang@linux.intel.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=libin.yang@intel.com \
    --cc=mengdong.lin@intel.com \
    --cc=tiwai@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.