Unverified Commit 82bd6071 authored by Dom Cobley's avatar Dom Cobley Committed by Maxime Ripard
Browse files

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: default avatarDom Cobley <popcornmix@gmail.com>
Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
Reviewed-by: default avatarNicolas Saenz Julienne <nsaenz@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20210525132354.297468-8-maxime@cerno.tech
parent 1698ecb2
Loading
Loading
Loading
Loading
+48 −0
Original line number Diff line number Diff line
@@ -1292,6 +1292,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,
@@ -1302,6 +1340,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;
@@ -1322,6 +1362,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 |
+30 −0
Original line number Diff line number Diff line
@@ -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