From 30f17f05efd5b8e4468440cca5ad1cea0d88652f Mon Sep 17 00:00:00 2001 From: Ben Romberger Date: Thu, 6 Apr 2017 16:08:16 -0700 Subject: [PATCH] ASoC: msm: qdsp6v2: Add TrueHD HDMI compress pass-though Add TrueHD audio format for compressed HDMI pass-through Change-Id: Id8a0b8c3a01c881ae284f13c2c0a36959c2413ac Signed-off-by: Ben Romberger --- include/sound/apr_audio-v2.h | 1 + include/sound/q6asm-v2.h | 1 + include/uapi/sound/compress_params.h | 3 ++- sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c | 25 ++++++++++++++-------- sound/soc/msm/qdsp6v2/q6asm.c | 3 +++ 5 files changed, 23 insertions(+), 10 deletions(-) diff --git a/include/sound/apr_audio-v2.h b/include/sound/apr_audio-v2.h index a5ba1496eef7..bcb53faaf678 100644 --- a/include/sound/apr_audio-v2.h +++ b/include/sound/apr_audio-v2.h @@ -5057,6 +5057,7 @@ struct asm_amrwbplus_fmt_blk_v2 { #define ASM_MEDIA_FMT_VORBIS 0x00010C15 #define ASM_MEDIA_FMT_APE 0x00012F32 #define ASM_MEDIA_FMT_DSD 0x00012F3E +#define ASM_MEDIA_FMT_TRUEHD 0x00013215 /* Media format ID for adaptive transform acoustic coding. This * ID is used by the #ASM_STREAM_CMD_OPEN_WRITE_COMPRESSED command diff --git a/include/sound/q6asm-v2.h b/include/sound/q6asm-v2.h index 29707b26644a..41fcdeb50831 100644 --- a/include/sound/q6asm-v2.h +++ b/include/sound/q6asm-v2.h @@ -55,6 +55,7 @@ #define FORMAT_DSD 0x001d #define FORMAT_APTX 0x001e #define FORMAT_GEN_COMPR 0x001f +#define FORMAT_TRUEHD 0x0020 #define ENCDEC_SBCBITRATE 0x0001 #define ENCDEC_IMMEDIATE_DECODE 0x0002 diff --git a/include/uapi/sound/compress_params.h b/include/uapi/sound/compress_params.h index 6a297ad6d380..f4028e805cc7 100644 --- a/include/uapi/sound/compress_params.h +++ b/include/uapi/sound/compress_params.h @@ -104,7 +104,8 @@ #define SND_AUDIOCODEC_APE ((__u32) 0x00000020) #define SND_AUDIOCODEC_DSD ((__u32) 0x00000021) #define SND_AUDIOCODEC_APTX ((__u32) 0x00000022) -#define SND_AUDIOCODEC_MAX SND_AUDIOCODEC_APTX +#define SND_AUDIOCODEC_TRUEHD ((__u32) 0x00000023) +#define SND_AUDIOCODEC_MAX SND_AUDIOCODEC_TRUEHD /* * Profile and modes are listed with bit masks. This allows for a * more compact representation of fields that will not evolve diff --git a/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c index 2929ea0d735b..8fc09130ab7d 100644 --- a/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c @@ -187,7 +187,7 @@ struct msm_compr_audio { const u32 compr_codecs[] = { SND_AUDIOCODEC_AC3, SND_AUDIOCODEC_EAC3, SND_AUDIOCODEC_DTS, - SND_AUDIOCODEC_DSD}; + SND_AUDIOCODEC_DSD, SND_AUDIOCODEC_TRUEHD}; struct query_audio_effect { uint32_t mod_id; @@ -904,7 +904,7 @@ static void populate_codec_list(struct msm_compr_audio *prtd) COMPR_PLAYBACK_MIN_NUM_FRAGMENTS; prtd->compr_cap.max_fragments = COMPR_PLAYBACK_MAX_NUM_FRAGMENTS; - prtd->compr_cap.num_codecs = 15; + prtd->compr_cap.num_codecs = 16; prtd->compr_cap.codecs[0] = SND_AUDIOCODEC_MP3; prtd->compr_cap.codecs[1] = SND_AUDIOCODEC_AAC; prtd->compr_cap.codecs[2] = SND_AUDIOCODEC_AC3; @@ -920,6 +920,7 @@ static void populate_codec_list(struct msm_compr_audio *prtd) prtd->compr_cap.codecs[12] = SND_AUDIOCODEC_DTS; prtd->compr_cap.codecs[13] = SND_AUDIOCODEC_DSD; prtd->compr_cap.codecs[14] = SND_AUDIOCODEC_APTX; + prtd->compr_cap.codecs[15] = SND_AUDIOCODEC_TRUEHD; } static int msm_compr_send_media_format_block(struct snd_compr_stream *cstream, @@ -1174,6 +1175,10 @@ static int msm_compr_send_media_format_block(struct snd_compr_stream *cstream, pr_err("%s: CMD DSD Format block failed ret %d\n", __func__, ret); break; + case FORMAT_TRUEHD: + pr_debug("SND_AUDIOCODEC_TRUEHD\n"); + /* no media format block needed */ + break; case FORMAT_APTX: pr_debug("SND_AUDIOCODEC_APTX\n"); memset(&aptx_cfg, 0x0, sizeof(struct aptx_dec_bt_addr_cfg)); @@ -1972,6 +1977,12 @@ static int msm_compr_set_params(struct snd_compr_stream *cstream, break; } + case SND_AUDIOCODEC_TRUEHD: { + pr_debug("%s: SND_AUDIOCODEC_TRUEHD\n", __func__); + prtd->codec = FORMAT_TRUEHD; + break; + } + case SND_AUDIOCODEC_APTX: { pr_debug("%s: SND_AUDIOCODEC_APTX\n", __func__); prtd->codec = FORMAT_APTX; @@ -2836,20 +2847,14 @@ static int msm_compr_get_codec_caps(struct snd_compr_stream *cstream, SND_AUDIOSTREAMFORMAT_RAW); break; case SND_AUDIOCODEC_AC3: - break; case SND_AUDIOCODEC_EAC3: - break; case SND_AUDIOCODEC_FLAC: - break; case SND_AUDIOCODEC_VORBIS: - break; case SND_AUDIOCODEC_ALAC: - break; case SND_AUDIOCODEC_APE: - break; case SND_AUDIOCODEC_DTS: - break; case SND_AUDIOCODEC_DSD: + case SND_AUDIOCODEC_TRUEHD: case SND_AUDIOCODEC_APTX: break; default: @@ -3318,6 +3323,7 @@ static int msm_compr_send_dec_params(struct snd_compr_stream *cstream, switch (prtd->codec) { case FORMAT_MP3: case FORMAT_MPEG4_AAC: + case FORMAT_TRUEHD: case FORMAT_APTX: pr_debug("%s: no runtime parameters for codec: %d\n", __func__, prtd->codec); @@ -3385,6 +3391,7 @@ static int msm_compr_dec_params_put(struct snd_kcontrol *kcontrol, case FORMAT_APE: case FORMAT_DTS: case FORMAT_DSD: + case FORMAT_TRUEHD: case FORMAT_APTX: pr_debug("%s: no runtime parameters for codec: %d\n", __func__, prtd->codec); diff --git a/sound/soc/msm/qdsp6v2/q6asm.c b/sound/soc/msm/qdsp6v2/q6asm.c index 731f439f5286..a9241cfdfec7 100644 --- a/sound/soc/msm/qdsp6v2/q6asm.c +++ b/sound/soc/msm/qdsp6v2/q6asm.c @@ -2782,6 +2782,9 @@ static int __q6asm_open_write(struct audio_client *ac, uint32_t format, case FORMAT_GEN_COMPR: open.dec_fmt_id = ASM_MEDIA_FMT_GENERIC_COMPRESSED; break; + case FORMAT_TRUEHD: + open.dec_fmt_id = ASM_MEDIA_FMT_TRUEHD; + break; default: pr_err("%s: Invalid format 0x%x\n", __func__, format); rc = -EINVAL;