dp_pll_14nm.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
  4. */
  5. /*
  6. ***************************************************************************
  7. ******** Display Port PLL driver block diagram for branch clocks **********
  8. ***************************************************************************
  9. +--------------------------+
  10. | DP_VCO_CLK |
  11. | |
  12. | +-------------------+ |
  13. | | (DP PLL/VCO) | |
  14. | +---------+---------+ |
  15. | v |
  16. | +----------+-----------+ |
  17. | | hsclk_divsel_clk_src | |
  18. | +----------+-----------+ |
  19. +--------------------------+
  20. |
  21. v
  22. +------------<------------|------------>-------------+
  23. | | |
  24. +----------v----------+ +----------v----------+ +----------v----------+
  25. | dp_link_2x_clk | | vco_divided_clk_src | | vco_divided_clk_src |
  26. | divsel_five | | | | |
  27. v----------+----------v | divsel_two | | divsel_four |
  28. | +----------+----------+ +----------+----------+
  29. | | |
  30. v v v
  31. | +---------------------+ |
  32. Input to MMSSCC block | | (aux_clk_ops) | |
  33. for link clk, crypto clk +--> vco_divided_clk <-+
  34. and interface clock | _src_mux |
  35. +----------+----------+
  36. |
  37. v
  38. Input to MMSSCC block
  39. for DP pixel clock
  40. ******************************************************************************
  41. */
  42. #define pr_fmt(fmt) "%s: " fmt, __func__
  43. #include <linux/kernel.h>
  44. #include <linux/err.h>
  45. #include <linux/iopoll.h>
  46. #include <linux/delay.h>
  47. #include <linux/usb/usbpd.h>
  48. #include <dt-bindings/clock/mdss-14nm-pll-clk.h>
  49. #include "pll_drv.h"
  50. #include "dp_pll.h"
  51. #include "dp_pll_14nm.h"
  52. static struct dp_pll_db dp_pdb;
  53. static struct clk_ops mux_clk_ops;
  54. static struct regmap_config dp_pll_14nm_cfg = {
  55. .reg_bits = 32,
  56. .reg_stride = 4,
  57. .val_bits = 32,
  58. .max_register = 0x910,
  59. };
  60. static struct regmap_bus dp_pixel_mux_regmap_ops = {
  61. .reg_write = dp_mux_set_parent_14nm,
  62. .reg_read = dp_mux_get_parent_14nm,
  63. };
  64. /* Op structures */
  65. static const struct clk_ops dp_14nm_vco_clk_ops = {
  66. .recalc_rate = dp_vco_recalc_rate_14nm,
  67. .set_rate = dp_vco_set_rate_14nm,
  68. .round_rate = dp_vco_round_rate_14nm,
  69. .prepare = dp_vco_prepare_14nm,
  70. .unprepare = dp_vco_unprepare_14nm,
  71. };
  72. static struct dp_pll_vco_clk dp_vco_clk = {
  73. .min_rate = DP_VCO_HSCLK_RATE_1620MHZDIV1000,
  74. .max_rate = DP_VCO_HSCLK_RATE_5400MHZDIV1000,
  75. .hw.init = &(struct clk_init_data){
  76. .name = "dp_vco_clk",
  77. .parent_names = (const char *[]){ "xo_board" },
  78. .num_parents = 1,
  79. .ops = &dp_14nm_vco_clk_ops,
  80. },
  81. };
  82. static struct clk_fixed_factor dp_phy_pll_link_clk = {
  83. .div = 10,
  84. .mult = 1,
  85. .hw.init = &(struct clk_init_data){
  86. .name = "dp_phy_pll_link_clk",
  87. .parent_names =
  88. (const char *[]){ "dp_vco_clk" },
  89. .num_parents = 1,
  90. .flags = (CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT),
  91. .ops = &clk_fixed_factor_ops,
  92. },
  93. };
  94. static struct clk_fixed_factor dp_vco_divsel_two_clk_src = {
  95. .div = 2,
  96. .mult = 1,
  97. .hw.init = &(struct clk_init_data){
  98. .name = "dp_vco_divsel_two_clk_src",
  99. .parent_names =
  100. (const char *[]){ "dp_vco_clk" },
  101. .num_parents = 1,
  102. .flags = (CLK_GET_RATE_NOCACHE),
  103. .ops = &clk_fixed_factor_ops,
  104. },
  105. };
  106. static struct clk_fixed_factor dp_vco_divsel_four_clk_src = {
  107. .div = 4,
  108. .mult = 1,
  109. .hw.init = &(struct clk_init_data){
  110. .name = "dp_vco_divsel_four_clk_src",
  111. .parent_names =
  112. (const char *[]){ "dp_vco_clk" },
  113. .num_parents = 1,
  114. .flags = (CLK_GET_RATE_NOCACHE),
  115. .ops = &clk_fixed_factor_ops,
  116. },
  117. };
  118. static int clk_mux_determine_rate(struct clk_hw *hw,
  119. struct clk_rate_request *req)
  120. {
  121. int ret = 0;
  122. ret = __clk_mux_determine_rate_closest(hw, req);
  123. if (ret)
  124. return ret;
  125. /* Set the new parent of mux if there is a new valid parent */
  126. if (hw->clk && req->best_parent_hw->clk)
  127. clk_set_parent(hw->clk, req->best_parent_hw->clk);
  128. return 0;
  129. }
  130. static unsigned long mux_recalc_rate(struct clk_hw *hw,
  131. unsigned long parent_rate)
  132. {
  133. struct clk *div_clk = NULL, *vco_clk = NULL;
  134. struct dp_pll_vco_clk *vco = NULL;
  135. div_clk = clk_get_parent(hw->clk);
  136. if (!div_clk)
  137. return 0;
  138. vco_clk = clk_get_parent(div_clk);
  139. if (!vco_clk)
  140. return 0;
  141. vco = to_dp_vco_hw(__clk_get_hw(vco_clk));
  142. if (!vco)
  143. return 0;
  144. if (vco->rate == DP_VCO_HSCLK_RATE_5400MHZDIV1000)
  145. return (vco->rate / 4);
  146. else
  147. return (vco->rate / 2);
  148. }
  149. static struct clk_regmap_mux dp_phy_pll_vco_div_clk = {
  150. .reg = 0x64,
  151. .shift = 0,
  152. .width = 1,
  153. .clkr = {
  154. .hw.init = &(struct clk_init_data){
  155. .name = "dp_phy_pll_vco_div_clk",
  156. .parent_names =
  157. (const char *[]){"dp_vco_divsel_two_clk_src",
  158. "dp_vco_divsel_four_clk_src"},
  159. .num_parents = 2,
  160. .ops = &mux_clk_ops,
  161. .flags = (CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT),
  162. },
  163. },
  164. };
  165. static struct clk_hw *mdss_dp_pllcc_14nm[] = {
  166. [DP_VCO_CLK] = &dp_vco_clk.hw,
  167. [DP_PHY_PLL_LINK_CLK] = &dp_phy_pll_link_clk.hw,
  168. [DP_VCO_DIVSEL_FOUR_CLK_SRC] = &dp_vco_divsel_four_clk_src.hw,
  169. [DP_VCO_DIVSEL_TWO_CLK_SRC] = &dp_vco_divsel_two_clk_src.hw,
  170. [DP_PHY_PLL_VCO_DIV_CLK] = &dp_phy_pll_vco_div_clk.clkr.hw,
  171. };
  172. int dp_mux_set_parent_14nm(void *context, unsigned int reg, unsigned int val)
  173. {
  174. struct mdss_pll_resources *dp_res = context;
  175. int rc;
  176. u32 auxclk_div;
  177. rc = mdss_pll_resource_enable(dp_res, true);
  178. if (rc) {
  179. pr_err("Failed to enable mdss DP PLL resources\n");
  180. return rc;
  181. }
  182. auxclk_div = MDSS_PLL_REG_R(dp_res->phy_base, DP_PHY_VCO_DIV);
  183. auxclk_div &= ~0x03; /* bits 0 to 1 */
  184. if (val == 0) /* mux parent index = 0 */
  185. auxclk_div |= 1;
  186. else if (val == 1) /* mux parent index = 1 */
  187. auxclk_div |= 2;
  188. MDSS_PLL_REG_W(dp_res->phy_base,
  189. DP_PHY_VCO_DIV, auxclk_div);
  190. /* Make sure the PHY registers writes are done */
  191. wmb();
  192. pr_debug("mux=%d auxclk_div=%x\n", val, auxclk_div);
  193. mdss_pll_resource_enable(dp_res, false);
  194. return 0;
  195. }
  196. int dp_mux_get_parent_14nm(void *context, unsigned int reg, unsigned int *val)
  197. {
  198. int rc;
  199. u32 auxclk_div = 0;
  200. struct mdss_pll_resources *dp_res = context;
  201. rc = mdss_pll_resource_enable(dp_res, true);
  202. if (rc) {
  203. pr_err("Failed to enable dp_res resources\n");
  204. return rc;
  205. }
  206. auxclk_div = MDSS_PLL_REG_R(dp_res->phy_base, DP_PHY_VCO_DIV);
  207. auxclk_div &= 0x03;
  208. if (auxclk_div == 1) /* Default divider */
  209. *val = 0;
  210. else if (auxclk_div == 2)
  211. *val = 1;
  212. mdss_pll_resource_enable(dp_res, false);
  213. pr_debug("auxclk_div=%d, val=%d\n", auxclk_div, *val);
  214. return 0;
  215. }
  216. static int dp_vco_pll_init_db_14nm(struct dp_pll_db *pdb,
  217. unsigned long rate)
  218. {
  219. struct mdss_pll_resources *dp_res = pdb->pll;
  220. u32 spare_value = 0;
  221. spare_value = MDSS_PLL_REG_R(dp_res->phy_base, DP_PHY_SPARE0);
  222. pdb->lane_cnt = spare_value & 0x0F;
  223. pdb->orientation = (spare_value & 0xF0) >> 4;
  224. pr_debug("spare_value=0x%x, ln_cnt=0x%x, orientation=0x%x\n",
  225. spare_value, pdb->lane_cnt, pdb->orientation);
  226. switch (rate) {
  227. case DP_VCO_HSCLK_RATE_1620MHZDIV1000:
  228. pdb->hsclk_sel = 0x2c;
  229. pdb->dec_start_mode0 = 0x69;
  230. pdb->div_frac_start1_mode0 = 0x00;
  231. pdb->div_frac_start2_mode0 = 0x80;
  232. pdb->div_frac_start3_mode0 = 0x07;
  233. pdb->lock_cmp1_mode0 = 0xbf;
  234. pdb->lock_cmp2_mode0 = 0x21;
  235. pdb->lock_cmp3_mode0 = 0x00;
  236. pdb->phy_vco_div = 0x1;
  237. pdb->lane_mode_1 = 0xc6;
  238. break;
  239. case DP_VCO_HSCLK_RATE_2700MHZDIV1000:
  240. pdb->hsclk_sel = 0x24;
  241. pdb->dec_start_mode0 = 0x69;
  242. pdb->div_frac_start1_mode0 = 0x00;
  243. pdb->div_frac_start2_mode0 = 0x80;
  244. pdb->div_frac_start3_mode0 = 0x07;
  245. pdb->lock_cmp1_mode0 = 0x3f;
  246. pdb->lock_cmp2_mode0 = 0x38;
  247. pdb->lock_cmp3_mode0 = 0x00;
  248. pdb->phy_vco_div = 0x1;
  249. pdb->lane_mode_1 = 0xc4;
  250. break;
  251. case DP_VCO_HSCLK_RATE_5400MHZDIV1000:
  252. pdb->hsclk_sel = 0x20;
  253. pdb->dec_start_mode0 = 0x8c;
  254. pdb->div_frac_start1_mode0 = 0x00;
  255. pdb->div_frac_start2_mode0 = 0x00;
  256. pdb->div_frac_start3_mode0 = 0x0a;
  257. pdb->lock_cmp1_mode0 = 0x7f;
  258. pdb->lock_cmp2_mode0 = 0x70;
  259. pdb->lock_cmp3_mode0 = 0x00;
  260. pdb->phy_vco_div = 0x2;
  261. pdb->lane_mode_1 = 0xc4;
  262. break;
  263. default:
  264. return -EINVAL;
  265. }
  266. return 0;
  267. }
  268. int dp_config_vco_rate_14nm(struct dp_pll_vco_clk *vco,
  269. unsigned long rate)
  270. {
  271. u32 res = 0;
  272. struct mdss_pll_resources *dp_res = vco->priv;
  273. struct dp_pll_db *pdb = (struct dp_pll_db *)dp_res->priv;
  274. res = dp_vco_pll_init_db_14nm(pdb, rate);
  275. if (res) {
  276. pr_err("VCO Init DB failed\n");
  277. return res;
  278. }
  279. MDSS_PLL_REG_W(dp_res->phy_base, DP_PHY_PD_CTL, 0x3d);
  280. /* Make sure the PHY register writes are done */
  281. wmb();
  282. MDSS_PLL_REG_W(dp_res->pll_base,
  283. QSERDES_COM_SVS_MODE_CLK_SEL, 0x01);
  284. MDSS_PLL_REG_W(dp_res->pll_base,
  285. QSERDES_COM_SYSCLK_EN_SEL, 0x37);
  286. MDSS_PLL_REG_W(dp_res->pll_base,
  287. QSERDES_COM_CLK_SELECT, 0x00);
  288. MDSS_PLL_REG_W(dp_res->pll_base,
  289. QSERDES_COM_SYS_CLK_CTRL, 0x06);
  290. MDSS_PLL_REG_W(dp_res->pll_base,
  291. QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x3f);
  292. MDSS_PLL_REG_W(dp_res->pll_base,
  293. QSERDES_COM_CLK_ENABLE1, 0x0e);
  294. MDSS_PLL_REG_W(dp_res->pll_base,
  295. QSERDES_COM_BG_CTRL, 0x0f);
  296. MDSS_PLL_REG_W(dp_res->pll_base,
  297. QSERDES_COM_SYSCLK_BUF_ENABLE, 0x06);
  298. MDSS_PLL_REG_W(dp_res->pll_base,
  299. QSERDES_COM_CLK_SELECT, 0x30);
  300. MDSS_PLL_REG_W(dp_res->pll_base,
  301. QSERDES_COM_PLL_IVCO, 0x0f);
  302. MDSS_PLL_REG_W(dp_res->pll_base,
  303. QSERDES_COM_PLL_CCTRL_MODE0, 0x28);
  304. MDSS_PLL_REG_W(dp_res->pll_base,
  305. QSERDES_COM_PLL_RCTRL_MODE0, 0x16);
  306. MDSS_PLL_REG_W(dp_res->pll_base,
  307. QSERDES_COM_CP_CTRL_MODE0, 0x0b);
  308. /* Parameters dependent on vco clock frequency */
  309. MDSS_PLL_REG_W(dp_res->pll_base,
  310. QSERDES_COM_HSCLK_SEL, pdb->hsclk_sel);
  311. MDSS_PLL_REG_W(dp_res->pll_base,
  312. QSERDES_COM_DEC_START_MODE0, pdb->dec_start_mode0);
  313. MDSS_PLL_REG_W(dp_res->pll_base,
  314. QSERDES_COM_DIV_FRAC_START1_MODE0, pdb->div_frac_start1_mode0);
  315. MDSS_PLL_REG_W(dp_res->pll_base,
  316. QSERDES_COM_DIV_FRAC_START2_MODE0, pdb->div_frac_start2_mode0);
  317. MDSS_PLL_REG_W(dp_res->pll_base,
  318. QSERDES_COM_DIV_FRAC_START3_MODE0, pdb->div_frac_start3_mode0);
  319. MDSS_PLL_REG_W(dp_res->pll_base,
  320. QSERDES_COM_LOCK_CMP1_MODE0, pdb->lock_cmp1_mode0);
  321. MDSS_PLL_REG_W(dp_res->pll_base,
  322. QSERDES_COM_LOCK_CMP2_MODE0, pdb->lock_cmp2_mode0);
  323. MDSS_PLL_REG_W(dp_res->pll_base,
  324. QSERDES_COM_LOCK_CMP3_MODE0, pdb->lock_cmp3_mode0);
  325. MDSS_PLL_REG_W(dp_res->pll_base,
  326. QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x40);
  327. MDSS_PLL_REG_W(dp_res->pll_base,
  328. QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x00);
  329. MDSS_PLL_REG_W(dp_res->pll_base,
  330. QSERDES_COM_VCO_TUNE_MAP, 0x00);
  331. MDSS_PLL_REG_W(dp_res->pll_base,
  332. QSERDES_COM_BG_TIMER, 0x08);
  333. MDSS_PLL_REG_W(dp_res->pll_base,
  334. QSERDES_COM_CORECLK_DIV, 0x05);
  335. MDSS_PLL_REG_W(dp_res->pll_base,
  336. QSERDES_COM_VCO_TUNE_CTRL, 0x00);
  337. MDSS_PLL_REG_W(dp_res->pll_base,
  338. QSERDES_COM_VCO_TUNE1_MODE0, 0x00);
  339. MDSS_PLL_REG_W(dp_res->pll_base,
  340. QSERDES_COM_VCO_TUNE2_MODE0, 0x00);
  341. MDSS_PLL_REG_W(dp_res->pll_base,
  342. QSERDES_COM_VCO_TUNE_CTRL, 0x00);
  343. wmb(); /* make sure write happens */
  344. MDSS_PLL_REG_W(dp_res->pll_base,
  345. QSERDES_COM_CORE_CLK_EN, 0x0f);
  346. wmb(); /* make sure write happens */
  347. if (pdb->orientation == ORIENTATION_CC2)
  348. MDSS_PLL_REG_W(dp_res->phy_base, DP_PHY_MODE, 0xc9);
  349. else
  350. MDSS_PLL_REG_W(dp_res->phy_base, DP_PHY_MODE, 0xd9);
  351. wmb(); /* make sure write happens */
  352. /* TX Lane configuration */
  353. MDSS_PLL_REG_W(dp_res->phy_base,
  354. DP_PHY_TX0_TX1_LANE_CTL, 0x05);
  355. MDSS_PLL_REG_W(dp_res->phy_base,
  356. DP_PHY_TX2_TX3_LANE_CTL, 0x05);
  357. /* TX-0 register configuration */
  358. MDSS_PLL_REG_W(dp_res->phy_base,
  359. QSERDES_TX0_OFFSET + TXn_TRANSCEIVER_BIAS_EN, 0x1a);
  360. MDSS_PLL_REG_W(dp_res->phy_base,
  361. QSERDES_TX0_OFFSET + TXn_VMODE_CTRL1, 0x40);
  362. MDSS_PLL_REG_W(dp_res->phy_base,
  363. QSERDES_TX0_OFFSET + TXn_PRE_STALL_LDO_BOOST_EN, 0x30);
  364. MDSS_PLL_REG_W(dp_res->phy_base,
  365. QSERDES_TX0_OFFSET + TXn_INTERFACE_SELECT, 0x3d);
  366. MDSS_PLL_REG_W(dp_res->phy_base,
  367. QSERDES_TX0_OFFSET + TXn_CLKBUF_ENABLE, 0x0f);
  368. MDSS_PLL_REG_W(dp_res->phy_base,
  369. QSERDES_TX0_OFFSET + TXn_RESET_TSYNC_EN, 0x03);
  370. MDSS_PLL_REG_W(dp_res->phy_base,
  371. QSERDES_TX0_OFFSET + TXn_TRAN_DRVR_EMP_EN, 0x03);
  372. MDSS_PLL_REG_W(dp_res->phy_base,
  373. QSERDES_TX0_OFFSET + TXn_PARRATE_REC_DETECT_IDLE_EN, 0x00);
  374. MDSS_PLL_REG_W(dp_res->phy_base,
  375. QSERDES_TX0_OFFSET + TXn_TX_INTERFACE_MODE, 0x00);
  376. MDSS_PLL_REG_W(dp_res->phy_base,
  377. QSERDES_TX0_OFFSET + TXn_TX_EMP_POST1_LVL, 0x2b);
  378. MDSS_PLL_REG_W(dp_res->phy_base,
  379. QSERDES_TX0_OFFSET + TXn_TX_DRV_LVL, 0x2f);
  380. MDSS_PLL_REG_W(dp_res->phy_base,
  381. QSERDES_TX0_OFFSET + TXn_TX_BAND, 0x4);
  382. MDSS_PLL_REG_W(dp_res->phy_base,
  383. QSERDES_TX0_OFFSET + TXn_RES_CODE_LANE_OFFSET_TX, 0x12);
  384. MDSS_PLL_REG_W(dp_res->phy_base,
  385. QSERDES_TX0_OFFSET + TXn_RES_CODE_LANE_OFFSET_RX, 0x12);
  386. /* TX-1 register configuration */
  387. MDSS_PLL_REG_W(dp_res->phy_base,
  388. QSERDES_TX1_OFFSET + TXn_TRANSCEIVER_BIAS_EN, 0x1a);
  389. MDSS_PLL_REG_W(dp_res->phy_base,
  390. QSERDES_TX1_OFFSET + TXn_VMODE_CTRL1, 0x40);
  391. MDSS_PLL_REG_W(dp_res->phy_base,
  392. QSERDES_TX1_OFFSET + TXn_PRE_STALL_LDO_BOOST_EN, 0x30);
  393. MDSS_PLL_REG_W(dp_res->phy_base,
  394. QSERDES_TX1_OFFSET + TXn_INTERFACE_SELECT, 0x3d);
  395. MDSS_PLL_REG_W(dp_res->phy_base,
  396. QSERDES_TX1_OFFSET + TXn_CLKBUF_ENABLE, 0x0f);
  397. MDSS_PLL_REG_W(dp_res->phy_base,
  398. QSERDES_TX1_OFFSET + TXn_RESET_TSYNC_EN, 0x03);
  399. MDSS_PLL_REG_W(dp_res->phy_base,
  400. QSERDES_TX1_OFFSET + TXn_TRAN_DRVR_EMP_EN, 0x03);
  401. MDSS_PLL_REG_W(dp_res->phy_base,
  402. QSERDES_TX1_OFFSET + TXn_PARRATE_REC_DETECT_IDLE_EN, 0x00);
  403. MDSS_PLL_REG_W(dp_res->phy_base,
  404. QSERDES_TX1_OFFSET + TXn_TX_INTERFACE_MODE, 0x00);
  405. MDSS_PLL_REG_W(dp_res->phy_base,
  406. QSERDES_TX1_OFFSET + TXn_TX_EMP_POST1_LVL, 0x2b);
  407. MDSS_PLL_REG_W(dp_res->phy_base,
  408. QSERDES_TX1_OFFSET + TXn_TX_DRV_LVL, 0x2f);
  409. MDSS_PLL_REG_W(dp_res->phy_base,
  410. QSERDES_TX1_OFFSET + TXn_TX_BAND, 0x4);
  411. MDSS_PLL_REG_W(dp_res->phy_base,
  412. QSERDES_TX1_OFFSET + TXn_RES_CODE_LANE_OFFSET_TX, 0x12);
  413. MDSS_PLL_REG_W(dp_res->phy_base,
  414. QSERDES_TX1_OFFSET + TXn_RES_CODE_LANE_OFFSET_RX, 0x12);
  415. wmb(); /* make sure write happens */
  416. /* PHY VCO divider programming */
  417. MDSS_PLL_REG_W(dp_res->phy_base,
  418. DP_PHY_VCO_DIV, pdb->phy_vco_div);
  419. wmb(); /* make sure write happens */
  420. MDSS_PLL_REG_W(dp_res->pll_base,
  421. QSERDES_COM_CMN_CONFIG, 0x02);
  422. wmb(); /* make sure write happens */
  423. return res;
  424. }
  425. static bool dp_14nm_pll_lock_status(struct mdss_pll_resources *dp_res)
  426. {
  427. u32 status;
  428. bool pll_locked;
  429. /* poll for PLL lock status */
  430. if (readl_poll_timeout_atomic((dp_res->pll_base +
  431. QSERDES_COM_C_READY_STATUS),
  432. status,
  433. ((status & BIT(0)) > 0),
  434. DP_PLL_POLL_SLEEP_US,
  435. DP_PLL_POLL_TIMEOUT_US)) {
  436. pr_err("C_READY status is not high. Status=%x\n", status);
  437. pll_locked = false;
  438. } else {
  439. pll_locked = true;
  440. }
  441. return pll_locked;
  442. }
  443. static bool dp_14nm_phy_rdy_status(struct mdss_pll_resources *dp_res)
  444. {
  445. u32 status;
  446. bool phy_ready = true;
  447. /* poll for PHY ready status */
  448. if (readl_poll_timeout_atomic((dp_res->phy_base +
  449. DP_PHY_STATUS),
  450. status,
  451. ((status & (BIT(1) | BIT(0))) > 0),
  452. DP_PHY_POLL_SLEEP_US,
  453. DP_PHY_POLL_TIMEOUT_US)) {
  454. pr_err("Phy_ready is not high. Status=%x\n", status);
  455. phy_ready = false;
  456. }
  457. return phy_ready;
  458. }
  459. static int dp_pll_enable_14nm(struct clk_hw *hw)
  460. {
  461. int rc = 0;
  462. struct dp_pll_vco_clk *vco = to_dp_vco_hw(hw);
  463. struct mdss_pll_resources *dp_res = vco->priv;
  464. MDSS_PLL_REG_W(dp_res->phy_base, DP_PHY_CFG, 0x01);
  465. MDSS_PLL_REG_W(dp_res->phy_base, DP_PHY_CFG, 0x05);
  466. MDSS_PLL_REG_W(dp_res->phy_base, DP_PHY_CFG, 0x01);
  467. MDSS_PLL_REG_W(dp_res->phy_base, DP_PHY_CFG, 0x09);
  468. wmb(); /* Make sure the PHY register writes are done */
  469. MDSS_PLL_REG_W(dp_res->pll_base,
  470. QSERDES_COM_RESETSM_CNTRL, 0x20);
  471. wmb(); /* Make sure the PLL register writes are done */
  472. udelay(900); /* hw recommended delay for full PU */
  473. if (!dp_14nm_pll_lock_status(dp_res)) {
  474. rc = -EINVAL;
  475. goto lock_err;
  476. }
  477. MDSS_PLL_REG_W(dp_res->phy_base, DP_PHY_CFG, 0x19);
  478. wmb(); /* Make sure the PHY register writes are done */
  479. udelay(10); /* hw recommended delay */
  480. if (!dp_14nm_phy_rdy_status(dp_res)) {
  481. rc = -EINVAL;
  482. goto lock_err;
  483. }
  484. pr_debug("PLL is locked\n");
  485. MDSS_PLL_REG_W(dp_res->phy_base,
  486. QSERDES_TX0_OFFSET + TXn_TRANSCEIVER_BIAS_EN, 0x3f);
  487. MDSS_PLL_REG_W(dp_res->phy_base,
  488. QSERDES_TX0_OFFSET + TXn_HIGHZ_DRVR_EN, 0x10);
  489. MDSS_PLL_REG_W(dp_res->phy_base,
  490. QSERDES_TX1_OFFSET + TXn_TRANSCEIVER_BIAS_EN, 0x3f);
  491. MDSS_PLL_REG_W(dp_res->phy_base,
  492. QSERDES_TX1_OFFSET + TXn_HIGHZ_DRVR_EN, 0x10);
  493. MDSS_PLL_REG_W(dp_res->phy_base,
  494. QSERDES_TX0_OFFSET + TXn_TX_POL_INV, 0x0a);
  495. MDSS_PLL_REG_W(dp_res->phy_base,
  496. QSERDES_TX1_OFFSET + TXn_TX_POL_INV, 0x0a);
  497. /*
  498. * Switch DP Mainlink clock (cc_dpphy_link_clk) from DP
  499. * controller side with final frequency
  500. */
  501. MDSS_PLL_REG_W(dp_res->phy_base, DP_PHY_CFG, 0x18);
  502. wmb(); /* Make sure the PHY register writes are done */
  503. MDSS_PLL_REG_W(dp_res->phy_base, DP_PHY_CFG, 0x19);
  504. wmb(); /* Make sure the PHY register writes are done */
  505. lock_err:
  506. return rc;
  507. }
  508. static int dp_pll_disable_14nm(struct clk_hw *hw)
  509. {
  510. struct dp_pll_vco_clk *vco = to_dp_vco_hw(hw);
  511. struct mdss_pll_resources *dp_res = vco->priv;
  512. /* Assert DP PHY power down */
  513. MDSS_PLL_REG_W(dp_res->phy_base, DP_PHY_PD_CTL, 0x2);
  514. /*
  515. * Make sure all the register writes to disable PLL are
  516. * completed before doing any other operation
  517. */
  518. wmb();
  519. return 0;
  520. }
  521. int dp_vco_prepare_14nm(struct clk_hw *hw)
  522. {
  523. int rc = 0;
  524. struct dp_pll_vco_clk *vco = to_dp_vco_hw(hw);
  525. struct mdss_pll_resources *dp_res = vco->priv;
  526. pr_debug("rate=%ld\n", vco->rate);
  527. rc = mdss_pll_resource_enable(dp_res, true);
  528. if (rc) {
  529. pr_err("Failed to enable mdss DP pll resources\n");
  530. goto error;
  531. }
  532. if ((dp_res->vco_cached_rate != 0)
  533. && (dp_res->vco_cached_rate == vco->rate)) {
  534. rc = vco->hw.init->ops->set_rate(hw,
  535. dp_res->vco_cached_rate, dp_res->vco_cached_rate);
  536. if (rc) {
  537. pr_err("index=%d vco_set_rate failed. rc=%d\n",
  538. rc, dp_res->index);
  539. mdss_pll_resource_enable(dp_res, false);
  540. goto error;
  541. }
  542. }
  543. rc = dp_pll_enable_14nm(hw);
  544. if (rc) {
  545. mdss_pll_resource_enable(dp_res, false);
  546. pr_err("ndx=%d failed to enable dp pll\n",
  547. dp_res->index);
  548. goto error;
  549. }
  550. mdss_pll_resource_enable(dp_res, false);
  551. error:
  552. return rc;
  553. }
  554. void dp_vco_unprepare_14nm(struct clk_hw *hw)
  555. {
  556. struct dp_pll_vco_clk *vco = to_dp_vco_hw(hw);
  557. struct mdss_pll_resources *dp_res = vco->priv;
  558. if (!dp_res) {
  559. pr_err("Invalid input parameter\n");
  560. return;
  561. }
  562. if (!dp_res->pll_on &&
  563. mdss_pll_resource_enable(dp_res, true)) {
  564. pr_err("pll resource can't be enabled\n");
  565. return;
  566. }
  567. dp_res->vco_cached_rate = vco->rate;
  568. dp_pll_disable_14nm(hw);
  569. dp_res->handoff_resources = false;
  570. mdss_pll_resource_enable(dp_res, false);
  571. dp_res->pll_on = false;
  572. }
  573. int dp_vco_set_rate_14nm(struct clk_hw *hw, unsigned long rate,
  574. unsigned long parent_rate)
  575. {
  576. struct dp_pll_vco_clk *vco = to_dp_vco_hw(hw);
  577. struct mdss_pll_resources *dp_res = vco->priv;
  578. int rc;
  579. rc = mdss_pll_resource_enable(dp_res, true);
  580. if (rc) {
  581. pr_err("pll resource can't be enabled\n");
  582. return rc;
  583. }
  584. pr_debug("DP lane CLK rate=%ld\n", rate);
  585. rc = dp_config_vco_rate_14nm(vco, rate);
  586. if (rc)
  587. pr_err("Failed to set clk rate\n");
  588. mdss_pll_resource_enable(dp_res, false);
  589. vco->rate = rate;
  590. return 0;
  591. }
  592. unsigned long dp_vco_recalc_rate_14nm(struct clk_hw *hw,
  593. unsigned long parent_rate)
  594. {
  595. struct dp_pll_vco_clk *vco = to_dp_vco_hw(hw);
  596. int rc;
  597. u32 div, hsclk_div;
  598. u64 vco_rate;
  599. struct mdss_pll_resources *dp_res = vco->priv;
  600. if (is_gdsc_disabled(dp_res))
  601. return 0;
  602. rc = mdss_pll_resource_enable(dp_res, true);
  603. if (rc) {
  604. pr_err("Failed to enable mdss DP pll=%d\n", dp_res->index);
  605. return rc;
  606. }
  607. div = MDSS_PLL_REG_R(dp_res->pll_base, QSERDES_COM_HSCLK_SEL);
  608. div &= 0x0f;
  609. if (div == 12)
  610. hsclk_div = 5; /* Default */
  611. else if (div == 4)
  612. hsclk_div = 3;
  613. else if (div == 0)
  614. hsclk_div = 2;
  615. else {
  616. pr_debug("unknown divider. forcing to default\n");
  617. hsclk_div = 5;
  618. }
  619. if (hsclk_div == 5)
  620. vco_rate = DP_VCO_HSCLK_RATE_1620MHZDIV1000;
  621. else if (hsclk_div == 3)
  622. vco_rate = DP_VCO_HSCLK_RATE_2700MHZDIV1000;
  623. else
  624. vco_rate = DP_VCO_HSCLK_RATE_5400MHZDIV1000;
  625. pr_debug("returning vco rate = %lu\n", (unsigned long)vco_rate);
  626. mdss_pll_resource_enable(dp_res, false);
  627. dp_res->vco_cached_rate = vco->rate = vco_rate;
  628. return (unsigned long)vco_rate;
  629. }
  630. long dp_vco_round_rate_14nm(struct clk_hw *hw, unsigned long rate,
  631. unsigned long *parent_rate)
  632. {
  633. unsigned long rrate = rate;
  634. struct dp_pll_vco_clk *vco = to_dp_vco_hw(hw);
  635. if (rate <= vco->min_rate)
  636. rrate = vco->min_rate;
  637. else if (rate <= DP_VCO_HSCLK_RATE_2700MHZDIV1000)
  638. rrate = DP_VCO_HSCLK_RATE_2700MHZDIV1000;
  639. else
  640. rrate = vco->max_rate;
  641. pr_debug("rrate=%ld\n", rrate);
  642. *parent_rate = rrate;
  643. return rrate;
  644. }
  645. int dp_pll_clock_register_14nm(struct platform_device *pdev,
  646. struct mdss_pll_resources *pll_res)
  647. {
  648. int rc = -ENOTSUPP, i = 0;
  649. struct clk_onecell_data *clk_data;
  650. struct clk *clk;
  651. struct regmap *regmap;
  652. int num_clks = ARRAY_SIZE(mdss_dp_pllcc_14nm);
  653. clk_data = devm_kzalloc(&pdev->dev, sizeof(*clk_data), GFP_KERNEL);
  654. if (!clk_data)
  655. return -ENOMEM;
  656. clk_data->clks = devm_kcalloc(&pdev->dev, num_clks,
  657. sizeof(struct clk *), GFP_KERNEL);
  658. if (!clk_data->clks)
  659. return -ENOMEM;
  660. clk_data->clk_num = num_clks;
  661. pll_res->priv = &dp_pdb;
  662. dp_pdb.pll = pll_res;
  663. /* Set client data for vco, mux and div clocks */
  664. regmap = devm_regmap_init(&pdev->dev, &dp_pixel_mux_regmap_ops,
  665. pll_res, &dp_pll_14nm_cfg);
  666. dp_phy_pll_vco_div_clk.clkr.regmap = regmap;
  667. mux_clk_ops = clk_regmap_mux_closest_ops;
  668. mux_clk_ops.determine_rate = clk_mux_determine_rate;
  669. mux_clk_ops.recalc_rate = mux_recalc_rate;
  670. dp_vco_clk.priv = pll_res;
  671. for (i = DP_VCO_CLK; i <= DP_PHY_PLL_VCO_DIV_CLK; i++) {
  672. pr_debug("reg clk: %d index: %d\n", i, pll_res->index);
  673. clk = devm_clk_register(&pdev->dev,
  674. mdss_dp_pllcc_14nm[i]);
  675. if (IS_ERR(clk)) {
  676. pr_err("clk registration failed for DP: %d\n",
  677. pll_res->index);
  678. rc = -EINVAL;
  679. goto clk_reg_fail;
  680. }
  681. clk_data->clks[i] = clk;
  682. }
  683. rc = of_clk_add_provider(pdev->dev.of_node,
  684. of_clk_src_onecell_get, clk_data);
  685. if (rc) {
  686. pr_err("Clock register failed rc=%d\n", rc);
  687. rc = -EPROBE_DEFER;
  688. } else {
  689. pr_debug("SUCCESS\n");
  690. }
  691. return 0;
  692. clk_reg_fail:
  693. return rc;
  694. }