bcm27xx: add kernel 5.10 support
[openwrt/openwrt.git] / target / linux / bcm27xx / patches-5.10 / 950-0313-vc4_hdmi-Set-HDMI_MAI_FMT.patch
1 From 80ba4d12d096a8f7855835ee54dc17d1e3a0d31a Mon Sep 17 00:00:00 2001
2 From: popcornmix <popcornmix@gmail.com>
3 Date: Tue, 10 Mar 2020 22:21:15 +0000
4 Subject: [PATCH] vc4_hdmi: Set HDMI_MAI_FMT
5
6 The hardware uses this for generating the right audio
7 data island packets when using formats other than PCM
8
9 Signed-off-by: Dom Cobley <popcornmix@gmail.com>
10 ---
11 drivers/gpu/drm/vc4/vc4_hdmi.c | 48 ++++++++++++++++++++++++++++++++++
12 drivers/gpu/drm/vc4/vc4_regs.h | 30 +++++++++++++++++++++
13 2 files changed, 78 insertions(+)
14
15 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
16 +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
17 @@ -988,6 +988,44 @@ static void vc4_hdmi_audio_shutdown(stru
18 vc4_hdmi->audio.substream = NULL;
19 }
20
21 +static int sample_rate_to_mai_fmt(int samplerate)
22 +{
23 + switch (samplerate) {
24 + case 8000:
25 + return VC4_HDMI_MAI_SAMPLE_RATE_8000;
26 + case 11025:
27 + return VC4_HDMI_MAI_SAMPLE_RATE_11025;
28 + case 12000:
29 + return VC4_HDMI_MAI_SAMPLE_RATE_12000;
30 + case 16000:
31 + return VC4_HDMI_MAI_SAMPLE_RATE_16000;
32 + case 22050:
33 + return VC4_HDMI_MAI_SAMPLE_RATE_22050;
34 + case 24000:
35 + return VC4_HDMI_MAI_SAMPLE_RATE_24000;
36 + case 32000:
37 + return VC4_HDMI_MAI_SAMPLE_RATE_32000;
38 + case 44100:
39 + return VC4_HDMI_MAI_SAMPLE_RATE_44100;
40 + case 48000:
41 + return VC4_HDMI_MAI_SAMPLE_RATE_48000;
42 + case 64000:
43 + return VC4_HDMI_MAI_SAMPLE_RATE_64000;
44 + case 88200:
45 + return VC4_HDMI_MAI_SAMPLE_RATE_88200;
46 + case 96000:
47 + return VC4_HDMI_MAI_SAMPLE_RATE_96000;
48 + case 128000:
49 + return VC4_HDMI_MAI_SAMPLE_RATE_128000;
50 + case 176400:
51 + return VC4_HDMI_MAI_SAMPLE_RATE_176400;
52 + case 192000:
53 + return VC4_HDMI_MAI_SAMPLE_RATE_192000;
54 + default:
55 + return VC4_HDMI_MAI_SAMPLE_RATE_NOT_INDICATED;
56 + }
57 +}
58 +
59 /* HDMI audio codec callbacks */
60 static int vc4_hdmi_audio_hw_params(struct snd_pcm_substream *substream,
61 struct snd_pcm_hw_params *params,
62 @@ -998,6 +1036,8 @@ static int vc4_hdmi_audio_hw_params(stru
63 struct device *dev = &vc4_hdmi->pdev->dev;
64 u32 audio_packet_config, channel_mask;
65 u32 channel_map;
66 + u32 mai_audio_format;
67 + u32 mai_sample_rate;
68
69 if (substream != vc4_hdmi->audio.substream)
70 return -EINVAL;
71 @@ -1018,6 +1058,14 @@ static int vc4_hdmi_audio_hw_params(stru
72
73 vc4_hdmi_audio_set_mai_clock(vc4_hdmi);
74
75 + mai_sample_rate = sample_rate_to_mai_fmt(vc4_hdmi->audio.samplerate);
76 + mai_audio_format = VC4_HDMI_MAI_FORMAT_PCM;
77 + HDMI_WRITE(HDMI_MAI_FMT,
78 + VC4_SET_FIELD(mai_sample_rate,
79 + VC4_HDMI_MAI_FORMAT_SAMPLE_RATE) |
80 + VC4_SET_FIELD(mai_audio_format,
81 + VC4_HDMI_MAI_FORMAT_AUDIO_FORMAT));
82 +
83 /* The B frame identifier should match the value used by alsa-lib (8) */
84 audio_packet_config =
85 VC4_HDMI_AUDIO_PACKET_ZERO_DATA_ON_SAMPLE_FLAT |
86 --- a/drivers/gpu/drm/vc4/vc4_regs.h
87 +++ b/drivers/gpu/drm/vc4/vc4_regs.h
88 @@ -516,6 +516,36 @@
89 # define VC4_HDMI_AUDIO_PACKET_CEA_MASK_MASK VC4_MASK(7, 0)
90 # define VC4_HDMI_AUDIO_PACKET_CEA_MASK_SHIFT 0
91
92 +# define VC4_HDMI_MAI_FORMAT_AUDIO_FORMAT_MASK VC4_MASK(23, 16)
93 +# define VC4_HDMI_MAI_FORMAT_AUDIO_FORMAT_SHIFT 16
94 +
95 +enum {
96 + VC4_HDMI_MAI_FORMAT_PCM = 2,
97 + VC4_HDMI_MAI_FORMAT_HBR = 200,
98 +};
99 +
100 +# define VC4_HDMI_MAI_FORMAT_SAMPLE_RATE_MASK VC4_MASK(15, 8)
101 +# define VC4_HDMI_MAI_FORMAT_SAMPLE_RATE_SHIFT 8
102 +
103 +enum {
104 + VC4_HDMI_MAI_SAMPLE_RATE_NOT_INDICATED = 0,
105 + VC4_HDMI_MAI_SAMPLE_RATE_8000 = 1,
106 + VC4_HDMI_MAI_SAMPLE_RATE_11025 = 2,
107 + VC4_HDMI_MAI_SAMPLE_RATE_12000 = 3,
108 + VC4_HDMI_MAI_SAMPLE_RATE_16000 = 4,
109 + VC4_HDMI_MAI_SAMPLE_RATE_22050 = 5,
110 + VC4_HDMI_MAI_SAMPLE_RATE_24000 = 6,
111 + VC4_HDMI_MAI_SAMPLE_RATE_32000 = 7,
112 + VC4_HDMI_MAI_SAMPLE_RATE_44100 = 8,
113 + VC4_HDMI_MAI_SAMPLE_RATE_48000 = 9,
114 + VC4_HDMI_MAI_SAMPLE_RATE_64000 = 10,
115 + VC4_HDMI_MAI_SAMPLE_RATE_88200 = 11,
116 + VC4_HDMI_MAI_SAMPLE_RATE_96000 = 12,
117 + VC4_HDMI_MAI_SAMPLE_RATE_128000 = 13,
118 + VC4_HDMI_MAI_SAMPLE_RATE_176400 = 14,
119 + VC4_HDMI_MAI_SAMPLE_RATE_192000 = 15,
120 +};
121 +
122 # define VC4_HDMI_RAM_PACKET_ENABLE BIT(16)
123
124 /* When set, the CTS_PERIOD counts based on MAI bus sync pulse instead