mtk-mutex.c 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2015 MediaTek Inc.
  4. */
  5. #include <linux/clk.h>
  6. #include <linux/iopoll.h>
  7. #include <linux/module.h>
  8. #include <linux/of.h>
  9. #include <linux/platform_device.h>
  10. #include <linux/regmap.h>
  11. #include <linux/soc/mediatek/mtk-mmsys.h>
  12. #include <linux/soc/mediatek/mtk-mutex.h>
  13. #include <linux/soc/mediatek/mtk-cmdq.h>
  14. #define MTK_MUTEX_MAX_HANDLES 10
  15. #define MT2701_MUTEX0_MOD0 0x2c
  16. #define MT2701_MUTEX0_SOF0 0x30
  17. #define MT8183_MUTEX0_MOD0 0x30
  18. #define MT8183_MUTEX0_SOF0 0x2c
  19. #define DISP_REG_MUTEX_EN(n) (0x20 + 0x20 * (n))
  20. #define DISP_REG_MUTEX(n) (0x24 + 0x20 * (n))
  21. #define DISP_REG_MUTEX_RST(n) (0x28 + 0x20 * (n))
  22. #define DISP_REG_MUTEX_MOD(mutex_mod_reg, n) (mutex_mod_reg + 0x20 * (n))
  23. #define DISP_REG_MUTEX_MOD1(mutex_mod_reg, n) ((mutex_mod_reg) + 0x20 * (n) + 0x4)
  24. #define DISP_REG_MUTEX_SOF(mutex_sof_reg, n) (mutex_sof_reg + 0x20 * (n))
  25. #define DISP_REG_MUTEX_MOD2(n) (0x34 + 0x20 * (n))
  26. #define INT_MUTEX BIT(1)
  27. #define MT8186_MUTEX_MOD_DISP_OVL0 0
  28. #define MT8186_MUTEX_MOD_DISP_OVL0_2L 1
  29. #define MT8186_MUTEX_MOD_DISP_RDMA0 2
  30. #define MT8186_MUTEX_MOD_DISP_COLOR0 4
  31. #define MT8186_MUTEX_MOD_DISP_CCORR0 5
  32. #define MT8186_MUTEX_MOD_DISP_AAL0 7
  33. #define MT8186_MUTEX_MOD_DISP_GAMMA0 8
  34. #define MT8186_MUTEX_MOD_DISP_POSTMASK0 9
  35. #define MT8186_MUTEX_MOD_DISP_DITHER0 10
  36. #define MT8186_MUTEX_MOD_DISP_RDMA1 17
  37. #define MT8186_MUTEX_SOF_SINGLE_MODE 0
  38. #define MT8186_MUTEX_SOF_DSI0 1
  39. #define MT8186_MUTEX_SOF_DPI0 2
  40. #define MT8186_MUTEX_EOF_DSI0 (MT8186_MUTEX_SOF_DSI0 << 6)
  41. #define MT8186_MUTEX_EOF_DPI0 (MT8186_MUTEX_SOF_DPI0 << 6)
  42. #define MT8167_MUTEX_MOD_DISP_PWM 1
  43. #define MT8167_MUTEX_MOD_DISP_OVL0 6
  44. #define MT8167_MUTEX_MOD_DISP_OVL1 7
  45. #define MT8167_MUTEX_MOD_DISP_RDMA0 8
  46. #define MT8167_MUTEX_MOD_DISP_RDMA1 9
  47. #define MT8167_MUTEX_MOD_DISP_WDMA0 10
  48. #define MT8167_MUTEX_MOD_DISP_CCORR 11
  49. #define MT8167_MUTEX_MOD_DISP_COLOR 12
  50. #define MT8167_MUTEX_MOD_DISP_AAL 13
  51. #define MT8167_MUTEX_MOD_DISP_GAMMA 14
  52. #define MT8167_MUTEX_MOD_DISP_DITHER 15
  53. #define MT8167_MUTEX_MOD_DISP_UFOE 16
  54. #define MT8192_MUTEX_MOD_DISP_OVL0 0
  55. #define MT8192_MUTEX_MOD_DISP_OVL0_2L 1
  56. #define MT8192_MUTEX_MOD_DISP_RDMA0 2
  57. #define MT8192_MUTEX_MOD_DISP_COLOR0 4
  58. #define MT8192_MUTEX_MOD_DISP_CCORR0 5
  59. #define MT8192_MUTEX_MOD_DISP_AAL0 6
  60. #define MT8192_MUTEX_MOD_DISP_GAMMA0 7
  61. #define MT8192_MUTEX_MOD_DISP_POSTMASK0 8
  62. #define MT8192_MUTEX_MOD_DISP_DITHER0 9
  63. #define MT8192_MUTEX_MOD_DISP_OVL2_2L 16
  64. #define MT8192_MUTEX_MOD_DISP_RDMA4 17
  65. #define MT8183_MUTEX_MOD_DISP_RDMA0 0
  66. #define MT8183_MUTEX_MOD_DISP_RDMA1 1
  67. #define MT8183_MUTEX_MOD_DISP_OVL0 9
  68. #define MT8183_MUTEX_MOD_DISP_OVL0_2L 10
  69. #define MT8183_MUTEX_MOD_DISP_OVL1_2L 11
  70. #define MT8183_MUTEX_MOD_DISP_WDMA0 12
  71. #define MT8183_MUTEX_MOD_DISP_COLOR0 13
  72. #define MT8183_MUTEX_MOD_DISP_CCORR0 14
  73. #define MT8183_MUTEX_MOD_DISP_AAL0 15
  74. #define MT8183_MUTEX_MOD_DISP_GAMMA0 16
  75. #define MT8183_MUTEX_MOD_DISP_DITHER0 17
  76. #define MT8183_MUTEX_MOD_MDP_RDMA0 2
  77. #define MT8183_MUTEX_MOD_MDP_RSZ0 4
  78. #define MT8183_MUTEX_MOD_MDP_RSZ1 5
  79. #define MT8183_MUTEX_MOD_MDP_TDSHP0 6
  80. #define MT8183_MUTEX_MOD_MDP_WROT0 7
  81. #define MT8183_MUTEX_MOD_MDP_WDMA 8
  82. #define MT8183_MUTEX_MOD_MDP_AAL0 23
  83. #define MT8183_MUTEX_MOD_MDP_CCORR0 24
  84. #define MT8186_MUTEX_MOD_MDP_RDMA0 0
  85. #define MT8186_MUTEX_MOD_MDP_AAL0 2
  86. #define MT8186_MUTEX_MOD_MDP_HDR0 4
  87. #define MT8186_MUTEX_MOD_MDP_RSZ0 5
  88. #define MT8186_MUTEX_MOD_MDP_RSZ1 6
  89. #define MT8186_MUTEX_MOD_MDP_WROT0 7
  90. #define MT8186_MUTEX_MOD_MDP_TDSHP0 9
  91. #define MT8186_MUTEX_MOD_MDP_COLOR0 14
  92. #define MT8173_MUTEX_MOD_DISP_OVL0 11
  93. #define MT8173_MUTEX_MOD_DISP_OVL1 12
  94. #define MT8173_MUTEX_MOD_DISP_RDMA0 13
  95. #define MT8173_MUTEX_MOD_DISP_RDMA1 14
  96. #define MT8173_MUTEX_MOD_DISP_RDMA2 15
  97. #define MT8173_MUTEX_MOD_DISP_WDMA0 16
  98. #define MT8173_MUTEX_MOD_DISP_WDMA1 17
  99. #define MT8173_MUTEX_MOD_DISP_COLOR0 18
  100. #define MT8173_MUTEX_MOD_DISP_COLOR1 19
  101. #define MT8173_MUTEX_MOD_DISP_AAL 20
  102. #define MT8173_MUTEX_MOD_DISP_GAMMA 21
  103. #define MT8173_MUTEX_MOD_DISP_UFOE 22
  104. #define MT8173_MUTEX_MOD_DISP_PWM0 23
  105. #define MT8173_MUTEX_MOD_DISP_PWM1 24
  106. #define MT8173_MUTEX_MOD_DISP_OD 25
  107. #define MT8188_MUTEX_MOD_DISP_OVL0 0
  108. #define MT8188_MUTEX_MOD_DISP_WDMA0 1
  109. #define MT8188_MUTEX_MOD_DISP_RDMA0 2
  110. #define MT8188_MUTEX_MOD_DISP_COLOR0 3
  111. #define MT8188_MUTEX_MOD_DISP_CCORR0 4
  112. #define MT8188_MUTEX_MOD_DISP_AAL0 5
  113. #define MT8188_MUTEX_MOD_DISP_GAMMA0 6
  114. #define MT8188_MUTEX_MOD_DISP_DITHER0 7
  115. #define MT8188_MUTEX_MOD_DISP_DSI0 8
  116. #define MT8188_MUTEX_MOD_DISP_DSC_WRAP0_CORE0 9
  117. #define MT8188_MUTEX_MOD_DISP_VPP_MERGE 20
  118. #define MT8188_MUTEX_MOD_DISP_DP_INTF0 21
  119. #define MT8188_MUTEX_MOD_DISP_POSTMASK0 24
  120. #define MT8188_MUTEX_MOD2_DISP_PWM0 33
  121. #define MT8188_MUTEX_MOD_DISP1_MDP_RDMA0 0
  122. #define MT8188_MUTEX_MOD_DISP1_MDP_RDMA1 1
  123. #define MT8188_MUTEX_MOD_DISP1_MDP_RDMA2 2
  124. #define MT8188_MUTEX_MOD_DISP1_MDP_RDMA3 3
  125. #define MT8188_MUTEX_MOD_DISP1_MDP_RDMA4 4
  126. #define MT8188_MUTEX_MOD_DISP1_MDP_RDMA5 5
  127. #define MT8188_MUTEX_MOD_DISP1_MDP_RDMA6 6
  128. #define MT8188_MUTEX_MOD_DISP1_MDP_RDMA7 7
  129. #define MT8188_MUTEX_MOD_DISP1_PADDING0 8
  130. #define MT8188_MUTEX_MOD_DISP1_PADDING1 9
  131. #define MT8188_MUTEX_MOD_DISP1_PADDING2 10
  132. #define MT8188_MUTEX_MOD_DISP1_PADDING3 11
  133. #define MT8188_MUTEX_MOD_DISP1_PADDING4 12
  134. #define MT8188_MUTEX_MOD_DISP1_PADDING5 13
  135. #define MT8188_MUTEX_MOD_DISP1_PADDING6 14
  136. #define MT8188_MUTEX_MOD_DISP1_PADDING7 15
  137. #define MT8188_MUTEX_MOD_DISP1_VPP_MERGE0 20
  138. #define MT8188_MUTEX_MOD_DISP1_VPP_MERGE1 21
  139. #define MT8188_MUTEX_MOD_DISP1_VPP_MERGE2 22
  140. #define MT8188_MUTEX_MOD_DISP1_VPP_MERGE3 23
  141. #define MT8188_MUTEX_MOD_DISP1_VPP_MERGE4 24
  142. #define MT8188_MUTEX_MOD_DISP1_DISP_MIXER 30
  143. #define MT8188_MUTEX_MOD_DISP1_DP_INTF1 39
  144. #define MT8195_MUTEX_MOD_DISP_OVL0 0
  145. #define MT8195_MUTEX_MOD_DISP_WDMA0 1
  146. #define MT8195_MUTEX_MOD_DISP_RDMA0 2
  147. #define MT8195_MUTEX_MOD_DISP_COLOR0 3
  148. #define MT8195_MUTEX_MOD_DISP_CCORR0 4
  149. #define MT8195_MUTEX_MOD_DISP_AAL0 5
  150. #define MT8195_MUTEX_MOD_DISP_GAMMA0 6
  151. #define MT8195_MUTEX_MOD_DISP_DITHER0 7
  152. #define MT8195_MUTEX_MOD_DISP_DSI0 8
  153. #define MT8195_MUTEX_MOD_DISP_DSC_WRAP0_CORE0 9
  154. #define MT8195_MUTEX_MOD_DISP_VPP_MERGE 20
  155. #define MT8195_MUTEX_MOD_DISP_DP_INTF0 21
  156. #define MT8195_MUTEX_MOD_DISP_PWM0 27
  157. #define MT8195_MUTEX_MOD_DISP1_MDP_RDMA0 0
  158. #define MT8195_MUTEX_MOD_DISP1_MDP_RDMA1 1
  159. #define MT8195_MUTEX_MOD_DISP1_MDP_RDMA2 2
  160. #define MT8195_MUTEX_MOD_DISP1_MDP_RDMA3 3
  161. #define MT8195_MUTEX_MOD_DISP1_MDP_RDMA4 4
  162. #define MT8195_MUTEX_MOD_DISP1_MDP_RDMA5 5
  163. #define MT8195_MUTEX_MOD_DISP1_MDP_RDMA6 6
  164. #define MT8195_MUTEX_MOD_DISP1_MDP_RDMA7 7
  165. #define MT8195_MUTEX_MOD_DISP1_VPP_MERGE0 8
  166. #define MT8195_MUTEX_MOD_DISP1_VPP_MERGE1 9
  167. #define MT8195_MUTEX_MOD_DISP1_VPP_MERGE2 10
  168. #define MT8195_MUTEX_MOD_DISP1_VPP_MERGE3 11
  169. #define MT8195_MUTEX_MOD_DISP1_VPP_MERGE4 12
  170. #define MT8195_MUTEX_MOD_DISP1_DISP_MIXER 18
  171. #define MT8195_MUTEX_MOD_DISP1_DPI0 25
  172. #define MT8195_MUTEX_MOD_DISP1_DPI1 26
  173. #define MT8195_MUTEX_MOD_DISP1_DP_INTF0 27
  174. /* VPPSYS0 */
  175. #define MT8195_MUTEX_MOD_MDP_RDMA0 0
  176. #define MT8195_MUTEX_MOD_MDP_FG0 1
  177. #define MT8195_MUTEX_MOD_MDP_STITCH0 2
  178. #define MT8195_MUTEX_MOD_MDP_HDR0 3
  179. #define MT8195_MUTEX_MOD_MDP_AAL0 4
  180. #define MT8195_MUTEX_MOD_MDP_RSZ0 5
  181. #define MT8195_MUTEX_MOD_MDP_TDSHP0 6
  182. #define MT8195_MUTEX_MOD_MDP_COLOR0 7
  183. #define MT8195_MUTEX_MOD_MDP_OVL0 8
  184. #define MT8195_MUTEX_MOD_MDP_PAD0 9
  185. #define MT8195_MUTEX_MOD_MDP_TCC0 10
  186. #define MT8195_MUTEX_MOD_MDP_WROT0 11
  187. /* VPPSYS1 */
  188. #define MT8195_MUTEX_MOD_MDP_TCC1 3
  189. #define MT8195_MUTEX_MOD_MDP_RDMA1 4
  190. #define MT8195_MUTEX_MOD_MDP_RDMA2 5
  191. #define MT8195_MUTEX_MOD_MDP_RDMA3 6
  192. #define MT8195_MUTEX_MOD_MDP_FG1 7
  193. #define MT8195_MUTEX_MOD_MDP_FG2 8
  194. #define MT8195_MUTEX_MOD_MDP_FG3 9
  195. #define MT8195_MUTEX_MOD_MDP_HDR1 10
  196. #define MT8195_MUTEX_MOD_MDP_HDR2 11
  197. #define MT8195_MUTEX_MOD_MDP_HDR3 12
  198. #define MT8195_MUTEX_MOD_MDP_AAL1 13
  199. #define MT8195_MUTEX_MOD_MDP_AAL2 14
  200. #define MT8195_MUTEX_MOD_MDP_AAL3 15
  201. #define MT8195_MUTEX_MOD_MDP_RSZ1 16
  202. #define MT8195_MUTEX_MOD_MDP_RSZ2 17
  203. #define MT8195_MUTEX_MOD_MDP_RSZ3 18
  204. #define MT8195_MUTEX_MOD_MDP_TDSHP1 19
  205. #define MT8195_MUTEX_MOD_MDP_TDSHP2 20
  206. #define MT8195_MUTEX_MOD_MDP_TDSHP3 21
  207. #define MT8195_MUTEX_MOD_MDP_MERGE2 22
  208. #define MT8195_MUTEX_MOD_MDP_MERGE3 23
  209. #define MT8195_MUTEX_MOD_MDP_COLOR1 24
  210. #define MT8195_MUTEX_MOD_MDP_COLOR2 25
  211. #define MT8195_MUTEX_MOD_MDP_COLOR3 26
  212. #define MT8195_MUTEX_MOD_MDP_OVL1 27
  213. #define MT8195_MUTEX_MOD_MDP_PAD1 28
  214. #define MT8195_MUTEX_MOD_MDP_PAD2 29
  215. #define MT8195_MUTEX_MOD_MDP_PAD3 30
  216. #define MT8195_MUTEX_MOD_MDP_WROT1 31
  217. #define MT8195_MUTEX_MOD_MDP_WROT2 32
  218. #define MT8195_MUTEX_MOD_MDP_WROT3 33
  219. #define MT8365_MUTEX_MOD_DISP_OVL0 7
  220. #define MT8365_MUTEX_MOD_DISP_OVL0_2L 8
  221. #define MT8365_MUTEX_MOD_DISP_RDMA0 9
  222. #define MT8365_MUTEX_MOD_DISP_RDMA1 10
  223. #define MT8365_MUTEX_MOD_DISP_WDMA0 11
  224. #define MT8365_MUTEX_MOD_DISP_COLOR0 12
  225. #define MT8365_MUTEX_MOD_DISP_CCORR 13
  226. #define MT8365_MUTEX_MOD_DISP_AAL 14
  227. #define MT8365_MUTEX_MOD_DISP_GAMMA 15
  228. #define MT8365_MUTEX_MOD_DISP_DITHER 16
  229. #define MT8365_MUTEX_MOD_DISP_DSI0 17
  230. #define MT8365_MUTEX_MOD_DISP_PWM0 20
  231. #define MT8365_MUTEX_MOD_DISP_DPI0 22
  232. #define MT2712_MUTEX_MOD_DISP_PWM2 10
  233. #define MT2712_MUTEX_MOD_DISP_OVL0 11
  234. #define MT2712_MUTEX_MOD_DISP_OVL1 12
  235. #define MT2712_MUTEX_MOD_DISP_RDMA0 13
  236. #define MT2712_MUTEX_MOD_DISP_RDMA1 14
  237. #define MT2712_MUTEX_MOD_DISP_RDMA2 15
  238. #define MT2712_MUTEX_MOD_DISP_WDMA0 16
  239. #define MT2712_MUTEX_MOD_DISP_WDMA1 17
  240. #define MT2712_MUTEX_MOD_DISP_COLOR0 18
  241. #define MT2712_MUTEX_MOD_DISP_COLOR1 19
  242. #define MT2712_MUTEX_MOD_DISP_AAL0 20
  243. #define MT2712_MUTEX_MOD_DISP_UFOE 22
  244. #define MT2712_MUTEX_MOD_DISP_PWM0 23
  245. #define MT2712_MUTEX_MOD_DISP_PWM1 24
  246. #define MT2712_MUTEX_MOD_DISP_OD0 25
  247. #define MT2712_MUTEX_MOD2_DISP_AAL1 33
  248. #define MT2712_MUTEX_MOD2_DISP_OD1 34
  249. #define MT2701_MUTEX_MOD_DISP_OVL 3
  250. #define MT2701_MUTEX_MOD_DISP_WDMA 6
  251. #define MT2701_MUTEX_MOD_DISP_COLOR 7
  252. #define MT2701_MUTEX_MOD_DISP_BLS 9
  253. #define MT2701_MUTEX_MOD_DISP_RDMA0 10
  254. #define MT2701_MUTEX_MOD_DISP_RDMA1 12
  255. #define MT2712_MUTEX_SOF_SINGLE_MODE 0
  256. #define MT2712_MUTEX_SOF_DSI0 1
  257. #define MT2712_MUTEX_SOF_DSI1 2
  258. #define MT2712_MUTEX_SOF_DPI0 3
  259. #define MT2712_MUTEX_SOF_DPI1 4
  260. #define MT2712_MUTEX_SOF_DSI2 5
  261. #define MT2712_MUTEX_SOF_DSI3 6
  262. #define MT8167_MUTEX_SOF_DPI0 2
  263. #define MT8167_MUTEX_SOF_DPI1 3
  264. #define MT8183_MUTEX_SOF_DSI0 1
  265. #define MT8183_MUTEX_SOF_DPI0 2
  266. #define MT8188_MUTEX_SOF_DSI0 1
  267. #define MT8188_MUTEX_SOF_DP_INTF0 3
  268. #define MT8188_MUTEX_SOF_DP_INTF1 4
  269. #define MT8195_MUTEX_SOF_DSI0 1
  270. #define MT8195_MUTEX_SOF_DSI1 2
  271. #define MT8195_MUTEX_SOF_DP_INTF0 3
  272. #define MT8195_MUTEX_SOF_DP_INTF1 4
  273. #define MT8195_MUTEX_SOF_DPI0 6 /* for HDMI_TX */
  274. #define MT8195_MUTEX_SOF_DPI1 5 /* for digital video out */
  275. #define MT8183_MUTEX_EOF_DSI0 (MT8183_MUTEX_SOF_DSI0 << 6)
  276. #define MT8183_MUTEX_EOF_DPI0 (MT8183_MUTEX_SOF_DPI0 << 6)
  277. #define MT8188_MUTEX_EOF_DSI0 (MT8188_MUTEX_SOF_DSI0 << 7)
  278. #define MT8188_MUTEX_EOF_DP_INTF0 (MT8188_MUTEX_SOF_DP_INTF0 << 7)
  279. #define MT8188_MUTEX_EOF_DP_INTF1 (MT8188_MUTEX_SOF_DP_INTF1 << 7)
  280. #define MT8195_MUTEX_EOF_DSI0 (MT8195_MUTEX_SOF_DSI0 << 7)
  281. #define MT8195_MUTEX_EOF_DSI1 (MT8195_MUTEX_SOF_DSI1 << 7)
  282. #define MT8195_MUTEX_EOF_DP_INTF0 (MT8195_MUTEX_SOF_DP_INTF0 << 7)
  283. #define MT8195_MUTEX_EOF_DP_INTF1 (MT8195_MUTEX_SOF_DP_INTF1 << 7)
  284. #define MT8195_MUTEX_EOF_DPI0 (MT8195_MUTEX_SOF_DPI0 << 7)
  285. #define MT8195_MUTEX_EOF_DPI1 (MT8195_MUTEX_SOF_DPI1 << 7)
  286. struct mtk_mutex {
  287. u8 id;
  288. bool claimed;
  289. };
  290. enum mtk_mutex_sof_id {
  291. MUTEX_SOF_SINGLE_MODE,
  292. MUTEX_SOF_DSI0,
  293. MUTEX_SOF_DSI1,
  294. MUTEX_SOF_DPI0,
  295. MUTEX_SOF_DPI1,
  296. MUTEX_SOF_DSI2,
  297. MUTEX_SOF_DSI3,
  298. MUTEX_SOF_DP_INTF0,
  299. MUTEX_SOF_DP_INTF1,
  300. DDP_MUTEX_SOF_MAX,
  301. };
  302. struct mtk_mutex_data {
  303. const u8 *mutex_mod;
  304. const u8 *mutex_table_mod;
  305. const u16 *mutex_sof;
  306. const u16 mutex_mod_reg;
  307. const u16 mutex_sof_reg;
  308. const bool no_clk;
  309. };
  310. struct mtk_mutex_ctx {
  311. struct device *dev;
  312. struct clk *clk;
  313. void __iomem *regs;
  314. struct mtk_mutex mutex[MTK_MUTEX_MAX_HANDLES];
  315. const struct mtk_mutex_data *data;
  316. phys_addr_t addr;
  317. struct cmdq_client_reg cmdq_reg;
  318. };
  319. static const u8 mt2701_mutex_mod[DDP_COMPONENT_ID_MAX] = {
  320. [DDP_COMPONENT_BLS] = MT2701_MUTEX_MOD_DISP_BLS,
  321. [DDP_COMPONENT_COLOR0] = MT2701_MUTEX_MOD_DISP_COLOR,
  322. [DDP_COMPONENT_OVL0] = MT2701_MUTEX_MOD_DISP_OVL,
  323. [DDP_COMPONENT_RDMA0] = MT2701_MUTEX_MOD_DISP_RDMA0,
  324. [DDP_COMPONENT_RDMA1] = MT2701_MUTEX_MOD_DISP_RDMA1,
  325. [DDP_COMPONENT_WDMA0] = MT2701_MUTEX_MOD_DISP_WDMA,
  326. };
  327. static const u8 mt2712_mutex_mod[DDP_COMPONENT_ID_MAX] = {
  328. [DDP_COMPONENT_AAL0] = MT2712_MUTEX_MOD_DISP_AAL0,
  329. [DDP_COMPONENT_AAL1] = MT2712_MUTEX_MOD2_DISP_AAL1,
  330. [DDP_COMPONENT_COLOR0] = MT2712_MUTEX_MOD_DISP_COLOR0,
  331. [DDP_COMPONENT_COLOR1] = MT2712_MUTEX_MOD_DISP_COLOR1,
  332. [DDP_COMPONENT_OD0] = MT2712_MUTEX_MOD_DISP_OD0,
  333. [DDP_COMPONENT_OD1] = MT2712_MUTEX_MOD2_DISP_OD1,
  334. [DDP_COMPONENT_OVL0] = MT2712_MUTEX_MOD_DISP_OVL0,
  335. [DDP_COMPONENT_OVL1] = MT2712_MUTEX_MOD_DISP_OVL1,
  336. [DDP_COMPONENT_PWM0] = MT2712_MUTEX_MOD_DISP_PWM0,
  337. [DDP_COMPONENT_PWM1] = MT2712_MUTEX_MOD_DISP_PWM1,
  338. [DDP_COMPONENT_PWM2] = MT2712_MUTEX_MOD_DISP_PWM2,
  339. [DDP_COMPONENT_RDMA0] = MT2712_MUTEX_MOD_DISP_RDMA0,
  340. [DDP_COMPONENT_RDMA1] = MT2712_MUTEX_MOD_DISP_RDMA1,
  341. [DDP_COMPONENT_RDMA2] = MT2712_MUTEX_MOD_DISP_RDMA2,
  342. [DDP_COMPONENT_UFOE] = MT2712_MUTEX_MOD_DISP_UFOE,
  343. [DDP_COMPONENT_WDMA0] = MT2712_MUTEX_MOD_DISP_WDMA0,
  344. [DDP_COMPONENT_WDMA1] = MT2712_MUTEX_MOD_DISP_WDMA1,
  345. };
  346. static const u8 mt8167_mutex_mod[DDP_COMPONENT_ID_MAX] = {
  347. [DDP_COMPONENT_AAL0] = MT8167_MUTEX_MOD_DISP_AAL,
  348. [DDP_COMPONENT_CCORR] = MT8167_MUTEX_MOD_DISP_CCORR,
  349. [DDP_COMPONENT_COLOR0] = MT8167_MUTEX_MOD_DISP_COLOR,
  350. [DDP_COMPONENT_DITHER0] = MT8167_MUTEX_MOD_DISP_DITHER,
  351. [DDP_COMPONENT_GAMMA] = MT8167_MUTEX_MOD_DISP_GAMMA,
  352. [DDP_COMPONENT_OVL0] = MT8167_MUTEX_MOD_DISP_OVL0,
  353. [DDP_COMPONENT_OVL1] = MT8167_MUTEX_MOD_DISP_OVL1,
  354. [DDP_COMPONENT_PWM0] = MT8167_MUTEX_MOD_DISP_PWM,
  355. [DDP_COMPONENT_RDMA0] = MT8167_MUTEX_MOD_DISP_RDMA0,
  356. [DDP_COMPONENT_RDMA1] = MT8167_MUTEX_MOD_DISP_RDMA1,
  357. [DDP_COMPONENT_UFOE] = MT8167_MUTEX_MOD_DISP_UFOE,
  358. [DDP_COMPONENT_WDMA0] = MT8167_MUTEX_MOD_DISP_WDMA0,
  359. };
  360. static const u8 mt8173_mutex_mod[DDP_COMPONENT_ID_MAX] = {
  361. [DDP_COMPONENT_AAL0] = MT8173_MUTEX_MOD_DISP_AAL,
  362. [DDP_COMPONENT_COLOR0] = MT8173_MUTEX_MOD_DISP_COLOR0,
  363. [DDP_COMPONENT_COLOR1] = MT8173_MUTEX_MOD_DISP_COLOR1,
  364. [DDP_COMPONENT_GAMMA] = MT8173_MUTEX_MOD_DISP_GAMMA,
  365. [DDP_COMPONENT_OD0] = MT8173_MUTEX_MOD_DISP_OD,
  366. [DDP_COMPONENT_OVL0] = MT8173_MUTEX_MOD_DISP_OVL0,
  367. [DDP_COMPONENT_OVL1] = MT8173_MUTEX_MOD_DISP_OVL1,
  368. [DDP_COMPONENT_PWM0] = MT8173_MUTEX_MOD_DISP_PWM0,
  369. [DDP_COMPONENT_PWM1] = MT8173_MUTEX_MOD_DISP_PWM1,
  370. [DDP_COMPONENT_RDMA0] = MT8173_MUTEX_MOD_DISP_RDMA0,
  371. [DDP_COMPONENT_RDMA1] = MT8173_MUTEX_MOD_DISP_RDMA1,
  372. [DDP_COMPONENT_RDMA2] = MT8173_MUTEX_MOD_DISP_RDMA2,
  373. [DDP_COMPONENT_UFOE] = MT8173_MUTEX_MOD_DISP_UFOE,
  374. [DDP_COMPONENT_WDMA0] = MT8173_MUTEX_MOD_DISP_WDMA0,
  375. [DDP_COMPONENT_WDMA1] = MT8173_MUTEX_MOD_DISP_WDMA1,
  376. };
  377. static const u8 mt8183_mutex_mod[DDP_COMPONENT_ID_MAX] = {
  378. [DDP_COMPONENT_AAL0] = MT8183_MUTEX_MOD_DISP_AAL0,
  379. [DDP_COMPONENT_CCORR] = MT8183_MUTEX_MOD_DISP_CCORR0,
  380. [DDP_COMPONENT_COLOR0] = MT8183_MUTEX_MOD_DISP_COLOR0,
  381. [DDP_COMPONENT_DITHER0] = MT8183_MUTEX_MOD_DISP_DITHER0,
  382. [DDP_COMPONENT_GAMMA] = MT8183_MUTEX_MOD_DISP_GAMMA0,
  383. [DDP_COMPONENT_OVL0] = MT8183_MUTEX_MOD_DISP_OVL0,
  384. [DDP_COMPONENT_OVL_2L0] = MT8183_MUTEX_MOD_DISP_OVL0_2L,
  385. [DDP_COMPONENT_OVL_2L1] = MT8183_MUTEX_MOD_DISP_OVL1_2L,
  386. [DDP_COMPONENT_RDMA0] = MT8183_MUTEX_MOD_DISP_RDMA0,
  387. [DDP_COMPONENT_RDMA1] = MT8183_MUTEX_MOD_DISP_RDMA1,
  388. [DDP_COMPONENT_WDMA0] = MT8183_MUTEX_MOD_DISP_WDMA0,
  389. };
  390. static const u8 mt8183_mutex_table_mod[MUTEX_MOD_IDX_MAX] = {
  391. [MUTEX_MOD_IDX_MDP_RDMA0] = MT8183_MUTEX_MOD_MDP_RDMA0,
  392. [MUTEX_MOD_IDX_MDP_RSZ0] = MT8183_MUTEX_MOD_MDP_RSZ0,
  393. [MUTEX_MOD_IDX_MDP_RSZ1] = MT8183_MUTEX_MOD_MDP_RSZ1,
  394. [MUTEX_MOD_IDX_MDP_TDSHP0] = MT8183_MUTEX_MOD_MDP_TDSHP0,
  395. [MUTEX_MOD_IDX_MDP_WROT0] = MT8183_MUTEX_MOD_MDP_WROT0,
  396. [MUTEX_MOD_IDX_MDP_WDMA] = MT8183_MUTEX_MOD_MDP_WDMA,
  397. [MUTEX_MOD_IDX_MDP_AAL0] = MT8183_MUTEX_MOD_MDP_AAL0,
  398. [MUTEX_MOD_IDX_MDP_CCORR0] = MT8183_MUTEX_MOD_MDP_CCORR0,
  399. };
  400. static const u8 mt8186_mutex_mod[DDP_COMPONENT_ID_MAX] = {
  401. [DDP_COMPONENT_AAL0] = MT8186_MUTEX_MOD_DISP_AAL0,
  402. [DDP_COMPONENT_CCORR] = MT8186_MUTEX_MOD_DISP_CCORR0,
  403. [DDP_COMPONENT_COLOR0] = MT8186_MUTEX_MOD_DISP_COLOR0,
  404. [DDP_COMPONENT_DITHER0] = MT8186_MUTEX_MOD_DISP_DITHER0,
  405. [DDP_COMPONENT_GAMMA] = MT8186_MUTEX_MOD_DISP_GAMMA0,
  406. [DDP_COMPONENT_OVL0] = MT8186_MUTEX_MOD_DISP_OVL0,
  407. [DDP_COMPONENT_OVL_2L0] = MT8186_MUTEX_MOD_DISP_OVL0_2L,
  408. [DDP_COMPONENT_POSTMASK0] = MT8186_MUTEX_MOD_DISP_POSTMASK0,
  409. [DDP_COMPONENT_RDMA0] = MT8186_MUTEX_MOD_DISP_RDMA0,
  410. [DDP_COMPONENT_RDMA1] = MT8186_MUTEX_MOD_DISP_RDMA1,
  411. };
  412. static const u8 mt8186_mdp_mutex_table_mod[MUTEX_MOD_IDX_MAX] = {
  413. [MUTEX_MOD_IDX_MDP_RDMA0] = MT8186_MUTEX_MOD_MDP_RDMA0,
  414. [MUTEX_MOD_IDX_MDP_RSZ0] = MT8186_MUTEX_MOD_MDP_RSZ0,
  415. [MUTEX_MOD_IDX_MDP_RSZ1] = MT8186_MUTEX_MOD_MDP_RSZ1,
  416. [MUTEX_MOD_IDX_MDP_TDSHP0] = MT8186_MUTEX_MOD_MDP_TDSHP0,
  417. [MUTEX_MOD_IDX_MDP_WROT0] = MT8186_MUTEX_MOD_MDP_WROT0,
  418. [MUTEX_MOD_IDX_MDP_HDR0] = MT8186_MUTEX_MOD_MDP_HDR0,
  419. [MUTEX_MOD_IDX_MDP_AAL0] = MT8186_MUTEX_MOD_MDP_AAL0,
  420. [MUTEX_MOD_IDX_MDP_COLOR0] = MT8186_MUTEX_MOD_MDP_COLOR0,
  421. };
  422. static const u8 mt8188_mutex_mod[DDP_COMPONENT_ID_MAX] = {
  423. [DDP_COMPONENT_OVL0] = MT8188_MUTEX_MOD_DISP_OVL0,
  424. [DDP_COMPONENT_WDMA0] = MT8188_MUTEX_MOD_DISP_WDMA0,
  425. [DDP_COMPONENT_RDMA0] = MT8188_MUTEX_MOD_DISP_RDMA0,
  426. [DDP_COMPONENT_COLOR0] = MT8188_MUTEX_MOD_DISP_COLOR0,
  427. [DDP_COMPONENT_CCORR] = MT8188_MUTEX_MOD_DISP_CCORR0,
  428. [DDP_COMPONENT_AAL0] = MT8188_MUTEX_MOD_DISP_AAL0,
  429. [DDP_COMPONENT_GAMMA] = MT8188_MUTEX_MOD_DISP_GAMMA0,
  430. [DDP_COMPONENT_POSTMASK0] = MT8188_MUTEX_MOD_DISP_POSTMASK0,
  431. [DDP_COMPONENT_DITHER0] = MT8188_MUTEX_MOD_DISP_DITHER0,
  432. [DDP_COMPONENT_MERGE0] = MT8188_MUTEX_MOD_DISP_VPP_MERGE,
  433. [DDP_COMPONENT_DSC0] = MT8188_MUTEX_MOD_DISP_DSC_WRAP0_CORE0,
  434. [DDP_COMPONENT_DSI0] = MT8188_MUTEX_MOD_DISP_DSI0,
  435. [DDP_COMPONENT_PWM0] = MT8188_MUTEX_MOD2_DISP_PWM0,
  436. [DDP_COMPONENT_DP_INTF0] = MT8188_MUTEX_MOD_DISP_DP_INTF0,
  437. [DDP_COMPONENT_DP_INTF1] = MT8188_MUTEX_MOD_DISP1_DP_INTF1,
  438. [DDP_COMPONENT_ETHDR_MIXER] = MT8188_MUTEX_MOD_DISP1_DISP_MIXER,
  439. [DDP_COMPONENT_MDP_RDMA0] = MT8188_MUTEX_MOD_DISP1_MDP_RDMA0,
  440. [DDP_COMPONENT_MDP_RDMA1] = MT8188_MUTEX_MOD_DISP1_MDP_RDMA1,
  441. [DDP_COMPONENT_MDP_RDMA2] = MT8188_MUTEX_MOD_DISP1_MDP_RDMA2,
  442. [DDP_COMPONENT_MDP_RDMA3] = MT8188_MUTEX_MOD_DISP1_MDP_RDMA3,
  443. [DDP_COMPONENT_MDP_RDMA4] = MT8188_MUTEX_MOD_DISP1_MDP_RDMA4,
  444. [DDP_COMPONENT_MDP_RDMA5] = MT8188_MUTEX_MOD_DISP1_MDP_RDMA5,
  445. [DDP_COMPONENT_MDP_RDMA6] = MT8188_MUTEX_MOD_DISP1_MDP_RDMA6,
  446. [DDP_COMPONENT_MDP_RDMA7] = MT8188_MUTEX_MOD_DISP1_MDP_RDMA7,
  447. [DDP_COMPONENT_PADDING0] = MT8188_MUTEX_MOD_DISP1_PADDING0,
  448. [DDP_COMPONENT_PADDING1] = MT8188_MUTEX_MOD_DISP1_PADDING1,
  449. [DDP_COMPONENT_PADDING2] = MT8188_MUTEX_MOD_DISP1_PADDING2,
  450. [DDP_COMPONENT_PADDING3] = MT8188_MUTEX_MOD_DISP1_PADDING3,
  451. [DDP_COMPONENT_PADDING4] = MT8188_MUTEX_MOD_DISP1_PADDING4,
  452. [DDP_COMPONENT_PADDING5] = MT8188_MUTEX_MOD_DISP1_PADDING5,
  453. [DDP_COMPONENT_PADDING6] = MT8188_MUTEX_MOD_DISP1_PADDING6,
  454. [DDP_COMPONENT_PADDING7] = MT8188_MUTEX_MOD_DISP1_PADDING7,
  455. [DDP_COMPONENT_MERGE1] = MT8188_MUTEX_MOD_DISP1_VPP_MERGE0,
  456. [DDP_COMPONENT_MERGE2] = MT8188_MUTEX_MOD_DISP1_VPP_MERGE1,
  457. [DDP_COMPONENT_MERGE3] = MT8188_MUTEX_MOD_DISP1_VPP_MERGE2,
  458. [DDP_COMPONENT_MERGE4] = MT8188_MUTEX_MOD_DISP1_VPP_MERGE3,
  459. [DDP_COMPONENT_MERGE5] = MT8188_MUTEX_MOD_DISP1_VPP_MERGE4,
  460. };
  461. static const u8 mt8188_mdp_mutex_table_mod[MUTEX_MOD_IDX_MAX] = {
  462. [MUTEX_MOD_IDX_MDP_RDMA0] = MT8195_MUTEX_MOD_MDP_RDMA0,
  463. [MUTEX_MOD_IDX_MDP_RDMA2] = MT8195_MUTEX_MOD_MDP_RDMA2,
  464. [MUTEX_MOD_IDX_MDP_RDMA3] = MT8195_MUTEX_MOD_MDP_RDMA3,
  465. [MUTEX_MOD_IDX_MDP_FG0] = MT8195_MUTEX_MOD_MDP_FG0,
  466. [MUTEX_MOD_IDX_MDP_FG2] = MT8195_MUTEX_MOD_MDP_FG2,
  467. [MUTEX_MOD_IDX_MDP_FG3] = MT8195_MUTEX_MOD_MDP_FG3,
  468. [MUTEX_MOD_IDX_MDP_HDR0] = MT8195_MUTEX_MOD_MDP_HDR0,
  469. [MUTEX_MOD_IDX_MDP_HDR2] = MT8195_MUTEX_MOD_MDP_HDR2,
  470. [MUTEX_MOD_IDX_MDP_HDR3] = MT8195_MUTEX_MOD_MDP_HDR3,
  471. [MUTEX_MOD_IDX_MDP_AAL0] = MT8195_MUTEX_MOD_MDP_AAL0,
  472. [MUTEX_MOD_IDX_MDP_AAL2] = MT8195_MUTEX_MOD_MDP_AAL2,
  473. [MUTEX_MOD_IDX_MDP_AAL3] = MT8195_MUTEX_MOD_MDP_AAL3,
  474. [MUTEX_MOD_IDX_MDP_RSZ0] = MT8195_MUTEX_MOD_MDP_RSZ0,
  475. [MUTEX_MOD_IDX_MDP_RSZ2] = MT8195_MUTEX_MOD_MDP_RSZ2,
  476. [MUTEX_MOD_IDX_MDP_RSZ3] = MT8195_MUTEX_MOD_MDP_RSZ3,
  477. [MUTEX_MOD_IDX_MDP_MERGE2] = MT8195_MUTEX_MOD_MDP_MERGE2,
  478. [MUTEX_MOD_IDX_MDP_MERGE3] = MT8195_MUTEX_MOD_MDP_MERGE3,
  479. [MUTEX_MOD_IDX_MDP_TDSHP0] = MT8195_MUTEX_MOD_MDP_TDSHP0,
  480. [MUTEX_MOD_IDX_MDP_TDSHP2] = MT8195_MUTEX_MOD_MDP_TDSHP2,
  481. [MUTEX_MOD_IDX_MDP_TDSHP3] = MT8195_MUTEX_MOD_MDP_TDSHP3,
  482. [MUTEX_MOD_IDX_MDP_COLOR0] = MT8195_MUTEX_MOD_MDP_COLOR0,
  483. [MUTEX_MOD_IDX_MDP_COLOR2] = MT8195_MUTEX_MOD_MDP_COLOR2,
  484. [MUTEX_MOD_IDX_MDP_COLOR3] = MT8195_MUTEX_MOD_MDP_COLOR3,
  485. [MUTEX_MOD_IDX_MDP_OVL0] = MT8195_MUTEX_MOD_MDP_OVL0,
  486. [MUTEX_MOD_IDX_MDP_PAD0] = MT8195_MUTEX_MOD_MDP_PAD0,
  487. [MUTEX_MOD_IDX_MDP_PAD2] = MT8195_MUTEX_MOD_MDP_PAD2,
  488. [MUTEX_MOD_IDX_MDP_PAD3] = MT8195_MUTEX_MOD_MDP_PAD3,
  489. [MUTEX_MOD_IDX_MDP_TCC0] = MT8195_MUTEX_MOD_MDP_TCC0,
  490. [MUTEX_MOD_IDX_MDP_WROT0] = MT8195_MUTEX_MOD_MDP_WROT0,
  491. [MUTEX_MOD_IDX_MDP_WROT2] = MT8195_MUTEX_MOD_MDP_WROT2,
  492. [MUTEX_MOD_IDX_MDP_WROT3] = MT8195_MUTEX_MOD_MDP_WROT3,
  493. };
  494. static const u8 mt8192_mutex_mod[DDP_COMPONENT_ID_MAX] = {
  495. [DDP_COMPONENT_AAL0] = MT8192_MUTEX_MOD_DISP_AAL0,
  496. [DDP_COMPONENT_CCORR] = MT8192_MUTEX_MOD_DISP_CCORR0,
  497. [DDP_COMPONENT_COLOR0] = MT8192_MUTEX_MOD_DISP_COLOR0,
  498. [DDP_COMPONENT_DITHER0] = MT8192_MUTEX_MOD_DISP_DITHER0,
  499. [DDP_COMPONENT_GAMMA] = MT8192_MUTEX_MOD_DISP_GAMMA0,
  500. [DDP_COMPONENT_POSTMASK0] = MT8192_MUTEX_MOD_DISP_POSTMASK0,
  501. [DDP_COMPONENT_OVL0] = MT8192_MUTEX_MOD_DISP_OVL0,
  502. [DDP_COMPONENT_OVL_2L0] = MT8192_MUTEX_MOD_DISP_OVL0_2L,
  503. [DDP_COMPONENT_OVL_2L2] = MT8192_MUTEX_MOD_DISP_OVL2_2L,
  504. [DDP_COMPONENT_RDMA0] = MT8192_MUTEX_MOD_DISP_RDMA0,
  505. [DDP_COMPONENT_RDMA4] = MT8192_MUTEX_MOD_DISP_RDMA4,
  506. };
  507. static const u8 mt8195_mutex_mod[DDP_COMPONENT_ID_MAX] = {
  508. [DDP_COMPONENT_OVL0] = MT8195_MUTEX_MOD_DISP_OVL0,
  509. [DDP_COMPONENT_WDMA0] = MT8195_MUTEX_MOD_DISP_WDMA0,
  510. [DDP_COMPONENT_RDMA0] = MT8195_MUTEX_MOD_DISP_RDMA0,
  511. [DDP_COMPONENT_COLOR0] = MT8195_MUTEX_MOD_DISP_COLOR0,
  512. [DDP_COMPONENT_CCORR] = MT8195_MUTEX_MOD_DISP_CCORR0,
  513. [DDP_COMPONENT_AAL0] = MT8195_MUTEX_MOD_DISP_AAL0,
  514. [DDP_COMPONENT_GAMMA] = MT8195_MUTEX_MOD_DISP_GAMMA0,
  515. [DDP_COMPONENT_DITHER0] = MT8195_MUTEX_MOD_DISP_DITHER0,
  516. [DDP_COMPONENT_MERGE0] = MT8195_MUTEX_MOD_DISP_VPP_MERGE,
  517. [DDP_COMPONENT_DSC0] = MT8195_MUTEX_MOD_DISP_DSC_WRAP0_CORE0,
  518. [DDP_COMPONENT_DSI0] = MT8195_MUTEX_MOD_DISP_DSI0,
  519. [DDP_COMPONENT_PWM0] = MT8195_MUTEX_MOD_DISP_PWM0,
  520. [DDP_COMPONENT_DP_INTF0] = MT8195_MUTEX_MOD_DISP_DP_INTF0,
  521. [DDP_COMPONENT_MDP_RDMA0] = MT8195_MUTEX_MOD_DISP1_MDP_RDMA0,
  522. [DDP_COMPONENT_MDP_RDMA1] = MT8195_MUTEX_MOD_DISP1_MDP_RDMA1,
  523. [DDP_COMPONENT_MDP_RDMA2] = MT8195_MUTEX_MOD_DISP1_MDP_RDMA2,
  524. [DDP_COMPONENT_MDP_RDMA3] = MT8195_MUTEX_MOD_DISP1_MDP_RDMA3,
  525. [DDP_COMPONENT_MDP_RDMA4] = MT8195_MUTEX_MOD_DISP1_MDP_RDMA4,
  526. [DDP_COMPONENT_MDP_RDMA5] = MT8195_MUTEX_MOD_DISP1_MDP_RDMA5,
  527. [DDP_COMPONENT_MDP_RDMA6] = MT8195_MUTEX_MOD_DISP1_MDP_RDMA6,
  528. [DDP_COMPONENT_MDP_RDMA7] = MT8195_MUTEX_MOD_DISP1_MDP_RDMA7,
  529. [DDP_COMPONENT_MERGE1] = MT8195_MUTEX_MOD_DISP1_VPP_MERGE0,
  530. [DDP_COMPONENT_MERGE2] = MT8195_MUTEX_MOD_DISP1_VPP_MERGE1,
  531. [DDP_COMPONENT_MERGE3] = MT8195_MUTEX_MOD_DISP1_VPP_MERGE2,
  532. [DDP_COMPONENT_MERGE4] = MT8195_MUTEX_MOD_DISP1_VPP_MERGE3,
  533. [DDP_COMPONENT_ETHDR_MIXER] = MT8195_MUTEX_MOD_DISP1_DISP_MIXER,
  534. [DDP_COMPONENT_MERGE5] = MT8195_MUTEX_MOD_DISP1_VPP_MERGE4,
  535. [DDP_COMPONENT_DP_INTF1] = MT8195_MUTEX_MOD_DISP1_DP_INTF0,
  536. };
  537. static const u8 mt8195_mutex_table_mod[MUTEX_MOD_IDX_MAX] = {
  538. [MUTEX_MOD_IDX_MDP_RDMA0] = MT8195_MUTEX_MOD_MDP_RDMA0,
  539. [MUTEX_MOD_IDX_MDP_RDMA1] = MT8195_MUTEX_MOD_MDP_RDMA1,
  540. [MUTEX_MOD_IDX_MDP_RDMA2] = MT8195_MUTEX_MOD_MDP_RDMA2,
  541. [MUTEX_MOD_IDX_MDP_RDMA3] = MT8195_MUTEX_MOD_MDP_RDMA3,
  542. [MUTEX_MOD_IDX_MDP_STITCH0] = MT8195_MUTEX_MOD_MDP_STITCH0,
  543. [MUTEX_MOD_IDX_MDP_FG0] = MT8195_MUTEX_MOD_MDP_FG0,
  544. [MUTEX_MOD_IDX_MDP_FG1] = MT8195_MUTEX_MOD_MDP_FG1,
  545. [MUTEX_MOD_IDX_MDP_FG2] = MT8195_MUTEX_MOD_MDP_FG2,
  546. [MUTEX_MOD_IDX_MDP_FG3] = MT8195_MUTEX_MOD_MDP_FG3,
  547. [MUTEX_MOD_IDX_MDP_HDR0] = MT8195_MUTEX_MOD_MDP_HDR0,
  548. [MUTEX_MOD_IDX_MDP_HDR1] = MT8195_MUTEX_MOD_MDP_HDR1,
  549. [MUTEX_MOD_IDX_MDP_HDR2] = MT8195_MUTEX_MOD_MDP_HDR2,
  550. [MUTEX_MOD_IDX_MDP_HDR3] = MT8195_MUTEX_MOD_MDP_HDR3,
  551. [MUTEX_MOD_IDX_MDP_AAL0] = MT8195_MUTEX_MOD_MDP_AAL0,
  552. [MUTEX_MOD_IDX_MDP_AAL1] = MT8195_MUTEX_MOD_MDP_AAL1,
  553. [MUTEX_MOD_IDX_MDP_AAL2] = MT8195_MUTEX_MOD_MDP_AAL2,
  554. [MUTEX_MOD_IDX_MDP_AAL3] = MT8195_MUTEX_MOD_MDP_AAL3,
  555. [MUTEX_MOD_IDX_MDP_RSZ0] = MT8195_MUTEX_MOD_MDP_RSZ0,
  556. [MUTEX_MOD_IDX_MDP_RSZ1] = MT8195_MUTEX_MOD_MDP_RSZ1,
  557. [MUTEX_MOD_IDX_MDP_RSZ2] = MT8195_MUTEX_MOD_MDP_RSZ2,
  558. [MUTEX_MOD_IDX_MDP_RSZ3] = MT8195_MUTEX_MOD_MDP_RSZ3,
  559. [MUTEX_MOD_IDX_MDP_MERGE2] = MT8195_MUTEX_MOD_MDP_MERGE2,
  560. [MUTEX_MOD_IDX_MDP_MERGE3] = MT8195_MUTEX_MOD_MDP_MERGE3,
  561. [MUTEX_MOD_IDX_MDP_TDSHP0] = MT8195_MUTEX_MOD_MDP_TDSHP0,
  562. [MUTEX_MOD_IDX_MDP_TDSHP1] = MT8195_MUTEX_MOD_MDP_TDSHP1,
  563. [MUTEX_MOD_IDX_MDP_TDSHP2] = MT8195_MUTEX_MOD_MDP_TDSHP2,
  564. [MUTEX_MOD_IDX_MDP_TDSHP3] = MT8195_MUTEX_MOD_MDP_TDSHP3,
  565. [MUTEX_MOD_IDX_MDP_COLOR0] = MT8195_MUTEX_MOD_MDP_COLOR0,
  566. [MUTEX_MOD_IDX_MDP_COLOR1] = MT8195_MUTEX_MOD_MDP_COLOR1,
  567. [MUTEX_MOD_IDX_MDP_COLOR2] = MT8195_MUTEX_MOD_MDP_COLOR2,
  568. [MUTEX_MOD_IDX_MDP_COLOR3] = MT8195_MUTEX_MOD_MDP_COLOR3,
  569. [MUTEX_MOD_IDX_MDP_OVL0] = MT8195_MUTEX_MOD_MDP_OVL0,
  570. [MUTEX_MOD_IDX_MDP_OVL1] = MT8195_MUTEX_MOD_MDP_OVL1,
  571. [MUTEX_MOD_IDX_MDP_PAD0] = MT8195_MUTEX_MOD_MDP_PAD0,
  572. [MUTEX_MOD_IDX_MDP_PAD1] = MT8195_MUTEX_MOD_MDP_PAD1,
  573. [MUTEX_MOD_IDX_MDP_PAD2] = MT8195_MUTEX_MOD_MDP_PAD2,
  574. [MUTEX_MOD_IDX_MDP_PAD3] = MT8195_MUTEX_MOD_MDP_PAD3,
  575. [MUTEX_MOD_IDX_MDP_TCC0] = MT8195_MUTEX_MOD_MDP_TCC0,
  576. [MUTEX_MOD_IDX_MDP_TCC1] = MT8195_MUTEX_MOD_MDP_TCC1,
  577. [MUTEX_MOD_IDX_MDP_WROT0] = MT8195_MUTEX_MOD_MDP_WROT0,
  578. [MUTEX_MOD_IDX_MDP_WROT1] = MT8195_MUTEX_MOD_MDP_WROT1,
  579. [MUTEX_MOD_IDX_MDP_WROT2] = MT8195_MUTEX_MOD_MDP_WROT2,
  580. [MUTEX_MOD_IDX_MDP_WROT3] = MT8195_MUTEX_MOD_MDP_WROT3,
  581. };
  582. static const u8 mt8365_mutex_mod[DDP_COMPONENT_ID_MAX] = {
  583. [DDP_COMPONENT_AAL0] = MT8365_MUTEX_MOD_DISP_AAL,
  584. [DDP_COMPONENT_CCORR] = MT8365_MUTEX_MOD_DISP_CCORR,
  585. [DDP_COMPONENT_COLOR0] = MT8365_MUTEX_MOD_DISP_COLOR0,
  586. [DDP_COMPONENT_DITHER0] = MT8365_MUTEX_MOD_DISP_DITHER,
  587. [DDP_COMPONENT_DPI0] = MT8365_MUTEX_MOD_DISP_DPI0,
  588. [DDP_COMPONENT_DSI0] = MT8365_MUTEX_MOD_DISP_DSI0,
  589. [DDP_COMPONENT_GAMMA] = MT8365_MUTEX_MOD_DISP_GAMMA,
  590. [DDP_COMPONENT_OVL0] = MT8365_MUTEX_MOD_DISP_OVL0,
  591. [DDP_COMPONENT_OVL_2L0] = MT8365_MUTEX_MOD_DISP_OVL0_2L,
  592. [DDP_COMPONENT_PWM0] = MT8365_MUTEX_MOD_DISP_PWM0,
  593. [DDP_COMPONENT_RDMA0] = MT8365_MUTEX_MOD_DISP_RDMA0,
  594. [DDP_COMPONENT_RDMA1] = MT8365_MUTEX_MOD_DISP_RDMA1,
  595. [DDP_COMPONENT_WDMA0] = MT8365_MUTEX_MOD_DISP_WDMA0,
  596. };
  597. static const u16 mt2712_mutex_sof[DDP_MUTEX_SOF_MAX] = {
  598. [MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
  599. [MUTEX_SOF_DSI0] = MUTEX_SOF_DSI0,
  600. [MUTEX_SOF_DSI1] = MUTEX_SOF_DSI1,
  601. [MUTEX_SOF_DPI0] = MUTEX_SOF_DPI0,
  602. [MUTEX_SOF_DPI1] = MUTEX_SOF_DPI1,
  603. [MUTEX_SOF_DSI2] = MUTEX_SOF_DSI2,
  604. [MUTEX_SOF_DSI3] = MUTEX_SOF_DSI3,
  605. };
  606. static const u16 mt6795_mutex_sof[DDP_MUTEX_SOF_MAX] = {
  607. [MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
  608. [MUTEX_SOF_DSI0] = MUTEX_SOF_DSI0,
  609. [MUTEX_SOF_DSI1] = MUTEX_SOF_DSI1,
  610. [MUTEX_SOF_DPI0] = MUTEX_SOF_DPI0,
  611. };
  612. static const u16 mt8167_mutex_sof[DDP_MUTEX_SOF_MAX] = {
  613. [MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
  614. [MUTEX_SOF_DSI0] = MUTEX_SOF_DSI0,
  615. [MUTEX_SOF_DPI0] = MT8167_MUTEX_SOF_DPI0,
  616. [MUTEX_SOF_DPI1] = MT8167_MUTEX_SOF_DPI1,
  617. };
  618. /* Add EOF setting so overlay hardware can receive frame done irq */
  619. static const u16 mt8183_mutex_sof[DDP_MUTEX_SOF_MAX] = {
  620. [MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
  621. [MUTEX_SOF_DSI0] = MUTEX_SOF_DSI0 | MT8183_MUTEX_EOF_DSI0,
  622. [MUTEX_SOF_DPI0] = MT8183_MUTEX_SOF_DPI0 | MT8183_MUTEX_EOF_DPI0,
  623. };
  624. static const u16 mt8186_mutex_sof[MUTEX_SOF_DSI3 + 1] = {
  625. [MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
  626. [MUTEX_SOF_DSI0] = MT8186_MUTEX_SOF_DSI0 | MT8186_MUTEX_EOF_DSI0,
  627. [MUTEX_SOF_DPI0] = MT8186_MUTEX_SOF_DPI0 | MT8186_MUTEX_EOF_DPI0,
  628. };
  629. /*
  630. * To support refresh mode(video mode), DISP_REG_MUTEX_SOF should
  631. * select the EOF source and configure the EOF plus timing from the
  632. * module that provides the timing signal.
  633. * So that MUTEX can not only send a STREAM_DONE event to GCE
  634. * but also detect the error at end of frame(EAEOF) when EOF signal
  635. * arrives.
  636. */
  637. static const u16 mt8188_mutex_sof[DDP_MUTEX_SOF_MAX] = {
  638. [MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
  639. [MUTEX_SOF_DSI0] =
  640. MT8188_MUTEX_SOF_DSI0 | MT8188_MUTEX_EOF_DSI0,
  641. [MUTEX_SOF_DP_INTF0] =
  642. MT8188_MUTEX_SOF_DP_INTF0 | MT8188_MUTEX_EOF_DP_INTF0,
  643. [MUTEX_SOF_DP_INTF1] =
  644. MT8188_MUTEX_SOF_DP_INTF1 | MT8188_MUTEX_EOF_DP_INTF1,
  645. };
  646. static const u16 mt8195_mutex_sof[DDP_MUTEX_SOF_MAX] = {
  647. [MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
  648. [MUTEX_SOF_DSI0] = MT8195_MUTEX_SOF_DSI0 | MT8195_MUTEX_EOF_DSI0,
  649. [MUTEX_SOF_DSI1] = MT8195_MUTEX_SOF_DSI1 | MT8195_MUTEX_EOF_DSI1,
  650. [MUTEX_SOF_DPI0] = MT8195_MUTEX_SOF_DPI0 | MT8195_MUTEX_EOF_DPI0,
  651. [MUTEX_SOF_DPI1] = MT8195_MUTEX_SOF_DPI1 | MT8195_MUTEX_EOF_DPI1,
  652. [MUTEX_SOF_DP_INTF0] =
  653. MT8195_MUTEX_SOF_DP_INTF0 | MT8195_MUTEX_EOF_DP_INTF0,
  654. [MUTEX_SOF_DP_INTF1] =
  655. MT8195_MUTEX_SOF_DP_INTF1 | MT8195_MUTEX_EOF_DP_INTF1,
  656. };
  657. static const struct mtk_mutex_data mt2701_mutex_driver_data = {
  658. .mutex_mod = mt2701_mutex_mod,
  659. .mutex_sof = mt2712_mutex_sof,
  660. .mutex_mod_reg = MT2701_MUTEX0_MOD0,
  661. .mutex_sof_reg = MT2701_MUTEX0_SOF0,
  662. };
  663. static const struct mtk_mutex_data mt2712_mutex_driver_data = {
  664. .mutex_mod = mt2712_mutex_mod,
  665. .mutex_sof = mt2712_mutex_sof,
  666. .mutex_mod_reg = MT2701_MUTEX0_MOD0,
  667. .mutex_sof_reg = MT2701_MUTEX0_SOF0,
  668. };
  669. static const struct mtk_mutex_data mt6795_mutex_driver_data = {
  670. .mutex_mod = mt8173_mutex_mod,
  671. .mutex_sof = mt6795_mutex_sof,
  672. .mutex_mod_reg = MT2701_MUTEX0_MOD0,
  673. .mutex_sof_reg = MT2701_MUTEX0_SOF0,
  674. };
  675. static const struct mtk_mutex_data mt8167_mutex_driver_data = {
  676. .mutex_mod = mt8167_mutex_mod,
  677. .mutex_sof = mt8167_mutex_sof,
  678. .mutex_mod_reg = MT2701_MUTEX0_MOD0,
  679. .mutex_sof_reg = MT2701_MUTEX0_SOF0,
  680. .no_clk = true,
  681. };
  682. static const struct mtk_mutex_data mt8173_mutex_driver_data = {
  683. .mutex_mod = mt8173_mutex_mod,
  684. .mutex_sof = mt2712_mutex_sof,
  685. .mutex_mod_reg = MT2701_MUTEX0_MOD0,
  686. .mutex_sof_reg = MT2701_MUTEX0_SOF0,
  687. };
  688. static const struct mtk_mutex_data mt8183_mutex_driver_data = {
  689. .mutex_mod = mt8183_mutex_mod,
  690. .mutex_sof = mt8183_mutex_sof,
  691. .mutex_mod_reg = MT8183_MUTEX0_MOD0,
  692. .mutex_sof_reg = MT8183_MUTEX0_SOF0,
  693. .mutex_table_mod = mt8183_mutex_table_mod,
  694. .no_clk = true,
  695. };
  696. static const struct mtk_mutex_data mt8186_mdp_mutex_driver_data = {
  697. .mutex_mod_reg = MT8183_MUTEX0_MOD0,
  698. .mutex_sof_reg = MT8183_MUTEX0_SOF0,
  699. .mutex_table_mod = mt8186_mdp_mutex_table_mod,
  700. };
  701. static const struct mtk_mutex_data mt8186_mutex_driver_data = {
  702. .mutex_mod = mt8186_mutex_mod,
  703. .mutex_sof = mt8186_mutex_sof,
  704. .mutex_mod_reg = MT8183_MUTEX0_MOD0,
  705. .mutex_sof_reg = MT8183_MUTEX0_SOF0,
  706. };
  707. static const struct mtk_mutex_data mt8188_mutex_driver_data = {
  708. .mutex_mod = mt8188_mutex_mod,
  709. .mutex_sof = mt8188_mutex_sof,
  710. .mutex_mod_reg = MT8183_MUTEX0_MOD0,
  711. .mutex_sof_reg = MT8183_MUTEX0_SOF0,
  712. };
  713. static const struct mtk_mutex_data mt8188_vpp_mutex_driver_data = {
  714. .mutex_sof = mt8188_mutex_sof,
  715. .mutex_mod_reg = MT8183_MUTEX0_MOD0,
  716. .mutex_sof_reg = MT8183_MUTEX0_SOF0,
  717. .mutex_table_mod = mt8188_mdp_mutex_table_mod,
  718. };
  719. static const struct mtk_mutex_data mt8192_mutex_driver_data = {
  720. .mutex_mod = mt8192_mutex_mod,
  721. .mutex_sof = mt8183_mutex_sof,
  722. .mutex_mod_reg = MT8183_MUTEX0_MOD0,
  723. .mutex_sof_reg = MT8183_MUTEX0_SOF0,
  724. };
  725. static const struct mtk_mutex_data mt8195_mutex_driver_data = {
  726. .mutex_mod = mt8195_mutex_mod,
  727. .mutex_sof = mt8195_mutex_sof,
  728. .mutex_mod_reg = MT8183_MUTEX0_MOD0,
  729. .mutex_sof_reg = MT8183_MUTEX0_SOF0,
  730. };
  731. static const struct mtk_mutex_data mt8195_vpp_mutex_driver_data = {
  732. .mutex_sof = mt8195_mutex_sof,
  733. .mutex_mod_reg = MT8183_MUTEX0_MOD0,
  734. .mutex_sof_reg = MT8183_MUTEX0_SOF0,
  735. .mutex_table_mod = mt8195_mutex_table_mod,
  736. };
  737. static const struct mtk_mutex_data mt8365_mutex_driver_data = {
  738. .mutex_mod = mt8365_mutex_mod,
  739. .mutex_sof = mt8183_mutex_sof,
  740. .mutex_mod_reg = MT8183_MUTEX0_MOD0,
  741. .mutex_sof_reg = MT8183_MUTEX0_SOF0,
  742. .no_clk = true,
  743. };
  744. struct mtk_mutex *mtk_mutex_get(struct device *dev)
  745. {
  746. struct mtk_mutex_ctx *mtx = dev_get_drvdata(dev);
  747. int i;
  748. for (i = 0; i < MTK_MUTEX_MAX_HANDLES; i++)
  749. if (!mtx->mutex[i].claimed) {
  750. mtx->mutex[i].claimed = true;
  751. return &mtx->mutex[i];
  752. }
  753. return ERR_PTR(-EBUSY);
  754. }
  755. EXPORT_SYMBOL_GPL(mtk_mutex_get);
  756. void mtk_mutex_put(struct mtk_mutex *mutex)
  757. {
  758. struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
  759. mutex[mutex->id]);
  760. WARN_ON(&mtx->mutex[mutex->id] != mutex);
  761. mutex->claimed = false;
  762. }
  763. EXPORT_SYMBOL_GPL(mtk_mutex_put);
  764. int mtk_mutex_prepare(struct mtk_mutex *mutex)
  765. {
  766. struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
  767. mutex[mutex->id]);
  768. return clk_prepare_enable(mtx->clk);
  769. }
  770. EXPORT_SYMBOL_GPL(mtk_mutex_prepare);
  771. void mtk_mutex_unprepare(struct mtk_mutex *mutex)
  772. {
  773. struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
  774. mutex[mutex->id]);
  775. clk_disable_unprepare(mtx->clk);
  776. }
  777. EXPORT_SYMBOL_GPL(mtk_mutex_unprepare);
  778. void mtk_mutex_add_comp(struct mtk_mutex *mutex,
  779. enum mtk_ddp_comp_id id)
  780. {
  781. struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
  782. mutex[mutex->id]);
  783. unsigned int reg;
  784. unsigned int sof_id;
  785. unsigned int offset;
  786. WARN_ON(&mtx->mutex[mutex->id] != mutex);
  787. switch (id) {
  788. case DDP_COMPONENT_DSI0:
  789. sof_id = MUTEX_SOF_DSI0;
  790. break;
  791. case DDP_COMPONENT_DSI1:
  792. sof_id = MUTEX_SOF_DSI0;
  793. break;
  794. case DDP_COMPONENT_DSI2:
  795. sof_id = MUTEX_SOF_DSI2;
  796. break;
  797. case DDP_COMPONENT_DSI3:
  798. sof_id = MUTEX_SOF_DSI3;
  799. break;
  800. case DDP_COMPONENT_DPI0:
  801. sof_id = MUTEX_SOF_DPI0;
  802. break;
  803. case DDP_COMPONENT_DPI1:
  804. sof_id = MUTEX_SOF_DPI1;
  805. break;
  806. case DDP_COMPONENT_DP_INTF0:
  807. sof_id = MUTEX_SOF_DP_INTF0;
  808. break;
  809. case DDP_COMPONENT_DP_INTF1:
  810. sof_id = MUTEX_SOF_DP_INTF1;
  811. break;
  812. default:
  813. if (mtx->data->mutex_mod[id] < 32) {
  814. offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg,
  815. mutex->id);
  816. reg = readl_relaxed(mtx->regs + offset);
  817. reg |= 1 << mtx->data->mutex_mod[id];
  818. writel_relaxed(reg, mtx->regs + offset);
  819. } else {
  820. offset = DISP_REG_MUTEX_MOD2(mutex->id);
  821. reg = readl_relaxed(mtx->regs + offset);
  822. reg |= 1 << (mtx->data->mutex_mod[id] - 32);
  823. writel_relaxed(reg, mtx->regs + offset);
  824. }
  825. return;
  826. }
  827. writel_relaxed(mtx->data->mutex_sof[sof_id],
  828. mtx->regs +
  829. DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg, mutex->id));
  830. }
  831. EXPORT_SYMBOL_GPL(mtk_mutex_add_comp);
  832. void mtk_mutex_remove_comp(struct mtk_mutex *mutex,
  833. enum mtk_ddp_comp_id id)
  834. {
  835. struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
  836. mutex[mutex->id]);
  837. unsigned int reg;
  838. unsigned int offset;
  839. WARN_ON(&mtx->mutex[mutex->id] != mutex);
  840. switch (id) {
  841. case DDP_COMPONENT_DSI0:
  842. case DDP_COMPONENT_DSI1:
  843. case DDP_COMPONENT_DSI2:
  844. case DDP_COMPONENT_DSI3:
  845. case DDP_COMPONENT_DPI0:
  846. case DDP_COMPONENT_DPI1:
  847. case DDP_COMPONENT_DP_INTF0:
  848. case DDP_COMPONENT_DP_INTF1:
  849. writel_relaxed(MUTEX_SOF_SINGLE_MODE,
  850. mtx->regs +
  851. DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg,
  852. mutex->id));
  853. break;
  854. default:
  855. if (mtx->data->mutex_mod[id] < 32) {
  856. offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg,
  857. mutex->id);
  858. reg = readl_relaxed(mtx->regs + offset);
  859. reg &= ~(1 << mtx->data->mutex_mod[id]);
  860. writel_relaxed(reg, mtx->regs + offset);
  861. } else {
  862. offset = DISP_REG_MUTEX_MOD2(mutex->id);
  863. reg = readl_relaxed(mtx->regs + offset);
  864. reg &= ~(1 << (mtx->data->mutex_mod[id] - 32));
  865. writel_relaxed(reg, mtx->regs + offset);
  866. }
  867. break;
  868. }
  869. }
  870. EXPORT_SYMBOL_GPL(mtk_mutex_remove_comp);
  871. void mtk_mutex_enable(struct mtk_mutex *mutex)
  872. {
  873. struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
  874. mutex[mutex->id]);
  875. WARN_ON(&mtx->mutex[mutex->id] != mutex);
  876. writel(1, mtx->regs + DISP_REG_MUTEX_EN(mutex->id));
  877. }
  878. EXPORT_SYMBOL_GPL(mtk_mutex_enable);
  879. int mtk_mutex_enable_by_cmdq(struct mtk_mutex *mutex, void *pkt)
  880. {
  881. struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
  882. mutex[mutex->id]);
  883. struct cmdq_pkt *cmdq_pkt = (struct cmdq_pkt *)pkt;
  884. WARN_ON(&mtx->mutex[mutex->id] != mutex);
  885. if (!mtx->cmdq_reg.size) {
  886. dev_err(mtx->dev, "mediatek,gce-client-reg hasn't been set");
  887. return -ENODEV;
  888. }
  889. cmdq_pkt_write(cmdq_pkt, mtx->cmdq_reg.subsys,
  890. mtx->addr + DISP_REG_MUTEX_EN(mutex->id), 1);
  891. return 0;
  892. }
  893. EXPORT_SYMBOL_GPL(mtk_mutex_enable_by_cmdq);
  894. void mtk_mutex_disable(struct mtk_mutex *mutex)
  895. {
  896. struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
  897. mutex[mutex->id]);
  898. WARN_ON(&mtx->mutex[mutex->id] != mutex);
  899. writel(0, mtx->regs + DISP_REG_MUTEX_EN(mutex->id));
  900. }
  901. EXPORT_SYMBOL_GPL(mtk_mutex_disable);
  902. void mtk_mutex_acquire(struct mtk_mutex *mutex)
  903. {
  904. struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
  905. mutex[mutex->id]);
  906. u32 tmp;
  907. writel(1, mtx->regs + DISP_REG_MUTEX_EN(mutex->id));
  908. writel(1, mtx->regs + DISP_REG_MUTEX(mutex->id));
  909. if (readl_poll_timeout_atomic(mtx->regs + DISP_REG_MUTEX(mutex->id),
  910. tmp, tmp & INT_MUTEX, 1, 10000))
  911. pr_err("could not acquire mutex %d\n", mutex->id);
  912. }
  913. EXPORT_SYMBOL_GPL(mtk_mutex_acquire);
  914. void mtk_mutex_release(struct mtk_mutex *mutex)
  915. {
  916. struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
  917. mutex[mutex->id]);
  918. writel(0, mtx->regs + DISP_REG_MUTEX(mutex->id));
  919. }
  920. EXPORT_SYMBOL_GPL(mtk_mutex_release);
  921. int mtk_mutex_write_mod(struct mtk_mutex *mutex,
  922. enum mtk_mutex_mod_index idx, bool clear)
  923. {
  924. struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
  925. mutex[mutex->id]);
  926. unsigned int reg;
  927. u32 reg_offset, id_offset = 0;
  928. WARN_ON(&mtx->mutex[mutex->id] != mutex);
  929. if (idx < MUTEX_MOD_IDX_MDP_RDMA0 ||
  930. idx >= MUTEX_MOD_IDX_MAX) {
  931. dev_err(mtx->dev, "Not supported MOD table index : %d", idx);
  932. return -EINVAL;
  933. }
  934. /*
  935. * Some SoCs may have multiple MUTEX_MOD registers as more than 32 mods
  936. * are present, hence requiring multiple 32-bits registers.
  937. *
  938. * The mutex_table_mod fully represents that by defining the number of
  939. * the mod sequentially, later used as a bit number, which can be more
  940. * than 0..31.
  941. *
  942. * In order to retain compatibility with older SoCs, we perform R/W on
  943. * the single 32 bits registers, but this requires us to translate the
  944. * mutex ID bit accordingly.
  945. */
  946. if (mtx->data->mutex_table_mod[idx] < 32) {
  947. reg_offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg,
  948. mutex->id);
  949. } else {
  950. reg_offset = DISP_REG_MUTEX_MOD1(mtx->data->mutex_mod_reg,
  951. mutex->id);
  952. id_offset = 32;
  953. }
  954. reg = readl_relaxed(mtx->regs + reg_offset);
  955. if (clear)
  956. reg &= ~BIT(mtx->data->mutex_table_mod[idx] - id_offset);
  957. else
  958. reg |= BIT(mtx->data->mutex_table_mod[idx] - id_offset);
  959. writel_relaxed(reg, mtx->regs + reg_offset);
  960. return 0;
  961. }
  962. EXPORT_SYMBOL_GPL(mtk_mutex_write_mod);
  963. int mtk_mutex_write_sof(struct mtk_mutex *mutex,
  964. enum mtk_mutex_sof_index idx)
  965. {
  966. struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
  967. mutex[mutex->id]);
  968. WARN_ON(&mtx->mutex[mutex->id] != mutex);
  969. if (idx < MUTEX_SOF_IDX_SINGLE_MODE ||
  970. idx >= MUTEX_SOF_IDX_MAX) {
  971. dev_err(mtx->dev, "Not supported SOF index : %d", idx);
  972. return -EINVAL;
  973. }
  974. writel_relaxed(idx, mtx->regs +
  975. DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg, mutex->id));
  976. return 0;
  977. }
  978. EXPORT_SYMBOL_GPL(mtk_mutex_write_sof);
  979. static int mtk_mutex_probe(struct platform_device *pdev)
  980. {
  981. struct device *dev = &pdev->dev;
  982. struct mtk_mutex_ctx *mtx;
  983. struct resource *regs;
  984. int i, ret;
  985. mtx = devm_kzalloc(dev, sizeof(*mtx), GFP_KERNEL);
  986. if (!mtx)
  987. return -ENOMEM;
  988. for (i = 0; i < MTK_MUTEX_MAX_HANDLES; i++)
  989. mtx->mutex[i].id = i;
  990. mtx->data = of_device_get_match_data(dev);
  991. if (!mtx->data->no_clk) {
  992. mtx->clk = devm_clk_get(dev, NULL);
  993. if (IS_ERR(mtx->clk))
  994. return dev_err_probe(dev, PTR_ERR(mtx->clk), "Failed to get clock\n");
  995. }
  996. mtx->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &regs);
  997. if (IS_ERR(mtx->regs)) {
  998. dev_err(dev, "Failed to map mutex registers\n");
  999. return PTR_ERR(mtx->regs);
  1000. }
  1001. mtx->addr = regs->start;
  1002. /* CMDQ is optional */
  1003. ret = cmdq_dev_get_client_reg(dev, &mtx->cmdq_reg, 0);
  1004. if (ret)
  1005. dev_dbg(dev, "No mediatek,gce-client-reg!\n");
  1006. platform_set_drvdata(pdev, mtx);
  1007. return 0;
  1008. }
  1009. static const struct of_device_id mutex_driver_dt_match[] = {
  1010. { .compatible = "mediatek,mt2701-disp-mutex", .data = &mt2701_mutex_driver_data },
  1011. { .compatible = "mediatek,mt2712-disp-mutex", .data = &mt2712_mutex_driver_data },
  1012. { .compatible = "mediatek,mt6795-disp-mutex", .data = &mt6795_mutex_driver_data },
  1013. { .compatible = "mediatek,mt8167-disp-mutex", .data = &mt8167_mutex_driver_data },
  1014. { .compatible = "mediatek,mt8173-disp-mutex", .data = &mt8173_mutex_driver_data },
  1015. { .compatible = "mediatek,mt8183-disp-mutex", .data = &mt8183_mutex_driver_data },
  1016. { .compatible = "mediatek,mt8186-disp-mutex", .data = &mt8186_mutex_driver_data },
  1017. { .compatible = "mediatek,mt8186-mdp3-mutex", .data = &mt8186_mdp_mutex_driver_data },
  1018. { .compatible = "mediatek,mt8188-disp-mutex", .data = &mt8188_mutex_driver_data },
  1019. { .compatible = "mediatek,mt8188-vpp-mutex", .data = &mt8188_vpp_mutex_driver_data },
  1020. { .compatible = "mediatek,mt8192-disp-mutex", .data = &mt8192_mutex_driver_data },
  1021. { .compatible = "mediatek,mt8195-disp-mutex", .data = &mt8195_mutex_driver_data },
  1022. { .compatible = "mediatek,mt8195-vpp-mutex", .data = &mt8195_vpp_mutex_driver_data },
  1023. { .compatible = "mediatek,mt8365-disp-mutex", .data = &mt8365_mutex_driver_data },
  1024. { /* sentinel */ },
  1025. };
  1026. MODULE_DEVICE_TABLE(of, mutex_driver_dt_match);
  1027. static struct platform_driver mtk_mutex_driver = {
  1028. .probe = mtk_mutex_probe,
  1029. .driver = {
  1030. .name = "mediatek-mutex",
  1031. .of_match_table = mutex_driver_dt_match,
  1032. },
  1033. };
  1034. module_platform_driver(mtk_mutex_driver);
  1035. MODULE_AUTHOR("Yongqiang Niu <yongqiang.niu@mediatek.com>");
  1036. MODULE_DESCRIPTION("MediaTek SoC MUTEX driver");
  1037. MODULE_LICENSE("GPL");