[alsa-devel] [PATCH] ALSA: hda - hdmi create spdif ctl based on pcm
From: Libin Yang libin.yang@linux.intel.com
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 --- sound/pci/hda/patch_hdmi.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index dfb7c26..2f949fb 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c @@ -2255,6 +2255,7 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo, hinfo->nid = 0;
mutex_lock(&spec->pcm_lock); + snd_hda_spdif_ctls_unassign(codec, pcm_idx); clear_bit(pcm_idx, &spec->pcm_in_use); pin_idx = hinfo_to_pin_index(codec, hinfo); if (spec->dyn_pcm_assign && pin_idx < 0) { @@ -2276,8 +2277,6 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo, pinctl & ~PIN_OUT); }
- snd_hda_spdif_ctls_unassign(codec, pcm_idx); - mutex_lock(&per_pin->lock); per_pin->chmap_set = false; memset(per_pin->chmap, 0, sizeof(per_pin->chmap)); @@ -2560,19 +2559,29 @@ static int generic_hdmi_build_controls(struct hda_codec *codec) err = generic_hdmi_build_jack(codec, pcm_idx); if (err < 0) return err; - }
- for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { - struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); - - err = snd_hda_create_dig_out_ctls(codec, + /* 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; - /* pin number is the same with pcm number so far */ - snd_hda_spdif_ctls_unassign(codec, pin_idx); + snd_hda_spdif_ctls_unassign(codec, pcm_idx); + } + + for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { + struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx);
/* add control for ELD Bytes */ err = hdmi_create_eld_ctl(codec, pin_idx,
Hi Takashi,
This patch is for DP MST audio, and for hda-mst branch.
Regards, Libin
-----Original Message----- From: libin.yang@linux.intel.com [mailto:libin.yang@linux.intel.com] Sent: Friday, January 29, 2016 1:53 PM To: alsa-devel@alsa-project.org; tiwai@suse.de Cc: Lin, Mengdong; Yang, Libin; Libin Yang Subject: [PATCH] ALSA: hda - hdmi create spdif ctl based on pcm
From: Libin Yang libin.yang@linux.intel.com
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
sound/pci/hda/patch_hdmi.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index dfb7c26..2f949fb 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c @@ -2255,6 +2255,7 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo, hinfo->nid = 0;
mutex_lock(&spec->pcm_lock);
clear_bit(pcm_idx, &spec->pcm_in_use); pin_idx = hinfo_to_pin_index(codec, hinfo); if (spec->dyn_pcm_assign && pin_idx < 0) {snd_hda_spdif_ctls_unassign(codec, pcm_idx);
@@ -2276,8 +2277,6 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo, pinctl & ~PIN_OUT); }
snd_hda_spdif_ctls_unassign(codec, pcm_idx);
- mutex_lock(&per_pin->lock); per_pin->chmap_set = false; memset(per_pin->chmap, 0, sizeof(per_pin->chmap));
@@ -2560,19 +2559,29 @@ static int generic_hdmi_build_controls(struct hda_codec *codec) err = generic_hdmi_build_jack(codec, pcm_idx); if (err < 0) return err;
}
for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
struct hdmi_spec_per_pin *per_pin = get_pin(spec,
pin_idx);
err = snd_hda_create_dig_out_ctls(codec,
/* 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;}
/* pin number is the same with pcm number so far */
snd_hda_spdif_ctls_unassign(codec, pin_idx);
snd_hda_spdif_ctls_unassign(codec, pcm_idx);
- }
- for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
struct hdmi_spec_per_pin *per_pin = get_pin(spec,
pin_idx);
/* add control for ELD Bytes */ err = hdmi_create_eld_ctl(codec, pin_idx,
-- 1.9.1
On Fri, 29 Jan 2016 06:59:47 +0100, Yang, Libin wrote:
Hi Takashi,
This patch is for DP MST audio, and for hda-mst branch.
OK, applied now. Also, I rebased topic/hda-mst branch on top of 4.5-rc1 (so that it's now building cleanly).
thanks,
Takashi
Regards, Libin
-----Original Message----- From: libin.yang@linux.intel.com [mailto:libin.yang@linux.intel.com] Sent: Friday, January 29, 2016 1:53 PM To: alsa-devel@alsa-project.org; tiwai@suse.de Cc: Lin, Mengdong; Yang, Libin; Libin Yang Subject: [PATCH] ALSA: hda - hdmi create spdif ctl based on pcm
From: Libin Yang libin.yang@linux.intel.com
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
sound/pci/hda/patch_hdmi.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index dfb7c26..2f949fb 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c @@ -2255,6 +2255,7 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo, hinfo->nid = 0;
mutex_lock(&spec->pcm_lock);
clear_bit(pcm_idx, &spec->pcm_in_use); pin_idx = hinfo_to_pin_index(codec, hinfo); if (spec->dyn_pcm_assign && pin_idx < 0) {snd_hda_spdif_ctls_unassign(codec, pcm_idx);
@@ -2276,8 +2277,6 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo, pinctl & ~PIN_OUT); }
snd_hda_spdif_ctls_unassign(codec, pcm_idx);
- mutex_lock(&per_pin->lock); per_pin->chmap_set = false; memset(per_pin->chmap, 0, sizeof(per_pin->chmap));
@@ -2560,19 +2559,29 @@ static int generic_hdmi_build_controls(struct hda_codec *codec) err = generic_hdmi_build_jack(codec, pcm_idx); if (err < 0) return err;
}
for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
struct hdmi_spec_per_pin *per_pin = get_pin(spec,
pin_idx);
err = snd_hda_create_dig_out_ctls(codec,
/* 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;}
/* pin number is the same with pcm number so far */
snd_hda_spdif_ctls_unassign(codec, pin_idx);
snd_hda_spdif_ctls_unassign(codec, pcm_idx);
- }
- for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
struct hdmi_spec_per_pin *per_pin = get_pin(spec,
pin_idx);
/* add control for ELD Bytes */ err = hdmi_create_eld_ctl(codec, pin_idx,
-- 1.9.1
participants (3)
-
libin.yang@linux.intel.com
-
Takashi Iwai
-
Yang, Libin