0001
0002
0003
0004
0005
0006 #include <linux/clk.h>
0007 #include <linux/clk-provider.h>
0008 #include <linux/delay.h>
0009
0010 #include "dsi_phy.h"
0011 #include "dsi.xml.h"
0012 #include "dsi_phy_14nm.xml.h"
0013
0014 #define PHY_14NM_CKLN_IDX 4
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 #define POLL_MAX_READS 15
0035 #define POLL_TIMEOUT_US 1000
0036
0037 #define VCO_REF_CLK_RATE 19200000
0038 #define VCO_MIN_RATE 1300000000UL
0039 #define VCO_MAX_RATE 2600000000UL
0040
0041 struct dsi_pll_config {
0042 u64 vco_current_rate;
0043
0044 u32 ssc_en;
0045
0046
0047 u32 plllock_cnt;
0048 u32 ssc_center;
0049 u32 ssc_adj_period;
0050 u32 ssc_spread;
0051 u32 ssc_freq;
0052
0053
0054 u32 dec_start;
0055 u32 div_frac_start;
0056 u32 ssc_period;
0057 u32 ssc_step_size;
0058 u32 plllock_cmp;
0059 u32 pll_vco_div_ref;
0060 u32 pll_vco_count;
0061 u32 pll_kvco_div_ref;
0062 u32 pll_kvco_count;
0063 };
0064
0065 struct pll_14nm_cached_state {
0066 unsigned long vco_rate;
0067 u8 n2postdiv;
0068 u8 n1postdiv;
0069 };
0070
0071 struct dsi_pll_14nm {
0072 struct clk_hw clk_hw;
0073
0074 struct msm_dsi_phy *phy;
0075
0076
0077 spinlock_t postdiv_lock;
0078
0079 struct pll_14nm_cached_state cached_state;
0080
0081 struct dsi_pll_14nm *slave;
0082 };
0083
0084 #define to_pll_14nm(x) container_of(x, struct dsi_pll_14nm, clk_hw)
0085
0086
0087
0088
0089
0090
0091 struct dsi_pll_14nm_postdiv {
0092 struct clk_hw hw;
0093
0094
0095 u8 shift;
0096 u8 width;
0097 u8 flags;
0098
0099 struct dsi_pll_14nm *pll;
0100 };
0101
0102 #define to_pll_14nm_postdiv(_hw) container_of(_hw, struct dsi_pll_14nm_postdiv, hw)
0103
0104
0105
0106
0107
0108 static struct dsi_pll_14nm *pll_14nm_list[DSI_MAX];
0109
0110 static bool pll_14nm_poll_for_ready(struct dsi_pll_14nm *pll_14nm,
0111 u32 nb_tries, u32 timeout_us)
0112 {
0113 bool pll_locked = false, pll_ready = false;
0114 void __iomem *base = pll_14nm->phy->pll_base;
0115 u32 tries, val;
0116
0117 tries = nb_tries;
0118 while (tries--) {
0119 val = dsi_phy_read(base + REG_DSI_14nm_PHY_PLL_RESET_SM_READY_STATUS);
0120 pll_locked = !!(val & BIT(5));
0121
0122 if (pll_locked)
0123 break;
0124
0125 udelay(timeout_us);
0126 }
0127
0128 if (!pll_locked)
0129 goto out;
0130
0131 tries = nb_tries;
0132 while (tries--) {
0133 val = dsi_phy_read(base + REG_DSI_14nm_PHY_PLL_RESET_SM_READY_STATUS);
0134 pll_ready = !!(val & BIT(0));
0135
0136 if (pll_ready)
0137 break;
0138
0139 udelay(timeout_us);
0140 }
0141
0142 out:
0143 DBG("DSI PLL is %slocked, %sready", pll_locked ? "" : "*not* ", pll_ready ? "" : "*not* ");
0144
0145 return pll_locked && pll_ready;
0146 }
0147
0148 static void dsi_pll_14nm_config_init(struct dsi_pll_config *pconf)
0149 {
0150
0151 pconf->plllock_cnt = 1;
0152
0153
0154
0155
0156
0157 pconf->ssc_en = 1;
0158 pconf->ssc_center = 0;
0159 pconf->ssc_spread = 5;
0160 pconf->ssc_freq = 31500;
0161 pconf->ssc_adj_period = 37;
0162 }
0163
0164 #define CEIL(x, y) (((x) + ((y) - 1)) / (y))
0165
0166 static void pll_14nm_ssc_calc(struct dsi_pll_14nm *pll, struct dsi_pll_config *pconf)
0167 {
0168 u32 period, ssc_period;
0169 u32 ref, rem;
0170 u64 step_size;
0171
0172 DBG("vco=%lld ref=%d", pconf->vco_current_rate, VCO_REF_CLK_RATE);
0173
0174 ssc_period = pconf->ssc_freq / 500;
0175 period = (u32)VCO_REF_CLK_RATE / 1000;
0176 ssc_period = CEIL(period, ssc_period);
0177 ssc_period -= 1;
0178 pconf->ssc_period = ssc_period;
0179
0180 DBG("ssc freq=%d spread=%d period=%d", pconf->ssc_freq,
0181 pconf->ssc_spread, pconf->ssc_period);
0182
0183 step_size = (u32)pconf->vco_current_rate;
0184 ref = VCO_REF_CLK_RATE;
0185 ref /= 1000;
0186 step_size = div_u64(step_size, ref);
0187 step_size <<= 20;
0188 step_size = div_u64(step_size, 1000);
0189 step_size *= pconf->ssc_spread;
0190 step_size = div_u64(step_size, 1000);
0191 step_size *= (pconf->ssc_adj_period + 1);
0192
0193 rem = 0;
0194 step_size = div_u64_rem(step_size, ssc_period + 1, &rem);
0195 if (rem)
0196 step_size++;
0197
0198 DBG("step_size=%lld", step_size);
0199
0200 step_size &= 0x0ffff;
0201
0202 pconf->ssc_step_size = step_size;
0203 }
0204
0205 static void pll_14nm_dec_frac_calc(struct dsi_pll_14nm *pll, struct dsi_pll_config *pconf)
0206 {
0207 u64 multiplier = BIT(20);
0208 u64 dec_start_multiple, dec_start, pll_comp_val;
0209 u32 duration, div_frac_start;
0210 u64 vco_clk_rate = pconf->vco_current_rate;
0211 u64 fref = VCO_REF_CLK_RATE;
0212
0213 DBG("vco_clk_rate=%lld ref_clk_rate=%lld", vco_clk_rate, fref);
0214
0215 dec_start_multiple = div_u64(vco_clk_rate * multiplier, fref);
0216 dec_start = div_u64_rem(dec_start_multiple, multiplier, &div_frac_start);
0217
0218 pconf->dec_start = (u32)dec_start;
0219 pconf->div_frac_start = div_frac_start;
0220
0221 if (pconf->plllock_cnt == 0)
0222 duration = 1024;
0223 else if (pconf->plllock_cnt == 1)
0224 duration = 256;
0225 else if (pconf->plllock_cnt == 2)
0226 duration = 128;
0227 else
0228 duration = 32;
0229
0230 pll_comp_val = duration * dec_start_multiple;
0231 pll_comp_val = div_u64(pll_comp_val, multiplier);
0232 do_div(pll_comp_val, 10);
0233
0234 pconf->plllock_cmp = (u32)pll_comp_val;
0235 }
0236
0237 static u32 pll_14nm_kvco_slop(u32 vrate)
0238 {
0239 u32 slop = 0;
0240
0241 if (vrate > VCO_MIN_RATE && vrate <= 1800000000UL)
0242 slop = 600;
0243 else if (vrate > 1800000000UL && vrate < 2300000000UL)
0244 slop = 400;
0245 else if (vrate > 2300000000UL && vrate < VCO_MAX_RATE)
0246 slop = 280;
0247
0248 return slop;
0249 }
0250
0251 static void pll_14nm_calc_vco_count(struct dsi_pll_14nm *pll, struct dsi_pll_config *pconf)
0252 {
0253 u64 vco_clk_rate = pconf->vco_current_rate;
0254 u64 fref = VCO_REF_CLK_RATE;
0255 u32 vco_measure_time = 5;
0256 u32 kvco_measure_time = 5;
0257 u64 data;
0258 u32 cnt;
0259
0260 data = fref * vco_measure_time;
0261 do_div(data, 1000000);
0262 data &= 0x03ff;
0263 data -= 2;
0264 pconf->pll_vco_div_ref = data;
0265
0266 data = div_u64(vco_clk_rate, 1000000);
0267 data *= vco_measure_time;
0268 do_div(data, 10);
0269 pconf->pll_vco_count = data;
0270
0271 data = fref * kvco_measure_time;
0272 do_div(data, 1000000);
0273 data &= 0x03ff;
0274 data -= 1;
0275 pconf->pll_kvco_div_ref = data;
0276
0277 cnt = pll_14nm_kvco_slop(vco_clk_rate);
0278 cnt *= 2;
0279 cnt /= 100;
0280 cnt *= kvco_measure_time;
0281 pconf->pll_kvco_count = cnt;
0282 }
0283
0284 static void pll_db_commit_ssc(struct dsi_pll_14nm *pll, struct dsi_pll_config *pconf)
0285 {
0286 void __iomem *base = pll->phy->pll_base;
0287 u8 data;
0288
0289 data = pconf->ssc_adj_period;
0290 data &= 0x0ff;
0291 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_ADJ_PER1, data);
0292 data = (pconf->ssc_adj_period >> 8);
0293 data &= 0x03;
0294 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_ADJ_PER2, data);
0295
0296 data = pconf->ssc_period;
0297 data &= 0x0ff;
0298 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_PER1, data);
0299 data = (pconf->ssc_period >> 8);
0300 data &= 0x0ff;
0301 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_PER2, data);
0302
0303 data = pconf->ssc_step_size;
0304 data &= 0x0ff;
0305 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_STEP_SIZE1, data);
0306 data = (pconf->ssc_step_size >> 8);
0307 data &= 0x0ff;
0308 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_STEP_SIZE2, data);
0309
0310 data = (pconf->ssc_center & 0x01);
0311 data <<= 1;
0312 data |= 0x01;
0313 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_EN_CENTER, data);
0314
0315 wmb();
0316 }
0317
0318 static void pll_db_commit_common(struct dsi_pll_14nm *pll,
0319 struct dsi_pll_config *pconf)
0320 {
0321 void __iomem *base = pll->phy->pll_base;
0322 u8 data;
0323
0324
0325 data = 0;
0326 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SYSCLK_EN_RESET, data);
0327
0328 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_TXCLK_EN, 1);
0329
0330 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL, 48);
0331 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL2, 4 << 3);
0332 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL5, 5);
0333
0334 data = pconf->pll_vco_div_ref & 0xff;
0335 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VCO_DIV_REF1, data);
0336 data = (pconf->pll_vco_div_ref >> 8) & 0x3;
0337 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VCO_DIV_REF2, data);
0338
0339 data = pconf->pll_kvco_div_ref & 0xff;
0340 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_KVCO_DIV_REF1, data);
0341 data = (pconf->pll_kvco_div_ref >> 8) & 0x3;
0342 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_KVCO_DIV_REF2, data);
0343
0344 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_MISC1, 16);
0345
0346 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IE_TRIM, 4);
0347
0348 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IP_TRIM, 4);
0349
0350 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_CP_SET_CUR, 1 << 3 | 1);
0351
0352 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICPCSET, 0 << 3 | 0);
0353
0354 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICPMSET, 0 << 3 | 0);
0355
0356 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICP_SET, 4 << 3 | 4);
0357
0358 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_LPF1, 1 << 4 | 11);
0359
0360 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IPTAT_TRIM, 7);
0361
0362 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_CRCTRL, 1 << 4 | 2);
0363 }
0364
0365 static void pll_14nm_software_reset(struct dsi_pll_14nm *pll_14nm)
0366 {
0367 void __iomem *cmn_base = pll_14nm->phy->base;
0368
0369
0370
0371
0372 dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_PLL_CNTRL, 0);
0373
0374
0375 dsi_phy_write_udelay(cmn_base + REG_DSI_14nm_PHY_CMN_CTRL_1, 0x20, 10);
0376 wmb();
0377
0378 dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_CTRL_1, 0);
0379 wmb();
0380 }
0381
0382 static void pll_db_commit_14nm(struct dsi_pll_14nm *pll,
0383 struct dsi_pll_config *pconf)
0384 {
0385 void __iomem *base = pll->phy->pll_base;
0386 void __iomem *cmn_base = pll->phy->base;
0387 u8 data;
0388
0389 DBG("DSI%d PLL", pll->phy->id);
0390
0391 dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_LDO_CNTRL, 0x3c);
0392
0393 pll_db_commit_common(pll, pconf);
0394
0395 pll_14nm_software_reset(pll);
0396
0397
0398 dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_CLK_CFG1, 1);
0399
0400 data = 0xff;
0401 dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_CTRL_0, data);
0402
0403
0404 data = pconf->dec_start;
0405 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_DEC_START, data);
0406
0407 data = pconf->div_frac_start & 0xff;
0408 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_DIV_FRAC_START1, data);
0409 data = (pconf->div_frac_start >> 8) & 0xff;
0410 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_DIV_FRAC_START2, data);
0411 data = (pconf->div_frac_start >> 16) & 0xf;
0412 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_DIV_FRAC_START3, data);
0413
0414 data = pconf->plllock_cmp & 0xff;
0415 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLLLOCK_CMP1, data);
0416
0417 data = (pconf->plllock_cmp >> 8) & 0xff;
0418 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLLLOCK_CMP2, data);
0419
0420 data = (pconf->plllock_cmp >> 16) & 0x3;
0421 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLLLOCK_CMP3, data);
0422
0423 data = pconf->plllock_cnt << 1 | 0 << 3;
0424 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLLLOCK_CMP_EN, data);
0425
0426 data = pconf->pll_vco_count & 0xff;
0427 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VCO_COUNT1, data);
0428 data = (pconf->pll_vco_count >> 8) & 0xff;
0429 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VCO_COUNT2, data);
0430
0431 data = pconf->pll_kvco_count & 0xff;
0432 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_KVCO_COUNT1, data);
0433 data = (pconf->pll_kvco_count >> 8) & 0x3;
0434 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_KVCO_COUNT2, data);
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444
0445 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_LPF2_POSTDIV, 0 << 4 | 3);
0446
0447 if (pconf->ssc_en)
0448 pll_db_commit_ssc(pll, pconf);
0449
0450 wmb();
0451 }
0452
0453
0454
0455
0456 static int dsi_pll_14nm_vco_set_rate(struct clk_hw *hw, unsigned long rate,
0457 unsigned long parent_rate)
0458 {
0459 struct dsi_pll_14nm *pll_14nm = to_pll_14nm(hw);
0460 struct dsi_pll_config conf;
0461
0462 DBG("DSI PLL%d rate=%lu, parent's=%lu", pll_14nm->phy->id, rate,
0463 parent_rate);
0464
0465 dsi_pll_14nm_config_init(&conf);
0466 conf.vco_current_rate = rate;
0467
0468 pll_14nm_dec_frac_calc(pll_14nm, &conf);
0469
0470 if (conf.ssc_en)
0471 pll_14nm_ssc_calc(pll_14nm, &conf);
0472
0473 pll_14nm_calc_vco_count(pll_14nm, &conf);
0474
0475
0476
0477
0478
0479 if (pll_14nm->phy->usecase == MSM_DSI_PHY_MASTER) {
0480 struct dsi_pll_14nm *pll_14nm_slave = pll_14nm->slave;
0481
0482 pll_db_commit_14nm(pll_14nm_slave, &conf);
0483 }
0484
0485 pll_db_commit_14nm(pll_14nm, &conf);
0486
0487 return 0;
0488 }
0489
0490 static unsigned long dsi_pll_14nm_vco_recalc_rate(struct clk_hw *hw,
0491 unsigned long parent_rate)
0492 {
0493 struct dsi_pll_14nm *pll_14nm = to_pll_14nm(hw);
0494 void __iomem *base = pll_14nm->phy->pll_base;
0495 u64 vco_rate, multiplier = BIT(20);
0496 u32 div_frac_start;
0497 u32 dec_start;
0498 u64 ref_clk = parent_rate;
0499
0500 dec_start = dsi_phy_read(base + REG_DSI_14nm_PHY_PLL_DEC_START);
0501 dec_start &= 0x0ff;
0502
0503 DBG("dec_start = %x", dec_start);
0504
0505 div_frac_start = (dsi_phy_read(base + REG_DSI_14nm_PHY_PLL_DIV_FRAC_START3)
0506 & 0xf) << 16;
0507 div_frac_start |= (dsi_phy_read(base + REG_DSI_14nm_PHY_PLL_DIV_FRAC_START2)
0508 & 0xff) << 8;
0509 div_frac_start |= dsi_phy_read(base + REG_DSI_14nm_PHY_PLL_DIV_FRAC_START1)
0510 & 0xff;
0511
0512 DBG("div_frac_start = %x", div_frac_start);
0513
0514 vco_rate = ref_clk * dec_start;
0515
0516 vco_rate += ((ref_clk * div_frac_start) / multiplier);
0517
0518
0519
0520
0521
0522
0523 vco_rate = DIV_ROUND_UP_ULL(vco_rate, 1000) * 1000;
0524
0525 DBG("returning vco rate = %lu", (unsigned long)vco_rate);
0526
0527 return (unsigned long)vco_rate;
0528 }
0529
0530 static int dsi_pll_14nm_vco_prepare(struct clk_hw *hw)
0531 {
0532 struct dsi_pll_14nm *pll_14nm = to_pll_14nm(hw);
0533 void __iomem *base = pll_14nm->phy->pll_base;
0534 void __iomem *cmn_base = pll_14nm->phy->base;
0535 bool locked;
0536
0537 DBG("");
0538
0539 if (unlikely(pll_14nm->phy->pll_on))
0540 return 0;
0541
0542 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VREF_CFG1, 0x10);
0543 dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_PLL_CNTRL, 1);
0544
0545 locked = pll_14nm_poll_for_ready(pll_14nm, POLL_MAX_READS,
0546 POLL_TIMEOUT_US);
0547
0548 if (unlikely(!locked)) {
0549 DRM_DEV_ERROR(&pll_14nm->phy->pdev->dev, "DSI PLL lock failed\n");
0550 return -EINVAL;
0551 }
0552
0553 DBG("DSI PLL lock success");
0554 pll_14nm->phy->pll_on = true;
0555
0556 return 0;
0557 }
0558
0559 static void dsi_pll_14nm_vco_unprepare(struct clk_hw *hw)
0560 {
0561 struct dsi_pll_14nm *pll_14nm = to_pll_14nm(hw);
0562 void __iomem *cmn_base = pll_14nm->phy->base;
0563
0564 DBG("");
0565
0566 if (unlikely(!pll_14nm->phy->pll_on))
0567 return;
0568
0569 dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_PLL_CNTRL, 0);
0570
0571 pll_14nm->phy->pll_on = false;
0572 }
0573
0574 static long dsi_pll_14nm_clk_round_rate(struct clk_hw *hw,
0575 unsigned long rate, unsigned long *parent_rate)
0576 {
0577 struct dsi_pll_14nm *pll_14nm = to_pll_14nm(hw);
0578
0579 if (rate < pll_14nm->phy->cfg->min_pll_rate)
0580 return pll_14nm->phy->cfg->min_pll_rate;
0581 else if (rate > pll_14nm->phy->cfg->max_pll_rate)
0582 return pll_14nm->phy->cfg->max_pll_rate;
0583 else
0584 return rate;
0585 }
0586
0587 static const struct clk_ops clk_ops_dsi_pll_14nm_vco = {
0588 .round_rate = dsi_pll_14nm_clk_round_rate,
0589 .set_rate = dsi_pll_14nm_vco_set_rate,
0590 .recalc_rate = dsi_pll_14nm_vco_recalc_rate,
0591 .prepare = dsi_pll_14nm_vco_prepare,
0592 .unprepare = dsi_pll_14nm_vco_unprepare,
0593 };
0594
0595
0596
0597
0598 #define div_mask(width) ((1 << (width)) - 1)
0599 static unsigned long dsi_pll_14nm_postdiv_recalc_rate(struct clk_hw *hw,
0600 unsigned long parent_rate)
0601 {
0602 struct dsi_pll_14nm_postdiv *postdiv = to_pll_14nm_postdiv(hw);
0603 struct dsi_pll_14nm *pll_14nm = postdiv->pll;
0604 void __iomem *base = pll_14nm->phy->base;
0605 u8 shift = postdiv->shift;
0606 u8 width = postdiv->width;
0607 u32 val;
0608
0609 DBG("DSI%d PLL parent rate=%lu", pll_14nm->phy->id, parent_rate);
0610
0611 val = dsi_phy_read(base + REG_DSI_14nm_PHY_CMN_CLK_CFG0) >> shift;
0612 val &= div_mask(width);
0613
0614 return divider_recalc_rate(hw, parent_rate, val, NULL,
0615 postdiv->flags, width);
0616 }
0617
0618 static long dsi_pll_14nm_postdiv_round_rate(struct clk_hw *hw,
0619 unsigned long rate,
0620 unsigned long *prate)
0621 {
0622 struct dsi_pll_14nm_postdiv *postdiv = to_pll_14nm_postdiv(hw);
0623 struct dsi_pll_14nm *pll_14nm = postdiv->pll;
0624
0625 DBG("DSI%d PLL parent rate=%lu", pll_14nm->phy->id, rate);
0626
0627 return divider_round_rate(hw, rate, prate, NULL,
0628 postdiv->width,
0629 postdiv->flags);
0630 }
0631
0632 static int dsi_pll_14nm_postdiv_set_rate(struct clk_hw *hw, unsigned long rate,
0633 unsigned long parent_rate)
0634 {
0635 struct dsi_pll_14nm_postdiv *postdiv = to_pll_14nm_postdiv(hw);
0636 struct dsi_pll_14nm *pll_14nm = postdiv->pll;
0637 void __iomem *base = pll_14nm->phy->base;
0638 spinlock_t *lock = &pll_14nm->postdiv_lock;
0639 u8 shift = postdiv->shift;
0640 u8 width = postdiv->width;
0641 unsigned int value;
0642 unsigned long flags = 0;
0643 u32 val;
0644
0645 DBG("DSI%d PLL parent rate=%lu parent rate %lu", pll_14nm->phy->id, rate,
0646 parent_rate);
0647
0648 value = divider_get_val(rate, parent_rate, NULL, postdiv->width,
0649 postdiv->flags);
0650
0651 spin_lock_irqsave(lock, flags);
0652
0653 val = dsi_phy_read(base + REG_DSI_14nm_PHY_CMN_CLK_CFG0);
0654 val &= ~(div_mask(width) << shift);
0655
0656 val |= value << shift;
0657 dsi_phy_write(base + REG_DSI_14nm_PHY_CMN_CLK_CFG0, val);
0658
0659
0660
0661
0662 if (pll_14nm->phy->usecase == MSM_DSI_PHY_MASTER) {
0663 struct dsi_pll_14nm *pll_14nm_slave = pll_14nm->slave;
0664 void __iomem *slave_base = pll_14nm_slave->phy->base;
0665
0666 dsi_phy_write(slave_base + REG_DSI_14nm_PHY_CMN_CLK_CFG0, val);
0667 }
0668
0669 spin_unlock_irqrestore(lock, flags);
0670
0671 return 0;
0672 }
0673
0674 static const struct clk_ops clk_ops_dsi_pll_14nm_postdiv = {
0675 .recalc_rate = dsi_pll_14nm_postdiv_recalc_rate,
0676 .round_rate = dsi_pll_14nm_postdiv_round_rate,
0677 .set_rate = dsi_pll_14nm_postdiv_set_rate,
0678 };
0679
0680
0681
0682
0683
0684 static void dsi_14nm_pll_save_state(struct msm_dsi_phy *phy)
0685 {
0686 struct dsi_pll_14nm *pll_14nm = to_pll_14nm(phy->vco_hw);
0687 struct pll_14nm_cached_state *cached_state = &pll_14nm->cached_state;
0688 void __iomem *cmn_base = pll_14nm->phy->base;
0689 u32 data;
0690
0691 data = dsi_phy_read(cmn_base + REG_DSI_14nm_PHY_CMN_CLK_CFG0);
0692
0693 cached_state->n1postdiv = data & 0xf;
0694 cached_state->n2postdiv = (data >> 4) & 0xf;
0695
0696 DBG("DSI%d PLL save state %x %x", pll_14nm->phy->id,
0697 cached_state->n1postdiv, cached_state->n2postdiv);
0698
0699 cached_state->vco_rate = clk_hw_get_rate(phy->vco_hw);
0700 }
0701
0702 static int dsi_14nm_pll_restore_state(struct msm_dsi_phy *phy)
0703 {
0704 struct dsi_pll_14nm *pll_14nm = to_pll_14nm(phy->vco_hw);
0705 struct pll_14nm_cached_state *cached_state = &pll_14nm->cached_state;
0706 void __iomem *cmn_base = pll_14nm->phy->base;
0707 u32 data;
0708 int ret;
0709
0710 ret = dsi_pll_14nm_vco_set_rate(phy->vco_hw,
0711 cached_state->vco_rate, 0);
0712 if (ret) {
0713 DRM_DEV_ERROR(&pll_14nm->phy->pdev->dev,
0714 "restore vco rate failed. ret=%d\n", ret);
0715 return ret;
0716 }
0717
0718 data = cached_state->n1postdiv | (cached_state->n2postdiv << 4);
0719
0720 DBG("DSI%d PLL restore state %x %x", pll_14nm->phy->id,
0721 cached_state->n1postdiv, cached_state->n2postdiv);
0722
0723 dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_CLK_CFG0, data);
0724
0725
0726 if (phy->usecase == MSM_DSI_PHY_MASTER) {
0727 struct dsi_pll_14nm *pll_14nm_slave = pll_14nm->slave;
0728 void __iomem *slave_base = pll_14nm_slave->phy->base;
0729
0730 dsi_phy_write(slave_base + REG_DSI_14nm_PHY_CMN_CLK_CFG0, data);
0731 }
0732
0733 return 0;
0734 }
0735
0736 static int dsi_14nm_set_usecase(struct msm_dsi_phy *phy)
0737 {
0738 struct dsi_pll_14nm *pll_14nm = to_pll_14nm(phy->vco_hw);
0739 void __iomem *base = phy->pll_base;
0740 u32 clkbuflr_en, bandgap = 0;
0741
0742 switch (phy->usecase) {
0743 case MSM_DSI_PHY_STANDALONE:
0744 clkbuflr_en = 0x1;
0745 break;
0746 case MSM_DSI_PHY_MASTER:
0747 clkbuflr_en = 0x3;
0748 pll_14nm->slave = pll_14nm_list[(pll_14nm->phy->id + 1) % DSI_MAX];
0749 break;
0750 case MSM_DSI_PHY_SLAVE:
0751 clkbuflr_en = 0x0;
0752 bandgap = 0x3;
0753 break;
0754 default:
0755 return -EINVAL;
0756 }
0757
0758 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_CLKBUFLR_EN, clkbuflr_en);
0759 if (bandgap)
0760 dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_BANDGAP, bandgap);
0761
0762 return 0;
0763 }
0764
0765 static struct clk_hw *pll_14nm_postdiv_register(struct dsi_pll_14nm *pll_14nm,
0766 const char *name,
0767 const char *parent_name,
0768 unsigned long flags,
0769 u8 shift)
0770 {
0771 struct dsi_pll_14nm_postdiv *pll_postdiv;
0772 struct device *dev = &pll_14nm->phy->pdev->dev;
0773 struct clk_init_data postdiv_init = {
0774 .parent_names = (const char *[]) { parent_name },
0775 .num_parents = 1,
0776 .name = name,
0777 .flags = flags,
0778 .ops = &clk_ops_dsi_pll_14nm_postdiv,
0779 };
0780 int ret;
0781
0782 pll_postdiv = devm_kzalloc(dev, sizeof(*pll_postdiv), GFP_KERNEL);
0783 if (!pll_postdiv)
0784 return ERR_PTR(-ENOMEM);
0785
0786 pll_postdiv->pll = pll_14nm;
0787 pll_postdiv->shift = shift;
0788
0789 pll_postdiv->width = 4;
0790
0791 pll_postdiv->flags = CLK_DIVIDER_ONE_BASED;
0792 pll_postdiv->hw.init = &postdiv_init;
0793
0794 ret = devm_clk_hw_register(dev, &pll_postdiv->hw);
0795 if (ret)
0796 return ERR_PTR(ret);
0797
0798 return &pll_postdiv->hw;
0799 }
0800
0801 static int pll_14nm_register(struct dsi_pll_14nm *pll_14nm, struct clk_hw **provided_clocks)
0802 {
0803 char clk_name[32], parent[32], vco_name[32];
0804 struct clk_init_data vco_init = {
0805 .parent_data = &(const struct clk_parent_data) {
0806 .fw_name = "ref",
0807 },
0808 .num_parents = 1,
0809 .name = vco_name,
0810 .flags = CLK_IGNORE_UNUSED,
0811 .ops = &clk_ops_dsi_pll_14nm_vco,
0812 };
0813 struct device *dev = &pll_14nm->phy->pdev->dev;
0814 struct clk_hw *hw;
0815 int ret;
0816
0817 DBG("DSI%d", pll_14nm->phy->id);
0818
0819 snprintf(vco_name, 32, "dsi%dvco_clk", pll_14nm->phy->id);
0820 pll_14nm->clk_hw.init = &vco_init;
0821
0822 ret = devm_clk_hw_register(dev, &pll_14nm->clk_hw);
0823 if (ret)
0824 return ret;
0825
0826 snprintf(clk_name, 32, "dsi%dn1_postdiv_clk", pll_14nm->phy->id);
0827 snprintf(parent, 32, "dsi%dvco_clk", pll_14nm->phy->id);
0828
0829
0830 hw = pll_14nm_postdiv_register(pll_14nm, clk_name, parent,
0831 CLK_SET_RATE_PARENT, 0);
0832 if (IS_ERR(hw))
0833 return PTR_ERR(hw);
0834
0835 snprintf(clk_name, 32, "dsi%dpllbyte", pll_14nm->phy->id);
0836 snprintf(parent, 32, "dsi%dn1_postdiv_clk", pll_14nm->phy->id);
0837
0838
0839 hw = devm_clk_hw_register_fixed_factor(dev, clk_name, parent,
0840 CLK_SET_RATE_PARENT, 1, 8);
0841 if (IS_ERR(hw))
0842 return PTR_ERR(hw);
0843
0844 provided_clocks[DSI_BYTE_PLL_CLK] = hw;
0845
0846 snprintf(clk_name, 32, "dsi%dn1_postdivby2_clk", pll_14nm->phy->id);
0847 snprintf(parent, 32, "dsi%dn1_postdiv_clk", pll_14nm->phy->id);
0848
0849
0850
0851
0852
0853 hw = devm_clk_hw_register_fixed_factor(dev, clk_name, parent, 0, 1, 2);
0854 if (IS_ERR(hw))
0855 return PTR_ERR(hw);
0856
0857 snprintf(clk_name, 32, "dsi%dpll", pll_14nm->phy->id);
0858 snprintf(parent, 32, "dsi%dn1_postdivby2_clk", pll_14nm->phy->id);
0859
0860
0861
0862
0863
0864 hw = pll_14nm_postdiv_register(pll_14nm, clk_name, parent, 0, 4);
0865 if (IS_ERR(hw))
0866 return PTR_ERR(hw);
0867
0868 provided_clocks[DSI_PIXEL_PLL_CLK] = hw;
0869
0870 return 0;
0871 }
0872
0873 static int dsi_pll_14nm_init(struct msm_dsi_phy *phy)
0874 {
0875 struct platform_device *pdev = phy->pdev;
0876 struct dsi_pll_14nm *pll_14nm;
0877 int ret;
0878
0879 if (!pdev)
0880 return -ENODEV;
0881
0882 pll_14nm = devm_kzalloc(&pdev->dev, sizeof(*pll_14nm), GFP_KERNEL);
0883 if (!pll_14nm)
0884 return -ENOMEM;
0885
0886 DBG("PLL%d", phy->id);
0887
0888 pll_14nm_list[phy->id] = pll_14nm;
0889
0890 spin_lock_init(&pll_14nm->postdiv_lock);
0891
0892 pll_14nm->phy = phy;
0893
0894 ret = pll_14nm_register(pll_14nm, phy->provided_clocks->hws);
0895 if (ret) {
0896 DRM_DEV_ERROR(&pdev->dev, "failed to register PLL: %d\n", ret);
0897 return ret;
0898 }
0899
0900 phy->vco_hw = &pll_14nm->clk_hw;
0901
0902 return 0;
0903 }
0904
0905 static void dsi_14nm_dphy_set_timing(struct msm_dsi_phy *phy,
0906 struct msm_dsi_dphy_timing *timing,
0907 int lane_idx)
0908 {
0909 void __iomem *base = phy->lane_base;
0910 bool clk_ln = (lane_idx == PHY_14NM_CKLN_IDX);
0911 u32 zero = clk_ln ? timing->clk_zero : timing->hs_zero;
0912 u32 prepare = clk_ln ? timing->clk_prepare : timing->hs_prepare;
0913 u32 trail = clk_ln ? timing->clk_trail : timing->hs_trail;
0914 u32 rqst = clk_ln ? timing->hs_rqst_ckln : timing->hs_rqst;
0915 u32 prep_dly = clk_ln ? timing->hs_prep_dly_ckln : timing->hs_prep_dly;
0916 u32 halfbyte_en = clk_ln ? timing->hs_halfbyte_en_ckln :
0917 timing->hs_halfbyte_en;
0918
0919 dsi_phy_write(base + REG_DSI_14nm_PHY_LN_TIMING_CTRL_4(lane_idx),
0920 DSI_14nm_PHY_LN_TIMING_CTRL_4_HS_EXIT(timing->hs_exit));
0921 dsi_phy_write(base + REG_DSI_14nm_PHY_LN_TIMING_CTRL_5(lane_idx),
0922 DSI_14nm_PHY_LN_TIMING_CTRL_5_HS_ZERO(zero));
0923 dsi_phy_write(base + REG_DSI_14nm_PHY_LN_TIMING_CTRL_6(lane_idx),
0924 DSI_14nm_PHY_LN_TIMING_CTRL_6_HS_PREPARE(prepare));
0925 dsi_phy_write(base + REG_DSI_14nm_PHY_LN_TIMING_CTRL_7(lane_idx),
0926 DSI_14nm_PHY_LN_TIMING_CTRL_7_HS_TRAIL(trail));
0927 dsi_phy_write(base + REG_DSI_14nm_PHY_LN_TIMING_CTRL_8(lane_idx),
0928 DSI_14nm_PHY_LN_TIMING_CTRL_8_HS_RQST(rqst));
0929 dsi_phy_write(base + REG_DSI_14nm_PHY_LN_CFG0(lane_idx),
0930 DSI_14nm_PHY_LN_CFG0_PREPARE_DLY(prep_dly));
0931 dsi_phy_write(base + REG_DSI_14nm_PHY_LN_CFG1(lane_idx),
0932 halfbyte_en ? DSI_14nm_PHY_LN_CFG1_HALFBYTECLK_EN : 0);
0933 dsi_phy_write(base + REG_DSI_14nm_PHY_LN_TIMING_CTRL_9(lane_idx),
0934 DSI_14nm_PHY_LN_TIMING_CTRL_9_TA_GO(timing->ta_go) |
0935 DSI_14nm_PHY_LN_TIMING_CTRL_9_TA_SURE(timing->ta_sure));
0936 dsi_phy_write(base + REG_DSI_14nm_PHY_LN_TIMING_CTRL_10(lane_idx),
0937 DSI_14nm_PHY_LN_TIMING_CTRL_10_TA_GET(timing->ta_get));
0938 dsi_phy_write(base + REG_DSI_14nm_PHY_LN_TIMING_CTRL_11(lane_idx),
0939 DSI_14nm_PHY_LN_TIMING_CTRL_11_TRIG3_CMD(0xa0));
0940 }
0941
0942 static int dsi_14nm_phy_enable(struct msm_dsi_phy *phy,
0943 struct msm_dsi_phy_clk_request *clk_req)
0944 {
0945 struct msm_dsi_dphy_timing *timing = &phy->timing;
0946 u32 data;
0947 int i;
0948 int ret;
0949 void __iomem *base = phy->base;
0950 void __iomem *lane_base = phy->lane_base;
0951 u32 glbl_test_ctrl;
0952
0953 if (msm_dsi_dphy_timing_calc_v2(timing, clk_req)) {
0954 DRM_DEV_ERROR(&phy->pdev->dev,
0955 "%s: D-PHY timing calculation failed\n", __func__);
0956 return -EINVAL;
0957 }
0958
0959 data = 0x1c;
0960 if (phy->usecase != MSM_DSI_PHY_STANDALONE)
0961 data |= DSI_14nm_PHY_CMN_LDO_CNTRL_VREG_CTRL(32);
0962 dsi_phy_write(base + REG_DSI_14nm_PHY_CMN_LDO_CNTRL, data);
0963
0964 dsi_phy_write(base + REG_DSI_14nm_PHY_CMN_GLBL_TEST_CTRL, 0x1);
0965
0966
0967 for (i = 0; i < 5; i++) {
0968 dsi_phy_write(lane_base + REG_DSI_14nm_PHY_LN_VREG_CNTRL(i),
0969 0x1d);
0970
0971 dsi_phy_write(lane_base +
0972 REG_DSI_14nm_PHY_LN_STRENGTH_CTRL_0(i), 0xff);
0973 dsi_phy_write(lane_base +
0974 REG_DSI_14nm_PHY_LN_STRENGTH_CTRL_1(i),
0975 (i == PHY_14NM_CKLN_IDX) ? 0x00 : 0x06);
0976
0977 dsi_phy_write(lane_base + REG_DSI_14nm_PHY_LN_CFG3(i),
0978 (i == PHY_14NM_CKLN_IDX) ? 0x8f : 0x0f);
0979 dsi_phy_write(lane_base + REG_DSI_14nm_PHY_LN_CFG2(i), 0x10);
0980 dsi_phy_write(lane_base + REG_DSI_14nm_PHY_LN_TEST_DATAPATH(i),
0981 0);
0982 dsi_phy_write(lane_base + REG_DSI_14nm_PHY_LN_TEST_STR(i),
0983 0x88);
0984
0985 dsi_14nm_dphy_set_timing(phy, timing, i);
0986 }
0987
0988
0989 dsi_phy_write(base + REG_DSI_14nm_PHY_CMN_PLL_CNTRL, 0x00);
0990
0991 wmb();
0992
0993
0994 dsi_phy_write(base + REG_DSI_14nm_PHY_CMN_CTRL_1, 0x80);
0995 wmb();
0996 udelay(100);
0997 dsi_phy_write(base + REG_DSI_14nm_PHY_CMN_CTRL_1, 0x00);
0998
0999 glbl_test_ctrl = dsi_phy_read(base + REG_DSI_14nm_PHY_CMN_GLBL_TEST_CTRL);
1000 if (phy->id == DSI_1 && phy->usecase == MSM_DSI_PHY_SLAVE)
1001 glbl_test_ctrl |= DSI_14nm_PHY_CMN_GLBL_TEST_CTRL_BITCLK_HS_SEL;
1002 else
1003 glbl_test_ctrl &= ~DSI_14nm_PHY_CMN_GLBL_TEST_CTRL_BITCLK_HS_SEL;
1004 dsi_phy_write(base + REG_DSI_14nm_PHY_CMN_GLBL_TEST_CTRL, glbl_test_ctrl);
1005 ret = dsi_14nm_set_usecase(phy);
1006 if (ret) {
1007 DRM_DEV_ERROR(&phy->pdev->dev, "%s: set pll usecase failed, %d\n",
1008 __func__, ret);
1009 return ret;
1010 }
1011
1012
1013 dsi_phy_write(base + REG_DSI_14nm_PHY_CMN_CTRL_0, 0xff);
1014
1015 return 0;
1016 }
1017
1018 static void dsi_14nm_phy_disable(struct msm_dsi_phy *phy)
1019 {
1020 dsi_phy_write(phy->base + REG_DSI_14nm_PHY_CMN_GLBL_TEST_CTRL, 0);
1021 dsi_phy_write(phy->base + REG_DSI_14nm_PHY_CMN_CTRL_0, 0);
1022
1023
1024 wmb();
1025 }
1026
1027 const struct msm_dsi_phy_cfg dsi_phy_14nm_cfgs = {
1028 .has_phy_lane = true,
1029 .reg_cfg = {
1030 .num = 1,
1031 .regs = {
1032 {"vcca", 17000, 32},
1033 },
1034 },
1035 .ops = {
1036 .enable = dsi_14nm_phy_enable,
1037 .disable = dsi_14nm_phy_disable,
1038 .pll_init = dsi_pll_14nm_init,
1039 .save_pll_state = dsi_14nm_pll_save_state,
1040 .restore_pll_state = dsi_14nm_pll_restore_state,
1041 },
1042 .min_pll_rate = VCO_MIN_RATE,
1043 .max_pll_rate = VCO_MAX_RATE,
1044 .io_start = { 0x994400, 0x996400 },
1045 .num_dsi_phy = 2,
1046 };
1047
1048 const struct msm_dsi_phy_cfg dsi_phy_14nm_660_cfgs = {
1049 .has_phy_lane = true,
1050 .reg_cfg = {
1051 .num = 1,
1052 .regs = {
1053 {"vcca", 73400, 32},
1054 },
1055 },
1056 .ops = {
1057 .enable = dsi_14nm_phy_enable,
1058 .disable = dsi_14nm_phy_disable,
1059 .pll_init = dsi_pll_14nm_init,
1060 .save_pll_state = dsi_14nm_pll_save_state,
1061 .restore_pll_state = dsi_14nm_pll_restore_state,
1062 },
1063 .min_pll_rate = VCO_MIN_RATE,
1064 .max_pll_rate = VCO_MAX_RATE,
1065 .io_start = { 0xc994400, 0xc996400 },
1066 .num_dsi_phy = 2,
1067 };
1068
1069 const struct msm_dsi_phy_cfg dsi_phy_14nm_8953_cfgs = {
1070 .has_phy_lane = true,
1071 .reg_cfg = {
1072 .num = 1,
1073 .regs = {
1074 {"vcca", 17000, 32},
1075 },
1076 },
1077 .ops = {
1078 .enable = dsi_14nm_phy_enable,
1079 .disable = dsi_14nm_phy_disable,
1080 .pll_init = dsi_pll_14nm_init,
1081 .save_pll_state = dsi_14nm_pll_save_state,
1082 .restore_pll_state = dsi_14nm_pll_restore_state,
1083 },
1084 .min_pll_rate = VCO_MIN_RATE,
1085 .max_pll_rate = VCO_MAX_RATE,
1086 .io_start = { 0x1a94400, 0x1a96400 },
1087 .num_dsi_phy = 2,
1088 };