firmware-utils: bump to git HEAD
[openwrt/openwrt.git] / target / linux / bcm27xx / patches-5.4 / 950-0891-vc4_hdmi-Set-HDMI_MAI_FMT.patch
1 From c9ba62745ba17d21542db28bf7dc28a39e19f7c2 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 | 47 ++++++++++++++++++++++++++++++++++
12 drivers/gpu/drm/vc4/vc4_regs.h | 31 ++++++++++++++++++++++
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 @@ -917,6 +917,45 @@ 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 + {
25 + case 8000:
26 + return VC4_HDMI_MAI_SAMPLE_RATE_8000;
27 + case 11025:
28 + return VC4_HDMI_MAI_SAMPLE_RATE_11025;
29 + case 12000:
30 + return VC4_HDMI_MAI_SAMPLE_RATE_12000;
31 + case 16000:
32 + return VC4_HDMI_MAI_SAMPLE_RATE_16000;
33 + case 22050:
34 + return VC4_HDMI_MAI_SAMPLE_RATE_22050;
35 + case 24000:
36 + return VC4_HDMI_MAI_SAMPLE_RATE_24000;
37 + case 32000:
38 + return VC4_HDMI_MAI_SAMPLE_RATE_32000;
39 + case 44100:
40 + return VC4_HDMI_MAI_SAMPLE_RATE_44100;
41 + case 48000:
42 + return VC4_HDMI_MAI_SAMPLE_RATE_48000;
43 + case 64000:
44 + return VC4_HDMI_MAI_SAMPLE_RATE_64000;
45 + case 88200:
46 + return VC4_HDMI_MAI_SAMPLE_RATE_88200;
47 + case 96000:
48 + return VC4_HDMI_MAI_SAMPLE_RATE_96000;
49 + case 128000:
50 + return VC4_HDMI_MAI_SAMPLE_RATE_128000;
51 + case 176400:
52 + return VC4_HDMI_MAI_SAMPLE_RATE_176400;
53 + case 192000:
54 + return VC4_HDMI_MAI_SAMPLE_RATE_192000;
55 + default:
56 + return VC4_HDMI_MAI_SAMPLE_RATE_NOT_INDICATED;
57 + }
58 +}
59 +
60 /* HDMI audio codec callbacks */
61 static int vc4_hdmi_audio_hw_params(struct snd_pcm_substream *substream,
62 struct snd_pcm_hw_params *params,
63 @@ -926,6 +965,8 @@ static int vc4_hdmi_audio_hw_params(stru
64 struct device *dev = &vc4_hdmi->pdev->dev;
65 u32 audio_packet_config, channel_mask;
66 u32 channel_map;
67 + u32 mai_audio_format;
68 + u32 mai_sample_rate;
69
70 if (substream != vc4_hdmi->audio.substream)
71 return -EINVAL;
72 @@ -946,6 +987,12 @@ static int vc4_hdmi_audio_hw_params(stru
73
74 vc4_hdmi_audio_set_mai_clock(vc4_hdmi);
75
76 + mai_sample_rate = sample_rate_to_mai_fmt(vc4_hdmi->audio.samplerate);
77 + mai_audio_format = VC4_HDMI_MAI_FORMAT_PCM;
78 + HDMI_WRITE(HDMI_MAI_FMT,
79 + VC4_SET_FIELD(mai_sample_rate, VC4_HDMI_MAI_FORMAT_SAMPLE_RATE) |
80 + VC4_SET_FIELD(mai_audio_format, VC4_HDMI_MAI_FORMAT_AUDIO_FORMAT));
81 +
82 /* The B frame identifier should match the value used by alsa-lib (8) */
83 audio_packet_config =
84 VC4_HDMI_AUDIO_PACKET_ZERO_DATA_ON_SAMPLE_FLAT |
85 --- a/drivers/gpu/drm/vc4/vc4_regs.h
86 +++ b/drivers/gpu/drm/vc4/vc4_regs.h
87 @@ -516,6 +516,37 @@
88 # define VC4_HDMI_AUDIO_PACKET_CEA_MASK_MASK VC4_MASK(7, 0)
89 # define VC4_HDMI_AUDIO_PACKET_CEA_MASK_SHIFT 0
90
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