mtk-mutex.c 29 KB

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