xref: /openbmc/linux/drivers/soc/mediatek/mtk-mutex.c (revision 12cecbf9)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2015 MediaTek Inc.
4  */
5 
6 #include <linux/clk.h>
7 #include <linux/iopoll.h>
8 #include <linux/module.h>
9 #include <linux/of_device.h>
10 #include <linux/of_address.h>
11 #include <linux/platform_device.h>
12 #include <linux/regmap.h>
13 #include <linux/soc/mediatek/mtk-mmsys.h>
14 #include <linux/soc/mediatek/mtk-mutex.h>
15 #include <linux/soc/mediatek/mtk-cmdq.h>
16 
17 #define MT2701_MUTEX0_MOD0			0x2c
18 #define MT2701_MUTEX0_SOF0			0x30
19 #define MT8183_MUTEX0_MOD0			0x30
20 #define MT8183_MUTEX0_SOF0			0x2c
21 
22 #define DISP_REG_MUTEX_EN(n)			(0x20 + 0x20 * (n))
23 #define DISP_REG_MUTEX(n)			(0x24 + 0x20 * (n))
24 #define DISP_REG_MUTEX_RST(n)			(0x28 + 0x20 * (n))
25 #define DISP_REG_MUTEX_MOD(mutex_mod_reg, n)	(mutex_mod_reg + 0x20 * (n))
26 #define DISP_REG_MUTEX_SOF(mutex_sof_reg, n)	(mutex_sof_reg + 0x20 * (n))
27 #define DISP_REG_MUTEX_MOD2(n)			(0x34 + 0x20 * (n))
28 
29 #define INT_MUTEX				BIT(1)
30 
31 #define MT8186_MUTEX_MOD_DISP_OVL0		0
32 #define MT8186_MUTEX_MOD_DISP_OVL0_2L		1
33 #define MT8186_MUTEX_MOD_DISP_RDMA0		2
34 #define MT8186_MUTEX_MOD_DISP_COLOR0		4
35 #define MT8186_MUTEX_MOD_DISP_CCORR0		5
36 #define MT8186_MUTEX_MOD_DISP_AAL0		7
37 #define MT8186_MUTEX_MOD_DISP_GAMMA0		8
38 #define MT8186_MUTEX_MOD_DISP_POSTMASK0		9
39 #define MT8186_MUTEX_MOD_DISP_DITHER0		10
40 #define MT8186_MUTEX_MOD_DISP_RDMA1		17
41 
42 #define MT8186_MUTEX_SOF_SINGLE_MODE		0
43 #define MT8186_MUTEX_SOF_DSI0			1
44 #define MT8186_MUTEX_SOF_DPI0			2
45 #define MT8186_MUTEX_EOF_DSI0			(MT8186_MUTEX_SOF_DSI0 << 6)
46 #define MT8186_MUTEX_EOF_DPI0			(MT8186_MUTEX_SOF_DPI0 << 6)
47 
48 #define MT8167_MUTEX_MOD_DISP_PWM		1
49 #define MT8167_MUTEX_MOD_DISP_OVL0		6
50 #define MT8167_MUTEX_MOD_DISP_OVL1		7
51 #define MT8167_MUTEX_MOD_DISP_RDMA0		8
52 #define MT8167_MUTEX_MOD_DISP_RDMA1		9
53 #define MT8167_MUTEX_MOD_DISP_WDMA0		10
54 #define MT8167_MUTEX_MOD_DISP_CCORR		11
55 #define MT8167_MUTEX_MOD_DISP_COLOR		12
56 #define MT8167_MUTEX_MOD_DISP_AAL		13
57 #define MT8167_MUTEX_MOD_DISP_GAMMA		14
58 #define MT8167_MUTEX_MOD_DISP_DITHER		15
59 #define MT8167_MUTEX_MOD_DISP_UFOE		16
60 
61 #define MT8192_MUTEX_MOD_DISP_OVL0		0
62 #define MT8192_MUTEX_MOD_DISP_OVL0_2L		1
63 #define MT8192_MUTEX_MOD_DISP_RDMA0		2
64 #define MT8192_MUTEX_MOD_DISP_COLOR0		4
65 #define MT8192_MUTEX_MOD_DISP_CCORR0		5
66 #define MT8192_MUTEX_MOD_DISP_AAL0		6
67 #define MT8192_MUTEX_MOD_DISP_GAMMA0		7
68 #define MT8192_MUTEX_MOD_DISP_POSTMASK0		8
69 #define MT8192_MUTEX_MOD_DISP_DITHER0		9
70 #define MT8192_MUTEX_MOD_DISP_OVL2_2L		16
71 #define MT8192_MUTEX_MOD_DISP_RDMA4		17
72 
73 #define MT8183_MUTEX_MOD_DISP_RDMA0		0
74 #define MT8183_MUTEX_MOD_DISP_RDMA1		1
75 #define MT8183_MUTEX_MOD_DISP_OVL0		9
76 #define MT8183_MUTEX_MOD_DISP_OVL0_2L		10
77 #define MT8183_MUTEX_MOD_DISP_OVL1_2L		11
78 #define MT8183_MUTEX_MOD_DISP_WDMA0		12
79 #define MT8183_MUTEX_MOD_DISP_COLOR0		13
80 #define MT8183_MUTEX_MOD_DISP_CCORR0		14
81 #define MT8183_MUTEX_MOD_DISP_AAL0		15
82 #define MT8183_MUTEX_MOD_DISP_GAMMA0		16
83 #define MT8183_MUTEX_MOD_DISP_DITHER0		17
84 
85 #define MT8183_MUTEX_MOD_MDP_RDMA0		2
86 #define MT8183_MUTEX_MOD_MDP_RSZ0		4
87 #define MT8183_MUTEX_MOD_MDP_RSZ1		5
88 #define MT8183_MUTEX_MOD_MDP_TDSHP0		6
89 #define MT8183_MUTEX_MOD_MDP_WROT0		7
90 #define MT8183_MUTEX_MOD_MDP_WDMA		8
91 #define MT8183_MUTEX_MOD_MDP_AAL0		23
92 #define MT8183_MUTEX_MOD_MDP_CCORR0		24
93 
94 #define MT8173_MUTEX_MOD_DISP_OVL0		11
95 #define MT8173_MUTEX_MOD_DISP_OVL1		12
96 #define MT8173_MUTEX_MOD_DISP_RDMA0		13
97 #define MT8173_MUTEX_MOD_DISP_RDMA1		14
98 #define MT8173_MUTEX_MOD_DISP_RDMA2		15
99 #define MT8173_MUTEX_MOD_DISP_WDMA0		16
100 #define MT8173_MUTEX_MOD_DISP_WDMA1		17
101 #define MT8173_MUTEX_MOD_DISP_COLOR0		18
102 #define MT8173_MUTEX_MOD_DISP_COLOR1		19
103 #define MT8173_MUTEX_MOD_DISP_AAL		20
104 #define MT8173_MUTEX_MOD_DISP_GAMMA		21
105 #define MT8173_MUTEX_MOD_DISP_UFOE		22
106 #define MT8173_MUTEX_MOD_DISP_PWM0		23
107 #define MT8173_MUTEX_MOD_DISP_PWM1		24
108 #define MT8173_MUTEX_MOD_DISP_OD		25
109 
110 #define MT8195_MUTEX_MOD_DISP_OVL0		0
111 #define MT8195_MUTEX_MOD_DISP_WDMA0		1
112 #define MT8195_MUTEX_MOD_DISP_RDMA0		2
113 #define MT8195_MUTEX_MOD_DISP_COLOR0		3
114 #define MT8195_MUTEX_MOD_DISP_CCORR0		4
115 #define MT8195_MUTEX_MOD_DISP_AAL0		5
116 #define MT8195_MUTEX_MOD_DISP_GAMMA0		6
117 #define MT8195_MUTEX_MOD_DISP_DITHER0		7
118 #define MT8195_MUTEX_MOD_DISP_DSI0		8
119 #define MT8195_MUTEX_MOD_DISP_DSC_WRAP0_CORE0	9
120 #define MT8195_MUTEX_MOD_DISP_VPP_MERGE		20
121 #define MT8195_MUTEX_MOD_DISP_DP_INTF0		21
122 #define MT8195_MUTEX_MOD_DISP_PWM0		27
123 
124 #define MT8365_MUTEX_MOD_DISP_OVL0		7
125 #define MT8365_MUTEX_MOD_DISP_OVL0_2L		8
126 #define MT8365_MUTEX_MOD_DISP_RDMA0		9
127 #define MT8365_MUTEX_MOD_DISP_RDMA1		10
128 #define MT8365_MUTEX_MOD_DISP_WDMA0		11
129 #define MT8365_MUTEX_MOD_DISP_COLOR0		12
130 #define MT8365_MUTEX_MOD_DISP_CCORR		13
131 #define MT8365_MUTEX_MOD_DISP_AAL		14
132 #define MT8365_MUTEX_MOD_DISP_GAMMA		15
133 #define MT8365_MUTEX_MOD_DISP_DITHER		16
134 #define MT8365_MUTEX_MOD_DISP_DSI0		17
135 #define MT8365_MUTEX_MOD_DISP_PWM0		20
136 #define MT8365_MUTEX_MOD_DISP_DPI0		22
137 
138 #define MT2712_MUTEX_MOD_DISP_PWM2		10
139 #define MT2712_MUTEX_MOD_DISP_OVL0		11
140 #define MT2712_MUTEX_MOD_DISP_OVL1		12
141 #define MT2712_MUTEX_MOD_DISP_RDMA0		13
142 #define MT2712_MUTEX_MOD_DISP_RDMA1		14
143 #define MT2712_MUTEX_MOD_DISP_RDMA2		15
144 #define MT2712_MUTEX_MOD_DISP_WDMA0		16
145 #define MT2712_MUTEX_MOD_DISP_WDMA1		17
146 #define MT2712_MUTEX_MOD_DISP_COLOR0		18
147 #define MT2712_MUTEX_MOD_DISP_COLOR1		19
148 #define MT2712_MUTEX_MOD_DISP_AAL0		20
149 #define MT2712_MUTEX_MOD_DISP_UFOE		22
150 #define MT2712_MUTEX_MOD_DISP_PWM0		23
151 #define MT2712_MUTEX_MOD_DISP_PWM1		24
152 #define MT2712_MUTEX_MOD_DISP_OD0		25
153 #define MT2712_MUTEX_MOD2_DISP_AAL1		33
154 #define MT2712_MUTEX_MOD2_DISP_OD1		34
155 
156 #define MT2701_MUTEX_MOD_DISP_OVL		3
157 #define MT2701_MUTEX_MOD_DISP_WDMA		6
158 #define MT2701_MUTEX_MOD_DISP_COLOR		7
159 #define MT2701_MUTEX_MOD_DISP_BLS		9
160 #define MT2701_MUTEX_MOD_DISP_RDMA0		10
161 #define MT2701_MUTEX_MOD_DISP_RDMA1		12
162 
163 #define MT2712_MUTEX_SOF_SINGLE_MODE		0
164 #define MT2712_MUTEX_SOF_DSI0			1
165 #define MT2712_MUTEX_SOF_DSI1			2
166 #define MT2712_MUTEX_SOF_DPI0			3
167 #define MT2712_MUTEX_SOF_DPI1			4
168 #define MT2712_MUTEX_SOF_DSI2			5
169 #define MT2712_MUTEX_SOF_DSI3			6
170 #define MT8167_MUTEX_SOF_DPI0			2
171 #define MT8167_MUTEX_SOF_DPI1			3
172 #define MT8183_MUTEX_SOF_DSI0			1
173 #define MT8183_MUTEX_SOF_DPI0			2
174 #define MT8195_MUTEX_SOF_DSI0			1
175 #define MT8195_MUTEX_SOF_DSI1			2
176 #define MT8195_MUTEX_SOF_DP_INTF0		3
177 #define MT8195_MUTEX_SOF_DP_INTF1		4
178 #define MT8195_MUTEX_SOF_DPI0			6 /* for HDMI_TX */
179 #define MT8195_MUTEX_SOF_DPI1			5 /* for digital video out */
180 
181 #define MT8183_MUTEX_EOF_DSI0			(MT8183_MUTEX_SOF_DSI0 << 6)
182 #define MT8183_MUTEX_EOF_DPI0			(MT8183_MUTEX_SOF_DPI0 << 6)
183 #define MT8195_MUTEX_EOF_DSI0			(MT8195_MUTEX_SOF_DSI0 << 7)
184 #define MT8195_MUTEX_EOF_DSI1			(MT8195_MUTEX_SOF_DSI1 << 7)
185 #define MT8195_MUTEX_EOF_DP_INTF0		(MT8195_MUTEX_SOF_DP_INTF0 << 7)
186 #define MT8195_MUTEX_EOF_DP_INTF1		(MT8195_MUTEX_SOF_DP_INTF1 << 7)
187 #define MT8195_MUTEX_EOF_DPI0			(MT8195_MUTEX_SOF_DPI0 << 7)
188 #define MT8195_MUTEX_EOF_DPI1			(MT8195_MUTEX_SOF_DPI1 << 7)
189 
190 struct mtk_mutex {
191 	int id;
192 	bool claimed;
193 };
194 
195 enum mtk_mutex_sof_id {
196 	MUTEX_SOF_SINGLE_MODE,
197 	MUTEX_SOF_DSI0,
198 	MUTEX_SOF_DSI1,
199 	MUTEX_SOF_DPI0,
200 	MUTEX_SOF_DPI1,
201 	MUTEX_SOF_DSI2,
202 	MUTEX_SOF_DSI3,
203 	MUTEX_SOF_DP_INTF0,
204 	MUTEX_SOF_DP_INTF1,
205 	DDP_MUTEX_SOF_MAX,
206 };
207 
208 struct mtk_mutex_data {
209 	const unsigned int *mutex_mod;
210 	const unsigned int *mutex_sof;
211 	const unsigned int mutex_mod_reg;
212 	const unsigned int mutex_sof_reg;
213 	const unsigned int *mutex_table_mod;
214 	const bool no_clk;
215 };
216 
217 struct mtk_mutex_ctx {
218 	struct device			*dev;
219 	struct clk			*clk;
220 	void __iomem			*regs;
221 	struct mtk_mutex		mutex[10];
222 	const struct mtk_mutex_data	*data;
223 	phys_addr_t			addr;
224 	struct cmdq_client_reg		cmdq_reg;
225 };
226 
227 static const unsigned int mt2701_mutex_mod[DDP_COMPONENT_ID_MAX] = {
228 	[DDP_COMPONENT_BLS] = MT2701_MUTEX_MOD_DISP_BLS,
229 	[DDP_COMPONENT_COLOR0] = MT2701_MUTEX_MOD_DISP_COLOR,
230 	[DDP_COMPONENT_OVL0] = MT2701_MUTEX_MOD_DISP_OVL,
231 	[DDP_COMPONENT_RDMA0] = MT2701_MUTEX_MOD_DISP_RDMA0,
232 	[DDP_COMPONENT_RDMA1] = MT2701_MUTEX_MOD_DISP_RDMA1,
233 	[DDP_COMPONENT_WDMA0] = MT2701_MUTEX_MOD_DISP_WDMA,
234 };
235 
236 static const unsigned int mt2712_mutex_mod[DDP_COMPONENT_ID_MAX] = {
237 	[DDP_COMPONENT_AAL0] = MT2712_MUTEX_MOD_DISP_AAL0,
238 	[DDP_COMPONENT_AAL1] = MT2712_MUTEX_MOD2_DISP_AAL1,
239 	[DDP_COMPONENT_COLOR0] = MT2712_MUTEX_MOD_DISP_COLOR0,
240 	[DDP_COMPONENT_COLOR1] = MT2712_MUTEX_MOD_DISP_COLOR1,
241 	[DDP_COMPONENT_OD0] = MT2712_MUTEX_MOD_DISP_OD0,
242 	[DDP_COMPONENT_OD1] = MT2712_MUTEX_MOD2_DISP_OD1,
243 	[DDP_COMPONENT_OVL0] = MT2712_MUTEX_MOD_DISP_OVL0,
244 	[DDP_COMPONENT_OVL1] = MT2712_MUTEX_MOD_DISP_OVL1,
245 	[DDP_COMPONENT_PWM0] = MT2712_MUTEX_MOD_DISP_PWM0,
246 	[DDP_COMPONENT_PWM1] = MT2712_MUTEX_MOD_DISP_PWM1,
247 	[DDP_COMPONENT_PWM2] = MT2712_MUTEX_MOD_DISP_PWM2,
248 	[DDP_COMPONENT_RDMA0] = MT2712_MUTEX_MOD_DISP_RDMA0,
249 	[DDP_COMPONENT_RDMA1] = MT2712_MUTEX_MOD_DISP_RDMA1,
250 	[DDP_COMPONENT_RDMA2] = MT2712_MUTEX_MOD_DISP_RDMA2,
251 	[DDP_COMPONENT_UFOE] = MT2712_MUTEX_MOD_DISP_UFOE,
252 	[DDP_COMPONENT_WDMA0] = MT2712_MUTEX_MOD_DISP_WDMA0,
253 	[DDP_COMPONENT_WDMA1] = MT2712_MUTEX_MOD_DISP_WDMA1,
254 };
255 
256 static const unsigned int mt8167_mutex_mod[DDP_COMPONENT_ID_MAX] = {
257 	[DDP_COMPONENT_AAL0] = MT8167_MUTEX_MOD_DISP_AAL,
258 	[DDP_COMPONENT_CCORR] = MT8167_MUTEX_MOD_DISP_CCORR,
259 	[DDP_COMPONENT_COLOR0] = MT8167_MUTEX_MOD_DISP_COLOR,
260 	[DDP_COMPONENT_DITHER0] = MT8167_MUTEX_MOD_DISP_DITHER,
261 	[DDP_COMPONENT_GAMMA] = MT8167_MUTEX_MOD_DISP_GAMMA,
262 	[DDP_COMPONENT_OVL0] = MT8167_MUTEX_MOD_DISP_OVL0,
263 	[DDP_COMPONENT_OVL1] = MT8167_MUTEX_MOD_DISP_OVL1,
264 	[DDP_COMPONENT_PWM0] = MT8167_MUTEX_MOD_DISP_PWM,
265 	[DDP_COMPONENT_RDMA0] = MT8167_MUTEX_MOD_DISP_RDMA0,
266 	[DDP_COMPONENT_RDMA1] = MT8167_MUTEX_MOD_DISP_RDMA1,
267 	[DDP_COMPONENT_UFOE] = MT8167_MUTEX_MOD_DISP_UFOE,
268 	[DDP_COMPONENT_WDMA0] = MT8167_MUTEX_MOD_DISP_WDMA0,
269 };
270 
271 static const unsigned int mt8173_mutex_mod[DDP_COMPONENT_ID_MAX] = {
272 	[DDP_COMPONENT_AAL0] = MT8173_MUTEX_MOD_DISP_AAL,
273 	[DDP_COMPONENT_COLOR0] = MT8173_MUTEX_MOD_DISP_COLOR0,
274 	[DDP_COMPONENT_COLOR1] = MT8173_MUTEX_MOD_DISP_COLOR1,
275 	[DDP_COMPONENT_GAMMA] = MT8173_MUTEX_MOD_DISP_GAMMA,
276 	[DDP_COMPONENT_OD0] = MT8173_MUTEX_MOD_DISP_OD,
277 	[DDP_COMPONENT_OVL0] = MT8173_MUTEX_MOD_DISP_OVL0,
278 	[DDP_COMPONENT_OVL1] = MT8173_MUTEX_MOD_DISP_OVL1,
279 	[DDP_COMPONENT_PWM0] = MT8173_MUTEX_MOD_DISP_PWM0,
280 	[DDP_COMPONENT_PWM1] = MT8173_MUTEX_MOD_DISP_PWM1,
281 	[DDP_COMPONENT_RDMA0] = MT8173_MUTEX_MOD_DISP_RDMA0,
282 	[DDP_COMPONENT_RDMA1] = MT8173_MUTEX_MOD_DISP_RDMA1,
283 	[DDP_COMPONENT_RDMA2] = MT8173_MUTEX_MOD_DISP_RDMA2,
284 	[DDP_COMPONENT_UFOE] = MT8173_MUTEX_MOD_DISP_UFOE,
285 	[DDP_COMPONENT_WDMA0] = MT8173_MUTEX_MOD_DISP_WDMA0,
286 	[DDP_COMPONENT_WDMA1] = MT8173_MUTEX_MOD_DISP_WDMA1,
287 };
288 
289 static const unsigned int mt8183_mutex_mod[DDP_COMPONENT_ID_MAX] = {
290 	[DDP_COMPONENT_AAL0] = MT8183_MUTEX_MOD_DISP_AAL0,
291 	[DDP_COMPONENT_CCORR] = MT8183_MUTEX_MOD_DISP_CCORR0,
292 	[DDP_COMPONENT_COLOR0] = MT8183_MUTEX_MOD_DISP_COLOR0,
293 	[DDP_COMPONENT_DITHER0] = MT8183_MUTEX_MOD_DISP_DITHER0,
294 	[DDP_COMPONENT_GAMMA] = MT8183_MUTEX_MOD_DISP_GAMMA0,
295 	[DDP_COMPONENT_OVL0] = MT8183_MUTEX_MOD_DISP_OVL0,
296 	[DDP_COMPONENT_OVL_2L0] = MT8183_MUTEX_MOD_DISP_OVL0_2L,
297 	[DDP_COMPONENT_OVL_2L1] = MT8183_MUTEX_MOD_DISP_OVL1_2L,
298 	[DDP_COMPONENT_RDMA0] = MT8183_MUTEX_MOD_DISP_RDMA0,
299 	[DDP_COMPONENT_RDMA1] = MT8183_MUTEX_MOD_DISP_RDMA1,
300 	[DDP_COMPONENT_WDMA0] = MT8183_MUTEX_MOD_DISP_WDMA0,
301 };
302 
303 static const unsigned int mt8183_mutex_table_mod[MUTEX_MOD_IDX_MAX] = {
304 	[MUTEX_MOD_IDX_MDP_RDMA0] = MT8183_MUTEX_MOD_MDP_RDMA0,
305 	[MUTEX_MOD_IDX_MDP_RSZ0] = MT8183_MUTEX_MOD_MDP_RSZ0,
306 	[MUTEX_MOD_IDX_MDP_RSZ1] = MT8183_MUTEX_MOD_MDP_RSZ1,
307 	[MUTEX_MOD_IDX_MDP_TDSHP0] = MT8183_MUTEX_MOD_MDP_TDSHP0,
308 	[MUTEX_MOD_IDX_MDP_WROT0] = MT8183_MUTEX_MOD_MDP_WROT0,
309 	[MUTEX_MOD_IDX_MDP_WDMA] = MT8183_MUTEX_MOD_MDP_WDMA,
310 	[MUTEX_MOD_IDX_MDP_AAL0] = MT8183_MUTEX_MOD_MDP_AAL0,
311 	[MUTEX_MOD_IDX_MDP_CCORR0] = MT8183_MUTEX_MOD_MDP_CCORR0,
312 };
313 
314 static const unsigned int mt8186_mutex_mod[DDP_COMPONENT_ID_MAX] = {
315 	[DDP_COMPONENT_AAL0] = MT8186_MUTEX_MOD_DISP_AAL0,
316 	[DDP_COMPONENT_CCORR] = MT8186_MUTEX_MOD_DISP_CCORR0,
317 	[DDP_COMPONENT_COLOR0] = MT8186_MUTEX_MOD_DISP_COLOR0,
318 	[DDP_COMPONENT_DITHER0] = MT8186_MUTEX_MOD_DISP_DITHER0,
319 	[DDP_COMPONENT_GAMMA] = MT8186_MUTEX_MOD_DISP_GAMMA0,
320 	[DDP_COMPONENT_OVL0] = MT8186_MUTEX_MOD_DISP_OVL0,
321 	[DDP_COMPONENT_OVL_2L0] = MT8186_MUTEX_MOD_DISP_OVL0_2L,
322 	[DDP_COMPONENT_POSTMASK0] = MT8186_MUTEX_MOD_DISP_POSTMASK0,
323 	[DDP_COMPONENT_RDMA0] = MT8186_MUTEX_MOD_DISP_RDMA0,
324 	[DDP_COMPONENT_RDMA1] = MT8186_MUTEX_MOD_DISP_RDMA1,
325 };
326 
327 static const unsigned int mt8192_mutex_mod[DDP_COMPONENT_ID_MAX] = {
328 	[DDP_COMPONENT_AAL0] = MT8192_MUTEX_MOD_DISP_AAL0,
329 	[DDP_COMPONENT_CCORR] = MT8192_MUTEX_MOD_DISP_CCORR0,
330 	[DDP_COMPONENT_COLOR0] = MT8192_MUTEX_MOD_DISP_COLOR0,
331 	[DDP_COMPONENT_DITHER0] = MT8192_MUTEX_MOD_DISP_DITHER0,
332 	[DDP_COMPONENT_GAMMA] = MT8192_MUTEX_MOD_DISP_GAMMA0,
333 	[DDP_COMPONENT_POSTMASK0] = MT8192_MUTEX_MOD_DISP_POSTMASK0,
334 	[DDP_COMPONENT_OVL0] = MT8192_MUTEX_MOD_DISP_OVL0,
335 	[DDP_COMPONENT_OVL_2L0] = MT8192_MUTEX_MOD_DISP_OVL0_2L,
336 	[DDP_COMPONENT_OVL_2L2] = MT8192_MUTEX_MOD_DISP_OVL2_2L,
337 	[DDP_COMPONENT_RDMA0] = MT8192_MUTEX_MOD_DISP_RDMA0,
338 	[DDP_COMPONENT_RDMA4] = MT8192_MUTEX_MOD_DISP_RDMA4,
339 };
340 
341 static const unsigned int mt8195_mutex_mod[DDP_COMPONENT_ID_MAX] = {
342 	[DDP_COMPONENT_OVL0] = MT8195_MUTEX_MOD_DISP_OVL0,
343 	[DDP_COMPONENT_WDMA0] = MT8195_MUTEX_MOD_DISP_WDMA0,
344 	[DDP_COMPONENT_RDMA0] = MT8195_MUTEX_MOD_DISP_RDMA0,
345 	[DDP_COMPONENT_COLOR0] = MT8195_MUTEX_MOD_DISP_COLOR0,
346 	[DDP_COMPONENT_CCORR] = MT8195_MUTEX_MOD_DISP_CCORR0,
347 	[DDP_COMPONENT_AAL0] = MT8195_MUTEX_MOD_DISP_AAL0,
348 	[DDP_COMPONENT_GAMMA] = MT8195_MUTEX_MOD_DISP_GAMMA0,
349 	[DDP_COMPONENT_DITHER0] = MT8195_MUTEX_MOD_DISP_DITHER0,
350 	[DDP_COMPONENT_MERGE0] = MT8195_MUTEX_MOD_DISP_VPP_MERGE,
351 	[DDP_COMPONENT_DSC0] = MT8195_MUTEX_MOD_DISP_DSC_WRAP0_CORE0,
352 	[DDP_COMPONENT_DSI0] = MT8195_MUTEX_MOD_DISP_DSI0,
353 	[DDP_COMPONENT_PWM0] = MT8195_MUTEX_MOD_DISP_PWM0,
354 	[DDP_COMPONENT_DP_INTF0] = MT8195_MUTEX_MOD_DISP_DP_INTF0,
355 };
356 
357 static const unsigned int mt8365_mutex_mod[DDP_COMPONENT_ID_MAX] = {
358 	[DDP_COMPONENT_AAL0] = MT8365_MUTEX_MOD_DISP_AAL,
359 	[DDP_COMPONENT_CCORR] = MT8365_MUTEX_MOD_DISP_CCORR,
360 	[DDP_COMPONENT_COLOR0] = MT8365_MUTEX_MOD_DISP_COLOR0,
361 	[DDP_COMPONENT_DITHER0] = MT8365_MUTEX_MOD_DISP_DITHER,
362 	[DDP_COMPONENT_DPI0] = MT8365_MUTEX_MOD_DISP_DPI0,
363 	[DDP_COMPONENT_DSI0] = MT8365_MUTEX_MOD_DISP_DSI0,
364 	[DDP_COMPONENT_GAMMA] = MT8365_MUTEX_MOD_DISP_GAMMA,
365 	[DDP_COMPONENT_OVL0] = MT8365_MUTEX_MOD_DISP_OVL0,
366 	[DDP_COMPONENT_OVL_2L0] = MT8365_MUTEX_MOD_DISP_OVL0_2L,
367 	[DDP_COMPONENT_PWM0] = MT8365_MUTEX_MOD_DISP_PWM0,
368 	[DDP_COMPONENT_RDMA0] = MT8365_MUTEX_MOD_DISP_RDMA0,
369 	[DDP_COMPONENT_RDMA1] = MT8365_MUTEX_MOD_DISP_RDMA1,
370 	[DDP_COMPONENT_WDMA0] = MT8365_MUTEX_MOD_DISP_WDMA0,
371 };
372 
373 static const unsigned int mt2712_mutex_sof[DDP_MUTEX_SOF_MAX] = {
374 	[MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
375 	[MUTEX_SOF_DSI0] = MUTEX_SOF_DSI0,
376 	[MUTEX_SOF_DSI1] = MUTEX_SOF_DSI1,
377 	[MUTEX_SOF_DPI0] = MUTEX_SOF_DPI0,
378 	[MUTEX_SOF_DPI1] = MUTEX_SOF_DPI1,
379 	[MUTEX_SOF_DSI2] = MUTEX_SOF_DSI2,
380 	[MUTEX_SOF_DSI3] = MUTEX_SOF_DSI3,
381 };
382 
383 static const unsigned int mt8167_mutex_sof[DDP_MUTEX_SOF_MAX] = {
384 	[MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
385 	[MUTEX_SOF_DSI0] = MUTEX_SOF_DSI0,
386 	[MUTEX_SOF_DPI0] = MT8167_MUTEX_SOF_DPI0,
387 	[MUTEX_SOF_DPI1] = MT8167_MUTEX_SOF_DPI1,
388 };
389 
390 /* Add EOF setting so overlay hardware can receive frame done irq */
391 static const unsigned int mt8183_mutex_sof[DDP_MUTEX_SOF_MAX] = {
392 	[MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
393 	[MUTEX_SOF_DSI0] = MUTEX_SOF_DSI0 | MT8183_MUTEX_EOF_DSI0,
394 	[MUTEX_SOF_DPI0] = MT8183_MUTEX_SOF_DPI0 | MT8183_MUTEX_EOF_DPI0,
395 };
396 
397 static const unsigned int mt8186_mutex_sof[MUTEX_SOF_DSI3 + 1] = {
398 	[MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
399 	[MUTEX_SOF_DSI0] = MT8186_MUTEX_SOF_DSI0 | MT8186_MUTEX_EOF_DSI0,
400 	[MUTEX_SOF_DPI0] = MT8186_MUTEX_SOF_DPI0 | MT8186_MUTEX_EOF_DPI0,
401 };
402 
403 /*
404  * To support refresh mode(video mode), DISP_REG_MUTEX_SOF should
405  * select the EOF source and configure the EOF plus timing from the
406  * module that provides the timing signal.
407  * So that MUTEX can not only send a STREAM_DONE event to GCE
408  * but also detect the error at end of frame(EAEOF) when EOF signal
409  * arrives.
410  */
411 static const unsigned int mt8195_mutex_sof[DDP_MUTEX_SOF_MAX] = {
412 	[MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
413 	[MUTEX_SOF_DSI0] = MT8195_MUTEX_SOF_DSI0 | MT8195_MUTEX_EOF_DSI0,
414 	[MUTEX_SOF_DSI1] = MT8195_MUTEX_SOF_DSI1 | MT8195_MUTEX_EOF_DSI1,
415 	[MUTEX_SOF_DPI0] = MT8195_MUTEX_SOF_DPI0 | MT8195_MUTEX_EOF_DPI0,
416 	[MUTEX_SOF_DPI1] = MT8195_MUTEX_SOF_DPI1 | MT8195_MUTEX_EOF_DPI1,
417 	[MUTEX_SOF_DP_INTF0] =
418 		MT8195_MUTEX_SOF_DP_INTF0 | MT8195_MUTEX_EOF_DP_INTF0,
419 	[MUTEX_SOF_DP_INTF1] =
420 		MT8195_MUTEX_SOF_DP_INTF1 | MT8195_MUTEX_EOF_DP_INTF1,
421 };
422 
423 static const struct mtk_mutex_data mt2701_mutex_driver_data = {
424 	.mutex_mod = mt2701_mutex_mod,
425 	.mutex_sof = mt2712_mutex_sof,
426 	.mutex_mod_reg = MT2701_MUTEX0_MOD0,
427 	.mutex_sof_reg = MT2701_MUTEX0_SOF0,
428 };
429 
430 static const struct mtk_mutex_data mt2712_mutex_driver_data = {
431 	.mutex_mod = mt2712_mutex_mod,
432 	.mutex_sof = mt2712_mutex_sof,
433 	.mutex_mod_reg = MT2701_MUTEX0_MOD0,
434 	.mutex_sof_reg = MT2701_MUTEX0_SOF0,
435 };
436 
437 static const struct mtk_mutex_data mt8167_mutex_driver_data = {
438 	.mutex_mod = mt8167_mutex_mod,
439 	.mutex_sof = mt8167_mutex_sof,
440 	.mutex_mod_reg = MT2701_MUTEX0_MOD0,
441 	.mutex_sof_reg = MT2701_MUTEX0_SOF0,
442 	.no_clk = true,
443 };
444 
445 static const struct mtk_mutex_data mt8173_mutex_driver_data = {
446 	.mutex_mod = mt8173_mutex_mod,
447 	.mutex_sof = mt2712_mutex_sof,
448 	.mutex_mod_reg = MT2701_MUTEX0_MOD0,
449 	.mutex_sof_reg = MT2701_MUTEX0_SOF0,
450 };
451 
452 static const struct mtk_mutex_data mt8183_mutex_driver_data = {
453 	.mutex_mod = mt8183_mutex_mod,
454 	.mutex_sof = mt8183_mutex_sof,
455 	.mutex_mod_reg = MT8183_MUTEX0_MOD0,
456 	.mutex_sof_reg = MT8183_MUTEX0_SOF0,
457 	.mutex_table_mod = mt8183_mutex_table_mod,
458 	.no_clk = true,
459 };
460 
461 static const struct mtk_mutex_data mt8186_mutex_driver_data = {
462 	.mutex_mod = mt8186_mutex_mod,
463 	.mutex_sof = mt8186_mutex_sof,
464 	.mutex_mod_reg = MT8183_MUTEX0_MOD0,
465 	.mutex_sof_reg = MT8183_MUTEX0_SOF0,
466 };
467 
468 static const struct mtk_mutex_data mt8192_mutex_driver_data = {
469 	.mutex_mod = mt8192_mutex_mod,
470 	.mutex_sof = mt8183_mutex_sof,
471 	.mutex_mod_reg = MT8183_MUTEX0_MOD0,
472 	.mutex_sof_reg = MT8183_MUTEX0_SOF0,
473 };
474 
475 static const struct mtk_mutex_data mt8195_mutex_driver_data = {
476 	.mutex_mod = mt8195_mutex_mod,
477 	.mutex_sof = mt8195_mutex_sof,
478 	.mutex_mod_reg = MT8183_MUTEX0_MOD0,
479 	.mutex_sof_reg = MT8183_MUTEX0_SOF0,
480 };
481 
482 static const struct mtk_mutex_data mt8365_mutex_driver_data = {
483 	.mutex_mod = mt8365_mutex_mod,
484 	.mutex_sof = mt8183_mutex_sof,
485 	.mutex_mod_reg = MT8183_MUTEX0_MOD0,
486 	.mutex_sof_reg = MT8183_MUTEX0_SOF0,
487 	.no_clk = true,
488 };
489 
490 struct mtk_mutex *mtk_mutex_get(struct device *dev)
491 {
492 	struct mtk_mutex_ctx *mtx = dev_get_drvdata(dev);
493 	int i;
494 
495 	for (i = 0; i < 10; i++)
496 		if (!mtx->mutex[i].claimed) {
497 			mtx->mutex[i].claimed = true;
498 			return &mtx->mutex[i];
499 		}
500 
501 	return ERR_PTR(-EBUSY);
502 }
503 EXPORT_SYMBOL_GPL(mtk_mutex_get);
504 
505 void mtk_mutex_put(struct mtk_mutex *mutex)
506 {
507 	struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
508 						 mutex[mutex->id]);
509 
510 	WARN_ON(&mtx->mutex[mutex->id] != mutex);
511 
512 	mutex->claimed = false;
513 }
514 EXPORT_SYMBOL_GPL(mtk_mutex_put);
515 
516 int mtk_mutex_prepare(struct mtk_mutex *mutex)
517 {
518 	struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
519 						 mutex[mutex->id]);
520 	return clk_prepare_enable(mtx->clk);
521 }
522 EXPORT_SYMBOL_GPL(mtk_mutex_prepare);
523 
524 void mtk_mutex_unprepare(struct mtk_mutex *mutex)
525 {
526 	struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
527 						 mutex[mutex->id]);
528 	clk_disable_unprepare(mtx->clk);
529 }
530 EXPORT_SYMBOL_GPL(mtk_mutex_unprepare);
531 
532 void mtk_mutex_add_comp(struct mtk_mutex *mutex,
533 			enum mtk_ddp_comp_id id)
534 {
535 	struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
536 						 mutex[mutex->id]);
537 	unsigned int reg;
538 	unsigned int sof_id;
539 	unsigned int offset;
540 
541 	WARN_ON(&mtx->mutex[mutex->id] != mutex);
542 
543 	switch (id) {
544 	case DDP_COMPONENT_DSI0:
545 		sof_id = MUTEX_SOF_DSI0;
546 		break;
547 	case DDP_COMPONENT_DSI1:
548 		sof_id = MUTEX_SOF_DSI0;
549 		break;
550 	case DDP_COMPONENT_DSI2:
551 		sof_id = MUTEX_SOF_DSI2;
552 		break;
553 	case DDP_COMPONENT_DSI3:
554 		sof_id = MUTEX_SOF_DSI3;
555 		break;
556 	case DDP_COMPONENT_DPI0:
557 		sof_id = MUTEX_SOF_DPI0;
558 		break;
559 	case DDP_COMPONENT_DPI1:
560 		sof_id = MUTEX_SOF_DPI1;
561 		break;
562 	case DDP_COMPONENT_DP_INTF0:
563 		sof_id = MUTEX_SOF_DP_INTF0;
564 		break;
565 	default:
566 		if (mtx->data->mutex_mod[id] < 32) {
567 			offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg,
568 						    mutex->id);
569 			reg = readl_relaxed(mtx->regs + offset);
570 			reg |= 1 << mtx->data->mutex_mod[id];
571 			writel_relaxed(reg, mtx->regs + offset);
572 		} else {
573 			offset = DISP_REG_MUTEX_MOD2(mutex->id);
574 			reg = readl_relaxed(mtx->regs + offset);
575 			reg |= 1 << (mtx->data->mutex_mod[id] - 32);
576 			writel_relaxed(reg, mtx->regs + offset);
577 		}
578 		return;
579 	}
580 
581 	writel_relaxed(mtx->data->mutex_sof[sof_id],
582 		       mtx->regs +
583 		       DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg, mutex->id));
584 }
585 EXPORT_SYMBOL_GPL(mtk_mutex_add_comp);
586 
587 void mtk_mutex_remove_comp(struct mtk_mutex *mutex,
588 			   enum mtk_ddp_comp_id id)
589 {
590 	struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
591 						 mutex[mutex->id]);
592 	unsigned int reg;
593 	unsigned int offset;
594 
595 	WARN_ON(&mtx->mutex[mutex->id] != mutex);
596 
597 	switch (id) {
598 	case DDP_COMPONENT_DSI0:
599 	case DDP_COMPONENT_DSI1:
600 	case DDP_COMPONENT_DSI2:
601 	case DDP_COMPONENT_DSI3:
602 	case DDP_COMPONENT_DPI0:
603 	case DDP_COMPONENT_DPI1:
604 	case DDP_COMPONENT_DP_INTF0:
605 		writel_relaxed(MUTEX_SOF_SINGLE_MODE,
606 			       mtx->regs +
607 			       DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg,
608 						  mutex->id));
609 		break;
610 	default:
611 		if (mtx->data->mutex_mod[id] < 32) {
612 			offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg,
613 						    mutex->id);
614 			reg = readl_relaxed(mtx->regs + offset);
615 			reg &= ~(1 << mtx->data->mutex_mod[id]);
616 			writel_relaxed(reg, mtx->regs + offset);
617 		} else {
618 			offset = DISP_REG_MUTEX_MOD2(mutex->id);
619 			reg = readl_relaxed(mtx->regs + offset);
620 			reg &= ~(1 << (mtx->data->mutex_mod[id] - 32));
621 			writel_relaxed(reg, mtx->regs + offset);
622 		}
623 		break;
624 	}
625 }
626 EXPORT_SYMBOL_GPL(mtk_mutex_remove_comp);
627 
628 void mtk_mutex_enable(struct mtk_mutex *mutex)
629 {
630 	struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
631 						 mutex[mutex->id]);
632 
633 	WARN_ON(&mtx->mutex[mutex->id] != mutex);
634 
635 	writel(1, mtx->regs + DISP_REG_MUTEX_EN(mutex->id));
636 }
637 EXPORT_SYMBOL_GPL(mtk_mutex_enable);
638 
639 int mtk_mutex_enable_by_cmdq(struct mtk_mutex *mutex, void *pkt)
640 {
641 	struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
642 						 mutex[mutex->id]);
643 #if IS_REACHABLE(CONFIG_MTK_CMDQ)
644 	struct cmdq_pkt *cmdq_pkt = (struct cmdq_pkt *)pkt;
645 
646 	WARN_ON(&mtx->mutex[mutex->id] != mutex);
647 
648 	if (!mtx->cmdq_reg.size) {
649 		dev_err(mtx->dev, "mediatek,gce-client-reg hasn't been set");
650 		return -EINVAL;
651 	}
652 
653 	cmdq_pkt_write(cmdq_pkt, mtx->cmdq_reg.subsys,
654 		       mtx->addr + DISP_REG_MUTEX_EN(mutex->id), 1);
655 	return 0;
656 #else
657 	dev_err(mtx->dev, "Not support for enable MUTEX by CMDQ");
658 	return -ENODEV;
659 #endif
660 }
661 EXPORT_SYMBOL_GPL(mtk_mutex_enable_by_cmdq);
662 
663 void mtk_mutex_disable(struct mtk_mutex *mutex)
664 {
665 	struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
666 						 mutex[mutex->id]);
667 
668 	WARN_ON(&mtx->mutex[mutex->id] != mutex);
669 
670 	writel(0, mtx->regs + DISP_REG_MUTEX_EN(mutex->id));
671 }
672 EXPORT_SYMBOL_GPL(mtk_mutex_disable);
673 
674 void mtk_mutex_acquire(struct mtk_mutex *mutex)
675 {
676 	struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
677 						 mutex[mutex->id]);
678 	u32 tmp;
679 
680 	writel(1, mtx->regs + DISP_REG_MUTEX_EN(mutex->id));
681 	writel(1, mtx->regs + DISP_REG_MUTEX(mutex->id));
682 	if (readl_poll_timeout_atomic(mtx->regs + DISP_REG_MUTEX(mutex->id),
683 				      tmp, tmp & INT_MUTEX, 1, 10000))
684 		pr_err("could not acquire mutex %d\n", mutex->id);
685 }
686 EXPORT_SYMBOL_GPL(mtk_mutex_acquire);
687 
688 void mtk_mutex_release(struct mtk_mutex *mutex)
689 {
690 	struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
691 						 mutex[mutex->id]);
692 
693 	writel(0, mtx->regs + DISP_REG_MUTEX(mutex->id));
694 }
695 EXPORT_SYMBOL_GPL(mtk_mutex_release);
696 
697 int mtk_mutex_write_mod(struct mtk_mutex *mutex,
698 			enum mtk_mutex_mod_index idx, bool clear)
699 {
700 	struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
701 						 mutex[mutex->id]);
702 	unsigned int reg;
703 	unsigned int offset;
704 
705 	WARN_ON(&mtx->mutex[mutex->id] != mutex);
706 
707 	if (idx < MUTEX_MOD_IDX_MDP_RDMA0 ||
708 	    idx >= MUTEX_MOD_IDX_MAX) {
709 		dev_err(mtx->dev, "Not supported MOD table index : %d", idx);
710 		return -EINVAL;
711 	}
712 
713 	offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg,
714 				    mutex->id);
715 	reg = readl_relaxed(mtx->regs + offset);
716 
717 	if (clear)
718 		reg &= ~BIT(mtx->data->mutex_table_mod[idx]);
719 	else
720 		reg |= BIT(mtx->data->mutex_table_mod[idx]);
721 
722 	writel_relaxed(reg, mtx->regs + offset);
723 
724 	return 0;
725 }
726 EXPORT_SYMBOL_GPL(mtk_mutex_write_mod);
727 
728 int mtk_mutex_write_sof(struct mtk_mutex *mutex,
729 			enum mtk_mutex_sof_index idx)
730 {
731 	struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
732 						 mutex[mutex->id]);
733 
734 	WARN_ON(&mtx->mutex[mutex->id] != mutex);
735 
736 	if (idx < MUTEX_SOF_IDX_SINGLE_MODE ||
737 	    idx >= MUTEX_SOF_IDX_MAX) {
738 		dev_err(mtx->dev, "Not supported SOF index : %d", idx);
739 		return -EINVAL;
740 	}
741 
742 	writel_relaxed(idx, mtx->regs +
743 		       DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg, mutex->id));
744 
745 	return 0;
746 }
747 EXPORT_SYMBOL_GPL(mtk_mutex_write_sof);
748 
749 static int mtk_mutex_probe(struct platform_device *pdev)
750 {
751 	struct device *dev = &pdev->dev;
752 	struct mtk_mutex_ctx *mtx;
753 	struct resource *regs;
754 	int i;
755 #if IS_REACHABLE(CONFIG_MTK_CMDQ)
756 	int ret;
757 #endif
758 
759 	mtx = devm_kzalloc(dev, sizeof(*mtx), GFP_KERNEL);
760 	if (!mtx)
761 		return -ENOMEM;
762 
763 	for (i = 0; i < 10; i++)
764 		mtx->mutex[i].id = i;
765 
766 	mtx->data = of_device_get_match_data(dev);
767 
768 	if (!mtx->data->no_clk) {
769 		mtx->clk = devm_clk_get(dev, NULL);
770 		if (IS_ERR(mtx->clk)) {
771 			if (PTR_ERR(mtx->clk) != -EPROBE_DEFER)
772 				dev_err(dev, "Failed to get clock\n");
773 			return PTR_ERR(mtx->clk);
774 		}
775 	}
776 
777 	mtx->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &regs);
778 	if (IS_ERR(mtx->regs)) {
779 		dev_err(dev, "Failed to map mutex registers\n");
780 		return PTR_ERR(mtx->regs);
781 	}
782 	mtx->addr = regs->start;
783 
784 #if IS_REACHABLE(CONFIG_MTK_CMDQ)
785 	ret = cmdq_dev_get_client_reg(dev, &mtx->cmdq_reg, 0);
786 	if (ret)
787 		dev_dbg(dev, "No mediatek,gce-client-reg!\n");
788 #endif
789 
790 	platform_set_drvdata(pdev, mtx);
791 
792 	return 0;
793 }
794 
795 static int mtk_mutex_remove(struct platform_device *pdev)
796 {
797 	return 0;
798 }
799 
800 static const struct of_device_id mutex_driver_dt_match[] = {
801 	{ .compatible = "mediatek,mt2701-disp-mutex",
802 	  .data = &mt2701_mutex_driver_data},
803 	{ .compatible = "mediatek,mt2712-disp-mutex",
804 	  .data = &mt2712_mutex_driver_data},
805 	{ .compatible = "mediatek,mt8167-disp-mutex",
806 	  .data = &mt8167_mutex_driver_data},
807 	{ .compatible = "mediatek,mt8173-disp-mutex",
808 	  .data = &mt8173_mutex_driver_data},
809 	{ .compatible = "mediatek,mt8183-disp-mutex",
810 	  .data = &mt8183_mutex_driver_data},
811 	{ .compatible = "mediatek,mt8186-disp-mutex",
812 	  .data = &mt8186_mutex_driver_data},
813 	{ .compatible = "mediatek,mt8192-disp-mutex",
814 	  .data = &mt8192_mutex_driver_data},
815 	{ .compatible = "mediatek,mt8195-disp-mutex",
816 	  .data = &mt8195_mutex_driver_data},
817 	{ .compatible = "mediatek,mt8365-disp-mutex",
818 	  .data = &mt8365_mutex_driver_data},
819 	{},
820 };
821 MODULE_DEVICE_TABLE(of, mutex_driver_dt_match);
822 
823 static struct platform_driver mtk_mutex_driver = {
824 	.probe		= mtk_mutex_probe,
825 	.remove		= mtk_mutex_remove,
826 	.driver		= {
827 		.name	= "mediatek-mutex",
828 		.owner	= THIS_MODULE,
829 		.of_match_table = mutex_driver_dt_match,
830 	},
831 };
832 
833 builtin_platform_driver(mtk_mutex_driver);
834