ALSA: hda - hdmi create spdif ctl based on pcm
SPDIF ctl should be based on pcm. Each spdif ctl controls one pcm state. This patch creates spdif based on pcm and no longer based on pin. Signed-off-by: Libin Yang <libin.yang@linux.intel.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Родитель
25e4abb33d
Коммит
b09887f891
|
@ -2257,6 +2257,7 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo,
|
||||||
hinfo->nid = 0;
|
hinfo->nid = 0;
|
||||||
|
|
||||||
mutex_lock(&spec->pcm_lock);
|
mutex_lock(&spec->pcm_lock);
|
||||||
|
snd_hda_spdif_ctls_unassign(codec, pcm_idx);
|
||||||
clear_bit(pcm_idx, &spec->pcm_in_use);
|
clear_bit(pcm_idx, &spec->pcm_in_use);
|
||||||
pin_idx = hinfo_to_pin_index(codec, hinfo);
|
pin_idx = hinfo_to_pin_index(codec, hinfo);
|
||||||
if (spec->dyn_pcm_assign && pin_idx < 0) {
|
if (spec->dyn_pcm_assign && pin_idx < 0) {
|
||||||
|
@ -2278,8 +2279,6 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo,
|
||||||
pinctl & ~PIN_OUT);
|
pinctl & ~PIN_OUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
snd_hda_spdif_ctls_unassign(codec, pcm_idx);
|
|
||||||
|
|
||||||
mutex_lock(&per_pin->lock);
|
mutex_lock(&per_pin->lock);
|
||||||
per_pin->chmap_set = false;
|
per_pin->chmap_set = false;
|
||||||
memset(per_pin->chmap, 0, sizeof(per_pin->chmap));
|
memset(per_pin->chmap, 0, sizeof(per_pin->chmap));
|
||||||
|
@ -2562,20 +2561,30 @@ static int generic_hdmi_build_controls(struct hda_codec *codec)
|
||||||
err = generic_hdmi_build_jack(codec, pcm_idx);
|
err = generic_hdmi_build_jack(codec, pcm_idx);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
/* create the spdif for each pcm
|
||||||
|
* pin will be bound when monitor is connected
|
||||||
|
*/
|
||||||
|
if (spec->dyn_pcm_assign)
|
||||||
|
err = snd_hda_create_dig_out_ctls(codec,
|
||||||
|
0, spec->cvt_nids[0],
|
||||||
|
HDA_PCM_TYPE_HDMI);
|
||||||
|
else {
|
||||||
|
struct hdmi_spec_per_pin *per_pin =
|
||||||
|
get_pin(spec, pcm_idx);
|
||||||
|
err = snd_hda_create_dig_out_ctls(codec,
|
||||||
|
per_pin->pin_nid,
|
||||||
|
per_pin->mux_nids[0],
|
||||||
|
HDA_PCM_TYPE_HDMI);
|
||||||
|
}
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
snd_hda_spdif_ctls_unassign(codec, pcm_idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
|
for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
|
||||||
struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx);
|
struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx);
|
||||||
|
|
||||||
err = snd_hda_create_dig_out_ctls(codec,
|
|
||||||
per_pin->pin_nid,
|
|
||||||
per_pin->mux_nids[0],
|
|
||||||
HDA_PCM_TYPE_HDMI);
|
|
||||||
if (err < 0)
|
|
||||||
return err;
|
|
||||||
/* pin number is the same with pcm number so far */
|
|
||||||
snd_hda_spdif_ctls_unassign(codec, pin_idx);
|
|
||||||
|
|
||||||
/* add control for ELD Bytes */
|
/* add control for ELD Bytes */
|
||||||
err = hdmi_create_eld_ctl(codec, pin_idx,
|
err = hdmi_create_eld_ctl(codec, pin_idx,
|
||||||
get_pcm_rec(spec, pin_idx)->device);
|
get_pcm_rec(spec, pin_idx)->device);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче