提交 fef1255e 编写于 作者: P popcornmix 提交者: Zheng Zengkai

vc4_hdmi: Set HDMI_MAI_FMT

raspberrypi inclusion
category: feature
bugzilla: 50432

--------------------------------

The hardware uses this for generating the right audio
data island packets when using formats other than PCM
Signed-off-by: NDom Cobley <popcornmix@gmail.com>
Signed-off-by: NFang Yafen <yafen@iscas.ac.cn>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 6ab09f8b
......@@ -979,6 +979,44 @@ static void vc4_hdmi_audio_shutdown(struct snd_pcm_substream *substream,
vc4_hdmi->audio.substream = NULL;
}
static int sample_rate_to_mai_fmt(int samplerate)
{
switch (samplerate) {
case 8000:
return VC4_HDMI_MAI_SAMPLE_RATE_8000;
case 11025:
return VC4_HDMI_MAI_SAMPLE_RATE_11025;
case 12000:
return VC4_HDMI_MAI_SAMPLE_RATE_12000;
case 16000:
return VC4_HDMI_MAI_SAMPLE_RATE_16000;
case 22050:
return VC4_HDMI_MAI_SAMPLE_RATE_22050;
case 24000:
return VC4_HDMI_MAI_SAMPLE_RATE_24000;
case 32000:
return VC4_HDMI_MAI_SAMPLE_RATE_32000;
case 44100:
return VC4_HDMI_MAI_SAMPLE_RATE_44100;
case 48000:
return VC4_HDMI_MAI_SAMPLE_RATE_48000;
case 64000:
return VC4_HDMI_MAI_SAMPLE_RATE_64000;
case 88200:
return VC4_HDMI_MAI_SAMPLE_RATE_88200;
case 96000:
return VC4_HDMI_MAI_SAMPLE_RATE_96000;
case 128000:
return VC4_HDMI_MAI_SAMPLE_RATE_128000;
case 176400:
return VC4_HDMI_MAI_SAMPLE_RATE_176400;
case 192000:
return VC4_HDMI_MAI_SAMPLE_RATE_192000;
default:
return VC4_HDMI_MAI_SAMPLE_RATE_NOT_INDICATED;
}
}
/* HDMI audio codec callbacks */
static int vc4_hdmi_audio_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
......@@ -989,6 +1027,8 @@ static int vc4_hdmi_audio_hw_params(struct snd_pcm_substream *substream,
struct device *dev = &vc4_hdmi->pdev->dev;
u32 audio_packet_config, channel_mask;
u32 channel_map;
u32 mai_audio_format;
u32 mai_sample_rate;
if (substream != vc4_hdmi->audio.substream)
return -EINVAL;
......@@ -1009,6 +1049,14 @@ static int vc4_hdmi_audio_hw_params(struct snd_pcm_substream *substream,
vc4_hdmi_audio_set_mai_clock(vc4_hdmi);
mai_sample_rate = sample_rate_to_mai_fmt(vc4_hdmi->audio.samplerate);
mai_audio_format = VC4_HDMI_MAI_FORMAT_PCM;
HDMI_WRITE(HDMI_MAI_FMT,
VC4_SET_FIELD(mai_sample_rate,
VC4_HDMI_MAI_FORMAT_SAMPLE_RATE) |
VC4_SET_FIELD(mai_audio_format,
VC4_HDMI_MAI_FORMAT_AUDIO_FORMAT));
/* The B frame identifier should match the value used by alsa-lib (8) */
audio_packet_config =
VC4_HDMI_AUDIO_PACKET_ZERO_DATA_ON_SAMPLE_FLAT |
......
......@@ -516,6 +516,36 @@
# define VC4_HDMI_AUDIO_PACKET_CEA_MASK_MASK VC4_MASK(7, 0)
# define VC4_HDMI_AUDIO_PACKET_CEA_MASK_SHIFT 0
# define VC4_HDMI_MAI_FORMAT_AUDIO_FORMAT_MASK VC4_MASK(23, 16)
# define VC4_HDMI_MAI_FORMAT_AUDIO_FORMAT_SHIFT 16
enum {
VC4_HDMI_MAI_FORMAT_PCM = 2,
VC4_HDMI_MAI_FORMAT_HBR = 200,
};
# define VC4_HDMI_MAI_FORMAT_SAMPLE_RATE_MASK VC4_MASK(15, 8)
# define VC4_HDMI_MAI_FORMAT_SAMPLE_RATE_SHIFT 8
enum {
VC4_HDMI_MAI_SAMPLE_RATE_NOT_INDICATED = 0,
VC4_HDMI_MAI_SAMPLE_RATE_8000 = 1,
VC4_HDMI_MAI_SAMPLE_RATE_11025 = 2,
VC4_HDMI_MAI_SAMPLE_RATE_12000 = 3,
VC4_HDMI_MAI_SAMPLE_RATE_16000 = 4,
VC4_HDMI_MAI_SAMPLE_RATE_22050 = 5,
VC4_HDMI_MAI_SAMPLE_RATE_24000 = 6,
VC4_HDMI_MAI_SAMPLE_RATE_32000 = 7,
VC4_HDMI_MAI_SAMPLE_RATE_44100 = 8,
VC4_HDMI_MAI_SAMPLE_RATE_48000 = 9,
VC4_HDMI_MAI_SAMPLE_RATE_64000 = 10,
VC4_HDMI_MAI_SAMPLE_RATE_88200 = 11,
VC4_HDMI_MAI_SAMPLE_RATE_96000 = 12,
VC4_HDMI_MAI_SAMPLE_RATE_128000 = 13,
VC4_HDMI_MAI_SAMPLE_RATE_176400 = 14,
VC4_HDMI_MAI_SAMPLE_RATE_192000 = 15,
};
# define VC4_HDMI_RAM_PACKET_ENABLE BIT(16)
/* When set, the CTS_PERIOD counts based on MAI bus sync pulse instead
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册