[alsa-devel] [PATCH] ALSA: hda - program ICT bits to support HBR audio
Takashi Iwai
tiwai at suse.de
Tue Sep 19 22:10:54 CEST 2017
On Tue, 19 Sep 2017 17:00:01 +0200,
Subhransu S. Prusty wrote:
>
> From: Sriram Periyasamy <sriramx.periyasamy at intel.com>
>
> On recent Intel platforms (Haswell, Broadwell, Skylake, ApolloLake,
> KabyLake, ...), the IEC Coding Type (ICT) bitfield in the Digital
> Converter Control #3 needs to be set explicitly for HDMI/DisplayPort
> High Bit Rate (HBR) audio playback to work. This was not required in
> earlier platforms when HBR was first introduced. The ICT bits are
> defined in Section 7.3.3.9 of the HDaudio 1.0a specification.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98797
>
> Signed-off-by: Sriram Periyasamy <sriramx.periyasamy at intel.com>
> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
> Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty at intel.com>
> ---
> include/sound/hda_verbs.h | 1 +
> sound/pci/hda/patch_hdmi.c | 18 ++++++++++++++++++
> 2 files changed, 19 insertions(+)
>
> diff --git a/include/sound/hda_verbs.h b/include/sound/hda_verbs.h
> index d0509db6d0ec..d2004d7feb2b 100644
> --- a/include/sound/hda_verbs.h
> +++ b/include/sound/hda_verbs.h
> @@ -54,6 +54,7 @@ enum {
> #define AC_VERB_GET_EAPD_BTLENABLE 0x0f0c
> #define AC_VERB_GET_DIGI_CONVERT_1 0x0f0d
> #define AC_VERB_GET_DIGI_CONVERT_2 0x0f0e /* unused */
> +#define AC_VERB_SET_DIGI_CONVERT_3 0x73e
The SET verb should be placed in the dedicated section instead.
> #define AC_VERB_GET_VOLUME_KNOB_CONTROL 0x0f0f
> /* f10-f1a: GPIO */
> #define AC_VERB_GET_GPIO_DATA 0x0f15
> diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
> index 53f9311370de..2dcd99d2a757 100644
> --- a/sound/pci/hda/patch_hdmi.c
> +++ b/sound/pci/hda/patch_hdmi.c
> @@ -906,6 +906,7 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t cvt_nid,
> hda_nid_t pin_nid, u32 stream_tag, int format)
> {
> struct hdmi_spec *spec = codec->spec;
> + unsigned int param;
> int err;
>
> err = spec->ops.pin_hbr_setup(codec, pin_nid, is_hbr_format(format));
> @@ -915,6 +916,23 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t cvt_nid,
> return err;
> }
>
> + /*
> + * on recent platforms IEC Coding Type is required for HBR support,
> + * read current Digital Converter settings and set ICT bitfield if
> + * needed.
> + */
> + param = snd_hda_codec_read(codec, cvt_nid, 0,
> + AC_VERB_GET_DIGI_CONVERT_1, 0);
> +
> + param = (param >> 16) & ~(AC_DIG3_ICT);
> +
> + /* on recent platforms ICT mode is required for HBR support */
> + if (is_hbr_format(format))
> + param |= 0x1;
> +
> + snd_hda_codec_write(codec, cvt_nid, 0,
> + AC_VERB_SET_DIGI_CONVERT_3, param);
Do all codecs support this verb? I'm a bit worried, since this
function gets called for all codecs, and some of them must be fairly
old.
thanks,
Takashi
More information about the Alsa-devel
mailing list