dsi_phy_hw_v2_0.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved.
  4. */
  5. #include <linux/math64.h>
  6. #include <linux/delay.h>
  7. #include "dsi_hw.h"
  8. #include "dsi_phy_hw.h"
  9. #define DSIPHY_CMN_REVISION_ID0 0x0000
  10. #define DSIPHY_CMN_REVISION_ID1 0x0004
  11. #define DSIPHY_CMN_REVISION_ID2 0x0008
  12. #define DSIPHY_CMN_REVISION_ID3 0x000C
  13. #define DSIPHY_CMN_CLK_CFG0 0x0010
  14. #define DSIPHY_CMN_CLK_CFG1 0x0014
  15. #define DSIPHY_CMN_GLBL_TEST_CTRL 0x0018
  16. #define DSIPHY_CMN_CTRL_0 0x001C
  17. #define DSIPHY_CMN_CTRL_1 0x0020
  18. #define DSIPHY_CMN_CAL_HW_TRIGGER 0x0024
  19. #define DSIPHY_CMN_CAL_SW_CFG0 0x0028
  20. #define DSIPHY_CMN_CAL_SW_CFG1 0x002C
  21. #define DSIPHY_CMN_CAL_SW_CFG2 0x0030
  22. #define DSIPHY_CMN_CAL_HW_CFG0 0x0034
  23. #define DSIPHY_CMN_CAL_HW_CFG1 0x0038
  24. #define DSIPHY_CMN_CAL_HW_CFG2 0x003C
  25. #define DSIPHY_CMN_CAL_HW_CFG3 0x0040
  26. #define DSIPHY_CMN_CAL_HW_CFG4 0x0044
  27. #define DSIPHY_CMN_PLL_CNTRL 0x0048
  28. #define DSIPHY_CMN_LDO_CNTRL 0x004C
  29. #define DSIPHY_CMN_REGULATOR_CAL_STATUS0 0x0064
  30. #define DSIPHY_CMN_REGULATOR_CAL_STATUS1 0x0068
  31. #define DSI_MDP_ULPS_CLAMP_ENABLE_OFF 0x0054
  32. /* n = 0..3 for data lanes and n = 4 for clock lane
  33. * t for count per lane
  34. */
  35. #define DSIPHY_DLNX_CFG(n, t) \
  36. (0x100 + ((t) * 0x04) + ((n) * 0x80))
  37. #define DSIPHY_DLNX_TIMING_CTRL(n, t) \
  38. (0x118 + ((t) * 0x04) + ((n) * 0x80))
  39. #define DSIPHY_DLNX_STRENGTH_CTRL(n, t) \
  40. (0x138 + ((t) * 0x04) + ((n) * 0x80))
  41. #define DSIPHY_DLNX_TEST_DATAPATH(n) (0x110 + ((n) * 0x80))
  42. #define DSIPHY_DLNX_TEST_STR(n) (0x114 + ((n) * 0x80))
  43. #define DSIPHY_DLNX_BIST_POLY(n) (0x140 + ((n) * 0x80))
  44. #define DSIPHY_DLNX_BIST_SEED0(n) (0x144 + ((n) * 0x80))
  45. #define DSIPHY_DLNX_BIST_SEED1(n) (0x148 + ((n) * 0x80))
  46. #define DSIPHY_DLNX_BIST_HEAD(n) (0x14C + ((n) * 0x80))
  47. #define DSIPHY_DLNX_BIST_SOT(n) (0x150 + ((n) * 0x80))
  48. #define DSIPHY_DLNX_BIST_CTRL0(n) (0x154 + ((n) * 0x80))
  49. #define DSIPHY_DLNX_BIST_CTRL1(n) (0x158 + ((n) * 0x80))
  50. #define DSIPHY_DLNX_BIST_CTRL2(n) (0x15C + ((n) * 0x80))
  51. #define DSIPHY_DLNX_BIST_CTRL3(n) (0x160 + ((n) * 0x80))
  52. #define DSIPHY_DLNX_VREG_CNTRL(n) (0x164 + ((n) * 0x80))
  53. #define DSIPHY_DLNX_HSTX_STR_STATUS(n) (0x168 + ((n) * 0x80))
  54. #define DSIPHY_DLNX_BIST_STATUS0(n) (0x16C + ((n) * 0x80))
  55. #define DSIPHY_DLNX_BIST_STATUS1(n) (0x170 + ((n) * 0x80))
  56. #define DSIPHY_DLNX_BIST_STATUS2(n) (0x174 + ((n) * 0x80))
  57. #define DSIPHY_DLNX_BIST_STATUS3(n) (0x178 + ((n) * 0x80))
  58. #define DSIPHY_DLNX_MISR_STATUS(n) (0x17C + ((n) * 0x80))
  59. #define DSIPHY_PLL_CLKBUFLR_EN 0x041C
  60. #define DSIPHY_PLL_PLL_BANDGAP 0x0508
  61. /* dynamic refresh control registers */
  62. #define DSI_DYN_REFRESH_CTRL 0x000
  63. #define DSI_DYN_REFRESH_PIPE_DELAY 0x004
  64. #define DSI_DYN_REFRESH_PIPE_DELAY2 0x008
  65. #define DSI_DYN_REFRESH_PLL_DELAY 0x00C
  66. #define DSI_DYN_REFRESH_STATUS 0x010
  67. #define DSI_DYN_REFRESH_PLL_CTRL0 0x014
  68. #define DSI_DYN_REFRESH_PLL_CTRL1 0x018
  69. #define DSI_DYN_REFRESH_PLL_CTRL2 0x01C
  70. #define DSI_DYN_REFRESH_PLL_CTRL3 0x020
  71. #define DSI_DYN_REFRESH_PLL_CTRL4 0x024
  72. #define DSI_DYN_REFRESH_PLL_CTRL5 0x028
  73. #define DSI_DYN_REFRESH_PLL_CTRL6 0x02C
  74. #define DSI_DYN_REFRESH_PLL_CTRL7 0x030
  75. #define DSI_DYN_REFRESH_PLL_CTRL8 0x034
  76. #define DSI_DYN_REFRESH_PLL_CTRL9 0x038
  77. #define DSI_DYN_REFRESH_PLL_CTRL10 0x03C
  78. #define DSI_DYN_REFRESH_PLL_CTRL11 0x040
  79. #define DSI_DYN_REFRESH_PLL_CTRL12 0x044
  80. #define DSI_DYN_REFRESH_PLL_CTRL13 0x048
  81. #define DSI_DYN_REFRESH_PLL_CTRL14 0x04C
  82. #define DSI_DYN_REFRESH_PLL_CTRL15 0x050
  83. #define DSI_DYN_REFRESH_PLL_CTRL16 0x054
  84. #define DSI_DYN_REFRESH_PLL_CTRL17 0x058
  85. #define DSI_DYN_REFRESH_PLL_CTRL18 0x05C
  86. #define DSI_DYN_REFRESH_PLL_CTRL19 0x060
  87. #define DSI_DYN_REFRESH_PLL_CTRL20 0x064
  88. #define DSI_DYN_REFRESH_PLL_CTRL21 0x068
  89. #define DSI_DYN_REFRESH_PLL_CTRL22 0x06C
  90. #define DSI_DYN_REFRESH_PLL_CTRL23 0x070
  91. #define DSI_DYN_REFRESH_PLL_CTRL24 0x074
  92. #define DSI_DYN_REFRESH_PLL_CTRL25 0x078
  93. #define DSI_DYN_REFRESH_PLL_CTRL26 0x07C
  94. #define DSI_DYN_REFRESH_PLL_CTRL27 0x080
  95. #define DSI_DYN_REFRESH_PLL_CTRL28 0x084
  96. #define DSI_DYN_REFRESH_PLL_CTRL29 0x088
  97. #define DSI_DYN_REFRESH_PLL_CTRL30 0x08C
  98. #define DSI_DYN_REFRESH_PLL_CTRL31 0x090
  99. #define DSI_DYN_REFRESH_PLL_UPPER_ADDR 0x094
  100. #define DSI_DYN_REFRESH_PLL_UPPER_ADDR2 0x098
  101. #define DSIPHY_DLN0_CFG1 0x0104
  102. #define DSIPHY_DLN0_TIMING_CTRL_4 0x0118
  103. #define DSIPHY_DLN0_TIMING_CTRL_5 0x011C
  104. #define DSIPHY_DLN0_TIMING_CTRL_6 0x0120
  105. #define DSIPHY_DLN0_TIMING_CTRL_7 0x0124
  106. #define DSIPHY_DLN0_TIMING_CTRL_8 0x0128
  107. #define DSIPHY_DLN1_CFG1 0x0184
  108. #define DSIPHY_DLN1_TIMING_CTRL_4 0x0198
  109. #define DSIPHY_DLN1_TIMING_CTRL_5 0x019C
  110. #define DSIPHY_DLN1_TIMING_CTRL_6 0x01A0
  111. #define DSIPHY_DLN1_TIMING_CTRL_7 0x01A4
  112. #define DSIPHY_DLN1_TIMING_CTRL_8 0x01A8
  113. #define DSIPHY_DLN2_CFG1 0x0204
  114. #define DSIPHY_DLN2_TIMING_CTRL_4 0x0218
  115. #define DSIPHY_DLN2_TIMING_CTRL_5 0x021C
  116. #define DSIPHY_DLN2_TIMING_CTRL_6 0x0220
  117. #define DSIPHY_DLN2_TIMING_CTRL_7 0x0224
  118. #define DSIPHY_DLN2_TIMING_CTRL_8 0x0228
  119. #define DSIPHY_DLN3_CFG1 0x0284
  120. #define DSIPHY_DLN3_TIMING_CTRL_4 0x0298
  121. #define DSIPHY_DLN3_TIMING_CTRL_5 0x029C
  122. #define DSIPHY_DLN3_TIMING_CTRL_6 0x02A0
  123. #define DSIPHY_DLN3_TIMING_CTRL_7 0x02A4
  124. #define DSIPHY_DLN3_TIMING_CTRL_8 0x02A8
  125. #define DSIPHY_CKLN_CFG1 0x0304
  126. #define DSIPHY_CKLN_TIMING_CTRL_4 0x0318
  127. #define DSIPHY_CKLN_TIMING_CTRL_5 0x031C
  128. #define DSIPHY_CKLN_TIMING_CTRL_6 0x0320
  129. #define DSIPHY_CKLN_TIMING_CTRL_7 0x0324
  130. #define DSIPHY_CKLN_TIMING_CTRL_8 0x0328
  131. #define DSIPHY_PLL_RESETSM_CNTRL5 0x043c
  132. /**
  133. * regulator_enable() - enable regulators for DSI PHY
  134. * @phy: Pointer to DSI PHY hardware object.
  135. * @reg_cfg: Regulator configuration for all DSI lanes.
  136. */
  137. void dsi_phy_hw_v2_0_regulator_enable(struct dsi_phy_hw *phy,
  138. struct dsi_phy_per_lane_cfgs *reg_cfg)
  139. {
  140. int i;
  141. bool is_split_link = test_bit(DSI_PHY_SPLIT_LINK, phy->feature_map);
  142. for (i = DSI_LOGICAL_LANE_0; i < DSI_LANE_MAX; i++)
  143. DSI_W32(phy, DSIPHY_DLNX_VREG_CNTRL(i), reg_cfg->lane[i][0]);
  144. if (is_split_link)
  145. DSI_W32(phy, DSIPHY_DLNX_VREG_CNTRL(DSI_LOGICAL_CLOCK_LANE+1),
  146. reg_cfg->lane[DSI_LOGICAL_CLOCK_LANE][0]);
  147. /* make sure all values are written to hardware */
  148. wmb();
  149. DSI_PHY_DBG(phy, "Phy regulators enabled\n");
  150. }
  151. /**
  152. * regulator_disable() - disable regulators
  153. * @phy: Pointer to DSI PHY hardware object.
  154. */
  155. void dsi_phy_hw_v2_0_regulator_disable(struct dsi_phy_hw *phy)
  156. {
  157. DSI_PHY_DBG(phy, "Phy regulators disabled\n");
  158. }
  159. /**
  160. * enable() - Enable PHY hardware
  161. * @phy: Pointer to DSI PHY hardware object.
  162. * @cfg: Per lane configurations for timing, strength and lane
  163. * configurations.
  164. */
  165. void dsi_phy_hw_v2_0_enable(struct dsi_phy_hw *phy,
  166. struct dsi_phy_cfg *cfg)
  167. {
  168. int i, j;
  169. struct dsi_phy_per_lane_cfgs *lanecfg = &cfg->lanecfg;
  170. struct dsi_phy_per_lane_cfgs *timing = &cfg->timing;
  171. struct dsi_phy_per_lane_cfgs *strength = &cfg->strength;
  172. u32 data;
  173. bool is_split_link = test_bit(DSI_PHY_SPLIT_LINK, phy->feature_map);
  174. DSI_W32(phy, DSIPHY_CMN_LDO_CNTRL, 0x1C);
  175. DSI_W32(phy, DSIPHY_CMN_GLBL_TEST_CTRL, 0x1);
  176. for (i = DSI_LOGICAL_LANE_0; i < DSI_LANE_MAX; i++) {
  177. for (j = 0; j < lanecfg->count_per_lane; j++)
  178. DSI_W32(phy, DSIPHY_DLNX_CFG(i, j),
  179. lanecfg->lane[i][j]);
  180. DSI_W32(phy, DSIPHY_DLNX_TEST_STR(i), 0x88);
  181. for (j = 0; j < timing->count_per_lane; j++)
  182. DSI_W32(phy, DSIPHY_DLNX_TIMING_CTRL(i, j),
  183. timing->lane[i][j]);
  184. for (j = 0; j < strength->count_per_lane; j++)
  185. DSI_W32(phy, DSIPHY_DLNX_STRENGTH_CTRL(i, j),
  186. strength->lane[i][j]);
  187. }
  188. if (is_split_link) {
  189. i = DSI_LOGICAL_CLOCK_LANE;
  190. for (j = 0; j < lanecfg->count_per_lane; j++)
  191. DSI_W32(phy, DSIPHY_DLNX_CFG(i+1, j),
  192. lanecfg->lane[i][j]);
  193. DSI_W32(phy, DSIPHY_DLNX_TEST_STR(i+1), 0x0);
  194. DSI_W32(phy, DSIPHY_DLNX_TEST_DATAPATH(i+1), 0x88);
  195. for (j = 0; j < timing->count_per_lane; j++)
  196. DSI_W32(phy, DSIPHY_DLNX_TIMING_CTRL(i+1, j),
  197. timing->lane[i][j]);
  198. for (j = 0; j < strength->count_per_lane; j++)
  199. DSI_W32(phy, DSIPHY_DLNX_STRENGTH_CTRL(i+1, j),
  200. strength->lane[i][j]);
  201. /* enable split link for cmn clk cfg1 */
  202. data = DSI_R32(phy, DSIPHY_CMN_CLK_CFG1);
  203. data |= BIT(1);
  204. DSI_W32(phy, DSIPHY_CMN_CLK_CFG1, data);
  205. }
  206. /* make sure all values are written to hardware before enabling phy */
  207. wmb();
  208. DSI_W32(phy, DSIPHY_CMN_CTRL_1, 0x80);
  209. udelay(100);
  210. DSI_W32(phy, DSIPHY_CMN_CTRL_1, 0x00);
  211. data = DSI_R32(phy, DSIPHY_CMN_GLBL_TEST_CTRL);
  212. switch (cfg->pll_source) {
  213. case DSI_PLL_SOURCE_STANDALONE:
  214. DSI_W32(phy, DSIPHY_PLL_CLKBUFLR_EN, 0x01);
  215. data &= ~BIT(2);
  216. break;
  217. case DSI_PLL_SOURCE_NATIVE:
  218. DSI_W32(phy, DSIPHY_PLL_CLKBUFLR_EN, 0x03);
  219. data &= ~BIT(2);
  220. break;
  221. case DSI_PLL_SOURCE_NON_NATIVE:
  222. DSI_W32(phy, DSIPHY_PLL_CLKBUFLR_EN, 0x00);
  223. data |= BIT(2);
  224. break;
  225. default:
  226. break;
  227. }
  228. DSI_W32(phy, DSIPHY_CMN_GLBL_TEST_CTRL, data);
  229. /* Enable bias current for pll1 during split display case */
  230. if (cfg->pll_source == DSI_PLL_SOURCE_NON_NATIVE)
  231. DSI_W32(phy, DSIPHY_PLL_PLL_BANDGAP, 0x3);
  232. DSI_PHY_DBG(phy, "Phy enabled\n");
  233. }
  234. /**
  235. * disable() - Disable PHY hardware
  236. * @phy: Pointer to DSI PHY hardware object.
  237. */
  238. void dsi_phy_hw_v2_0_disable(struct dsi_phy_hw *phy,
  239. struct dsi_phy_cfg *cfg)
  240. {
  241. DSI_W32(phy, DSIPHY_PLL_CLKBUFLR_EN, 0);
  242. DSI_W32(phy, DSIPHY_CMN_GLBL_TEST_CTRL, 0);
  243. DSI_W32(phy, DSIPHY_CMN_CTRL_0, 0);
  244. DSI_PHY_DBG(phy, "Phy disabled\n");
  245. }
  246. /**
  247. * dsi_phy_hw_v2_0_idle_on() - Enable DSI PHY hardware during idle screen
  248. * @phy: Pointer to DSI PHY hardware object.
  249. */
  250. void dsi_phy_hw_v2_0_idle_on(struct dsi_phy_hw *phy, struct dsi_phy_cfg *cfg)
  251. {
  252. int i = 0, j;
  253. struct dsi_phy_per_lane_cfgs *strength = &cfg->strength;
  254. bool is_split_link = test_bit(DSI_PHY_SPLIT_LINK, phy->feature_map);
  255. for (i = DSI_LOGICAL_LANE_0; i < DSI_LANE_MAX; i++) {
  256. for (j = 0; j < strength->count_per_lane; j++)
  257. DSI_W32(phy, DSIPHY_DLNX_STRENGTH_CTRL(i, j),
  258. strength->lane[i][j]);
  259. }
  260. if (is_split_link) {
  261. i = DSI_LOGICAL_CLOCK_LANE;
  262. for (j = 0; j < strength->count_per_lane; j++)
  263. DSI_W32(phy, DSIPHY_DLNX_STRENGTH_CTRL(i+1, j),
  264. strength->lane[i][j]);
  265. }
  266. wmb(); /* make sure write happens */
  267. DSI_PHY_DBG(phy, "Phy enabled out of idle screen\n");
  268. }
  269. /**
  270. * dsi_phy_hw_v2_0_idle_off() - Disable DSI PHY hardware during idle screen
  271. * @phy: Pointer to DSI PHY hardware object.
  272. */
  273. void dsi_phy_hw_v2_0_idle_off(struct dsi_phy_hw *phy)
  274. {
  275. int i = 0;
  276. bool is_split_link = test_bit(DSI_PHY_SPLIT_LINK, phy->feature_map);
  277. DSI_W32(phy, DSIPHY_CMN_CTRL_0, 0x7f);
  278. for (i = DSI_LOGICAL_LANE_0; i < DSI_LANE_MAX; i++)
  279. DSI_W32(phy, DSIPHY_DLNX_VREG_CNTRL(i), 0x1c);
  280. if (is_split_link)
  281. DSI_W32(phy, DSIPHY_DLNX_VREG_CNTRL(DSI_LOGICAL_CLOCK_LANE+1),
  282. 0x1c);
  283. DSI_W32(phy, DSIPHY_CMN_LDO_CNTRL, 0x1C);
  284. for (i = DSI_LOGICAL_LANE_0; i < DSI_LANE_MAX; i++)
  285. DSI_W32(phy, DSIPHY_DLNX_STRENGTH_CTRL(i, 1), 0x0);
  286. if (is_split_link)
  287. DSI_W32(phy,
  288. DSIPHY_DLNX_STRENGTH_CTRL(DSI_LOGICAL_CLOCK_LANE+1, 1), 0x0);
  289. wmb(); /* make sure write happens */
  290. DSI_PHY_DBG(phy, "Phy disabled during idle screen\n");
  291. }
  292. int dsi_phy_hw_timing_val_v2_0(struct dsi_phy_per_lane_cfgs *timing_cfg,
  293. u32 *timing_val, u32 size)
  294. {
  295. int i = 0, j = 0;
  296. if (size != (DSI_LANE_MAX * DSI_MAX_SETTINGS)) {
  297. DSI_ERR("Unexpected timing array size %d\n", size);
  298. return -EINVAL;
  299. }
  300. for (i = DSI_LOGICAL_LANE_0; i < DSI_LANE_MAX; i++) {
  301. for (j = 0; j < DSI_MAX_SETTINGS; j++) {
  302. timing_cfg->lane[i][j] = *timing_val;
  303. timing_val++;
  304. }
  305. }
  306. return 0;
  307. }
  308. void dsi_phy_hw_v2_0_clamp_ctrl(struct dsi_phy_hw *phy, bool enable)
  309. {
  310. u32 clamp_reg = 0;
  311. if (!phy->phy_clamp_base) {
  312. DSI_PHY_DBG(phy, "phy_clamp_base NULL\n");
  313. return;
  314. }
  315. if (enable) {
  316. clamp_reg |= BIT(0);
  317. DSI_MISC_W32(phy, DSI_MDP_ULPS_CLAMP_ENABLE_OFF,
  318. clamp_reg);
  319. DSI_PHY_DBG(phy, "clamp enabled\n");
  320. } else {
  321. clamp_reg &= ~BIT(0);
  322. DSI_MISC_W32(phy, DSI_MDP_ULPS_CLAMP_ENABLE_OFF,
  323. clamp_reg);
  324. DSI_PHY_DBG(phy, "clamp disabled\n");
  325. }
  326. }
  327. void dsi_phy_hw_v2_0_dyn_refresh_config(struct dsi_phy_hw *phy,
  328. struct dsi_phy_cfg *cfg, bool is_master)
  329. {
  330. u32 glbl_tst_cntrl;
  331. if (is_master) {
  332. glbl_tst_cntrl = DSI_R32(phy, DSIPHY_CMN_GLBL_TEST_CTRL);
  333. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL0,
  334. DSIPHY_CMN_GLBL_TEST_CTRL,
  335. DSIPHY_PLL_PLL_BANDGAP,
  336. glbl_tst_cntrl | BIT(1), 0x1);
  337. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL1,
  338. DSIPHY_PLL_RESETSM_CNTRL5,
  339. DSIPHY_PLL_PLL_BANDGAP, 0x0D, 0x03);
  340. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL2,
  341. DSIPHY_PLL_RESETSM_CNTRL5,
  342. DSIPHY_CMN_PLL_CNTRL, 0x1D, 0x00);
  343. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL3,
  344. DSIPHY_CMN_CTRL_1, DSIPHY_DLN0_CFG1, 0x20, 0);
  345. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL4,
  346. DSIPHY_DLN1_CFG1, DSIPHY_DLN2_CFG1, 0, 0);
  347. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL5,
  348. DSIPHY_DLN3_CFG1, DSIPHY_CKLN_CFG1, 0, 0);
  349. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL6,
  350. DSIPHY_DLN0_TIMING_CTRL_4,
  351. DSIPHY_DLN1_TIMING_CTRL_4,
  352. cfg->timing.lane[0][0], cfg->timing.lane[1][0]);
  353. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL7,
  354. DSIPHY_DLN2_TIMING_CTRL_4,
  355. DSIPHY_DLN3_TIMING_CTRL_4,
  356. cfg->timing.lane[2][0], cfg->timing.lane[3][0]);
  357. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL8,
  358. DSIPHY_CKLN_TIMING_CTRL_4,
  359. DSIPHY_DLN0_TIMING_CTRL_5,
  360. cfg->timing.lane[4][0], cfg->timing.lane[0][1]);
  361. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL9,
  362. DSIPHY_DLN1_TIMING_CTRL_5,
  363. DSIPHY_DLN2_TIMING_CTRL_5,
  364. cfg->timing.lane[1][1], cfg->timing.lane[2][1]);
  365. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL10,
  366. DSIPHY_DLN3_TIMING_CTRL_5,
  367. DSIPHY_CKLN_TIMING_CTRL_5,
  368. cfg->timing.lane[3][1], cfg->timing.lane[4][1]);
  369. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL11,
  370. DSIPHY_DLN0_TIMING_CTRL_6,
  371. DSIPHY_DLN1_TIMING_CTRL_6,
  372. cfg->timing.lane[0][2], cfg->timing.lane[1][2]);
  373. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL12,
  374. DSIPHY_DLN2_TIMING_CTRL_6,
  375. DSIPHY_DLN3_TIMING_CTRL_6,
  376. cfg->timing.lane[2][2], cfg->timing.lane[3][2]);
  377. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL13,
  378. DSIPHY_CKLN_TIMING_CTRL_6,
  379. DSIPHY_DLN0_TIMING_CTRL_7,
  380. cfg->timing.lane[4][2], cfg->timing.lane[0][3]);
  381. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL14,
  382. DSIPHY_DLN1_TIMING_CTRL_7,
  383. DSIPHY_DLN2_TIMING_CTRL_7,
  384. cfg->timing.lane[1][3], cfg->timing.lane[2][3]);
  385. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL15,
  386. DSIPHY_DLN3_TIMING_CTRL_7,
  387. DSIPHY_CKLN_TIMING_CTRL_7,
  388. cfg->timing.lane[3][3], cfg->timing.lane[4][3]);
  389. DSI_DYN_REF_REG_W(phy->dyn_pll_base,
  390. DSI_DYN_REFRESH_PLL_CTRL16,
  391. DSIPHY_DLN0_TIMING_CTRL_8,
  392. DSIPHY_DLN1_TIMING_CTRL_8,
  393. cfg->timing.lane[0][4], cfg->timing.lane[1][4]);
  394. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL17,
  395. DSIPHY_DLN2_TIMING_CTRL_8,
  396. DSIPHY_DLN3_TIMING_CTRL_8,
  397. cfg->timing.lane[2][4], cfg->timing.lane[3][4]);
  398. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL18,
  399. DSIPHY_CKLN_TIMING_CTRL_8, DSIPHY_CMN_CTRL_1,
  400. cfg->timing.lane[4][4], 0);
  401. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL30,
  402. DSIPHY_CMN_GLBL_TEST_CTRL,
  403. DSIPHY_CMN_GLBL_TEST_CTRL,
  404. ((glbl_tst_cntrl) & (~BIT(2))),
  405. ((glbl_tst_cntrl) & (~BIT(2))));
  406. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL31,
  407. DSIPHY_CMN_GLBL_TEST_CTRL,
  408. DSIPHY_CMN_GLBL_TEST_CTRL,
  409. ((glbl_tst_cntrl) & (~BIT(2))),
  410. ((glbl_tst_cntrl) & (~BIT(2))));
  411. } else {
  412. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL0,
  413. DSIPHY_DLN0_CFG1, DSIPHY_DLN1_CFG1, 0, 0);
  414. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL1,
  415. DSIPHY_DLN2_CFG1, DSIPHY_DLN3_CFG1, 0x0, 0x0);
  416. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL2,
  417. DSIPHY_CKLN_CFG1, DSIPHY_DLN0_TIMING_CTRL_4,
  418. 0x0, cfg->timing.lane[0][0]);
  419. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL3,
  420. DSIPHY_DLN1_TIMING_CTRL_4,
  421. DSIPHY_DLN2_TIMING_CTRL_4,
  422. cfg->timing.lane[1][0], cfg->timing.lane[2][0]);
  423. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL4,
  424. DSIPHY_DLN3_TIMING_CTRL_4,
  425. DSIPHY_CKLN_TIMING_CTRL_4,
  426. cfg->timing.lane[3][0], cfg->timing.lane[4][0]);
  427. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL5,
  428. DSIPHY_DLN0_TIMING_CTRL_5,
  429. DSIPHY_DLN1_TIMING_CTRL_5,
  430. cfg->timing.lane[0][1], cfg->timing.lane[1][1]);
  431. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL6,
  432. DSIPHY_DLN2_TIMING_CTRL_5,
  433. DSIPHY_DLN3_TIMING_CTRL_5,
  434. cfg->timing.lane[2][1], cfg->timing.lane[3][1]);
  435. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL7,
  436. DSIPHY_CKLN_TIMING_CTRL_5,
  437. DSIPHY_DLN0_TIMING_CTRL_6,
  438. cfg->timing.lane[4][1], cfg->timing.lane[0][2]);
  439. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL8,
  440. DSIPHY_DLN1_TIMING_CTRL_6,
  441. DSIPHY_DLN2_TIMING_CTRL_6,
  442. cfg->timing.lane[1][2], cfg->timing.lane[2][2]);
  443. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL9,
  444. DSIPHY_DLN3_TIMING_CTRL_6,
  445. DSIPHY_CKLN_TIMING_CTRL_6,
  446. cfg->timing.lane[3][2], cfg->timing.lane[4][2]);
  447. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL10,
  448. DSIPHY_DLN0_TIMING_CTRL_7,
  449. DSIPHY_DLN1_TIMING_CTRL_7,
  450. cfg->timing.lane[0][3], cfg->timing.lane[1][3]);
  451. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL11,
  452. DSIPHY_DLN2_TIMING_CTRL_7,
  453. DSIPHY_DLN3_TIMING_CTRL_7,
  454. cfg->timing.lane[2][3], cfg->timing.lane[3][3]);
  455. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL12,
  456. DSIPHY_CKLN_TIMING_CTRL_7,
  457. DSIPHY_DLN0_TIMING_CTRL_8,
  458. cfg->timing.lane[4][3], cfg->timing.lane[0][4]);
  459. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL13,
  460. DSIPHY_DLN1_TIMING_CTRL_8,
  461. DSIPHY_DLN2_TIMING_CTRL_8,
  462. cfg->timing.lane[1][4], cfg->timing.lane[2][4]);
  463. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL14,
  464. DSIPHY_DLN3_TIMING_CTRL_8,
  465. DSIPHY_CKLN_TIMING_CTRL_8,
  466. cfg->timing.lane[3][4], cfg->timing.lane[4][4]);
  467. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL15,
  468. 0x0110, 0x0110, 0, 0);
  469. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL16,
  470. 0x0110, 0x0110, 0, 0);
  471. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL17,
  472. 0x0110, 0x0110, 0, 0);
  473. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL18,
  474. 0x0110, 0x0110, 0, 0);
  475. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL19,
  476. 0x0110, 0x0110, 0, 0);
  477. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL20,
  478. 0x0110, 0x0110, 0, 0);
  479. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL21,
  480. 0x0110, 0x0110, 0, 0);
  481. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL22,
  482. 0x0110, 0x0110, 0, 0);
  483. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL23,
  484. 0x0110, 0x0110, 0, 0);
  485. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL24,
  486. 0x0110, 0x0110, 0, 0);
  487. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL25,
  488. 0x0110, 0x0110, 0, 0);
  489. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL26,
  490. 0x0110, 0x0110, 0, 0);
  491. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL27,
  492. 0x0110, 0x0110, 0, 0);
  493. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL28,
  494. 0x0110, 0x0110, 0, 0);
  495. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL29,
  496. 0x0110, 0x0110, 0, 0);
  497. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL30,
  498. 0x0110, 0x0110, 0, 0);
  499. DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL31,
  500. 0x0110, 0x0110, 0, 0);
  501. DSI_GEN_W32(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_UPPER_ADDR,
  502. 0x0);
  503. DSI_GEN_W32(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_UPPER_ADDR2,
  504. 0x0);
  505. }
  506. wmb(); /* make sure phy timings are updated*/
  507. }
  508. void dsi_phy_hw_v2_0_dyn_refresh_pipe_delay(struct dsi_phy_hw *phy,
  509. struct dsi_dyn_clk_delay *delay)
  510. {
  511. if (!delay)
  512. return;
  513. DSI_GEN_W32(phy->dyn_pll_base, DSI_DYN_REFRESH_PIPE_DELAY,
  514. delay->pipe_delay);
  515. DSI_GEN_W32(phy->dyn_pll_base, DSI_DYN_REFRESH_PIPE_DELAY2,
  516. delay->pipe_delay2);
  517. DSI_GEN_W32(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_DELAY,
  518. delay->pll_delay);
  519. }
  520. void dsi_phy_hw_v2_0_dyn_refresh_helper(struct dsi_phy_hw *phy, u32 offset)
  521. {
  522. u32 reg;
  523. /*
  524. * if no offset is mentioned then this means we want to clear
  525. * the dynamic refresh ctrl register which is the last step
  526. * of dynamic refresh sequence.
  527. */
  528. if (!offset) {
  529. reg = DSI_GEN_R32(phy->dyn_pll_base, DSI_DYN_REFRESH_CTRL);
  530. reg &= ~(BIT(0) | BIT(8));
  531. DSI_GEN_W32(phy->dyn_pll_base, DSI_DYN_REFRESH_CTRL, reg);
  532. wmb(); /* ensure dynamic fps is cleared */
  533. return;
  534. }
  535. if (offset & BIT(DYN_REFRESH_INTF_SEL)) {
  536. reg = DSI_GEN_R32(phy->dyn_pll_base, DSI_DYN_REFRESH_CTRL);
  537. reg |= BIT(13);
  538. DSI_GEN_W32(phy->dyn_pll_base, DSI_DYN_REFRESH_CTRL, reg);
  539. }
  540. if (offset & BIT(DYN_REFRESH_SWI_CTRL)) {
  541. reg = DSI_GEN_R32(phy->dyn_pll_base, DSI_DYN_REFRESH_CTRL);
  542. reg |= BIT(0);
  543. DSI_GEN_W32(phy->dyn_pll_base, DSI_DYN_REFRESH_CTRL, reg);
  544. }
  545. if (offset & BIT(DYN_REFRESH_SW_TRIGGER)) {
  546. reg = DSI_GEN_R32(phy->dyn_pll_base, DSI_DYN_REFRESH_CTRL);
  547. reg |= BIT(8);
  548. DSI_GEN_W32(phy->dyn_pll_base, DSI_DYN_REFRESH_CTRL, reg);
  549. wmb(); /* ensure dynamic fps is triggered */
  550. }
  551. }
  552. int dsi_phy_hw_v2_0_cache_phy_timings(struct dsi_phy_per_lane_cfgs *timings,
  553. u32 *dst, u32 size)
  554. {
  555. int i, j, count = 0;
  556. if (!timings || !dst || !size)
  557. return -EINVAL;
  558. if (size != (DSI_LANE_MAX * DSI_MAX_SETTINGS)) {
  559. pr_err("size mis-match\n");
  560. return -EINVAL;
  561. }
  562. for (i = DSI_LOGICAL_LANE_0; i < DSI_LANE_MAX; i++) {
  563. for (j = 0; j < DSI_MAX_SETTINGS; j++) {
  564. dst[count] = timings->lane[i][j];
  565. count++;
  566. }
  567. }
  568. return 0;
  569. }