Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Copyright (c) 2016, The Linux Foundation. All rights reserved.
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  * DSI PLL 14nm - clock diagram (eg: DSI0):
0018  *
0019  *         dsi0n1_postdiv_clk
0020  *                         |
0021  *                         |
0022  *                 +----+  |  +----+
0023  *  dsi0vco_clk ---| n1 |--o--| /8 |-- dsi0pllbyte
0024  *                 +----+  |  +----+
0025  *                         |           dsi0n1_postdivby2_clk
0026  *                         |   +----+  |
0027  *                         o---| /2 |--o--|\
0028  *                         |   +----+     | \   +----+
0029  *                         |              |  |--| n2 |-- dsi0pll
0030  *                         o--------------| /   +----+
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; /* SSC enable/disable */
0045 
0046     /* fixed params */
0047     u32 plllock_cnt;
0048     u32 ssc_center;
0049     u32 ssc_adj_period;
0050     u32 ssc_spread;
0051     u32 ssc_freq;
0052 
0053     /* calculated */
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     /* protects REG_DSI_14nm_PHY_CMN_CLK_CFG0 register */
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  * Private struct for N1/N2 post-divider clocks. These clocks are similar to
0088  * the generic clk_divider class of clocks. The only difference is that it
0089  * also sets the slave DSI PLL's post-dividers if in bonded DSI mode
0090  */
0091 struct dsi_pll_14nm_postdiv {
0092     struct clk_hw hw;
0093 
0094     /* divider params */
0095     u8 shift;
0096     u8 width;
0097     u8 flags; /* same flags as used by clk_divider struct */
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  * Global list of private DSI PLL struct pointers. We need this for bonded DSI
0106  * mode, where the master PLL's clk_ops needs access the slave's private data
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     /* fixed input */
0151     pconf->plllock_cnt = 1;
0152 
0153     /*
0154      * SSC is enabled by default. We might need DT props for configuring
0155      * some SSC params like PPM and center/down spread etc.
0156      */
0157     pconf->ssc_en = 1;
0158     pconf->ssc_center = 0;      /* down spread by default */
0159     pconf->ssc_spread = 5;      /* PPM / 1000 */
0160     pconf->ssc_freq = 31500;    /* default recommended */
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;   /* take lower 16 bits */
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; /* 10 bits */
0263     data -= 2;
0264     pconf->pll_vco_div_ref = data;
0265 
0266     data = div_u64(vco_clk_rate, 1000000);  /* unit is Mhz */
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; /* 10 bits */
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; /* enable */
0313     dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_EN_CENTER, data);
0314 
0315     wmb();  /* make sure register committed */
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     /* confgiure the non frequency dependent pll registers */
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); /* bandgap_timer */
0332     dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL5, 5); /* pll_wakeup_timer */
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     /* de assert pll start and apply pll sw reset */
0370 
0371     /* stop pll */
0372     dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_PLL_CNTRL, 0);
0373 
0374     /* pll sw reset */
0375     dsi_phy_write_udelay(cmn_base + REG_DSI_14nm_PHY_CMN_CTRL_1, 0x20, 10);
0376     wmb();  /* make sure register committed */
0377 
0378     dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_CTRL_1, 0);
0379     wmb();  /* make sure register committed */
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     /* Use the /2 path in Mux */
0398     dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_CLK_CFG1, 1);
0399 
0400     data = 0xff; /* data, clk, pll normal operation */
0401     dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_CTRL_0, data);
0402 
0403     /* configure the frequency dependent pll registers */
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; /* plllock_rng */
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      * High nibble configures the post divider internal to the VCO. It's
0438      * fixed to divide by 1 for now.
0439      *
0440      * 0: divided by 1
0441      * 1: divided by 2
0442      * 2: divided by 4
0443      * 3: divided by 8
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();  /* make sure register committed */
0451 }
0452 
0453 /*
0454  * VCO clock Callbacks
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     /* commit the slave DSI PLL registers if we're master. Note that we
0476      * don't lock the slave PLL. We just ensure that the PLL/PHY registers
0477      * of the master and slave are identical
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      * Recalculating the rate from dec_start and frac_start doesn't end up
0520      * the rate we originally set. Convert the freq to KHz, round it up and
0521      * convert it back to MHz.
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  * N1 and N2 post-divider clock callbacks
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     /* If we're master in bonded DSI mode, then the slave PLL's post-dividers
0660      * follow the master's post dividers
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  * PLL Callbacks
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     /* also restore post-dividers for slave DSI PLL */
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     /* both N1 and N2 postdividers are 4 bits wide */
0789     pll_postdiv->width = 4;
0790     /* range of each divider is from 1 to 15 */
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     /* N1 postdiv, bits 0-3 in REG_DSI_14nm_PHY_CMN_CLK_CFG0 */
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     /* DSI Byte clock = VCO_CLK / N1 / 8 */
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      * Skip the mux for now, force DSICLK_SEL to 1, Add a /2 divider
0851      * on the way. Don't let it set parent.
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     /* DSI pixel clock = VCO_CLK / N1 / 2 / N2
0861      * This is the output of N2 post-divider, bits 4-7 in
0862      * REG_DSI_14nm_PHY_CMN_CLK_CFG0. Don't let it set parent.
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     /* 4 data lanes + 1 clk lane configuration */
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     /* Make sure PLL is not start */
0989     dsi_phy_write(base + REG_DSI_14nm_PHY_CMN_PLL_CNTRL, 0x00);
0990 
0991     wmb(); /* make sure everything is written before reset and enable */
0992 
0993     /* reset digital block */
0994     dsi_phy_write(base + REG_DSI_14nm_PHY_CMN_CTRL_1, 0x80);
0995     wmb(); /* ensure reset is asserted */
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     /* Remove power down from PLL and all lanes */
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     /* ensure that the phy is completely disabled */
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 };