bcm27xx: add support for linux v5.15
[openwrt/staging/chunkeey.git] / target / linux / bcm27xx / patches-5.15 / 950-0447-drm-vc4-Refactor-VEC-TV-mode-setting.patch
1 From 723c2a1a51f64c381ab0b5ad662e3411a6bc9fca Mon Sep 17 00:00:00 2001
2 From: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com>
3 Date: Thu, 15 Jul 2021 01:07:49 +0200
4 Subject: [PATCH] drm/vc4: Refactor VEC TV mode setting
5
6 Change the mode_set function pointer logic to declarative config0,
7 config1 and custom_freq fields, to make TV mode setting logic more
8 concise and uniform.
9
10 Additionally, remove the superfluous tv_mode field, which was redundant
11 with the mode field in struct drm_tv_connector_state.
12
13 Signed-off-by: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com>
14 ---
15 drivers/gpu/drm/vc4/vc4_vec.c | 69 +++++++++++------------------------
16 1 file changed, 22 insertions(+), 47 deletions(-)
17
18 --- a/drivers/gpu/drm/vc4/vc4_vec.c
19 +++ b/drivers/gpu/drm/vc4/vc4_vec.c
20 @@ -170,8 +170,6 @@ struct vc4_vec {
21
22 struct clk *clock;
23
24 - const struct vc4_vec_tv_mode *tv_mode;
25 -
26 struct debugfs_regset32 regset;
27 };
28
29 @@ -211,7 +209,9 @@ enum vc4_vec_tv_mode_id {
30
31 struct vc4_vec_tv_mode {
32 const struct drm_display_mode *mode;
33 - void (*mode_set)(struct vc4_vec *vec);
34 + u32 config0;
35 + u32 config1;
36 + u32 custom_freq;
37 };
38
39 static const struct debugfs_reg32 vec_regs[] = {
40 @@ -241,18 +241,6 @@ static const struct debugfs_reg32 vec_re
41 VC4_REG32(VEC_DAC_MISC),
42 };
43
44 -static void vc4_vec_ntsc_mode_set(struct vc4_vec *vec)
45 -{
46 - VEC_WRITE(VEC_CONFIG0, VEC_CONFIG0_NTSC_STD | VEC_CONFIG0_PDEN);
47 - VEC_WRITE(VEC_CONFIG1, VEC_CONFIG1_C_CVBS_CVBS);
48 -}
49 -
50 -static void vc4_vec_ntsc_j_mode_set(struct vc4_vec *vec)
51 -{
52 - VEC_WRITE(VEC_CONFIG0, VEC_CONFIG0_NTSC_STD);
53 - VEC_WRITE(VEC_CONFIG1, VEC_CONFIG1_C_CVBS_CVBS);
54 -}
55 -
56 static const struct drm_display_mode ntsc_mode = {
57 DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 13500,
58 720, 720 + 14, 720 + 14 + 64, 720 + 14 + 64 + 60, 0,
59 @@ -260,21 +248,6 @@ static const struct drm_display_mode nts
60 DRM_MODE_FLAG_INTERLACE)
61 };
62
63 -static void vc4_vec_pal_mode_set(struct vc4_vec *vec)
64 -{
65 - VEC_WRITE(VEC_CONFIG0, VEC_CONFIG0_PAL_BDGHI_STD);
66 - VEC_WRITE(VEC_CONFIG1, VEC_CONFIG1_C_CVBS_CVBS);
67 -}
68 -
69 -static void vc4_vec_pal_m_mode_set(struct vc4_vec *vec)
70 -{
71 - VEC_WRITE(VEC_CONFIG0, VEC_CONFIG0_PAL_BDGHI_STD);
72 - VEC_WRITE(VEC_CONFIG1,
73 - VEC_CONFIG1_C_CVBS_CVBS | VEC_CONFIG1_CUSTOM_FREQ);
74 - VEC_WRITE(VEC_FREQ3_2, 0x223b);
75 - VEC_WRITE(VEC_FREQ1_0, 0x61d1);
76 -}
77 -
78 static const struct drm_display_mode pal_mode = {
79 DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 13500,
80 720, 720 + 20, 720 + 20 + 64, 720 + 20 + 64 + 60, 0,
81 @@ -285,19 +258,24 @@ static const struct drm_display_mode pal
82 static const struct vc4_vec_tv_mode vc4_vec_tv_modes[] = {
83 [VC4_VEC_TV_MODE_NTSC] = {
84 .mode = &ntsc_mode,
85 - .mode_set = vc4_vec_ntsc_mode_set,
86 + .config0 = VEC_CONFIG0_NTSC_STD | VEC_CONFIG0_PDEN,
87 + .config1 = VEC_CONFIG1_C_CVBS_CVBS,
88 },
89 [VC4_VEC_TV_MODE_NTSC_J] = {
90 .mode = &ntsc_mode,
91 - .mode_set = vc4_vec_ntsc_j_mode_set,
92 + .config0 = VEC_CONFIG0_NTSC_STD,
93 + .config1 = VEC_CONFIG1_C_CVBS_CVBS,
94 },
95 [VC4_VEC_TV_MODE_PAL] = {
96 .mode = &pal_mode,
97 - .mode_set = vc4_vec_pal_mode_set,
98 + .config0 = VEC_CONFIG0_PAL_BDGHI_STD,
99 + .config1 = VEC_CONFIG1_C_CVBS_CVBS,
100 },
101 [VC4_VEC_TV_MODE_PAL_M] = {
102 .mode = &pal_mode,
103 - .mode_set = vc4_vec_pal_m_mode_set,
104 + .config0 = VEC_CONFIG0_PAL_BDGHI_STD,
105 + .config1 = VEC_CONFIG1_C_CVBS_CVBS | VEC_CONFIG1_CUSTOM_FREQ,
106 + .custom_freq = 0x223b61d1,
107 },
108 };
109
110 @@ -367,7 +345,6 @@ static struct drm_connector *vc4_vec_con
111 drm_object_attach_property(&connector->base,
112 dev->mode_config.tv_mode_property,
113 VC4_VEC_TV_MODE_NTSC);
114 - vec->tv_mode = &vc4_vec_tv_modes[VC4_VEC_TV_MODE_NTSC];
115
116 drm_connector_attach_encoder(connector, vec->encoder);
117
118 @@ -400,6 +377,7 @@ static void vc4_vec_encoder_enable(struc
119 {
120 struct vc4_vec_encoder *vc4_vec_encoder = to_vc4_vec_encoder(encoder);
121 struct vc4_vec *vec = vc4_vec_encoder->vec;
122 + unsigned int tv_mode = vec->connector->state->tv.mode;
123 int ret;
124
125 ret = pm_runtime_get_sync(&vec->pdev->dev);
126 @@ -455,7 +433,15 @@ static void vc4_vec_encoder_enable(struc
127 /* Mask all interrupts. */
128 VEC_WRITE(VEC_MASK0, 0);
129
130 - vec->tv_mode->mode_set(vec);
131 + VEC_WRITE(VEC_CONFIG0, vc4_vec_tv_modes[tv_mode].config0);
132 + VEC_WRITE(VEC_CONFIG1, vc4_vec_tv_modes[tv_mode].config1);
133 + if (vc4_vec_tv_modes[tv_mode].custom_freq != 0) {
134 + VEC_WRITE(VEC_FREQ3_2,
135 + (vc4_vec_tv_modes[tv_mode].custom_freq >> 16) &
136 + 0xffff);
137 + VEC_WRITE(VEC_FREQ1_0,
138 + vc4_vec_tv_modes[tv_mode].custom_freq & 0xffff);
139 + }
140
141 VEC_WRITE(VEC_DAC_MISC,
142 VEC_DAC_MISC_VID_ACT | VEC_DAC_MISC_DAC_RST_N);
143 @@ -470,16 +456,6 @@ static bool vc4_vec_encoder_mode_fixup(s
144 return true;
145 }
146
147 -static void vc4_vec_encoder_atomic_mode_set(struct drm_encoder *encoder,
148 - struct drm_crtc_state *crtc_state,
149 - struct drm_connector_state *conn_state)
150 -{
151 - struct vc4_vec_encoder *vc4_vec_encoder = to_vc4_vec_encoder(encoder);
152 - struct vc4_vec *vec = vc4_vec_encoder->vec;
153 -
154 - vec->tv_mode = &vc4_vec_tv_modes[conn_state->tv.mode];
155 -}
156 -
157 static int vc4_vec_encoder_atomic_check(struct drm_encoder *encoder,
158 struct drm_crtc_state *crtc_state,
159 struct drm_connector_state *conn_state)
160 @@ -500,7 +476,6 @@ static const struct drm_encoder_helper_f
161 .enable = vc4_vec_encoder_enable,
162 .mode_fixup = vc4_vec_encoder_mode_fixup,
163 .atomic_check = vc4_vec_encoder_atomic_check,
164 - .atomic_mode_set = vc4_vec_encoder_atomic_mode_set,
165 };
166
167 static const struct vc4_vec_variant bcm2835_vec_variant = {