mtk-mutex.c 43 KB

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