mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-10 07:10:27 +00:00
drm/vc4: hdmi: Set HDMI_MAI_FMT
The hardware uses this for generating the right audio data island packets when using formats other than PCM Signed-off-by: Dom Cobley <popcornmix@gmail.com> Signed-off-by: Maxime Ripard <maxime@cerno.tech> Reviewed-by: Nicolas Saenz Julienne <nsaenz@kernel.org> Link: https://patchwork.freedesktop.org/patch/msgid/20210525132354.297468-8-maxime@cerno.tech
This commit is contained in:
parent
1698ecb218
commit
82bd607178
@ -1292,6 +1292,44 @@ static void vc4_hdmi_audio_shutdown(struct snd_pcm_substream *substream,
|
|||||||
vc4_hdmi->audio.substream = NULL;
|
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 */
|
/* HDMI audio codec callbacks */
|
||||||
static int vc4_hdmi_audio_hw_params(struct snd_pcm_substream *substream,
|
static int vc4_hdmi_audio_hw_params(struct snd_pcm_substream *substream,
|
||||||
struct snd_pcm_hw_params *params,
|
struct snd_pcm_hw_params *params,
|
||||||
@ -1302,6 +1340,8 @@ static int vc4_hdmi_audio_hw_params(struct snd_pcm_substream *substream,
|
|||||||
struct device *dev = &vc4_hdmi->pdev->dev;
|
struct device *dev = &vc4_hdmi->pdev->dev;
|
||||||
u32 audio_packet_config, channel_mask;
|
u32 audio_packet_config, channel_mask;
|
||||||
u32 channel_map;
|
u32 channel_map;
|
||||||
|
u32 mai_audio_format;
|
||||||
|
u32 mai_sample_rate;
|
||||||
|
|
||||||
if (substream != vc4_hdmi->audio.substream)
|
if (substream != vc4_hdmi->audio.substream)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -1322,6 +1362,14 @@ static int vc4_hdmi_audio_hw_params(struct snd_pcm_substream *substream,
|
|||||||
|
|
||||||
vc4_hdmi_audio_set_mai_clock(vc4_hdmi);
|
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) */
|
/* The B frame identifier should match the value used by alsa-lib (8) */
|
||||||
audio_packet_config =
|
audio_packet_config =
|
||||||
VC4_HDMI_AUDIO_PACKET_ZERO_DATA_ON_SAMPLE_FLAT |
|
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_MASK VC4_MASK(7, 0)
|
||||||
# define VC4_HDMI_AUDIO_PACKET_CEA_MASK_SHIFT 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)
|
# define VC4_HDMI_RAM_PACKET_ENABLE BIT(16)
|
||||||
|
|
||||||
/* When set, the CTS_PERIOD counts based on MAI bus sync pulse instead
|
/* When set, the CTS_PERIOD counts based on MAI bus sync pulse instead
|
||||||
|
Loading…
x
Reference in New Issue
Block a user