Message ID | 1454046807-138480-1-git-send-email-libin.yang@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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); > + 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, > -- > 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); > > + 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, > > -- > > 1.9.1 >
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,