1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
4  */
5 
6 #include <linux/clk-provider.h>
7 #include <linux/delay.h>
8 
9 #include "dsi_phy.h"
10 #include "dsi.xml.h"
11 #include "dsi_phy_28nm_8960.xml.h"
12 
13 /*
14  * DSI PLL 28nm (8960/A family) - clock diagram (eg: DSI1):
15  *
16  *
17  *                        +------+
18  *  dsi1vco_clk ----o-----| DIV1 |---dsi1pllbit (not exposed as clock)
19  *  F * byte_clk    |     +------+
20  *                  | bit clock divider (F / 8)
21  *                  |
22  *                  |     +------+
23  *                  o-----| DIV2 |---dsi0pllbyte---o---> To byte RCG
24  *                  |     +------+                 | (sets parent rate)
25  *                  | byte clock divider (F)       |
26  *                  |                              |
27  *                  |                              o---> To esc RCG
28  *                  |                                (doesn't set parent rate)
29  *                  |
30  *                  |     +------+
31  *                  o-----| DIV3 |----dsi0pll------o---> To dsi RCG
32  *                        +------+                 | (sets parent rate)
33  *                  dsi clock divider (F * magic)  |
34  *                                                 |
35  *                                                 o---> To pixel rcg
36  *                                                  (doesn't set parent rate)
37  */
38 
39 #define POLL_MAX_READS		8000
40 #define POLL_TIMEOUT_US		1
41 
42 #define VCO_REF_CLK_RATE	27000000
43 #define VCO_MIN_RATE		600000000
44 #define VCO_MAX_RATE		1200000000
45 
46 #define VCO_PREF_DIV_RATIO	27
47 
48 struct pll_28nm_cached_state {
49 	unsigned long vco_rate;
50 	u8 postdiv3;
51 	u8 postdiv2;
52 	u8 postdiv1;
53 };
54 
55 struct clk_bytediv {
56 	struct clk_hw hw;
57 	void __iomem *reg;
58 };
59 
60 struct dsi_pll_28nm {
61 	struct clk_hw clk_hw;
62 
63 	struct msm_dsi_phy *phy;
64 
65 	struct pll_28nm_cached_state cached_state;
66 };
67 
68 #define to_pll_28nm(x)	container_of(x, struct dsi_pll_28nm, clk_hw)
69 
70 static bool pll_28nm_poll_for_ready(struct dsi_pll_28nm *pll_28nm,
71 				    int nb_tries, int timeout_us)
72 {
73 	bool pll_locked = false;
74 	u32 val;
75 
76 	while (nb_tries--) {
77 		val = dsi_phy_read(pll_28nm->phy->pll_base + REG_DSI_28nm_8960_PHY_PLL_RDY);
78 		pll_locked = !!(val & DSI_28nm_8960_PHY_PLL_RDY_PLL_RDY);
79 
80 		if (pll_locked)
81 			break;
82 
83 		udelay(timeout_us);
84 	}
85 	DBG("DSI PLL is %slocked", pll_locked ? "" : "*not* ");
86 
87 	return pll_locked;
88 }
89 
90 /*
91  * Clock Callbacks
92  */
93 static int dsi_pll_28nm_clk_set_rate(struct clk_hw *hw, unsigned long rate,
94 				     unsigned long parent_rate)
95 {
96 	struct dsi_pll_28nm *pll_28nm = to_pll_28nm(hw);
97 	void __iomem *base = pll_28nm->phy->pll_base;
98 	u32 val, temp, fb_divider;
99 
100 	DBG("rate=%lu, parent's=%lu", rate, parent_rate);
101 
102 	temp = rate / 10;
103 	val = VCO_REF_CLK_RATE / 10;
104 	fb_divider = (temp * VCO_PREF_DIV_RATIO) / val;
105 	fb_divider = fb_divider / 2 - 1;
106 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_1,
107 		      fb_divider & 0xff);
108 
109 	val = dsi_phy_read(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_2);
110 
111 	val |= (fb_divider >> 8) & 0x07;
112 
113 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_2,
114 		      val);
115 
116 	val = dsi_phy_read(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_3);
117 
118 	val |= (VCO_PREF_DIV_RATIO - 1) & 0x3f;
119 
120 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_3,
121 		      val);
122 
123 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_6,
124 		      0xf);
125 
126 	val = dsi_phy_read(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_8);
127 	val |= 0x7 << 4;
128 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_8,
129 		      val);
130 
131 	return 0;
132 }
133 
134 static int dsi_pll_28nm_clk_is_enabled(struct clk_hw *hw)
135 {
136 	struct dsi_pll_28nm *pll_28nm = to_pll_28nm(hw);
137 
138 	return pll_28nm_poll_for_ready(pll_28nm, POLL_MAX_READS,
139 					POLL_TIMEOUT_US);
140 }
141 
142 static unsigned long dsi_pll_28nm_clk_recalc_rate(struct clk_hw *hw,
143 						  unsigned long parent_rate)
144 {
145 	struct dsi_pll_28nm *pll_28nm = to_pll_28nm(hw);
146 	void __iomem *base = pll_28nm->phy->pll_base;
147 	unsigned long vco_rate;
148 	u32 status, fb_divider, temp, ref_divider;
149 
150 	VERB("parent_rate=%lu", parent_rate);
151 
152 	status = dsi_phy_read(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_0);
153 
154 	if (status & DSI_28nm_8960_PHY_PLL_CTRL_0_ENABLE) {
155 		fb_divider = dsi_phy_read(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_1);
156 		fb_divider &= 0xff;
157 		temp = dsi_phy_read(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_2) & 0x07;
158 		fb_divider = (temp << 8) | fb_divider;
159 		fb_divider += 1;
160 
161 		ref_divider = dsi_phy_read(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_3);
162 		ref_divider &= 0x3f;
163 		ref_divider += 1;
164 
165 		/* multiply by 2 */
166 		vco_rate = (parent_rate / ref_divider) * fb_divider * 2;
167 	} else {
168 		vco_rate = 0;
169 	}
170 
171 	DBG("returning vco rate = %lu", vco_rate);
172 
173 	return vco_rate;
174 }
175 
176 static int dsi_pll_28nm_vco_prepare(struct clk_hw *hw)
177 {
178 	struct dsi_pll_28nm *pll_28nm = to_pll_28nm(hw);
179 	struct device *dev = &pll_28nm->phy->pdev->dev;
180 	void __iomem *base = pll_28nm->phy->pll_base;
181 	bool locked;
182 	unsigned int bit_div, byte_div;
183 	int max_reads = 1000, timeout_us = 100;
184 	u32 val;
185 
186 	DBG("id=%d", pll_28nm->phy->id);
187 
188 	if (unlikely(pll_28nm->phy->pll_on))
189 		return 0;
190 
191 	/*
192 	 * before enabling the PLL, configure the bit clock divider since we
193 	 * don't expose it as a clock to the outside world
194 	 * 1: read back the byte clock divider that should already be set
195 	 * 2: divide by 8 to get bit clock divider
196 	 * 3: write it to POSTDIV1
197 	 */
198 	val = dsi_phy_read(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_9);
199 	byte_div = val + 1;
200 	bit_div = byte_div / 8;
201 
202 	val = dsi_phy_read(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_8);
203 	val &= ~0xf;
204 	val |= (bit_div - 1);
205 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_8, val);
206 
207 	/* enable the PLL */
208 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_0,
209 		      DSI_28nm_8960_PHY_PLL_CTRL_0_ENABLE);
210 
211 	locked = pll_28nm_poll_for_ready(pll_28nm, max_reads, timeout_us);
212 
213 	if (unlikely(!locked)) {
214 		DRM_DEV_ERROR(dev, "DSI PLL lock failed\n");
215 		return -EINVAL;
216 	}
217 
218 	DBG("DSI PLL lock success");
219 	pll_28nm->phy->pll_on = true;
220 
221 	return 0;
222 }
223 
224 static void dsi_pll_28nm_vco_unprepare(struct clk_hw *hw)
225 {
226 	struct dsi_pll_28nm *pll_28nm = to_pll_28nm(hw);
227 
228 	DBG("id=%d", pll_28nm->phy->id);
229 
230 	if (unlikely(!pll_28nm->phy->pll_on))
231 		return;
232 
233 	dsi_phy_write(pll_28nm->phy->pll_base + REG_DSI_28nm_8960_PHY_PLL_CTRL_0, 0x00);
234 
235 	pll_28nm->phy->pll_on = false;
236 }
237 
238 static long dsi_pll_28nm_clk_round_rate(struct clk_hw *hw,
239 		unsigned long rate, unsigned long *parent_rate)
240 {
241 	struct dsi_pll_28nm *pll_28nm = to_pll_28nm(hw);
242 
243 	if      (rate < pll_28nm->phy->cfg->min_pll_rate)
244 		return  pll_28nm->phy->cfg->min_pll_rate;
245 	else if (rate > pll_28nm->phy->cfg->max_pll_rate)
246 		return  pll_28nm->phy->cfg->max_pll_rate;
247 	else
248 		return rate;
249 }
250 
251 static const struct clk_ops clk_ops_dsi_pll_28nm_vco = {
252 	.round_rate = dsi_pll_28nm_clk_round_rate,
253 	.set_rate = dsi_pll_28nm_clk_set_rate,
254 	.recalc_rate = dsi_pll_28nm_clk_recalc_rate,
255 	.prepare = dsi_pll_28nm_vco_prepare,
256 	.unprepare = dsi_pll_28nm_vco_unprepare,
257 	.is_enabled = dsi_pll_28nm_clk_is_enabled,
258 };
259 
260 /*
261  * Custom byte clock divier clk_ops
262  *
263  * This clock is the entry point to configuring the PLL. The user (dsi host)
264  * will set this clock's rate to the desired byte clock rate. The VCO lock
265  * frequency is a multiple of the byte clock rate. The multiplication factor
266  * (shown as F in the diagram above) is a function of the byte clock rate.
267  *
268  * This custom divider clock ensures that its parent (VCO) is set to the
269  * desired rate, and that the byte clock postdivider (POSTDIV2) is configured
270  * accordingly
271  */
272 #define to_clk_bytediv(_hw) container_of(_hw, struct clk_bytediv, hw)
273 
274 static unsigned long clk_bytediv_recalc_rate(struct clk_hw *hw,
275 		unsigned long parent_rate)
276 {
277 	struct clk_bytediv *bytediv = to_clk_bytediv(hw);
278 	unsigned int div;
279 
280 	div = dsi_phy_read(bytediv->reg) & 0xff;
281 
282 	return parent_rate / (div + 1);
283 }
284 
285 /* find multiplication factor(wrt byte clock) at which the VCO should be set */
286 static unsigned int get_vco_mul_factor(unsigned long byte_clk_rate)
287 {
288 	unsigned long bit_mhz;
289 
290 	/* convert to bit clock in Mhz */
291 	bit_mhz = (byte_clk_rate * 8) / 1000000;
292 
293 	if (bit_mhz < 125)
294 		return 64;
295 	else if (bit_mhz < 250)
296 		return 32;
297 	else if (bit_mhz < 600)
298 		return 16;
299 	else
300 		return 8;
301 }
302 
303 static long clk_bytediv_round_rate(struct clk_hw *hw, unsigned long rate,
304 				   unsigned long *prate)
305 {
306 	unsigned long best_parent;
307 	unsigned int factor;
308 
309 	factor = get_vco_mul_factor(rate);
310 
311 	best_parent = rate * factor;
312 	*prate = clk_hw_round_rate(clk_hw_get_parent(hw), best_parent);
313 
314 	return *prate / factor;
315 }
316 
317 static int clk_bytediv_set_rate(struct clk_hw *hw, unsigned long rate,
318 				unsigned long parent_rate)
319 {
320 	struct clk_bytediv *bytediv = to_clk_bytediv(hw);
321 	u32 val;
322 	unsigned int factor;
323 
324 	factor = get_vco_mul_factor(rate);
325 
326 	val = dsi_phy_read(bytediv->reg);
327 	val |= (factor - 1) & 0xff;
328 	dsi_phy_write(bytediv->reg, val);
329 
330 	return 0;
331 }
332 
333 /* Our special byte clock divider ops */
334 static const struct clk_ops clk_bytediv_ops = {
335 	.round_rate = clk_bytediv_round_rate,
336 	.set_rate = clk_bytediv_set_rate,
337 	.recalc_rate = clk_bytediv_recalc_rate,
338 };
339 
340 /*
341  * PLL Callbacks
342  */
343 static void dsi_28nm_pll_save_state(struct msm_dsi_phy *phy)
344 {
345 	struct dsi_pll_28nm *pll_28nm = to_pll_28nm(phy->vco_hw);
346 	struct pll_28nm_cached_state *cached_state = &pll_28nm->cached_state;
347 	void __iomem *base = pll_28nm->phy->pll_base;
348 
349 	cached_state->postdiv3 =
350 			dsi_phy_read(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_10);
351 	cached_state->postdiv2 =
352 			dsi_phy_read(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_9);
353 	cached_state->postdiv1 =
354 			dsi_phy_read(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_8);
355 
356 	cached_state->vco_rate = clk_hw_get_rate(phy->vco_hw);
357 }
358 
359 static int dsi_28nm_pll_restore_state(struct msm_dsi_phy *phy)
360 {
361 	struct dsi_pll_28nm *pll_28nm = to_pll_28nm(phy->vco_hw);
362 	struct pll_28nm_cached_state *cached_state = &pll_28nm->cached_state;
363 	void __iomem *base = pll_28nm->phy->pll_base;
364 	int ret;
365 
366 	ret = dsi_pll_28nm_clk_set_rate(phy->vco_hw,
367 					cached_state->vco_rate, 0);
368 	if (ret) {
369 		DRM_DEV_ERROR(&pll_28nm->phy->pdev->dev,
370 			      "restore vco rate failed. ret=%d\n", ret);
371 		return ret;
372 	}
373 
374 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_10,
375 		      cached_state->postdiv3);
376 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_9,
377 		      cached_state->postdiv2);
378 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_8,
379 		      cached_state->postdiv1);
380 
381 	return 0;
382 }
383 
384 static int pll_28nm_register(struct dsi_pll_28nm *pll_28nm, struct clk_hw **provided_clocks)
385 {
386 	char clk_name[32];
387 	struct clk_init_data vco_init = {
388 		.parent_data = &(const struct clk_parent_data) {
389 			.fw_name = "ref",
390 		},
391 		.num_parents = 1,
392 		.flags = CLK_IGNORE_UNUSED,
393 		.ops = &clk_ops_dsi_pll_28nm_vco,
394 	};
395 	struct device *dev = &pll_28nm->phy->pdev->dev;
396 	struct clk_hw *hw;
397 	struct clk_bytediv *bytediv;
398 	struct clk_init_data bytediv_init = { };
399 	int ret;
400 
401 	DBG("%d", pll_28nm->phy->id);
402 
403 	bytediv = devm_kzalloc(dev, sizeof(*bytediv), GFP_KERNEL);
404 	if (!bytediv)
405 		return -ENOMEM;
406 
407 	snprintf(clk_name, sizeof(clk_name), "dsi%dvco_clk", pll_28nm->phy->id);
408 	vco_init.name = clk_name;
409 
410 	pll_28nm->clk_hw.init = &vco_init;
411 
412 	ret = devm_clk_hw_register(dev, &pll_28nm->clk_hw);
413 	if (ret)
414 		return ret;
415 
416 	/* prepare and register bytediv */
417 	bytediv->hw.init = &bytediv_init;
418 	bytediv->reg = pll_28nm->phy->pll_base + REG_DSI_28nm_8960_PHY_PLL_CTRL_9;
419 
420 	snprintf(clk_name, sizeof(clk_name), "dsi%dpllbyte", pll_28nm->phy->id + 1);
421 
422 	bytediv_init.name = clk_name;
423 	bytediv_init.ops = &clk_bytediv_ops;
424 	bytediv_init.flags = CLK_SET_RATE_PARENT;
425 	bytediv_init.parent_hws = (const struct clk_hw*[]){
426 		&pll_28nm->clk_hw,
427 	};
428 	bytediv_init.num_parents = 1;
429 
430 	/* DIV2 */
431 	ret = devm_clk_hw_register(dev, &bytediv->hw);
432 	if (ret)
433 		return ret;
434 	provided_clocks[DSI_BYTE_PLL_CLK] = &bytediv->hw;
435 
436 	snprintf(clk_name, sizeof(clk_name), "dsi%dpll", pll_28nm->phy->id + 1);
437 	/* DIV3 */
438 	hw = devm_clk_hw_register_divider_parent_hw(dev, clk_name,
439 			&pll_28nm->clk_hw, 0, pll_28nm->phy->pll_base +
440 				REG_DSI_28nm_8960_PHY_PLL_CTRL_10,
441 			0, 8, 0, NULL);
442 	if (IS_ERR(hw))
443 		return PTR_ERR(hw);
444 	provided_clocks[DSI_PIXEL_PLL_CLK] = hw;
445 
446 	return 0;
447 }
448 
449 static int dsi_pll_28nm_8960_init(struct msm_dsi_phy *phy)
450 {
451 	struct platform_device *pdev = phy->pdev;
452 	struct dsi_pll_28nm *pll_28nm;
453 	int ret;
454 
455 	if (!pdev)
456 		return -ENODEV;
457 
458 	pll_28nm = devm_kzalloc(&pdev->dev, sizeof(*pll_28nm), GFP_KERNEL);
459 	if (!pll_28nm)
460 		return -ENOMEM;
461 
462 	pll_28nm->phy = phy;
463 
464 	ret = pll_28nm_register(pll_28nm, phy->provided_clocks->hws);
465 	if (ret) {
466 		DRM_DEV_ERROR(&pdev->dev, "failed to register PLL: %d\n", ret);
467 		return ret;
468 	}
469 
470 	phy->vco_hw = &pll_28nm->clk_hw;
471 
472 	return 0;
473 }
474 
475 static void dsi_28nm_dphy_set_timing(struct msm_dsi_phy *phy,
476 		struct msm_dsi_dphy_timing *timing)
477 {
478 	void __iomem *base = phy->base;
479 
480 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_TIMING_CTRL_0,
481 		      DSI_28nm_8960_PHY_TIMING_CTRL_0_CLK_ZERO(timing->clk_zero));
482 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_TIMING_CTRL_1,
483 		      DSI_28nm_8960_PHY_TIMING_CTRL_1_CLK_TRAIL(timing->clk_trail));
484 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_TIMING_CTRL_2,
485 		      DSI_28nm_8960_PHY_TIMING_CTRL_2_CLK_PREPARE(timing->clk_prepare));
486 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_TIMING_CTRL_3, 0x0);
487 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_TIMING_CTRL_4,
488 		      DSI_28nm_8960_PHY_TIMING_CTRL_4_HS_EXIT(timing->hs_exit));
489 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_TIMING_CTRL_5,
490 		      DSI_28nm_8960_PHY_TIMING_CTRL_5_HS_ZERO(timing->hs_zero));
491 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_TIMING_CTRL_6,
492 		      DSI_28nm_8960_PHY_TIMING_CTRL_6_HS_PREPARE(timing->hs_prepare));
493 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_TIMING_CTRL_7,
494 		      DSI_28nm_8960_PHY_TIMING_CTRL_7_HS_TRAIL(timing->hs_trail));
495 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_TIMING_CTRL_8,
496 		      DSI_28nm_8960_PHY_TIMING_CTRL_8_HS_RQST(timing->hs_rqst));
497 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_TIMING_CTRL_9,
498 		      DSI_28nm_8960_PHY_TIMING_CTRL_9_TA_GO(timing->ta_go) |
499 		      DSI_28nm_8960_PHY_TIMING_CTRL_9_TA_SURE(timing->ta_sure));
500 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_TIMING_CTRL_10,
501 		      DSI_28nm_8960_PHY_TIMING_CTRL_10_TA_GET(timing->ta_get));
502 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_TIMING_CTRL_11,
503 		      DSI_28nm_8960_PHY_TIMING_CTRL_11_TRIG3_CMD(0));
504 }
505 
506 static void dsi_28nm_phy_regulator_init(struct msm_dsi_phy *phy)
507 {
508 	void __iomem *base = phy->reg_base;
509 
510 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_REGULATOR_CTRL_0, 0x3);
511 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_REGULATOR_CTRL_1, 1);
512 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_REGULATOR_CTRL_2, 1);
513 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_REGULATOR_CTRL_3, 0);
514 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_REGULATOR_CTRL_4,
515 		      0x100);
516 }
517 
518 static void dsi_28nm_phy_regulator_ctrl(struct msm_dsi_phy *phy)
519 {
520 	void __iomem *base = phy->reg_base;
521 
522 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_REGULATOR_CTRL_0, 0x3);
523 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_REGULATOR_CTRL_1, 0xa);
524 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_REGULATOR_CTRL_2, 0x4);
525 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_REGULATOR_CTRL_3, 0x0);
526 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_REGULATOR_CTRL_4, 0x20);
527 }
528 
529 static void dsi_28nm_phy_calibration(struct msm_dsi_phy *phy)
530 {
531 	void __iomem *base = phy->reg_base;
532 	u32 status;
533 	int i = 5000;
534 
535 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_REGULATOR_CAL_PWR_CFG,
536 		      0x3);
537 
538 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_CAL_SW_CFG_2, 0x0);
539 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_CAL_HW_CFG_1, 0x5a);
540 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_CAL_HW_CFG_3, 0x10);
541 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_CAL_HW_CFG_4, 0x1);
542 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_CAL_HW_CFG_0, 0x1);
543 
544 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_CAL_HW_TRIGGER, 0x1);
545 	usleep_range(5000, 6000);
546 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_MISC_CAL_HW_TRIGGER, 0x0);
547 
548 	do {
549 		status = dsi_phy_read(base +
550 				REG_DSI_28nm_8960_PHY_MISC_CAL_STATUS);
551 
552 		if (!(status & DSI_28nm_8960_PHY_MISC_CAL_STATUS_CAL_BUSY))
553 			break;
554 
555 		udelay(1);
556 	} while (--i > 0);
557 }
558 
559 static void dsi_28nm_phy_lane_config(struct msm_dsi_phy *phy)
560 {
561 	void __iomem *base = phy->base;
562 	int i;
563 
564 	for (i = 0; i < 4; i++) {
565 		dsi_phy_write(base + REG_DSI_28nm_8960_PHY_LN_CFG_0(i), 0x80);
566 		dsi_phy_write(base + REG_DSI_28nm_8960_PHY_LN_CFG_1(i), 0x45);
567 		dsi_phy_write(base + REG_DSI_28nm_8960_PHY_LN_CFG_2(i), 0x00);
568 		dsi_phy_write(base + REG_DSI_28nm_8960_PHY_LN_TEST_DATAPATH(i),
569 			      0x00);
570 		dsi_phy_write(base + REG_DSI_28nm_8960_PHY_LN_TEST_STR_0(i),
571 			      0x01);
572 		dsi_phy_write(base + REG_DSI_28nm_8960_PHY_LN_TEST_STR_1(i),
573 			      0x66);
574 	}
575 
576 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_LNCK_CFG_0, 0x40);
577 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_LNCK_CFG_1, 0x67);
578 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_LNCK_CFG_2, 0x0);
579 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_LNCK_TEST_DATAPATH, 0x0);
580 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_LNCK_TEST_STR0, 0x1);
581 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_LNCK_TEST_STR1, 0x88);
582 }
583 
584 static int dsi_28nm_phy_enable(struct msm_dsi_phy *phy,
585 				struct msm_dsi_phy_clk_request *clk_req)
586 {
587 	struct msm_dsi_dphy_timing *timing = &phy->timing;
588 	void __iomem *base = phy->base;
589 
590 	DBG("");
591 
592 	if (msm_dsi_dphy_timing_calc(timing, clk_req)) {
593 		DRM_DEV_ERROR(&phy->pdev->dev,
594 			      "%s: D-PHY timing calculation failed\n",
595 			      __func__);
596 		return -EINVAL;
597 	}
598 
599 	dsi_28nm_phy_regulator_init(phy);
600 
601 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_LDO_CTRL, 0x04);
602 
603 	/* strength control */
604 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_STRENGTH_0, 0xff);
605 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_STRENGTH_1, 0x00);
606 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_STRENGTH_2, 0x06);
607 
608 	/* phy ctrl */
609 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_CTRL_0, 0x5f);
610 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_CTRL_1, 0x00);
611 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_CTRL_2, 0x00);
612 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_CTRL_3, 0x10);
613 
614 	dsi_28nm_phy_regulator_ctrl(phy);
615 
616 	dsi_28nm_phy_calibration(phy);
617 
618 	dsi_28nm_phy_lane_config(phy);
619 
620 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_BIST_CTRL_4, 0x0f);
621 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_BIST_CTRL_1, 0x03);
622 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_BIST_CTRL_0, 0x03);
623 	dsi_phy_write(base + REG_DSI_28nm_8960_PHY_BIST_CTRL_4, 0x0);
624 
625 	dsi_28nm_dphy_set_timing(phy, timing);
626 
627 	return 0;
628 }
629 
630 static void dsi_28nm_phy_disable(struct msm_dsi_phy *phy)
631 {
632 	dsi_phy_write(phy->base + REG_DSI_28nm_8960_PHY_CTRL_0, 0x0);
633 
634 	/*
635 	 * Wait for the registers writes to complete in order to
636 	 * ensure that the phy is completely disabled
637 	 */
638 	wmb();
639 }
640 
641 static const struct regulator_bulk_data dsi_phy_28nm_8960_regulators[] = {
642 	{ .supply = "vddio", .init_load_uA = 100000 },	/* 1.8 V */
643 };
644 
645 const struct msm_dsi_phy_cfg dsi_phy_28nm_8960_cfgs = {
646 	.has_phy_regulator = true,
647 	.regulator_data = dsi_phy_28nm_8960_regulators,
648 	.num_regulators = ARRAY_SIZE(dsi_phy_28nm_8960_regulators),
649 	.ops = {
650 		.enable = dsi_28nm_phy_enable,
651 		.disable = dsi_28nm_phy_disable,
652 		.pll_init = dsi_pll_28nm_8960_init,
653 		.save_pll_state = dsi_28nm_pll_save_state,
654 		.restore_pll_state = dsi_28nm_pll_restore_state,
655 	},
656 	.min_pll_rate = VCO_MIN_RATE,
657 	.max_pll_rate = VCO_MAX_RATE,
658 	.io_start = { 0x4700300, 0x5800300 },
659 	.num_dsi_phy = 2,
660 };
661