diff mbox series

[v3,23/25] drm/msm/dsi: remove temp data from global pll structure

Message ID 20210327110305.3289784-24-dmitry.baryshkov@linaro.org (mailing list archive)
State Not Applicable, archived
Headers show
Series [v3,01/25] clk: fixed: add devm helper for clk_hw_register_fixed_factor() | expand

Commit Message

Dmitry Baryshkov March 27, 2021, 11:03 a.m. UTC
The 7nm, 10nm and 14nm drivers would store interim data used during
VCO/PLL rate setting in the global dsi_pll_Nnm structure. Move this data
structures to the onstack storage. While we are at it, drop
unused/static 'config' data, unused config fields, etc.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c | 167 ++++-------
 drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c | 334 +++++++--------------
 drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c  | 166 ++++------
 3 files changed, 220 insertions(+), 447 deletions(-)

Comments

Abhinav Kumar March 30, 2021, 3:26 a.m. UTC | #1
On 2021-03-27 04:03, Dmitry Baryshkov wrote:
> The 7nm, 10nm and 14nm drivers would store interim data used during
> VCO/PLL rate setting in the global dsi_pll_Nnm structure. Move this 
> data
> structures to the onstack storage. While we are at it, drop
> unused/static 'config' data, unused config fields, etc.
> 
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Abhinav Kumar <abhinavk@codeaurora.org>
> ---
>  drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c | 167 ++++-------
>  drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c | 334 +++++++--------------
>  drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c  | 166 ++++------
>  3 files changed, 220 insertions(+), 447 deletions(-)
> 
> diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c
> b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c
> index b937e77b3c37..1fbb54f4df98 100644
> --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c
> +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c
> @@ -36,43 +36,25 @@
>   */
> 
>  #define VCO_REF_CLK_RATE		19200000
> -
> -struct dsi_pll_regs {
> -	u32 pll_prop_gain_rate;
> -	u32 pll_lockdet_rate;
> -	u32 decimal_div_start;
> -	u32 frac_div_start_low;
> -	u32 frac_div_start_mid;
> -	u32 frac_div_start_high;
> -	u32 pll_clock_inverters;
> -	u32 ssc_stepsize_low;
> -	u32 ssc_stepsize_high;
> -	u32 ssc_div_per_low;
> -	u32 ssc_div_per_high;
> -	u32 ssc_adjper_low;
> -	u32 ssc_adjper_high;
> -	u32 ssc_control;
> -};
> +#define FRAC_BITS 18
> 
>  /* v3.0.0 10nm implementation that requires the old timings settings 
> */
>  #define DSI_PHY_10NM_QUIRK_OLD_TIMINGS	BIT(0)
> 
>  struct dsi_pll_config {
> -	u32 ref_freq;
> -	bool div_override;
> -	u32 output_div;
> -	bool ignore_frac;
> -	bool disable_prescaler;
>  	bool enable_ssc;
>  	bool ssc_center;
> -	u32 dec_bits;
> -	u32 frac_bits;
> -	u32 lock_timer;
>  	u32 ssc_freq;
>  	u32 ssc_offset;
>  	u32 ssc_adj_per;
> -	u32 thresh_cycles;
> -	u32 refclk_cycles;
> +
> +	/* out */
> +	u32 pll_prop_gain_rate;
> +	u32 decimal_div_start;
> +	u32 frac_div_start;
> +	u32 pll_clock_inverters;
> +	u32 ssc_stepsize;
> +	u32 ssc_div_per;
>  };
> 
>  struct pll_10nm_cached_state {
> @@ -88,15 +70,11 @@ struct dsi_pll_10nm {
> 
>  	struct msm_dsi_phy *phy;
> 
> -	u64 vco_ref_clk_rate;
>  	u64 vco_current_rate;
> 
>  	/* protects REG_DSI_10nm_PHY_CMN_CLK_CFG0 register */
>  	spinlock_t postdiv_lock;
> 
> -	struct dsi_pll_config pll_configuration;
> -	struct dsi_pll_regs reg_setup;
> -
>  	struct pll_10nm_cached_state cached_state;
> 
>  	struct dsi_pll_10nm *slave;
> @@ -110,34 +88,19 @@ struct dsi_pll_10nm {
>   */
>  static struct dsi_pll_10nm *pll_10nm_list[DSI_MAX];
> 
> -static void dsi_pll_setup_config(struct dsi_pll_10nm *pll)
> +static void dsi_pll_setup_config(struct dsi_pll_config *config)
>  {
> -	struct dsi_pll_config *config = &pll->pll_configuration;
> -
> -	config->ref_freq = pll->vco_ref_clk_rate;
> -	config->output_div = 1;
> -	config->dec_bits = 8;
> -	config->frac_bits = 18;
> -	config->lock_timer = 64;
>  	config->ssc_freq = 31500;
>  	config->ssc_offset = 5000;
>  	config->ssc_adj_per = 2;
> -	config->thresh_cycles = 32;
> -	config->refclk_cycles = 256;
> -
> -	config->div_override = false;
> -	config->ignore_frac = false;
> -	config->disable_prescaler = false;
> 
>  	config->enable_ssc = false;
> -	config->ssc_center = 0;
> +	config->ssc_center = false;
>  }
> 
> -static void dsi_pll_calc_dec_frac(struct dsi_pll_10nm *pll)
> +static void dsi_pll_calc_dec_frac(struct dsi_pll_10nm *pll, struct
> dsi_pll_config *config)
>  {
> -	struct dsi_pll_config *config = &pll->pll_configuration;
> -	struct dsi_pll_regs *regs = &pll->reg_setup;
> -	u64 fref = pll->vco_ref_clk_rate;
> +	u64 fref = VCO_REF_CLK_RATE;
>  	u64 pll_freq;
>  	u64 divider;
>  	u64 dec, dec_multiple;
> @@ -146,40 +109,32 @@ static void dsi_pll_calc_dec_frac(struct
> dsi_pll_10nm *pll)
> 
>  	pll_freq = pll->vco_current_rate;
> 
> -	if (config->disable_prescaler)
> -		divider = fref;
> -	else
> -		divider = fref * 2;
> +	divider = fref * 2;
> 
> -	multiplier = 1 << config->frac_bits;
> +	multiplier = 1 << FRAC_BITS;
>  	dec_multiple = div_u64(pll_freq * multiplier, divider);
>  	dec = div_u64_rem(dec_multiple, multiplier, &frac);
> 
>  	if (pll_freq <= 1900000000UL)
> -		regs->pll_prop_gain_rate = 8;
> +		config->pll_prop_gain_rate = 8;
>  	else if (pll_freq <= 3000000000UL)
> -		regs->pll_prop_gain_rate = 10;
> +		config->pll_prop_gain_rate = 10;
>  	else
> -		regs->pll_prop_gain_rate = 12;
> +		config->pll_prop_gain_rate = 12;
>  	if (pll_freq < 1100000000UL)
> -		regs->pll_clock_inverters = 8;
> +		config->pll_clock_inverters = 8;
>  	else
> -		regs->pll_clock_inverters = 0;
> +		config->pll_clock_inverters = 0;
> 
> -	regs->pll_lockdet_rate = config->lock_timer;
> -	regs->decimal_div_start = dec;
> -	regs->frac_div_start_low = (frac & 0xff);
> -	regs->frac_div_start_mid = (frac & 0xff00) >> 8;
> -	regs->frac_div_start_high = (frac & 0x30000) >> 16;
> +	config->decimal_div_start = dec;
> +	config->frac_div_start = frac;
>  }
> 
>  #define SSC_CENTER		BIT(0)
>  #define SSC_EN			BIT(1)
> 
> -static void dsi_pll_calc_ssc(struct dsi_pll_10nm *pll)
> +static void dsi_pll_calc_ssc(struct dsi_pll_10nm *pll, struct
> dsi_pll_config *config)
>  {
> -	struct dsi_pll_config *config = &pll->pll_configuration;
> -	struct dsi_pll_regs *regs = &pll->reg_setup;
>  	u32 ssc_per;
>  	u32 ssc_mod;
>  	u64 ssc_step_size;
> @@ -190,58 +145,49 @@ static void dsi_pll_calc_ssc(struct dsi_pll_10nm 
> *pll)
>  		return;
>  	}
> 
> -	ssc_per = DIV_ROUND_CLOSEST(config->ref_freq, config->ssc_freq) / 2 - 
> 1;
> +	ssc_per = DIV_ROUND_CLOSEST(VCO_REF_CLK_RATE, config->ssc_freq) / 2 - 
> 1;
>  	ssc_mod = (ssc_per + 1) % (config->ssc_adj_per + 1);
>  	ssc_per -= ssc_mod;
> 
> -	frac = regs->frac_div_start_low |
> -			(regs->frac_div_start_mid << 8) |
> -			(regs->frac_div_start_high << 16);
> -	ssc_step_size = regs->decimal_div_start;
> -	ssc_step_size *= (1 << config->frac_bits);
> +	frac = config->frac_div_start;
> +	ssc_step_size = config->decimal_div_start;
> +	ssc_step_size *= (1 << FRAC_BITS);
>  	ssc_step_size += frac;
>  	ssc_step_size *= config->ssc_offset;
>  	ssc_step_size *= (config->ssc_adj_per + 1);
>  	ssc_step_size = div_u64(ssc_step_size, (ssc_per + 1));
>  	ssc_step_size = DIV_ROUND_CLOSEST_ULL(ssc_step_size, 1000000);
> 
> -	regs->ssc_div_per_low = ssc_per & 0xFF;
> -	regs->ssc_div_per_high = (ssc_per & 0xFF00) >> 8;
> -	regs->ssc_stepsize_low = (u32)(ssc_step_size & 0xFF);
> -	regs->ssc_stepsize_high = (u32)((ssc_step_size & 0xFF00) >> 8);
> -	regs->ssc_adjper_low = config->ssc_adj_per & 0xFF;
> -	regs->ssc_adjper_high = (config->ssc_adj_per & 0xFF00) >> 8;
> -
> -	regs->ssc_control = config->ssc_center ? SSC_CENTER : 0;
> +	config->ssc_div_per = ssc_per;
> +	config->ssc_stepsize = ssc_step_size;
> 
>  	pr_debug("SCC: Dec:%d, frac:%llu, frac_bits:%d\n",
> -		 regs->decimal_div_start, frac, config->frac_bits);
> +		 config->decimal_div_start, frac, FRAC_BITS);
>  	pr_debug("SSC: div_per:0x%X, stepsize:0x%X, adjper:0x%X\n",
>  		 ssc_per, (u32)ssc_step_size, config->ssc_adj_per);
>  }
> 
> -static void dsi_pll_ssc_commit(struct dsi_pll_10nm *pll)
> +static void dsi_pll_ssc_commit(struct dsi_pll_10nm *pll, struct
> dsi_pll_config *config)
>  {
>  	void __iomem *base = pll->phy->pll_base;
> -	struct dsi_pll_regs *regs = &pll->reg_setup;
> 
> -	if (pll->pll_configuration.enable_ssc) {
> +	if (config->enable_ssc) {
>  		pr_debug("SSC is enabled\n");
> 
>  		dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_STEPSIZE_LOW_1,
> -			  regs->ssc_stepsize_low);
> +			  config->ssc_stepsize & 0xff);
>  		dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_STEPSIZE_HIGH_1,
> -			  regs->ssc_stepsize_high);
> +			  config->ssc_stepsize >> 8);
>  		dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_DIV_PER_LOW_1,
> -			  regs->ssc_div_per_low);
> +			  config->ssc_div_per & 0xff);
>  		dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_DIV_PER_HIGH_1,
> -			  regs->ssc_div_per_high);
> +			  config->ssc_div_per >> 8);
>  		dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_DIV_ADJPER_LOW_1,
> -			  regs->ssc_adjper_low);
> +			  config->ssc_adj_per & 0xff);
>  		dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_DIV_ADJPER_HIGH_1,
> -			  regs->ssc_adjper_high);
> +			  config->ssc_adj_per >> 8);
>  		dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_CONTROL,
> -			  SSC_EN | regs->ssc_control);
> +			  SSC_EN | (config->ssc_center ? SSC_CENTER : 0));
>  	}
>  }
> 
> @@ -271,50 +217,48 @@ static void dsi_pll_config_hzindep_reg(struct
> dsi_pll_10nm *pll)
>  	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_IFILT, 0x3f);
>  }
> 
> -static void dsi_pll_commit(struct dsi_pll_10nm *pll)
> +static void dsi_pll_commit(struct dsi_pll_10nm *pll, struct
> dsi_pll_config *config)
>  {
>  	void __iomem *base = pll->phy->pll_base;
> -	struct dsi_pll_regs *reg = &pll->reg_setup;
> 
>  	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_CORE_INPUT_OVERRIDE, 0x12);
>  	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_DECIMAL_DIV_START_1,
> -		  reg->decimal_div_start);
> +		  config->decimal_div_start);
>  	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_FRAC_DIV_START_LOW_1,
> -		  reg->frac_div_start_low);
> +		  config->frac_div_start & 0xff);
>  	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_FRAC_DIV_START_MID_1,
> -		  reg->frac_div_start_mid);
> +		  (config->frac_div_start & 0xff00) >> 8);
>  	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_FRAC_DIV_START_HIGH_1,
> -		  reg->frac_div_start_high);
> -	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_PLL_LOCKDET_RATE_1,
> -		  reg->pll_lockdet_rate);
> +		  (config->frac_div_start & 0x30000) >> 16);
> +	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_PLL_LOCKDET_RATE_1, 64);
>  	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_PLL_LOCK_DELAY, 0x06);
>  	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_CMODE, 0x10);
>  	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_CLOCK_INVERTERS,
> -		  reg->pll_clock_inverters);
> +		  config->pll_clock_inverters);
>  }
> 
>  static int dsi_pll_10nm_vco_set_rate(struct clk_hw *hw, unsigned long 
> rate,
>  				     unsigned long parent_rate)
>  {
>  	struct dsi_pll_10nm *pll_10nm = to_pll_10nm(hw);
> +	struct dsi_pll_config config;
> 
>  	DBG("DSI PLL%d rate=%lu, parent's=%lu", pll_10nm->phy->id, rate,
>  	    parent_rate);
> 
>  	pll_10nm->vco_current_rate = rate;
> -	pll_10nm->vco_ref_clk_rate = VCO_REF_CLK_RATE;
> 
> -	dsi_pll_setup_config(pll_10nm);
> +	dsi_pll_setup_config(&config);
> 
> -	dsi_pll_calc_dec_frac(pll_10nm);
> +	dsi_pll_calc_dec_frac(pll_10nm, &config);
> 
> -	dsi_pll_calc_ssc(pll_10nm);
> +	dsi_pll_calc_ssc(pll_10nm, &config);
> 
> -	dsi_pll_commit(pll_10nm);
> +	dsi_pll_commit(pll_10nm, &config);
> 
>  	dsi_pll_config_hzindep_reg(pll_10nm);
> 
> -	dsi_pll_ssc_commit(pll_10nm);
> +	dsi_pll_ssc_commit(pll_10nm, &config);
> 
>  	/* flush, ensure all register writes are done*/
>  	wmb();
> @@ -461,9 +405,8 @@ static unsigned long
> dsi_pll_10nm_vco_recalc_rate(struct clk_hw *hw,
>  						  unsigned long parent_rate)
>  {
>  	struct dsi_pll_10nm *pll_10nm = to_pll_10nm(hw);
> -	struct dsi_pll_config *config = &pll_10nm->pll_configuration;
>  	void __iomem *base = pll_10nm->phy->pll_base;
> -	u64 ref_clk = pll_10nm->vco_ref_clk_rate;
> +	u64 ref_clk = VCO_REF_CLK_RATE;
>  	u64 vco_rate = 0x0;
>  	u64 multiplier;
>  	u32 frac;
> @@ -483,7 +426,7 @@ static unsigned long
> dsi_pll_10nm_vco_recalc_rate(struct clk_hw *hw,
>  	 * TODO:
>  	 *	1. Assumes prescaler is disabled
>  	 */
> -	multiplier = 1 << config->frac_bits;
> +	multiplier = 1 << FRAC_BITS;
>  	pll_freq = dec * (ref_clk * 2);
>  	tmp64 = (ref_clk * 2 * frac);
>  	pll_freq += div_u64(tmp64, multiplier);
> @@ -565,7 +508,7 @@ static int dsi_10nm_restore_state(struct 
> msm_dsi_phy *phy)
>  	val |= cached->pll_mux;
>  	dsi_phy_write(phy_base + REG_DSI_10nm_PHY_CMN_CLK_CFG1, val);
> 
> -	ret = dsi_pll_10nm_vco_set_rate(phy->vco_hw,
> pll_10nm->vco_current_rate, pll_10nm->vco_ref_clk_rate);
> +	ret = dsi_pll_10nm_vco_set_rate(phy->vco_hw,
> pll_10nm->vco_current_rate, VCO_REF_CLK_RATE);
>  	if (ret) {
>  		DRM_DEV_ERROR(&pll_10nm->phy->pdev->dev,
>  			"restore vco rate failed. ret=%d\n", ret);
> diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c
> b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c
> index 8b4865c5796d..d08ad0c632b4 100644
> --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c
> +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c
> @@ -37,51 +37,19 @@
>  #define VCO_MIN_RATE			1300000000UL
>  #define VCO_MAX_RATE			2600000000UL
> 
> -#define DSI_PLL_DEFAULT_VCO_POSTDIV	1
> +struct dsi_pll_config {
> +	u64 vco_current_rate;
> 
> -struct dsi_pll_input {
> -	u32 fref;	/* reference clk */
> -	u32 fdata;	/* bit clock rate */
> -	u32 dsiclk_sel; /* Mux configuration (see diagram) */
>  	u32 ssc_en;	/* SSC enable/disable */
> -	u32 ldo_en;
> 
>  	/* fixed params */
> -	u32 refclk_dbler_en;
> -	u32 vco_measure_time;
> -	u32 kvco_measure_time;
> -	u32 bandgap_timer;
> -	u32 pll_wakeup_timer;
>  	u32 plllock_cnt;
> -	u32 plllock_rng;
>  	u32 ssc_center;
>  	u32 ssc_adj_period;
>  	u32 ssc_spread;
>  	u32 ssc_freq;
> -	u32 pll_ie_trim;
> -	u32 pll_ip_trim;
> -	u32 pll_iptat_trim;
> -	u32 pll_cpcset_cur;
> -	u32 pll_cpmset_cur;
> -
> -	u32 pll_icpmset;
> -	u32 pll_icpcset;
> -
> -	u32 pll_icpmset_p;
> -	u32 pll_icpmset_m;
> -
> -	u32 pll_icpcset_p;
> -	u32 pll_icpcset_m;
> -
> -	u32 pll_lpf_res1;
> -	u32 pll_lpf_cap1;
> -	u32 pll_lpf_cap2;
> -	u32 pll_c3ctrl;
> -	u32 pll_r3ctrl;
> -};
> 
> -struct dsi_pll_output {
> -	u32 pll_txclk_en;
> +	/* calculated */
>  	u32 dec_start;
>  	u32 div_frac_start;
>  	u32 ssc_period;
> @@ -91,19 +59,6 @@ struct dsi_pll_output {
>  	u32 pll_vco_count;
>  	u32 pll_kvco_div_ref;
>  	u32 pll_kvco_count;
> -	u32 pll_misc1;
> -	u32 pll_lpf2_postdiv;
> -	u32 pll_resetsm_cntrl;
> -	u32 pll_resetsm_cntrl2;
> -	u32 pll_resetsm_cntrl5;
> -	u32 pll_kvco_code;
> -
> -	u32 cmn_clk_cfg0;
> -	u32 cmn_clk_cfg1;
> -	u32 cmn_ldo_cntrl;
> -
> -	u32 pll_postdiv;
> -	u32 fcvo;
>  };
> 
>  struct pll_14nm_cached_state {
> @@ -117,15 +72,9 @@ struct dsi_pll_14nm {
> 
>  	struct msm_dsi_phy *phy;
> 
> -	struct dsi_pll_input in;
> -	struct dsi_pll_output out;
> -
>  	/* protects REG_DSI_14nm_PHY_CMN_CLK_CFG0 register */
>  	spinlock_t postdiv_lock;
> 
> -	u64 vco_current_rate;
> -	u64 vco_ref_clk_rate;
> -
>  	struct pll_14nm_cached_state cached_state;
> 
>  	struct dsi_pll_14nm *slave;
> @@ -195,78 +144,50 @@ static bool pll_14nm_poll_for_ready(struct
> dsi_pll_14nm *pll_14nm,
>  	return pll_locked;
>  }
> 
> -static void dsi_pll_14nm_input_init(struct dsi_pll_14nm *pll)
> +static void dsi_pll_14nm_config_init(struct dsi_pll_config *pconf)
>  {
> -	pll->in.fref = pll->vco_ref_clk_rate;
> -	pll->in.fdata = 0;
> -	pll->in.dsiclk_sel = 1;	/* Use the /2 path in Mux */
> -	pll->in.ldo_en = 0;	/* disabled for now */
> -
>  	/* fixed input */
> -	pll->in.refclk_dbler_en = 0;
> -	pll->in.vco_measure_time = 5;
> -	pll->in.kvco_measure_time = 5;
> -	pll->in.bandgap_timer = 4;
> -	pll->in.pll_wakeup_timer = 5;
> -	pll->in.plllock_cnt = 1;
> -	pll->in.plllock_rng = 0;
> +	pconf->plllock_cnt = 1;
> 
>  	/*
>  	 * SSC is enabled by default. We might need DT props for configuring
>  	 * some SSC params like PPM and center/down spread etc.
>  	 */
> -	pll->in.ssc_en = 1;
> -	pll->in.ssc_center = 0;		/* down spread by default */
> -	pll->in.ssc_spread = 5;		/* PPM / 1000 */
> -	pll->in.ssc_freq = 31500;	/* default recommended */
> -	pll->in.ssc_adj_period = 37;
> -
> -	pll->in.pll_ie_trim = 4;
> -	pll->in.pll_ip_trim = 4;
> -	pll->in.pll_cpcset_cur = 1;
> -	pll->in.pll_cpmset_cur = 1;
> -	pll->in.pll_icpmset = 4;
> -	pll->in.pll_icpcset = 4;
> -	pll->in.pll_icpmset_p = 0;
> -	pll->in.pll_icpmset_m = 0;
> -	pll->in.pll_icpcset_p = 0;
> -	pll->in.pll_icpcset_m = 0;
> -	pll->in.pll_lpf_res1 = 3;
> -	pll->in.pll_lpf_cap1 = 11;
> -	pll->in.pll_lpf_cap2 = 1;
> -	pll->in.pll_iptat_trim = 7;
> -	pll->in.pll_c3ctrl = 2;
> -	pll->in.pll_r3ctrl = 1;
> +	pconf->ssc_en = 1;
> +	pconf->ssc_center = 0;		/* down spread by default */
> +	pconf->ssc_spread = 5;		/* PPM / 1000 */
> +	pconf->ssc_freq = 31500;	/* default recommended */
> +	pconf->ssc_adj_period = 37;
>  }
> 
>  #define CEIL(x, y)		(((x) + ((y) - 1)) / (y))
> 
> -static void pll_14nm_ssc_calc(struct dsi_pll_14nm *pll)
> +static void pll_14nm_ssc_calc(struct dsi_pll_14nm *pll, struct
> dsi_pll_config *pconf)
>  {
>  	u32 period, ssc_period;
>  	u32 ref, rem;
>  	u64 step_size;
> 
> -	DBG("vco=%lld ref=%lld", pll->vco_current_rate, 
> pll->vco_ref_clk_rate);
> +	DBG("vco=%lld ref=%d", pconf->vco_current_rate, VCO_REF_CLK_RATE);
> 
> -	ssc_period = pll->in.ssc_freq / 500;
> -	period = (u32)pll->vco_ref_clk_rate / 1000;
> +	ssc_period = pconf->ssc_freq / 500;
> +	period = (u32)VCO_REF_CLK_RATE / 1000;
>  	ssc_period  = CEIL(period, ssc_period);
>  	ssc_period -= 1;
> -	pll->out.ssc_period = ssc_period;
> +	pconf->ssc_period = ssc_period;
> 
> -	DBG("ssc freq=%d spread=%d period=%d", pll->in.ssc_freq,
> -	    pll->in.ssc_spread, pll->out.ssc_period);
> +	DBG("ssc freq=%d spread=%d period=%d", pconf->ssc_freq,
> +	    pconf->ssc_spread, pconf->ssc_period);
> 
> -	step_size = (u32)pll->vco_current_rate;
> -	ref = pll->vco_ref_clk_rate;
> +	step_size = (u32)pconf->vco_current_rate;
> +	ref = VCO_REF_CLK_RATE;
>  	ref /= 1000;
>  	step_size = div_u64(step_size, ref);
>  	step_size <<= 20;
>  	step_size = div_u64(step_size, 1000);
> -	step_size *= pll->in.ssc_spread;
> +	step_size *= pconf->ssc_spread;
>  	step_size = div_u64(step_size, 1000);
> -	step_size *= (pll->in.ssc_adj_period + 1);
> +	step_size *= (pconf->ssc_adj_period + 1);
> 
>  	rem = 0;
>  	step_size = div_u64_rem(step_size, ssc_period + 1, &rem);
> @@ -277,18 +198,16 @@ static void pll_14nm_ssc_calc(struct dsi_pll_14nm 
> *pll)
> 
>  	step_size &= 0x0ffff;	/* take lower 16 bits */
> 
> -	pll->out.ssc_step_size = step_size;
> +	pconf->ssc_step_size = step_size;
>  }
> 
> -static void pll_14nm_dec_frac_calc(struct dsi_pll_14nm *pll)
> +static void pll_14nm_dec_frac_calc(struct dsi_pll_14nm *pll, struct
> dsi_pll_config *pconf)
>  {
> -	struct dsi_pll_input *pin = &pll->in;
> -	struct dsi_pll_output *pout = &pll->out;
>  	u64 multiplier = BIT(20);
>  	u64 dec_start_multiple, dec_start, pll_comp_val;
>  	u32 duration, div_frac_start;
> -	u64 vco_clk_rate = pll->vco_current_rate;
> -	u64 fref = pll->vco_ref_clk_rate;
> +	u64 vco_clk_rate = pconf->vco_current_rate;
> +	u64 fref = VCO_REF_CLK_RATE;
> 
>  	DBG("vco_clk_rate=%lld ref_clk_rate=%lld", vco_clk_rate, fref);
> 
> @@ -297,14 +216,14 @@ static void pll_14nm_dec_frac_calc(struct
> dsi_pll_14nm *pll)
> 
>  	dec_start = div_u64(dec_start_multiple, multiplier);
> 
> -	pout->dec_start = (u32)dec_start;
> -	pout->div_frac_start = div_frac_start;
> +	pconf->dec_start = (u32)dec_start;
> +	pconf->div_frac_start = div_frac_start;
> 
> -	if (pin->plllock_cnt == 0)
> +	if (pconf->plllock_cnt == 0)
>  		duration = 1024;
> -	else if (pin->plllock_cnt == 1)
> +	else if (pconf->plllock_cnt == 1)
>  		duration = 256;
> -	else if (pin->plllock_cnt == 2)
> +	else if (pconf->plllock_cnt == 2)
>  		duration = 128;
>  	else
>  		duration = 32;
> @@ -313,10 +232,7 @@ static void pll_14nm_dec_frac_calc(struct
> dsi_pll_14nm *pll)
>  	pll_comp_val = div_u64(pll_comp_val, multiplier);
>  	do_div(pll_comp_val, 10);
> 
> -	pout->plllock_cmp = (u32)pll_comp_val;
> -
> -	pout->pll_txclk_en = 1;
> -	pout->cmn_ldo_cntrl = 0x3c;
> +	pconf->plllock_cmp = (u32)pll_comp_val;
>  }
> 
>  static u32 pll_14nm_kvco_slop(u32 vrate)
> @@ -333,74 +249,66 @@ static u32 pll_14nm_kvco_slop(u32 vrate)
>  	return slop;
>  }
> 
> -static void pll_14nm_calc_vco_count(struct dsi_pll_14nm *pll)
> +static void pll_14nm_calc_vco_count(struct dsi_pll_14nm *pll, struct
> dsi_pll_config *pconf)
>  {
> -	struct dsi_pll_input *pin = &pll->in;
> -	struct dsi_pll_output *pout = &pll->out;
> -	u64 vco_clk_rate = pll->vco_current_rate;
> -	u64 fref = pll->vco_ref_clk_rate;
> +	u64 vco_clk_rate = pconf->vco_current_rate;
> +	u64 fref = VCO_REF_CLK_RATE;
> +	u32 vco_measure_time = 5;
> +	u32 kvco_measure_time = 5;
>  	u64 data;
>  	u32 cnt;
> 
> -	data = fref * pin->vco_measure_time;
> +	data = fref * vco_measure_time;
>  	do_div(data, 1000000);
>  	data &= 0x03ff;	/* 10 bits */
>  	data -= 2;
> -	pout->pll_vco_div_ref = data;
> +	pconf->pll_vco_div_ref = data;
> 
>  	data = div_u64(vco_clk_rate, 1000000);	/* unit is Mhz */
> -	data *= pin->vco_measure_time;
> +	data *= vco_measure_time;
>  	do_div(data, 10);
> -	pout->pll_vco_count = data;
> +	pconf->pll_vco_count = data;
> 
> -	data = fref * pin->kvco_measure_time;
> +	data = fref * kvco_measure_time;
>  	do_div(data, 1000000);
>  	data &= 0x03ff;	/* 10 bits */
>  	data -= 1;
> -	pout->pll_kvco_div_ref = data;
> +	pconf->pll_kvco_div_ref = data;
> 
>  	cnt = pll_14nm_kvco_slop(vco_clk_rate);
>  	cnt *= 2;
>  	cnt /= 100;
> -	cnt *= pin->kvco_measure_time;
> -	pout->pll_kvco_count = cnt;
> -
> -	pout->pll_misc1 = 16;
> -	pout->pll_resetsm_cntrl = 48;
> -	pout->pll_resetsm_cntrl2 = pin->bandgap_timer << 3;
> -	pout->pll_resetsm_cntrl5 = pin->pll_wakeup_timer;
> -	pout->pll_kvco_code = 0;
> +	cnt *= kvco_measure_time;
> +	pconf->pll_kvco_count = cnt;
>  }
> 
> -static void pll_db_commit_ssc(struct dsi_pll_14nm *pll)
> +static void pll_db_commit_ssc(struct dsi_pll_14nm *pll, struct
> dsi_pll_config *pconf)
>  {
>  	void __iomem *base = pll->phy->pll_base;
> -	struct dsi_pll_input *pin = &pll->in;
> -	struct dsi_pll_output *pout = &pll->out;
>  	u8 data;
> 
> -	data = pin->ssc_adj_period;
> +	data = pconf->ssc_adj_period;
>  	data &= 0x0ff;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_ADJ_PER1, data);
> -	data = (pin->ssc_adj_period >> 8);
> +	data = (pconf->ssc_adj_period >> 8);
>  	data &= 0x03;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_ADJ_PER2, data);
> 
> -	data = pout->ssc_period;
> +	data = pconf->ssc_period;
>  	data &= 0x0ff;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_PER1, data);
> -	data = (pout->ssc_period >> 8);
> +	data = (pconf->ssc_period >> 8);
>  	data &= 0x0ff;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_PER2, data);
> 
> -	data = pout->ssc_step_size;
> +	data = pconf->ssc_step_size;
>  	data &= 0x0ff;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_STEP_SIZE1, data);
> -	data = (pout->ssc_step_size >> 8);
> +	data = (pconf->ssc_step_size >> 8);
>  	data &= 0x0ff;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_STEP_SIZE2, data);
> 
> -	data = (pin->ssc_center & 0x01);
> +	data = (pconf->ssc_center & 0x01);
>  	data <<= 1;
>  	data |= 0x01; /* enable */
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_EN_CENTER, data);
> @@ -409,8 +317,7 @@ static void pll_db_commit_ssc(struct dsi_pll_14nm 
> *pll)
>  }
> 
>  static void pll_db_commit_common(struct dsi_pll_14nm *pll,
> -				 struct dsi_pll_input *pin,
> -				 struct dsi_pll_output *pout)
> +				 struct dsi_pll_config *pconf)
>  {
>  	void __iomem *base = pll->phy->pll_base;
>  	u8 data;
> @@ -419,55 +326,41 @@ static void pll_db_commit_common(struct 
> dsi_pll_14nm *pll,
>  	data = 0;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SYSCLK_EN_RESET, data);
> 
> -	data = pout->pll_txclk_en;
> -	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_TXCLK_EN, data);
> +	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_TXCLK_EN, 1);
> 
> -	data = pout->pll_resetsm_cntrl;
> -	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL, data);
> -	data = pout->pll_resetsm_cntrl2;
> -	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL2, data);
> -	data = pout->pll_resetsm_cntrl5;
> -	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL5, data);
> +	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL, 48);
> +	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL2, 4 << 3);
> /* bandgap_timer */
> +	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL5, 5); /*
> pll_wakeup_timer */
> 
> -	data = pout->pll_vco_div_ref & 0xff;
> +	data = pconf->pll_vco_div_ref & 0xff;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VCO_DIV_REF1, data);
> -	data = (pout->pll_vco_div_ref >> 8) & 0x3;
> +	data = (pconf->pll_vco_div_ref >> 8) & 0x3;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VCO_DIV_REF2, data);
> 
> -	data = pout->pll_kvco_div_ref & 0xff;
> +	data = pconf->pll_kvco_div_ref & 0xff;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_KVCO_DIV_REF1, data);
> -	data = (pout->pll_kvco_div_ref >> 8) & 0x3;
> +	data = (pconf->pll_kvco_div_ref >> 8) & 0x3;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_KVCO_DIV_REF2, data);
> 
> -	data = pout->pll_misc1;
> -	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_MISC1, data);
> +	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_MISC1, 16);
> 
> -	data = pin->pll_ie_trim;
> -	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IE_TRIM, data);
> +	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IE_TRIM, 4);
> 
> -	data = pin->pll_ip_trim;
> -	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IP_TRIM, data);
> +	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IP_TRIM, 4);
> 
> -	data = pin->pll_cpmset_cur << 3 | pin->pll_cpcset_cur;
> -	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_CP_SET_CUR, data);
> +	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_CP_SET_CUR, 1 << 3 | 1);
> 
> -	data = pin->pll_icpcset_p << 3 | pin->pll_icpcset_m;
> -	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICPCSET, data);
> +	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICPCSET, 0 << 3 | 0);
> 
> -	data = pin->pll_icpmset_p << 3 | pin->pll_icpcset_m;
> -	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICPMSET, data);
> +	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICPMSET, 0 << 3 | 0);
> 
> -	data = pin->pll_icpmset << 3 | pin->pll_icpcset;
> -	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICP_SET, data);
> +	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICP_SET, 4 << 3 | 4);
> 
> -	data = pin->pll_lpf_cap2 << 4 | pin->pll_lpf_cap1;
> -	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_LPF1, data);
> +	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_LPF1, 1 << 4 | 11);
> 
> -	data = pin->pll_iptat_trim;
> -	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IPTAT_TRIM, data);
> +	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IPTAT_TRIM, 7);
> 
> -	data = pin->pll_c3ctrl | pin->pll_r3ctrl << 4;
> -	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_CRCTRL, data);
> +	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_CRCTRL, 1 << 4 | 2);
>  }
> 
>  static void pll_14nm_software_reset(struct dsi_pll_14nm *pll_14nm)
> @@ -488,8 +381,7 @@ static void pll_14nm_software_reset(struct
> dsi_pll_14nm *pll_14nm)
>  }
> 
>  static void pll_db_commit_14nm(struct dsi_pll_14nm *pll,
> -			       struct dsi_pll_input *pin,
> -			       struct dsi_pll_output *pout)
> +			       struct dsi_pll_config *pconf)
>  {
>  	void __iomem *base = pll->phy->pll_base;
>  	void __iomem *cmn_base = pll->phy->base;
> @@ -497,57 +389,64 @@ static void pll_db_commit_14nm(struct 
> dsi_pll_14nm *pll,
> 
>  	DBG("DSI%d PLL", pll->phy->id);
> 
> -	data = pout->cmn_ldo_cntrl;
> -	dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_LDO_CNTRL, data);
> +	dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_LDO_CNTRL, 0x3c);
> 
> -	pll_db_commit_common(pll, pin, pout);
> +	pll_db_commit_common(pll, pconf);
> 
>  	pll_14nm_software_reset(pll);
> 
> -	data = pin->dsiclk_sel; /* set dsiclk_sel = 1  */
> -	dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_CLK_CFG1, data);
> +	/* Use the /2 path in Mux */
> +	dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_CLK_CFG1, 1);
> 
>  	data = 0xff; /* data, clk, pll normal operation */
>  	dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_CTRL_0, data);
> 
>  	/* configure the frequency dependent pll registers */
> -	data = pout->dec_start;
> +	data = pconf->dec_start;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_DEC_START, data);
> 
> -	data = pout->div_frac_start & 0xff;
> +	data = pconf->div_frac_start & 0xff;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_DIV_FRAC_START1, data);
> -	data = (pout->div_frac_start >> 8) & 0xff;
> +	data = (pconf->div_frac_start >> 8) & 0xff;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_DIV_FRAC_START2, data);
> -	data = (pout->div_frac_start >> 16) & 0xf;
> +	data = (pconf->div_frac_start >> 16) & 0xf;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_DIV_FRAC_START3, data);
> 
> -	data = pout->plllock_cmp & 0xff;
> +	data = pconf->plllock_cmp & 0xff;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLLLOCK_CMP1, data);
> 
> -	data = (pout->plllock_cmp >> 8) & 0xff;
> +	data = (pconf->plllock_cmp >> 8) & 0xff;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLLLOCK_CMP2, data);
> 
> -	data = (pout->plllock_cmp >> 16) & 0x3;
> +	data = (pconf->plllock_cmp >> 16) & 0x3;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLLLOCK_CMP3, data);
> 
> -	data = pin->plllock_cnt << 1 | pin->plllock_rng << 3;
> +	data = pconf->plllock_cnt << 1 | 0 << 3; /* plllock_rng */
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLLLOCK_CMP_EN, data);
> 
> -	data = pout->pll_vco_count & 0xff;
> +	data = pconf->pll_vco_count & 0xff;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VCO_COUNT1, data);
> -	data = (pout->pll_vco_count >> 8) & 0xff;
> +	data = (pconf->pll_vco_count >> 8) & 0xff;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VCO_COUNT2, data);
> 
> -	data = pout->pll_kvco_count & 0xff;
> +	data = pconf->pll_kvco_count & 0xff;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_KVCO_COUNT1, data);
> -	data = (pout->pll_kvco_count >> 8) & 0x3;
> +	data = (pconf->pll_kvco_count >> 8) & 0x3;
>  	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_KVCO_COUNT2, data);
> 
> -	data = (pout->pll_postdiv - 1) << 4 | pin->pll_lpf_res1;
> -	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_LPF2_POSTDIV, data);
> +	/*
> +	 * High nibble configures the post divider internal to the VCO. It's
> +	 * fixed to divide by 1 for now.
> +	 *
> +	 * 0: divided by 1
> +	 * 1: divided by 2
> +	 * 2: divided by 4
> +	 * 3: divided by 8
> +	 */
> +	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_LPF2_POSTDIV, 0 << 4 | 
> 3);
> 
> -	if (pin->ssc_en)
> -		pll_db_commit_ssc(pll);
> +	if (pconf->ssc_en)
> +		pll_db_commit_ssc(pll, pconf);
> 
>  	wmb();	/* make sure register committed */
>  }
> @@ -559,35 +458,20 @@ static int dsi_pll_14nm_vco_set_rate(struct
> clk_hw *hw, unsigned long rate,
>  				     unsigned long parent_rate)
>  {
>  	struct dsi_pll_14nm *pll_14nm = to_pll_14nm(hw);
> -	struct dsi_pll_input *pin = &pll_14nm->in;
> -	struct dsi_pll_output *pout = &pll_14nm->out;
> +	struct dsi_pll_config conf;
> 
>  	DBG("DSI PLL%d rate=%lu, parent's=%lu", pll_14nm->phy->id, rate,
>  	    parent_rate);
> 
> -	pll_14nm->vco_current_rate = rate;
> -	pll_14nm->vco_ref_clk_rate = VCO_REF_CLK_RATE;
> -
> -	dsi_pll_14nm_input_init(pll_14nm);
> -
> -	/*
> -	 * This configures the post divider internal to the VCO. It's
> -	 * fixed to divide by 1 for now.
> -	 *
> -	 * tx_band = pll_postdiv.
> -	 * 0: divided by 1
> -	 * 1: divided by 2
> -	 * 2: divided by 4
> -	 * 3: divided by 8
> -	 */
> -	pout->pll_postdiv = DSI_PLL_DEFAULT_VCO_POSTDIV;
> +	dsi_pll_14nm_config_init(&conf);
> +	conf.vco_current_rate = rate;
> 
> -	pll_14nm_dec_frac_calc(pll_14nm);
> +	pll_14nm_dec_frac_calc(pll_14nm, &conf);
> 
> -	if (pin->ssc_en)
> -		pll_14nm_ssc_calc(pll_14nm);
> +	if (conf.ssc_en)
> +		pll_14nm_ssc_calc(pll_14nm, &conf);
> 
> -	pll_14nm_calc_vco_count(pll_14nm);
> +	pll_14nm_calc_vco_count(pll_14nm, &conf);
> 
>  	/* commit the slave DSI PLL registers if we're master. Note that we
>  	 * don't lock the slave PLL. We just ensure that the PLL/PHY 
> registers
> @@ -596,10 +480,10 @@ static int dsi_pll_14nm_vco_set_rate(struct
> clk_hw *hw, unsigned long rate,
>  	if (pll_14nm->phy->usecase == MSM_DSI_PHY_MASTER) {
>  		struct dsi_pll_14nm *pll_14nm_slave = pll_14nm->slave;
> 
> -		pll_db_commit_14nm(pll_14nm_slave, pin, pout);
> +		pll_db_commit_14nm(pll_14nm_slave, &conf);
>  	}
> 
> -	pll_db_commit_14nm(pll_14nm, pin, pout);
> +	pll_db_commit_14nm(pll_14nm, &conf);
> 
>  	return 0;
>  }
> diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c
> b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c
> index 4df237ad0eaf..ce6ae2fba993 100644
> --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c
> +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c
> @@ -36,43 +36,24 @@
>   */
> 
>  #define VCO_REF_CLK_RATE		19200000
> -
> -struct dsi_pll_regs {
> -	u32 pll_prop_gain_rate;
> -	u32 pll_lockdet_rate;
> -	u32 decimal_div_start;
> -	u32 frac_div_start_low;
> -	u32 frac_div_start_mid;
> -	u32 frac_div_start_high;
> -	u32 pll_clock_inverters;
> -	u32 ssc_stepsize_low;
> -	u32 ssc_stepsize_high;
> -	u32 ssc_div_per_low;
> -	u32 ssc_div_per_high;
> -	u32 ssc_adjper_low;
> -	u32 ssc_adjper_high;
> -	u32 ssc_control;
> -};
> +#define FRAC_BITS 18
> 
>  /* Hardware is V4.1 */
>  #define DSI_PHY_7NM_QUIRK_V4_1		BIT(0)
> 
>  struct dsi_pll_config {
> -	u32 ref_freq;
> -	bool div_override;
> -	u32 output_div;
> -	bool ignore_frac;
> -	bool disable_prescaler;
>  	bool enable_ssc;
>  	bool ssc_center;
> -	u32 dec_bits;
> -	u32 frac_bits;
> -	u32 lock_timer;
>  	u32 ssc_freq;
>  	u32 ssc_offset;
>  	u32 ssc_adj_per;
> -	u32 thresh_cycles;
> -	u32 refclk_cycles;
> +
> +	/* out */
> +	u32 decimal_div_start;
> +	u32 frac_div_start;
> +	u32 pll_clock_inverters;
> +	u32 ssc_stepsize;
> +	u32 ssc_div_per;
>  };
> 
>  struct pll_7nm_cached_state {
> @@ -88,15 +69,11 @@ struct dsi_pll_7nm {
> 
>  	struct msm_dsi_phy *phy;
> 
> -	u64 vco_ref_clk_rate;
>  	u64 vco_current_rate;
> 
>  	/* protects REG_DSI_7nm_PHY_CMN_CLK_CFG0 register */
>  	spinlock_t postdiv_lock;
> 
> -	struct dsi_pll_config pll_configuration;
> -	struct dsi_pll_regs reg_setup;
> -
>  	struct pll_7nm_cached_state cached_state;
> 
>  	struct dsi_pll_7nm *slave;
> @@ -110,35 +87,20 @@ struct dsi_pll_7nm {
>   */
>  static struct dsi_pll_7nm *pll_7nm_list[DSI_MAX];
> 
> -static void dsi_pll_setup_config(struct dsi_pll_7nm *pll)
> +static void dsi_pll_setup_config(struct dsi_pll_config *config)
>  {
> -	struct dsi_pll_config *config = &pll->pll_configuration;
> -
> -	config->ref_freq = pll->vco_ref_clk_rate;
> -	config->output_div = 1;
> -	config->dec_bits = 8;
> -	config->frac_bits = 18;
> -	config->lock_timer = 64;
>  	config->ssc_freq = 31500;
>  	config->ssc_offset = 4800;
>  	config->ssc_adj_per = 2;
> -	config->thresh_cycles = 32;
> -	config->refclk_cycles = 256;
> -
> -	config->div_override = false;
> -	config->ignore_frac = false;
> -	config->disable_prescaler = false;
> 
>  	/* TODO: ssc enable */
>  	config->enable_ssc = false;
>  	config->ssc_center = 0;
>  }
> 
> -static void dsi_pll_calc_dec_frac(struct dsi_pll_7nm *pll)
> +static void dsi_pll_calc_dec_frac(struct dsi_pll_7nm *pll, struct
> dsi_pll_config *config)
>  {
> -	struct dsi_pll_config *config = &pll->pll_configuration;
> -	struct dsi_pll_regs *regs = &pll->reg_setup;
> -	u64 fref = pll->vco_ref_clk_rate;
> +	u64 fref = VCO_REF_CLK_RATE;
>  	u64 pll_freq;
>  	u64 divider;
>  	u64 dec, dec_multiple;
> @@ -147,42 +109,34 @@ static void dsi_pll_calc_dec_frac(struct 
> dsi_pll_7nm *pll)
> 
>  	pll_freq = pll->vco_current_rate;
> 
> -	if (config->disable_prescaler)
> -		divider = fref;
> -	else
> -		divider = fref * 2;
> +	divider = fref * 2;
> 
> -	multiplier = 1 << config->frac_bits;
> +	multiplier = 1 << FRAC_BITS;
>  	dec_multiple = div_u64(pll_freq * multiplier, divider);
>  	div_u64_rem(dec_multiple, multiplier, &frac);
> 
>  	dec = div_u64(dec_multiple, multiplier);
> 
>  	if (!(pll->phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V4_1))
> -		regs->pll_clock_inverters = 0x28;
> +		config->pll_clock_inverters = 0x28;
>  	else if (pll_freq <= 1000000000ULL)
> -		regs->pll_clock_inverters = 0xa0;
> +		config->pll_clock_inverters = 0xa0;
>  	else if (pll_freq <= 2500000000ULL)
> -		regs->pll_clock_inverters = 0x20;
> +		config->pll_clock_inverters = 0x20;
>  	else if (pll_freq <= 3020000000ULL)
> -		regs->pll_clock_inverters = 0x00;
> +		config->pll_clock_inverters = 0x00;
>  	else
> -		regs->pll_clock_inverters = 0x40;
> +		config->pll_clock_inverters = 0x40;
> 
> -	regs->pll_lockdet_rate = config->lock_timer;
> -	regs->decimal_div_start = dec;
> -	regs->frac_div_start_low = (frac & 0xff);
> -	regs->frac_div_start_mid = (frac & 0xff00) >> 8;
> -	regs->frac_div_start_high = (frac & 0x30000) >> 16;
> +	config->decimal_div_start = dec;
> +	config->frac_div_start = frac;
>  }
> 
>  #define SSC_CENTER		BIT(0)
>  #define SSC_EN			BIT(1)
> 
> -static void dsi_pll_calc_ssc(struct dsi_pll_7nm *pll)
> +static void dsi_pll_calc_ssc(struct dsi_pll_7nm *pll, struct
> dsi_pll_config *config)
>  {
> -	struct dsi_pll_config *config = &pll->pll_configuration;
> -	struct dsi_pll_regs *regs = &pll->reg_setup;
>  	u32 ssc_per;
>  	u32 ssc_mod;
>  	u64 ssc_step_size;
> @@ -193,58 +147,49 @@ static void dsi_pll_calc_ssc(struct dsi_pll_7nm 
> *pll)
>  		return;
>  	}
> 
> -	ssc_per = DIV_ROUND_CLOSEST(config->ref_freq, config->ssc_freq) / 2 - 
> 1;
> +	ssc_per = DIV_ROUND_CLOSEST(VCO_REF_CLK_RATE, config->ssc_freq) / 2 - 
> 1;
>  	ssc_mod = (ssc_per + 1) % (config->ssc_adj_per + 1);
>  	ssc_per -= ssc_mod;
> 
> -	frac = regs->frac_div_start_low |
> -			(regs->frac_div_start_mid << 8) |
> -			(regs->frac_div_start_high << 16);
> -	ssc_step_size = regs->decimal_div_start;
> -	ssc_step_size *= (1 << config->frac_bits);
> +	frac = config->frac_div_start;
> +	ssc_step_size = config->decimal_div_start;
> +	ssc_step_size *= (1 << FRAC_BITS);
>  	ssc_step_size += frac;
>  	ssc_step_size *= config->ssc_offset;
>  	ssc_step_size *= (config->ssc_adj_per + 1);
>  	ssc_step_size = div_u64(ssc_step_size, (ssc_per + 1));
>  	ssc_step_size = DIV_ROUND_CLOSEST_ULL(ssc_step_size, 1000000);
> 
> -	regs->ssc_div_per_low = ssc_per & 0xFF;
> -	regs->ssc_div_per_high = (ssc_per & 0xFF00) >> 8;
> -	regs->ssc_stepsize_low = (u32)(ssc_step_size & 0xFF);
> -	regs->ssc_stepsize_high = (u32)((ssc_step_size & 0xFF00) >> 8);
> -	regs->ssc_adjper_low = config->ssc_adj_per & 0xFF;
> -	regs->ssc_adjper_high = (config->ssc_adj_per & 0xFF00) >> 8;
> -
> -	regs->ssc_control = config->ssc_center ? SSC_CENTER : 0;
> +	config->ssc_div_per = ssc_per;
> +	config->ssc_stepsize = ssc_step_size;
> 
>  	pr_debug("SCC: Dec:%d, frac:%llu, frac_bits:%d\n",
> -		 regs->decimal_div_start, frac, config->frac_bits);
> +		 config->decimal_div_start, frac, FRAC_BITS);
>  	pr_debug("SSC: div_per:0x%X, stepsize:0x%X, adjper:0x%X\n",
>  		 ssc_per, (u32)ssc_step_size, config->ssc_adj_per);
>  }
> 
> -static void dsi_pll_ssc_commit(struct dsi_pll_7nm *pll)
> +static void dsi_pll_ssc_commit(struct dsi_pll_7nm *pll, struct
> dsi_pll_config *config)
>  {
>  	void __iomem *base = pll->phy->pll_base;
> -	struct dsi_pll_regs *regs = &pll->reg_setup;
> 
> -	if (pll->pll_configuration.enable_ssc) {
> +	if (config->enable_ssc) {
>  		pr_debug("SSC is enabled\n");
> 
>  		dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_STEPSIZE_LOW_1,
> -			  regs->ssc_stepsize_low);
> +			  config->ssc_stepsize & 0xff);
>  		dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_STEPSIZE_HIGH_1,
> -			  regs->ssc_stepsize_high);
> +			  config->ssc_stepsize >> 8);
>  		dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_DIV_PER_LOW_1,
> -			  regs->ssc_div_per_low);
> +			  config->ssc_div_per & 0xff);
>  		dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_DIV_PER_HIGH_1,
> -			  regs->ssc_div_per_high);
> +			  config->ssc_div_per >> 8);
>  		dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_ADJPER_LOW_1,
> -			  regs->ssc_adjper_low);
> +			  config->ssc_adj_per & 0xff);
>  		dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_ADJPER_HIGH_1,
> -			  regs->ssc_adjper_high);
> +			  config->ssc_adj_per >> 8);
>  		dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_CONTROL,
> -			  SSC_EN | regs->ssc_control);
> +			  SSC_EN | (config->ssc_center ? SSC_CENTER : 0));
>  	}
>  }
> 
> @@ -296,44 +241,46 @@ static void dsi_pll_config_hzindep_reg(struct
> dsi_pll_7nm *pll)
>  	}
>  }
> 
> -static void dsi_pll_commit(struct dsi_pll_7nm *pll)
> +static void dsi_pll_commit(struct dsi_pll_7nm *pll, struct
> dsi_pll_config *config)
>  {
>  	void __iomem *base = pll->phy->pll_base;
> -	struct dsi_pll_regs *reg = &pll->reg_setup;
> 
>  	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_CORE_INPUT_OVERRIDE, 0x12);
> -	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_DECIMAL_DIV_START_1,
> reg->decimal_div_start);
> -	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_LOW_1,
> reg->frac_div_start_low);
> -	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_MID_1,
> reg->frac_div_start_mid);
> -	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_HIGH_1,
> reg->frac_div_start_high);
> -	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_PLL_LOCKDET_RATE_1,
> reg->pll_lockdet_rate);
> +	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_DECIMAL_DIV_START_1,
> config->decimal_div_start);
> +	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_LOW_1,
> +		  config->frac_div_start & 0xff);
> +	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_MID_1,
> +		  (config->frac_div_start & 0xff00) >> 8);
> +	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_HIGH_1,
> +		  (config->frac_div_start & 0x30000) >> 16);
> +	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_PLL_LOCKDET_RATE_1, 0x40);
>  	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_PLL_LOCK_DELAY, 0x06);
>  	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_CMODE_1, 0x10); /* TODO:
> 0x00 for CPHY */
> -	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_CLOCK_INVERTERS,
> reg->pll_clock_inverters);
> +	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_CLOCK_INVERTERS,
> config->pll_clock_inverters);
>  }
> 
>  static int dsi_pll_7nm_vco_set_rate(struct clk_hw *hw, unsigned long 
> rate,
>  				     unsigned long parent_rate)
>  {
>  	struct dsi_pll_7nm *pll_7nm = to_pll_7nm(hw);
> +	struct dsi_pll_config config;
> 
>  	DBG("DSI PLL%d rate=%lu, parent's=%lu", pll_7nm->phy->id, rate,
>  	    parent_rate);
> 
>  	pll_7nm->vco_current_rate = rate;
> -	pll_7nm->vco_ref_clk_rate = VCO_REF_CLK_RATE;
> 
> -	dsi_pll_setup_config(pll_7nm);
> +	dsi_pll_setup_config(&config);
> 
> -	dsi_pll_calc_dec_frac(pll_7nm);
> +	dsi_pll_calc_dec_frac(pll_7nm, &config);
> 
> -	dsi_pll_calc_ssc(pll_7nm);
> +	dsi_pll_calc_ssc(pll_7nm, &config);
> 
> -	dsi_pll_commit(pll_7nm);
> +	dsi_pll_commit(pll_7nm, &config);
> 
>  	dsi_pll_config_hzindep_reg(pll_7nm);
> 
> -	dsi_pll_ssc_commit(pll_7nm);
> +	dsi_pll_ssc_commit(pll_7nm, &config);
> 
>  	/* flush, ensure all register writes are done*/
>  	wmb();
> @@ -486,9 +433,8 @@ static unsigned long
> dsi_pll_7nm_vco_recalc_rate(struct clk_hw *hw,
>  						  unsigned long parent_rate)
>  {
>  	struct dsi_pll_7nm *pll_7nm = to_pll_7nm(hw);
> -	struct dsi_pll_config *config = &pll_7nm->pll_configuration;
>  	void __iomem *base = pll_7nm->phy->pll_base;
> -	u64 ref_clk = pll_7nm->vco_ref_clk_rate;
> +	u64 ref_clk = VCO_REF_CLK_RATE;
>  	u64 vco_rate = 0x0;
>  	u64 multiplier;
>  	u32 frac;
> @@ -508,7 +454,7 @@ static unsigned long
> dsi_pll_7nm_vco_recalc_rate(struct clk_hw *hw,
>  	 * TODO:
>  	 *	1. Assumes prescaler is disabled
>  	 */
> -	multiplier = 1 << config->frac_bits;
> +	multiplier = 1 << FRAC_BITS;
>  	pll_freq = dec * (ref_clk * 2);
>  	tmp64 = (ref_clk * 2 * frac);
>  	pll_freq += div_u64(tmp64, multiplier);
> @@ -590,7 +536,7 @@ static int dsi_7nm_restore_state(struct msm_dsi_phy 
> *phy)
>  	val |= cached->pll_mux;
>  	dsi_phy_write(phy_base + REG_DSI_7nm_PHY_CMN_CLK_CFG1, val);
> 
> -	ret = dsi_pll_7nm_vco_set_rate(phy->vco_hw,
> pll_7nm->vco_current_rate, pll_7nm->vco_ref_clk_rate);
> +	ret = dsi_pll_7nm_vco_set_rate(phy->vco_hw,
> pll_7nm->vco_current_rate, VCO_REF_CLK_RATE);
>  	if (ret) {
>  		DRM_DEV_ERROR(&pll_7nm->phy->pdev->dev,
>  			"restore vco rate failed. ret=%d\n", ret);
Dmitry Baryshkov March 30, 2021, 3:23 p.m. UTC | #2
On 30/03/2021 06:26, abhinavk@codeaurora.org wrote:
> On 2021-03-27 04:03, Dmitry Baryshkov wrote:
>> The 7nm, 10nm and 14nm drivers would store interim data used during
>> VCO/PLL rate setting in the global dsi_pll_Nnm structure. Move this data
>> structures to the onstack storage. While we are at it, drop
>> unused/static 'config' data, unused config fields, etc.
>>
>> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> Reviewed-by: Abhinav Kumar <abhinavk@codeaurora.org>

Thank you for the thorough review. I'll post v4 as soon as we agree on 
the patch 24.

>> ---
>>  drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c | 167 ++++-------
>>  drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c | 334 +++++++--------------
>>  drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c  | 166 ++++------
>>  3 files changed, 220 insertions(+), 447 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c
>> b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c
>> index b937e77b3c37..1fbb54f4df98 100644
>> --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c
>> +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c
>> @@ -36,43 +36,25 @@
>>   */
>>
>>  #define VCO_REF_CLK_RATE        19200000
>> -
>> -struct dsi_pll_regs {
>> -    u32 pll_prop_gain_rate;
>> -    u32 pll_lockdet_rate;
>> -    u32 decimal_div_start;
>> -    u32 frac_div_start_low;
>> -    u32 frac_div_start_mid;
>> -    u32 frac_div_start_high;
>> -    u32 pll_clock_inverters;
>> -    u32 ssc_stepsize_low;
>> -    u32 ssc_stepsize_high;
>> -    u32 ssc_div_per_low;
>> -    u32 ssc_div_per_high;
>> -    u32 ssc_adjper_low;
>> -    u32 ssc_adjper_high;
>> -    u32 ssc_control;
>> -};
>> +#define FRAC_BITS 18
>>
>>  /* v3.0.0 10nm implementation that requires the old timings settings */
>>  #define DSI_PHY_10NM_QUIRK_OLD_TIMINGS    BIT(0)
>>
>>  struct dsi_pll_config {
>> -    u32 ref_freq;
>> -    bool div_override;
>> -    u32 output_div;
>> -    bool ignore_frac;
>> -    bool disable_prescaler;
>>      bool enable_ssc;
>>      bool ssc_center;
>> -    u32 dec_bits;
>> -    u32 frac_bits;
>> -    u32 lock_timer;
>>      u32 ssc_freq;
>>      u32 ssc_offset;
>>      u32 ssc_adj_per;
>> -    u32 thresh_cycles;
>> -    u32 refclk_cycles;
>> +
>> +    /* out */
>> +    u32 pll_prop_gain_rate;
>> +    u32 decimal_div_start;
>> +    u32 frac_div_start;
>> +    u32 pll_clock_inverters;
>> +    u32 ssc_stepsize;
>> +    u32 ssc_div_per;
>>  };
>>
>>  struct pll_10nm_cached_state {
>> @@ -88,15 +70,11 @@ struct dsi_pll_10nm {
>>
>>      struct msm_dsi_phy *phy;
>>
>> -    u64 vco_ref_clk_rate;
>>      u64 vco_current_rate;
>>
>>      /* protects REG_DSI_10nm_PHY_CMN_CLK_CFG0 register */
>>      spinlock_t postdiv_lock;
>>
>> -    struct dsi_pll_config pll_configuration;
>> -    struct dsi_pll_regs reg_setup;
>> -
>>      struct pll_10nm_cached_state cached_state;
>>
>>      struct dsi_pll_10nm *slave;
>> @@ -110,34 +88,19 @@ struct dsi_pll_10nm {
>>   */
>>  static struct dsi_pll_10nm *pll_10nm_list[DSI_MAX];
>>
>> -static void dsi_pll_setup_config(struct dsi_pll_10nm *pll)
>> +static void dsi_pll_setup_config(struct dsi_pll_config *config)
>>  {
>> -    struct dsi_pll_config *config = &pll->pll_configuration;
>> -
>> -    config->ref_freq = pll->vco_ref_clk_rate;
>> -    config->output_div = 1;
>> -    config->dec_bits = 8;
>> -    config->frac_bits = 18;
>> -    config->lock_timer = 64;
>>      config->ssc_freq = 31500;
>>      config->ssc_offset = 5000;
>>      config->ssc_adj_per = 2;
>> -    config->thresh_cycles = 32;
>> -    config->refclk_cycles = 256;
>> -
>> -    config->div_override = false;
>> -    config->ignore_frac = false;
>> -    config->disable_prescaler = false;
>>
>>      config->enable_ssc = false;
>> -    config->ssc_center = 0;
>> +    config->ssc_center = false;
>>  }
>>
>> -static void dsi_pll_calc_dec_frac(struct dsi_pll_10nm *pll)
>> +static void dsi_pll_calc_dec_frac(struct dsi_pll_10nm *pll, struct
>> dsi_pll_config *config)
>>  {
>> -    struct dsi_pll_config *config = &pll->pll_configuration;
>> -    struct dsi_pll_regs *regs = &pll->reg_setup;
>> -    u64 fref = pll->vco_ref_clk_rate;
>> +    u64 fref = VCO_REF_CLK_RATE;
>>      u64 pll_freq;
>>      u64 divider;
>>      u64 dec, dec_multiple;
>> @@ -146,40 +109,32 @@ static void dsi_pll_calc_dec_frac(struct
>> dsi_pll_10nm *pll)
>>
>>      pll_freq = pll->vco_current_rate;
>>
>> -    if (config->disable_prescaler)
>> -        divider = fref;
>> -    else
>> -        divider = fref * 2;
>> +    divider = fref * 2;
>>
>> -    multiplier = 1 << config->frac_bits;
>> +    multiplier = 1 << FRAC_BITS;
>>      dec_multiple = div_u64(pll_freq * multiplier, divider);
>>      dec = div_u64_rem(dec_multiple, multiplier, &frac);
>>
>>      if (pll_freq <= 1900000000UL)
>> -        regs->pll_prop_gain_rate = 8;
>> +        config->pll_prop_gain_rate = 8;
>>      else if (pll_freq <= 3000000000UL)
>> -        regs->pll_prop_gain_rate = 10;
>> +        config->pll_prop_gain_rate = 10;
>>      else
>> -        regs->pll_prop_gain_rate = 12;
>> +        config->pll_prop_gain_rate = 12;
>>      if (pll_freq < 1100000000UL)
>> -        regs->pll_clock_inverters = 8;
>> +        config->pll_clock_inverters = 8;
>>      else
>> -        regs->pll_clock_inverters = 0;
>> +        config->pll_clock_inverters = 0;
>>
>> -    regs->pll_lockdet_rate = config->lock_timer;
>> -    regs->decimal_div_start = dec;
>> -    regs->frac_div_start_low = (frac & 0xff);
>> -    regs->frac_div_start_mid = (frac & 0xff00) >> 8;
>> -    regs->frac_div_start_high = (frac & 0x30000) >> 16;
>> +    config->decimal_div_start = dec;
>> +    config->frac_div_start = frac;
>>  }
>>
>>  #define SSC_CENTER        BIT(0)
>>  #define SSC_EN            BIT(1)
>>
>> -static void dsi_pll_calc_ssc(struct dsi_pll_10nm *pll)
>> +static void dsi_pll_calc_ssc(struct dsi_pll_10nm *pll, struct
>> dsi_pll_config *config)
>>  {
>> -    struct dsi_pll_config *config = &pll->pll_configuration;
>> -    struct dsi_pll_regs *regs = &pll->reg_setup;
>>      u32 ssc_per;
>>      u32 ssc_mod;
>>      u64 ssc_step_size;
>> @@ -190,58 +145,49 @@ static void dsi_pll_calc_ssc(struct dsi_pll_10nm 
>> *pll)
>>          return;
>>      }
>>
>> -    ssc_per = DIV_ROUND_CLOSEST(config->ref_freq, config->ssc_freq) / 
>> 2 - 1;
>> +    ssc_per = DIV_ROUND_CLOSEST(VCO_REF_CLK_RATE, config->ssc_freq) / 
>> 2 - 1;
>>      ssc_mod = (ssc_per + 1) % (config->ssc_adj_per + 1);
>>      ssc_per -= ssc_mod;
>>
>> -    frac = regs->frac_div_start_low |
>> -            (regs->frac_div_start_mid << 8) |
>> -            (regs->frac_div_start_high << 16);
>> -    ssc_step_size = regs->decimal_div_start;
>> -    ssc_step_size *= (1 << config->frac_bits);
>> +    frac = config->frac_div_start;
>> +    ssc_step_size = config->decimal_div_start;
>> +    ssc_step_size *= (1 << FRAC_BITS);
>>      ssc_step_size += frac;
>>      ssc_step_size *= config->ssc_offset;
>>      ssc_step_size *= (config->ssc_adj_per + 1);
>>      ssc_step_size = div_u64(ssc_step_size, (ssc_per + 1));
>>      ssc_step_size = DIV_ROUND_CLOSEST_ULL(ssc_step_size, 1000000);
>>
>> -    regs->ssc_div_per_low = ssc_per & 0xFF;
>> -    regs->ssc_div_per_high = (ssc_per & 0xFF00) >> 8;
>> -    regs->ssc_stepsize_low = (u32)(ssc_step_size & 0xFF);
>> -    regs->ssc_stepsize_high = (u32)((ssc_step_size & 0xFF00) >> 8);
>> -    regs->ssc_adjper_low = config->ssc_adj_per & 0xFF;
>> -    regs->ssc_adjper_high = (config->ssc_adj_per & 0xFF00) >> 8;
>> -
>> -    regs->ssc_control = config->ssc_center ? SSC_CENTER : 0;
>> +    config->ssc_div_per = ssc_per;
>> +    config->ssc_stepsize = ssc_step_size;
>>
>>      pr_debug("SCC: Dec:%d, frac:%llu, frac_bits:%d\n",
>> -         regs->decimal_div_start, frac, config->frac_bits);
>> +         config->decimal_div_start, frac, FRAC_BITS);
>>      pr_debug("SSC: div_per:0x%X, stepsize:0x%X, adjper:0x%X\n",
>>           ssc_per, (u32)ssc_step_size, config->ssc_adj_per);
>>  }
>>
>> -static void dsi_pll_ssc_commit(struct dsi_pll_10nm *pll)
>> +static void dsi_pll_ssc_commit(struct dsi_pll_10nm *pll, struct
>> dsi_pll_config *config)
>>  {
>>      void __iomem *base = pll->phy->pll_base;
>> -    struct dsi_pll_regs *regs = &pll->reg_setup;
>>
>> -    if (pll->pll_configuration.enable_ssc) {
>> +    if (config->enable_ssc) {
>>          pr_debug("SSC is enabled\n");
>>
>>          dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_STEPSIZE_LOW_1,
>> -              regs->ssc_stepsize_low);
>> +              config->ssc_stepsize & 0xff);
>>          dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_STEPSIZE_HIGH_1,
>> -              regs->ssc_stepsize_high);
>> +              config->ssc_stepsize >> 8);
>>          dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_DIV_PER_LOW_1,
>> -              regs->ssc_div_per_low);
>> +              config->ssc_div_per & 0xff);
>>          dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_DIV_PER_HIGH_1,
>> -              regs->ssc_div_per_high);
>> +              config->ssc_div_per >> 8);
>>          dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_DIV_ADJPER_LOW_1,
>> -              regs->ssc_adjper_low);
>> +              config->ssc_adj_per & 0xff);
>>          dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_DIV_ADJPER_HIGH_1,
>> -              regs->ssc_adjper_high);
>> +              config->ssc_adj_per >> 8);
>>          dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_CONTROL,
>> -              SSC_EN | regs->ssc_control);
>> +              SSC_EN | (config->ssc_center ? SSC_CENTER : 0));
>>      }
>>  }
>>
>> @@ -271,50 +217,48 @@ static void dsi_pll_config_hzindep_reg(struct
>> dsi_pll_10nm *pll)
>>      dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_IFILT, 0x3f);
>>  }
>>
>> -static void dsi_pll_commit(struct dsi_pll_10nm *pll)
>> +static void dsi_pll_commit(struct dsi_pll_10nm *pll, struct
>> dsi_pll_config *config)
>>  {
>>      void __iomem *base = pll->phy->pll_base;
>> -    struct dsi_pll_regs *reg = &pll->reg_setup;
>>
>>      dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_CORE_INPUT_OVERRIDE, 
>> 0x12);
>>      dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_DECIMAL_DIV_START_1,
>> -          reg->decimal_div_start);
>> +          config->decimal_div_start);
>>      dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_FRAC_DIV_START_LOW_1,
>> -          reg->frac_div_start_low);
>> +          config->frac_div_start & 0xff);
>>      dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_FRAC_DIV_START_MID_1,
>> -          reg->frac_div_start_mid);
>> +          (config->frac_div_start & 0xff00) >> 8);
>>      dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_FRAC_DIV_START_HIGH_1,
>> -          reg->frac_div_start_high);
>> -    dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_PLL_LOCKDET_RATE_1,
>> -          reg->pll_lockdet_rate);
>> +          (config->frac_div_start & 0x30000) >> 16);
>> +    dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_PLL_LOCKDET_RATE_1, 64);
>>      dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_PLL_LOCK_DELAY, 0x06);
>>      dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_CMODE, 0x10);
>>      dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_CLOCK_INVERTERS,
>> -          reg->pll_clock_inverters);
>> +          config->pll_clock_inverters);
>>  }
>>
>>  static int dsi_pll_10nm_vco_set_rate(struct clk_hw *hw, unsigned long 
>> rate,
>>                       unsigned long parent_rate)
>>  {
>>      struct dsi_pll_10nm *pll_10nm = to_pll_10nm(hw);
>> +    struct dsi_pll_config config;
>>
>>      DBG("DSI PLL%d rate=%lu, parent's=%lu", pll_10nm->phy->id, rate,
>>          parent_rate);
>>
>>      pll_10nm->vco_current_rate = rate;
>> -    pll_10nm->vco_ref_clk_rate = VCO_REF_CLK_RATE;
>>
>> -    dsi_pll_setup_config(pll_10nm);
>> +    dsi_pll_setup_config(&config);
>>
>> -    dsi_pll_calc_dec_frac(pll_10nm);
>> +    dsi_pll_calc_dec_frac(pll_10nm, &config);
>>
>> -    dsi_pll_calc_ssc(pll_10nm);
>> +    dsi_pll_calc_ssc(pll_10nm, &config);
>>
>> -    dsi_pll_commit(pll_10nm);
>> +    dsi_pll_commit(pll_10nm, &config);
>>
>>      dsi_pll_config_hzindep_reg(pll_10nm);
>>
>> -    dsi_pll_ssc_commit(pll_10nm);
>> +    dsi_pll_ssc_commit(pll_10nm, &config);
>>
>>      /* flush, ensure all register writes are done*/
>>      wmb();
>> @@ -461,9 +405,8 @@ static unsigned long
>> dsi_pll_10nm_vco_recalc_rate(struct clk_hw *hw,
>>                            unsigned long parent_rate)
>>  {
>>      struct dsi_pll_10nm *pll_10nm = to_pll_10nm(hw);
>> -    struct dsi_pll_config *config = &pll_10nm->pll_configuration;
>>      void __iomem *base = pll_10nm->phy->pll_base;
>> -    u64 ref_clk = pll_10nm->vco_ref_clk_rate;
>> +    u64 ref_clk = VCO_REF_CLK_RATE;
>>      u64 vco_rate = 0x0;
>>      u64 multiplier;
>>      u32 frac;
>> @@ -483,7 +426,7 @@ static unsigned long
>> dsi_pll_10nm_vco_recalc_rate(struct clk_hw *hw,
>>       * TODO:
>>       *    1. Assumes prescaler is disabled
>>       */
>> -    multiplier = 1 << config->frac_bits;
>> +    multiplier = 1 << FRAC_BITS;
>>      pll_freq = dec * (ref_clk * 2);
>>      tmp64 = (ref_clk * 2 * frac);
>>      pll_freq += div_u64(tmp64, multiplier);
>> @@ -565,7 +508,7 @@ static int dsi_10nm_restore_state(struct 
>> msm_dsi_phy *phy)
>>      val |= cached->pll_mux;
>>      dsi_phy_write(phy_base + REG_DSI_10nm_PHY_CMN_CLK_CFG1, val);
>>
>> -    ret = dsi_pll_10nm_vco_set_rate(phy->vco_hw,
>> pll_10nm->vco_current_rate, pll_10nm->vco_ref_clk_rate);
>> +    ret = dsi_pll_10nm_vco_set_rate(phy->vco_hw,
>> pll_10nm->vco_current_rate, VCO_REF_CLK_RATE);
>>      if (ret) {
>>          DRM_DEV_ERROR(&pll_10nm->phy->pdev->dev,
>>              "restore vco rate failed. ret=%d\n", ret);
>> diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c
>> b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c
>> index 8b4865c5796d..d08ad0c632b4 100644
>> --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c
>> +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c
>> @@ -37,51 +37,19 @@
>>  #define VCO_MIN_RATE            1300000000UL
>>  #define VCO_MAX_RATE            2600000000UL
>>
>> -#define DSI_PLL_DEFAULT_VCO_POSTDIV    1
>> +struct dsi_pll_config {
>> +    u64 vco_current_rate;
>>
>> -struct dsi_pll_input {
>> -    u32 fref;    /* reference clk */
>> -    u32 fdata;    /* bit clock rate */
>> -    u32 dsiclk_sel; /* Mux configuration (see diagram) */
>>      u32 ssc_en;    /* SSC enable/disable */
>> -    u32 ldo_en;
>>
>>      /* fixed params */
>> -    u32 refclk_dbler_en;
>> -    u32 vco_measure_time;
>> -    u32 kvco_measure_time;
>> -    u32 bandgap_timer;
>> -    u32 pll_wakeup_timer;
>>      u32 plllock_cnt;
>> -    u32 plllock_rng;
>>      u32 ssc_center;
>>      u32 ssc_adj_period;
>>      u32 ssc_spread;
>>      u32 ssc_freq;
>> -    u32 pll_ie_trim;
>> -    u32 pll_ip_trim;
>> -    u32 pll_iptat_trim;
>> -    u32 pll_cpcset_cur;
>> -    u32 pll_cpmset_cur;
>> -
>> -    u32 pll_icpmset;
>> -    u32 pll_icpcset;
>> -
>> -    u32 pll_icpmset_p;
>> -    u32 pll_icpmset_m;
>> -
>> -    u32 pll_icpcset_p;
>> -    u32 pll_icpcset_m;
>> -
>> -    u32 pll_lpf_res1;
>> -    u32 pll_lpf_cap1;
>> -    u32 pll_lpf_cap2;
>> -    u32 pll_c3ctrl;
>> -    u32 pll_r3ctrl;
>> -};
>>
>> -struct dsi_pll_output {
>> -    u32 pll_txclk_en;
>> +    /* calculated */
>>      u32 dec_start;
>>      u32 div_frac_start;
>>      u32 ssc_period;
>> @@ -91,19 +59,6 @@ struct dsi_pll_output {
>>      u32 pll_vco_count;
>>      u32 pll_kvco_div_ref;
>>      u32 pll_kvco_count;
>> -    u32 pll_misc1;
>> -    u32 pll_lpf2_postdiv;
>> -    u32 pll_resetsm_cntrl;
>> -    u32 pll_resetsm_cntrl2;
>> -    u32 pll_resetsm_cntrl5;
>> -    u32 pll_kvco_code;
>> -
>> -    u32 cmn_clk_cfg0;
>> -    u32 cmn_clk_cfg1;
>> -    u32 cmn_ldo_cntrl;
>> -
>> -    u32 pll_postdiv;
>> -    u32 fcvo;
>>  };
>>
>>  struct pll_14nm_cached_state {
>> @@ -117,15 +72,9 @@ struct dsi_pll_14nm {
>>
>>      struct msm_dsi_phy *phy;
>>
>> -    struct dsi_pll_input in;
>> -    struct dsi_pll_output out;
>> -
>>      /* protects REG_DSI_14nm_PHY_CMN_CLK_CFG0 register */
>>      spinlock_t postdiv_lock;
>>
>> -    u64 vco_current_rate;
>> -    u64 vco_ref_clk_rate;
>> -
>>      struct pll_14nm_cached_state cached_state;
>>
>>      struct dsi_pll_14nm *slave;
>> @@ -195,78 +144,50 @@ static bool pll_14nm_poll_for_ready(struct
>> dsi_pll_14nm *pll_14nm,
>>      return pll_locked;
>>  }
>>
>> -static void dsi_pll_14nm_input_init(struct dsi_pll_14nm *pll)
>> +static void dsi_pll_14nm_config_init(struct dsi_pll_config *pconf)
>>  {
>> -    pll->in.fref = pll->vco_ref_clk_rate;
>> -    pll->in.fdata = 0;
>> -    pll->in.dsiclk_sel = 1;    /* Use the /2 path in Mux */
>> -    pll->in.ldo_en = 0;    /* disabled for now */
>> -
>>      /* fixed input */
>> -    pll->in.refclk_dbler_en = 0;
>> -    pll->in.vco_measure_time = 5;
>> -    pll->in.kvco_measure_time = 5;
>> -    pll->in.bandgap_timer = 4;
>> -    pll->in.pll_wakeup_timer = 5;
>> -    pll->in.plllock_cnt = 1;
>> -    pll->in.plllock_rng = 0;
>> +    pconf->plllock_cnt = 1;
>>
>>      /*
>>       * SSC is enabled by default. We might need DT props for configuring
>>       * some SSC params like PPM and center/down spread etc.
>>       */
>> -    pll->in.ssc_en = 1;
>> -    pll->in.ssc_center = 0;        /* down spread by default */
>> -    pll->in.ssc_spread = 5;        /* PPM / 1000 */
>> -    pll->in.ssc_freq = 31500;    /* default recommended */
>> -    pll->in.ssc_adj_period = 37;
>> -
>> -    pll->in.pll_ie_trim = 4;
>> -    pll->in.pll_ip_trim = 4;
>> -    pll->in.pll_cpcset_cur = 1;
>> -    pll->in.pll_cpmset_cur = 1;
>> -    pll->in.pll_icpmset = 4;
>> -    pll->in.pll_icpcset = 4;
>> -    pll->in.pll_icpmset_p = 0;
>> -    pll->in.pll_icpmset_m = 0;
>> -    pll->in.pll_icpcset_p = 0;
>> -    pll->in.pll_icpcset_m = 0;
>> -    pll->in.pll_lpf_res1 = 3;
>> -    pll->in.pll_lpf_cap1 = 11;
>> -    pll->in.pll_lpf_cap2 = 1;
>> -    pll->in.pll_iptat_trim = 7;
>> -    pll->in.pll_c3ctrl = 2;
>> -    pll->in.pll_r3ctrl = 1;
>> +    pconf->ssc_en = 1;
>> +    pconf->ssc_center = 0;        /* down spread by default */
>> +    pconf->ssc_spread = 5;        /* PPM / 1000 */
>> +    pconf->ssc_freq = 31500;    /* default recommended */
>> +    pconf->ssc_adj_period = 37;
>>  }
>>
>>  #define CEIL(x, y)        (((x) + ((y) - 1)) / (y))
>>
>> -static void pll_14nm_ssc_calc(struct dsi_pll_14nm *pll)
>> +static void pll_14nm_ssc_calc(struct dsi_pll_14nm *pll, struct
>> dsi_pll_config *pconf)
>>  {
>>      u32 period, ssc_period;
>>      u32 ref, rem;
>>      u64 step_size;
>>
>> -    DBG("vco=%lld ref=%lld", pll->vco_current_rate, 
>> pll->vco_ref_clk_rate);
>> +    DBG("vco=%lld ref=%d", pconf->vco_current_rate, VCO_REF_CLK_RATE);
>>
>> -    ssc_period = pll->in.ssc_freq / 500;
>> -    period = (u32)pll->vco_ref_clk_rate / 1000;
>> +    ssc_period = pconf->ssc_freq / 500;
>> +    period = (u32)VCO_REF_CLK_RATE / 1000;
>>      ssc_period  = CEIL(period, ssc_period);
>>      ssc_period -= 1;
>> -    pll->out.ssc_period = ssc_period;
>> +    pconf->ssc_period = ssc_period;
>>
>> -    DBG("ssc freq=%d spread=%d period=%d", pll->in.ssc_freq,
>> -        pll->in.ssc_spread, pll->out.ssc_period);
>> +    DBG("ssc freq=%d spread=%d period=%d", pconf->ssc_freq,
>> +        pconf->ssc_spread, pconf->ssc_period);
>>
>> -    step_size = (u32)pll->vco_current_rate;
>> -    ref = pll->vco_ref_clk_rate;
>> +    step_size = (u32)pconf->vco_current_rate;
>> +    ref = VCO_REF_CLK_RATE;
>>      ref /= 1000;
>>      step_size = div_u64(step_size, ref);
>>      step_size <<= 20;
>>      step_size = div_u64(step_size, 1000);
>> -    step_size *= pll->in.ssc_spread;
>> +    step_size *= pconf->ssc_spread;
>>      step_size = div_u64(step_size, 1000);
>> -    step_size *= (pll->in.ssc_adj_period + 1);
>> +    step_size *= (pconf->ssc_adj_period + 1);
>>
>>      rem = 0;
>>      step_size = div_u64_rem(step_size, ssc_period + 1, &rem);
>> @@ -277,18 +198,16 @@ static void pll_14nm_ssc_calc(struct 
>> dsi_pll_14nm *pll)
>>
>>      step_size &= 0x0ffff;    /* take lower 16 bits */
>>
>> -    pll->out.ssc_step_size = step_size;
>> +    pconf->ssc_step_size = step_size;
>>  }
>>
>> -static void pll_14nm_dec_frac_calc(struct dsi_pll_14nm *pll)
>> +static void pll_14nm_dec_frac_calc(struct dsi_pll_14nm *pll, struct
>> dsi_pll_config *pconf)
>>  {
>> -    struct dsi_pll_input *pin = &pll->in;
>> -    struct dsi_pll_output *pout = &pll->out;
>>      u64 multiplier = BIT(20);
>>      u64 dec_start_multiple, dec_start, pll_comp_val;
>>      u32 duration, div_frac_start;
>> -    u64 vco_clk_rate = pll->vco_current_rate;
>> -    u64 fref = pll->vco_ref_clk_rate;
>> +    u64 vco_clk_rate = pconf->vco_current_rate;
>> +    u64 fref = VCO_REF_CLK_RATE;
>>
>>      DBG("vco_clk_rate=%lld ref_clk_rate=%lld", vco_clk_rate, fref);
>>
>> @@ -297,14 +216,14 @@ static void pll_14nm_dec_frac_calc(struct
>> dsi_pll_14nm *pll)
>>
>>      dec_start = div_u64(dec_start_multiple, multiplier);
>>
>> -    pout->dec_start = (u32)dec_start;
>> -    pout->div_frac_start = div_frac_start;
>> +    pconf->dec_start = (u32)dec_start;
>> +    pconf->div_frac_start = div_frac_start;
>>
>> -    if (pin->plllock_cnt == 0)
>> +    if (pconf->plllock_cnt == 0)
>>          duration = 1024;
>> -    else if (pin->plllock_cnt == 1)
>> +    else if (pconf->plllock_cnt == 1)
>>          duration = 256;
>> -    else if (pin->plllock_cnt == 2)
>> +    else if (pconf->plllock_cnt == 2)
>>          duration = 128;
>>      else
>>          duration = 32;
>> @@ -313,10 +232,7 @@ static void pll_14nm_dec_frac_calc(struct
>> dsi_pll_14nm *pll)
>>      pll_comp_val = div_u64(pll_comp_val, multiplier);
>>      do_div(pll_comp_val, 10);
>>
>> -    pout->plllock_cmp = (u32)pll_comp_val;
>> -
>> -    pout->pll_txclk_en = 1;
>> -    pout->cmn_ldo_cntrl = 0x3c;
>> +    pconf->plllock_cmp = (u32)pll_comp_val;
>>  }
>>
>>  static u32 pll_14nm_kvco_slop(u32 vrate)
>> @@ -333,74 +249,66 @@ static u32 pll_14nm_kvco_slop(u32 vrate)
>>      return slop;
>>  }
>>
>> -static void pll_14nm_calc_vco_count(struct dsi_pll_14nm *pll)
>> +static void pll_14nm_calc_vco_count(struct dsi_pll_14nm *pll, struct
>> dsi_pll_config *pconf)
>>  {
>> -    struct dsi_pll_input *pin = &pll->in;
>> -    struct dsi_pll_output *pout = &pll->out;
>> -    u64 vco_clk_rate = pll->vco_current_rate;
>> -    u64 fref = pll->vco_ref_clk_rate;
>> +    u64 vco_clk_rate = pconf->vco_current_rate;
>> +    u64 fref = VCO_REF_CLK_RATE;
>> +    u32 vco_measure_time = 5;
>> +    u32 kvco_measure_time = 5;
>>      u64 data;
>>      u32 cnt;
>>
>> -    data = fref * pin->vco_measure_time;
>> +    data = fref * vco_measure_time;
>>      do_div(data, 1000000);
>>      data &= 0x03ff;    /* 10 bits */
>>      data -= 2;
>> -    pout->pll_vco_div_ref = data;
>> +    pconf->pll_vco_div_ref = data;
>>
>>      data = div_u64(vco_clk_rate, 1000000);    /* unit is Mhz */
>> -    data *= pin->vco_measure_time;
>> +    data *= vco_measure_time;
>>      do_div(data, 10);
>> -    pout->pll_vco_count = data;
>> +    pconf->pll_vco_count = data;
>>
>> -    data = fref * pin->kvco_measure_time;
>> +    data = fref * kvco_measure_time;
>>      do_div(data, 1000000);
>>      data &= 0x03ff;    /* 10 bits */
>>      data -= 1;
>> -    pout->pll_kvco_div_ref = data;
>> +    pconf->pll_kvco_div_ref = data;
>>
>>      cnt = pll_14nm_kvco_slop(vco_clk_rate);
>>      cnt *= 2;
>>      cnt /= 100;
>> -    cnt *= pin->kvco_measure_time;
>> -    pout->pll_kvco_count = cnt;
>> -
>> -    pout->pll_misc1 = 16;
>> -    pout->pll_resetsm_cntrl = 48;
>> -    pout->pll_resetsm_cntrl2 = pin->bandgap_timer << 3;
>> -    pout->pll_resetsm_cntrl5 = pin->pll_wakeup_timer;
>> -    pout->pll_kvco_code = 0;
>> +    cnt *= kvco_measure_time;
>> +    pconf->pll_kvco_count = cnt;
>>  }
>>
>> -static void pll_db_commit_ssc(struct dsi_pll_14nm *pll)
>> +static void pll_db_commit_ssc(struct dsi_pll_14nm *pll, struct
>> dsi_pll_config *pconf)
>>  {
>>      void __iomem *base = pll->phy->pll_base;
>> -    struct dsi_pll_input *pin = &pll->in;
>> -    struct dsi_pll_output *pout = &pll->out;
>>      u8 data;
>>
>> -    data = pin->ssc_adj_period;
>> +    data = pconf->ssc_adj_period;
>>      data &= 0x0ff;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_ADJ_PER1, data);
>> -    data = (pin->ssc_adj_period >> 8);
>> +    data = (pconf->ssc_adj_period >> 8);
>>      data &= 0x03;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_ADJ_PER2, data);
>>
>> -    data = pout->ssc_period;
>> +    data = pconf->ssc_period;
>>      data &= 0x0ff;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_PER1, data);
>> -    data = (pout->ssc_period >> 8);
>> +    data = (pconf->ssc_period >> 8);
>>      data &= 0x0ff;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_PER2, data);
>>
>> -    data = pout->ssc_step_size;
>> +    data = pconf->ssc_step_size;
>>      data &= 0x0ff;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_STEP_SIZE1, data);
>> -    data = (pout->ssc_step_size >> 8);
>> +    data = (pconf->ssc_step_size >> 8);
>>      data &= 0x0ff;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_STEP_SIZE2, data);
>>
>> -    data = (pin->ssc_center & 0x01);
>> +    data = (pconf->ssc_center & 0x01);
>>      data <<= 1;
>>      data |= 0x01; /* enable */
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_EN_CENTER, data);
>> @@ -409,8 +317,7 @@ static void pll_db_commit_ssc(struct dsi_pll_14nm 
>> *pll)
>>  }
>>
>>  static void pll_db_commit_common(struct dsi_pll_14nm *pll,
>> -                 struct dsi_pll_input *pin,
>> -                 struct dsi_pll_output *pout)
>> +                 struct dsi_pll_config *pconf)
>>  {
>>      void __iomem *base = pll->phy->pll_base;
>>      u8 data;
>> @@ -419,55 +326,41 @@ static void pll_db_commit_common(struct 
>> dsi_pll_14nm *pll,
>>      data = 0;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SYSCLK_EN_RESET, data);
>>
>> -    data = pout->pll_txclk_en;
>> -    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_TXCLK_EN, data);
>> +    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_TXCLK_EN, 1);
>>
>> -    data = pout->pll_resetsm_cntrl;
>> -    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL, data);
>> -    data = pout->pll_resetsm_cntrl2;
>> -    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL2, data);
>> -    data = pout->pll_resetsm_cntrl5;
>> -    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL5, data);
>> +    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL, 48);
>> +    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL2, 4 << 3);
>> /* bandgap_timer */
>> +    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL5, 5); /*
>> pll_wakeup_timer */
>>
>> -    data = pout->pll_vco_div_ref & 0xff;
>> +    data = pconf->pll_vco_div_ref & 0xff;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VCO_DIV_REF1, data);
>> -    data = (pout->pll_vco_div_ref >> 8) & 0x3;
>> +    data = (pconf->pll_vco_div_ref >> 8) & 0x3;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VCO_DIV_REF2, data);
>>
>> -    data = pout->pll_kvco_div_ref & 0xff;
>> +    data = pconf->pll_kvco_div_ref & 0xff;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_KVCO_DIV_REF1, data);
>> -    data = (pout->pll_kvco_div_ref >> 8) & 0x3;
>> +    data = (pconf->pll_kvco_div_ref >> 8) & 0x3;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_KVCO_DIV_REF2, data);
>>
>> -    data = pout->pll_misc1;
>> -    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_MISC1, data);
>> +    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_MISC1, 16);
>>
>> -    data = pin->pll_ie_trim;
>> -    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IE_TRIM, data);
>> +    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IE_TRIM, 4);
>>
>> -    data = pin->pll_ip_trim;
>> -    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IP_TRIM, data);
>> +    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IP_TRIM, 4);
>>
>> -    data = pin->pll_cpmset_cur << 3 | pin->pll_cpcset_cur;
>> -    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_CP_SET_CUR, data);
>> +    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_CP_SET_CUR, 1 << 3 | 1);
>>
>> -    data = pin->pll_icpcset_p << 3 | pin->pll_icpcset_m;
>> -    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICPCSET, data);
>> +    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICPCSET, 0 << 3 | 0);
>>
>> -    data = pin->pll_icpmset_p << 3 | pin->pll_icpcset_m;
>> -    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICPMSET, data);
>> +    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICPMSET, 0 << 3 | 0);
>>
>> -    data = pin->pll_icpmset << 3 | pin->pll_icpcset;
>> -    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICP_SET, data);
>> +    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICP_SET, 4 << 3 | 4);
>>
>> -    data = pin->pll_lpf_cap2 << 4 | pin->pll_lpf_cap1;
>> -    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_LPF1, data);
>> +    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_LPF1, 1 << 4 | 11);
>>
>> -    data = pin->pll_iptat_trim;
>> -    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IPTAT_TRIM, data);
>> +    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IPTAT_TRIM, 7);
>>
>> -    data = pin->pll_c3ctrl | pin->pll_r3ctrl << 4;
>> -    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_CRCTRL, data);
>> +    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_CRCTRL, 1 << 4 | 2);
>>  }
>>
>>  static void pll_14nm_software_reset(struct dsi_pll_14nm *pll_14nm)
>> @@ -488,8 +381,7 @@ static void pll_14nm_software_reset(struct
>> dsi_pll_14nm *pll_14nm)
>>  }
>>
>>  static void pll_db_commit_14nm(struct dsi_pll_14nm *pll,
>> -                   struct dsi_pll_input *pin,
>> -                   struct dsi_pll_output *pout)
>> +                   struct dsi_pll_config *pconf)
>>  {
>>      void __iomem *base = pll->phy->pll_base;
>>      void __iomem *cmn_base = pll->phy->base;
>> @@ -497,57 +389,64 @@ static void pll_db_commit_14nm(struct 
>> dsi_pll_14nm *pll,
>>
>>      DBG("DSI%d PLL", pll->phy->id);
>>
>> -    data = pout->cmn_ldo_cntrl;
>> -    dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_LDO_CNTRL, data);
>> +    dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_LDO_CNTRL, 0x3c);
>>
>> -    pll_db_commit_common(pll, pin, pout);
>> +    pll_db_commit_common(pll, pconf);
>>
>>      pll_14nm_software_reset(pll);
>>
>> -    data = pin->dsiclk_sel; /* set dsiclk_sel = 1  */
>> -    dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_CLK_CFG1, data);
>> +    /* Use the /2 path in Mux */
>> +    dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_CLK_CFG1, 1);
>>
>>      data = 0xff; /* data, clk, pll normal operation */
>>      dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_CTRL_0, data);
>>
>>      /* configure the frequency dependent pll registers */
>> -    data = pout->dec_start;
>> +    data = pconf->dec_start;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_DEC_START, data);
>>
>> -    data = pout->div_frac_start & 0xff;
>> +    data = pconf->div_frac_start & 0xff;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_DIV_FRAC_START1, data);
>> -    data = (pout->div_frac_start >> 8) & 0xff;
>> +    data = (pconf->div_frac_start >> 8) & 0xff;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_DIV_FRAC_START2, data);
>> -    data = (pout->div_frac_start >> 16) & 0xf;
>> +    data = (pconf->div_frac_start >> 16) & 0xf;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_DIV_FRAC_START3, data);
>>
>> -    data = pout->plllock_cmp & 0xff;
>> +    data = pconf->plllock_cmp & 0xff;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLLLOCK_CMP1, data);
>>
>> -    data = (pout->plllock_cmp >> 8) & 0xff;
>> +    data = (pconf->plllock_cmp >> 8) & 0xff;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLLLOCK_CMP2, data);
>>
>> -    data = (pout->plllock_cmp >> 16) & 0x3;
>> +    data = (pconf->plllock_cmp >> 16) & 0x3;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLLLOCK_CMP3, data);
>>
>> -    data = pin->plllock_cnt << 1 | pin->plllock_rng << 3;
>> +    data = pconf->plllock_cnt << 1 | 0 << 3; /* plllock_rng */
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLLLOCK_CMP_EN, data);
>>
>> -    data = pout->pll_vco_count & 0xff;
>> +    data = pconf->pll_vco_count & 0xff;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VCO_COUNT1, data);
>> -    data = (pout->pll_vco_count >> 8) & 0xff;
>> +    data = (pconf->pll_vco_count >> 8) & 0xff;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VCO_COUNT2, data);
>>
>> -    data = pout->pll_kvco_count & 0xff;
>> +    data = pconf->pll_kvco_count & 0xff;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_KVCO_COUNT1, data);
>> -    data = (pout->pll_kvco_count >> 8) & 0x3;
>> +    data = (pconf->pll_kvco_count >> 8) & 0x3;
>>      dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_KVCO_COUNT2, data);
>>
>> -    data = (pout->pll_postdiv - 1) << 4 | pin->pll_lpf_res1;
>> -    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_LPF2_POSTDIV, data);
>> +    /*
>> +     * High nibble configures the post divider internal to the VCO. It's
>> +     * fixed to divide by 1 for now.
>> +     *
>> +     * 0: divided by 1
>> +     * 1: divided by 2
>> +     * 2: divided by 4
>> +     * 3: divided by 8
>> +     */
>> +    dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_LPF2_POSTDIV, 0 << 
>> 4 | 3);
>>
>> -    if (pin->ssc_en)
>> -        pll_db_commit_ssc(pll);
>> +    if (pconf->ssc_en)
>> +        pll_db_commit_ssc(pll, pconf);
>>
>>      wmb();    /* make sure register committed */
>>  }
>> @@ -559,35 +458,20 @@ static int dsi_pll_14nm_vco_set_rate(struct
>> clk_hw *hw, unsigned long rate,
>>                       unsigned long parent_rate)
>>  {
>>      struct dsi_pll_14nm *pll_14nm = to_pll_14nm(hw);
>> -    struct dsi_pll_input *pin = &pll_14nm->in;
>> -    struct dsi_pll_output *pout = &pll_14nm->out;
>> +    struct dsi_pll_config conf;
>>
>>      DBG("DSI PLL%d rate=%lu, parent's=%lu", pll_14nm->phy->id, rate,
>>          parent_rate);
>>
>> -    pll_14nm->vco_current_rate = rate;
>> -    pll_14nm->vco_ref_clk_rate = VCO_REF_CLK_RATE;
>> -
>> -    dsi_pll_14nm_input_init(pll_14nm);
>> -
>> -    /*
>> -     * This configures the post divider internal to the VCO. It's
>> -     * fixed to divide by 1 for now.
>> -     *
>> -     * tx_band = pll_postdiv.
>> -     * 0: divided by 1
>> -     * 1: divided by 2
>> -     * 2: divided by 4
>> -     * 3: divided by 8
>> -     */
>> -    pout->pll_postdiv = DSI_PLL_DEFAULT_VCO_POSTDIV;
>> +    dsi_pll_14nm_config_init(&conf);
>> +    conf.vco_current_rate = rate;
>>
>> -    pll_14nm_dec_frac_calc(pll_14nm);
>> +    pll_14nm_dec_frac_calc(pll_14nm, &conf);
>>
>> -    if (pin->ssc_en)
>> -        pll_14nm_ssc_calc(pll_14nm);
>> +    if (conf.ssc_en)
>> +        pll_14nm_ssc_calc(pll_14nm, &conf);
>>
>> -    pll_14nm_calc_vco_count(pll_14nm);
>> +    pll_14nm_calc_vco_count(pll_14nm, &conf);
>>
>>      /* commit the slave DSI PLL registers if we're master. Note that we
>>       * don't lock the slave PLL. We just ensure that the PLL/PHY 
>> registers
>> @@ -596,10 +480,10 @@ static int dsi_pll_14nm_vco_set_rate(struct
>> clk_hw *hw, unsigned long rate,
>>      if (pll_14nm->phy->usecase == MSM_DSI_PHY_MASTER) {
>>          struct dsi_pll_14nm *pll_14nm_slave = pll_14nm->slave;
>>
>> -        pll_db_commit_14nm(pll_14nm_slave, pin, pout);
>> +        pll_db_commit_14nm(pll_14nm_slave, &conf);
>>      }
>>
>> -    pll_db_commit_14nm(pll_14nm, pin, pout);
>> +    pll_db_commit_14nm(pll_14nm, &conf);
>>
>>      return 0;
>>  }
>> diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c
>> b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c
>> index 4df237ad0eaf..ce6ae2fba993 100644
>> --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c
>> +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c
>> @@ -36,43 +36,24 @@
>>   */
>>
>>  #define VCO_REF_CLK_RATE        19200000
>> -
>> -struct dsi_pll_regs {
>> -    u32 pll_prop_gain_rate;
>> -    u32 pll_lockdet_rate;
>> -    u32 decimal_div_start;
>> -    u32 frac_div_start_low;
>> -    u32 frac_div_start_mid;
>> -    u32 frac_div_start_high;
>> -    u32 pll_clock_inverters;
>> -    u32 ssc_stepsize_low;
>> -    u32 ssc_stepsize_high;
>> -    u32 ssc_div_per_low;
>> -    u32 ssc_div_per_high;
>> -    u32 ssc_adjper_low;
>> -    u32 ssc_adjper_high;
>> -    u32 ssc_control;
>> -};
>> +#define FRAC_BITS 18
>>
>>  /* Hardware is V4.1 */
>>  #define DSI_PHY_7NM_QUIRK_V4_1        BIT(0)
>>
>>  struct dsi_pll_config {
>> -    u32 ref_freq;
>> -    bool div_override;
>> -    u32 output_div;
>> -    bool ignore_frac;
>> -    bool disable_prescaler;
>>      bool enable_ssc;
>>      bool ssc_center;
>> -    u32 dec_bits;
>> -    u32 frac_bits;
>> -    u32 lock_timer;
>>      u32 ssc_freq;
>>      u32 ssc_offset;
>>      u32 ssc_adj_per;
>> -    u32 thresh_cycles;
>> -    u32 refclk_cycles;
>> +
>> +    /* out */
>> +    u32 decimal_div_start;
>> +    u32 frac_div_start;
>> +    u32 pll_clock_inverters;
>> +    u32 ssc_stepsize;
>> +    u32 ssc_div_per;
>>  };
>>
>>  struct pll_7nm_cached_state {
>> @@ -88,15 +69,11 @@ struct dsi_pll_7nm {
>>
>>      struct msm_dsi_phy *phy;
>>
>> -    u64 vco_ref_clk_rate;
>>      u64 vco_current_rate;
>>
>>      /* protects REG_DSI_7nm_PHY_CMN_CLK_CFG0 register */
>>      spinlock_t postdiv_lock;
>>
>> -    struct dsi_pll_config pll_configuration;
>> -    struct dsi_pll_regs reg_setup;
>> -
>>      struct pll_7nm_cached_state cached_state;
>>
>>      struct dsi_pll_7nm *slave;
>> @@ -110,35 +87,20 @@ struct dsi_pll_7nm {
>>   */
>>  static struct dsi_pll_7nm *pll_7nm_list[DSI_MAX];
>>
>> -static void dsi_pll_setup_config(struct dsi_pll_7nm *pll)
>> +static void dsi_pll_setup_config(struct dsi_pll_config *config)
>>  {
>> -    struct dsi_pll_config *config = &pll->pll_configuration;
>> -
>> -    config->ref_freq = pll->vco_ref_clk_rate;
>> -    config->output_div = 1;
>> -    config->dec_bits = 8;
>> -    config->frac_bits = 18;
>> -    config->lock_timer = 64;
>>      config->ssc_freq = 31500;
>>      config->ssc_offset = 4800;
>>      config->ssc_adj_per = 2;
>> -    config->thresh_cycles = 32;
>> -    config->refclk_cycles = 256;
>> -
>> -    config->div_override = false;
>> -    config->ignore_frac = false;
>> -    config->disable_prescaler = false;
>>
>>      /* TODO: ssc enable */
>>      config->enable_ssc = false;
>>      config->ssc_center = 0;
>>  }
>>
>> -static void dsi_pll_calc_dec_frac(struct dsi_pll_7nm *pll)
>> +static void dsi_pll_calc_dec_frac(struct dsi_pll_7nm *pll, struct
>> dsi_pll_config *config)
>>  {
>> -    struct dsi_pll_config *config = &pll->pll_configuration;
>> -    struct dsi_pll_regs *regs = &pll->reg_setup;
>> -    u64 fref = pll->vco_ref_clk_rate;
>> +    u64 fref = VCO_REF_CLK_RATE;
>>      u64 pll_freq;
>>      u64 divider;
>>      u64 dec, dec_multiple;
>> @@ -147,42 +109,34 @@ static void dsi_pll_calc_dec_frac(struct 
>> dsi_pll_7nm *pll)
>>
>>      pll_freq = pll->vco_current_rate;
>>
>> -    if (config->disable_prescaler)
>> -        divider = fref;
>> -    else
>> -        divider = fref * 2;
>> +    divider = fref * 2;
>>
>> -    multiplier = 1 << config->frac_bits;
>> +    multiplier = 1 << FRAC_BITS;
>>      dec_multiple = div_u64(pll_freq * multiplier, divider);
>>      div_u64_rem(dec_multiple, multiplier, &frac);
>>
>>      dec = div_u64(dec_multiple, multiplier);
>>
>>      if (!(pll->phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V4_1))
>> -        regs->pll_clock_inverters = 0x28;
>> +        config->pll_clock_inverters = 0x28;
>>      else if (pll_freq <= 1000000000ULL)
>> -        regs->pll_clock_inverters = 0xa0;
>> +        config->pll_clock_inverters = 0xa0;
>>      else if (pll_freq <= 2500000000ULL)
>> -        regs->pll_clock_inverters = 0x20;
>> +        config->pll_clock_inverters = 0x20;
>>      else if (pll_freq <= 3020000000ULL)
>> -        regs->pll_clock_inverters = 0x00;
>> +        config->pll_clock_inverters = 0x00;
>>      else
>> -        regs->pll_clock_inverters = 0x40;
>> +        config->pll_clock_inverters = 0x40;
>>
>> -    regs->pll_lockdet_rate = config->lock_timer;
>> -    regs->decimal_div_start = dec;
>> -    regs->frac_div_start_low = (frac & 0xff);
>> -    regs->frac_div_start_mid = (frac & 0xff00) >> 8;
>> -    regs->frac_div_start_high = (frac & 0x30000) >> 16;
>> +    config->decimal_div_start = dec;
>> +    config->frac_div_start = frac;
>>  }
>>
>>  #define SSC_CENTER        BIT(0)
>>  #define SSC_EN            BIT(1)
>>
>> -static void dsi_pll_calc_ssc(struct dsi_pll_7nm *pll)
>> +static void dsi_pll_calc_ssc(struct dsi_pll_7nm *pll, struct
>> dsi_pll_config *config)
>>  {
>> -    struct dsi_pll_config *config = &pll->pll_configuration;
>> -    struct dsi_pll_regs *regs = &pll->reg_setup;
>>      u32 ssc_per;
>>      u32 ssc_mod;
>>      u64 ssc_step_size;
>> @@ -193,58 +147,49 @@ static void dsi_pll_calc_ssc(struct dsi_pll_7nm 
>> *pll)
>>          return;
>>      }
>>
>> -    ssc_per = DIV_ROUND_CLOSEST(config->ref_freq, config->ssc_freq) / 
>> 2 - 1;
>> +    ssc_per = DIV_ROUND_CLOSEST(VCO_REF_CLK_RATE, config->ssc_freq) / 
>> 2 - 1;
>>      ssc_mod = (ssc_per + 1) % (config->ssc_adj_per + 1);
>>      ssc_per -= ssc_mod;
>>
>> -    frac = regs->frac_div_start_low |
>> -            (regs->frac_div_start_mid << 8) |
>> -            (regs->frac_div_start_high << 16);
>> -    ssc_step_size = regs->decimal_div_start;
>> -    ssc_step_size *= (1 << config->frac_bits);
>> +    frac = config->frac_div_start;
>> +    ssc_step_size = config->decimal_div_start;
>> +    ssc_step_size *= (1 << FRAC_BITS);
>>      ssc_step_size += frac;
>>      ssc_step_size *= config->ssc_offset;
>>      ssc_step_size *= (config->ssc_adj_per + 1);
>>      ssc_step_size = div_u64(ssc_step_size, (ssc_per + 1));
>>      ssc_step_size = DIV_ROUND_CLOSEST_ULL(ssc_step_size, 1000000);
>>
>> -    regs->ssc_div_per_low = ssc_per & 0xFF;
>> -    regs->ssc_div_per_high = (ssc_per & 0xFF00) >> 8;
>> -    regs->ssc_stepsize_low = (u32)(ssc_step_size & 0xFF);
>> -    regs->ssc_stepsize_high = (u32)((ssc_step_size & 0xFF00) >> 8);
>> -    regs->ssc_adjper_low = config->ssc_adj_per & 0xFF;
>> -    regs->ssc_adjper_high = (config->ssc_adj_per & 0xFF00) >> 8;
>> -
>> -    regs->ssc_control = config->ssc_center ? SSC_CENTER : 0;
>> +    config->ssc_div_per = ssc_per;
>> +    config->ssc_stepsize = ssc_step_size;
>>
>>      pr_debug("SCC: Dec:%d, frac:%llu, frac_bits:%d\n",
>> -         regs->decimal_div_start, frac, config->frac_bits);
>> +         config->decimal_div_start, frac, FRAC_BITS);
>>      pr_debug("SSC: div_per:0x%X, stepsize:0x%X, adjper:0x%X\n",
>>           ssc_per, (u32)ssc_step_size, config->ssc_adj_per);
>>  }
>>
>> -static void dsi_pll_ssc_commit(struct dsi_pll_7nm *pll)
>> +static void dsi_pll_ssc_commit(struct dsi_pll_7nm *pll, struct
>> dsi_pll_config *config)
>>  {
>>      void __iomem *base = pll->phy->pll_base;
>> -    struct dsi_pll_regs *regs = &pll->reg_setup;
>>
>> -    if (pll->pll_configuration.enable_ssc) {
>> +    if (config->enable_ssc) {
>>          pr_debug("SSC is enabled\n");
>>
>>          dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_STEPSIZE_LOW_1,
>> -              regs->ssc_stepsize_low);
>> +              config->ssc_stepsize & 0xff);
>>          dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_STEPSIZE_HIGH_1,
>> -              regs->ssc_stepsize_high);
>> +              config->ssc_stepsize >> 8);
>>          dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_DIV_PER_LOW_1,
>> -              regs->ssc_div_per_low);
>> +              config->ssc_div_per & 0xff);
>>          dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_DIV_PER_HIGH_1,
>> -              regs->ssc_div_per_high);
>> +              config->ssc_div_per >> 8);
>>          dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_ADJPER_LOW_1,
>> -              regs->ssc_adjper_low);
>> +              config->ssc_adj_per & 0xff);
>>          dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_ADJPER_HIGH_1,
>> -              regs->ssc_adjper_high);
>> +              config->ssc_adj_per >> 8);
>>          dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_CONTROL,
>> -              SSC_EN | regs->ssc_control);
>> +              SSC_EN | (config->ssc_center ? SSC_CENTER : 0));
>>      }
>>  }
>>
>> @@ -296,44 +241,46 @@ static void dsi_pll_config_hzindep_reg(struct
>> dsi_pll_7nm *pll)
>>      }
>>  }
>>
>> -static void dsi_pll_commit(struct dsi_pll_7nm *pll)
>> +static void dsi_pll_commit(struct dsi_pll_7nm *pll, struct
>> dsi_pll_config *config)
>>  {
>>      void __iomem *base = pll->phy->pll_base;
>> -    struct dsi_pll_regs *reg = &pll->reg_setup;
>>
>>      dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_CORE_INPUT_OVERRIDE, 0x12);
>> -    dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_DECIMAL_DIV_START_1,
>> reg->decimal_div_start);
>> -    dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_LOW_1,
>> reg->frac_div_start_low);
>> -    dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_MID_1,
>> reg->frac_div_start_mid);
>> -    dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_HIGH_1,
>> reg->frac_div_start_high);
>> -    dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_PLL_LOCKDET_RATE_1,
>> reg->pll_lockdet_rate);
>> +    dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_DECIMAL_DIV_START_1,
>> config->decimal_div_start);
>> +    dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_LOW_1,
>> +          config->frac_div_start & 0xff);
>> +    dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_MID_1,
>> +          (config->frac_div_start & 0xff00) >> 8);
>> +    dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_HIGH_1,
>> +          (config->frac_div_start & 0x30000) >> 16);
>> +    dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_PLL_LOCKDET_RATE_1, 0x40);
>>      dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_PLL_LOCK_DELAY, 0x06);
>>      dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_CMODE_1, 0x10); /* TODO:
>> 0x00 for CPHY */
>> -    dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_CLOCK_INVERTERS,
>> reg->pll_clock_inverters);
>> +    dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_CLOCK_INVERTERS,
>> config->pll_clock_inverters);
>>  }
>>
>>  static int dsi_pll_7nm_vco_set_rate(struct clk_hw *hw, unsigned long 
>> rate,
>>                       unsigned long parent_rate)
>>  {
>>      struct dsi_pll_7nm *pll_7nm = to_pll_7nm(hw);
>> +    struct dsi_pll_config config;
>>
>>      DBG("DSI PLL%d rate=%lu, parent's=%lu", pll_7nm->phy->id, rate,
>>          parent_rate);
>>
>>      pll_7nm->vco_current_rate = rate;
>> -    pll_7nm->vco_ref_clk_rate = VCO_REF_CLK_RATE;
>>
>> -    dsi_pll_setup_config(pll_7nm);
>> +    dsi_pll_setup_config(&config);
>>
>> -    dsi_pll_calc_dec_frac(pll_7nm);
>> +    dsi_pll_calc_dec_frac(pll_7nm, &config);
>>
>> -    dsi_pll_calc_ssc(pll_7nm);
>> +    dsi_pll_calc_ssc(pll_7nm, &config);
>>
>> -    dsi_pll_commit(pll_7nm);
>> +    dsi_pll_commit(pll_7nm, &config);
>>
>>      dsi_pll_config_hzindep_reg(pll_7nm);
>>
>> -    dsi_pll_ssc_commit(pll_7nm);
>> +    dsi_pll_ssc_commit(pll_7nm, &config);
>>
>>      /* flush, ensure all register writes are done*/
>>      wmb();
>> @@ -486,9 +433,8 @@ static unsigned long
>> dsi_pll_7nm_vco_recalc_rate(struct clk_hw *hw,
>>                            unsigned long parent_rate)
>>  {
>>      struct dsi_pll_7nm *pll_7nm = to_pll_7nm(hw);
>> -    struct dsi_pll_config *config = &pll_7nm->pll_configuration;
>>      void __iomem *base = pll_7nm->phy->pll_base;
>> -    u64 ref_clk = pll_7nm->vco_ref_clk_rate;
>> +    u64 ref_clk = VCO_REF_CLK_RATE;
>>      u64 vco_rate = 0x0;
>>      u64 multiplier;
>>      u32 frac;
>> @@ -508,7 +454,7 @@ static unsigned long
>> dsi_pll_7nm_vco_recalc_rate(struct clk_hw *hw,
>>       * TODO:
>>       *    1. Assumes prescaler is disabled
>>       */
>> -    multiplier = 1 << config->frac_bits;
>> +    multiplier = 1 << FRAC_BITS;
>>      pll_freq = dec * (ref_clk * 2);
>>      tmp64 = (ref_clk * 2 * frac);
>>      pll_freq += div_u64(tmp64, multiplier);
>> @@ -590,7 +536,7 @@ static int dsi_7nm_restore_state(struct 
>> msm_dsi_phy *phy)
>>      val |= cached->pll_mux;
>>      dsi_phy_write(phy_base + REG_DSI_7nm_PHY_CMN_CLK_CFG1, val);
>>
>> -    ret = dsi_pll_7nm_vco_set_rate(phy->vco_hw,
>> pll_7nm->vco_current_rate, pll_7nm->vco_ref_clk_rate);
>> +    ret = dsi_pll_7nm_vco_set_rate(phy->vco_hw,
>> pll_7nm->vco_current_rate, VCO_REF_CLK_RATE);
>>      if (ret) {
>>          DRM_DEV_ERROR(&pll_7nm->phy->pdev->dev,
>>              "restore vco rate failed. ret=%d\n", ret);
diff mbox series

Patch

diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c
index b937e77b3c37..1fbb54f4df98 100644
--- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c
+++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c
@@ -36,43 +36,25 @@ 
  */
 
 #define VCO_REF_CLK_RATE		19200000
-
-struct dsi_pll_regs {
-	u32 pll_prop_gain_rate;
-	u32 pll_lockdet_rate;
-	u32 decimal_div_start;
-	u32 frac_div_start_low;
-	u32 frac_div_start_mid;
-	u32 frac_div_start_high;
-	u32 pll_clock_inverters;
-	u32 ssc_stepsize_low;
-	u32 ssc_stepsize_high;
-	u32 ssc_div_per_low;
-	u32 ssc_div_per_high;
-	u32 ssc_adjper_low;
-	u32 ssc_adjper_high;
-	u32 ssc_control;
-};
+#define FRAC_BITS 18
 
 /* v3.0.0 10nm implementation that requires the old timings settings */
 #define DSI_PHY_10NM_QUIRK_OLD_TIMINGS	BIT(0)
 
 struct dsi_pll_config {
-	u32 ref_freq;
-	bool div_override;
-	u32 output_div;
-	bool ignore_frac;
-	bool disable_prescaler;
 	bool enable_ssc;
 	bool ssc_center;
-	u32 dec_bits;
-	u32 frac_bits;
-	u32 lock_timer;
 	u32 ssc_freq;
 	u32 ssc_offset;
 	u32 ssc_adj_per;
-	u32 thresh_cycles;
-	u32 refclk_cycles;
+
+	/* out */
+	u32 pll_prop_gain_rate;
+	u32 decimal_div_start;
+	u32 frac_div_start;
+	u32 pll_clock_inverters;
+	u32 ssc_stepsize;
+	u32 ssc_div_per;
 };
 
 struct pll_10nm_cached_state {
@@ -88,15 +70,11 @@  struct dsi_pll_10nm {
 
 	struct msm_dsi_phy *phy;
 
-	u64 vco_ref_clk_rate;
 	u64 vco_current_rate;
 
 	/* protects REG_DSI_10nm_PHY_CMN_CLK_CFG0 register */
 	spinlock_t postdiv_lock;
 
-	struct dsi_pll_config pll_configuration;
-	struct dsi_pll_regs reg_setup;
-
 	struct pll_10nm_cached_state cached_state;
 
 	struct dsi_pll_10nm *slave;
@@ -110,34 +88,19 @@  struct dsi_pll_10nm {
  */
 static struct dsi_pll_10nm *pll_10nm_list[DSI_MAX];
 
-static void dsi_pll_setup_config(struct dsi_pll_10nm *pll)
+static void dsi_pll_setup_config(struct dsi_pll_config *config)
 {
-	struct dsi_pll_config *config = &pll->pll_configuration;
-
-	config->ref_freq = pll->vco_ref_clk_rate;
-	config->output_div = 1;
-	config->dec_bits = 8;
-	config->frac_bits = 18;
-	config->lock_timer = 64;
 	config->ssc_freq = 31500;
 	config->ssc_offset = 5000;
 	config->ssc_adj_per = 2;
-	config->thresh_cycles = 32;
-	config->refclk_cycles = 256;
-
-	config->div_override = false;
-	config->ignore_frac = false;
-	config->disable_prescaler = false;
 
 	config->enable_ssc = false;
-	config->ssc_center = 0;
+	config->ssc_center = false;
 }
 
-static void dsi_pll_calc_dec_frac(struct dsi_pll_10nm *pll)
+static void dsi_pll_calc_dec_frac(struct dsi_pll_10nm *pll, struct dsi_pll_config *config)
 {
-	struct dsi_pll_config *config = &pll->pll_configuration;
-	struct dsi_pll_regs *regs = &pll->reg_setup;
-	u64 fref = pll->vco_ref_clk_rate;
+	u64 fref = VCO_REF_CLK_RATE;
 	u64 pll_freq;
 	u64 divider;
 	u64 dec, dec_multiple;
@@ -146,40 +109,32 @@  static void dsi_pll_calc_dec_frac(struct dsi_pll_10nm *pll)
 
 	pll_freq = pll->vco_current_rate;
 
-	if (config->disable_prescaler)
-		divider = fref;
-	else
-		divider = fref * 2;
+	divider = fref * 2;
 
-	multiplier = 1 << config->frac_bits;
+	multiplier = 1 << FRAC_BITS;
 	dec_multiple = div_u64(pll_freq * multiplier, divider);
 	dec = div_u64_rem(dec_multiple, multiplier, &frac);
 
 	if (pll_freq <= 1900000000UL)
-		regs->pll_prop_gain_rate = 8;
+		config->pll_prop_gain_rate = 8;
 	else if (pll_freq <= 3000000000UL)
-		regs->pll_prop_gain_rate = 10;
+		config->pll_prop_gain_rate = 10;
 	else
-		regs->pll_prop_gain_rate = 12;
+		config->pll_prop_gain_rate = 12;
 	if (pll_freq < 1100000000UL)
-		regs->pll_clock_inverters = 8;
+		config->pll_clock_inverters = 8;
 	else
-		regs->pll_clock_inverters = 0;
+		config->pll_clock_inverters = 0;
 
-	regs->pll_lockdet_rate = config->lock_timer;
-	regs->decimal_div_start = dec;
-	regs->frac_div_start_low = (frac & 0xff);
-	regs->frac_div_start_mid = (frac & 0xff00) >> 8;
-	regs->frac_div_start_high = (frac & 0x30000) >> 16;
+	config->decimal_div_start = dec;
+	config->frac_div_start = frac;
 }
 
 #define SSC_CENTER		BIT(0)
 #define SSC_EN			BIT(1)
 
-static void dsi_pll_calc_ssc(struct dsi_pll_10nm *pll)
+static void dsi_pll_calc_ssc(struct dsi_pll_10nm *pll, struct dsi_pll_config *config)
 {
-	struct dsi_pll_config *config = &pll->pll_configuration;
-	struct dsi_pll_regs *regs = &pll->reg_setup;
 	u32 ssc_per;
 	u32 ssc_mod;
 	u64 ssc_step_size;
@@ -190,58 +145,49 @@  static void dsi_pll_calc_ssc(struct dsi_pll_10nm *pll)
 		return;
 	}
 
-	ssc_per = DIV_ROUND_CLOSEST(config->ref_freq, config->ssc_freq) / 2 - 1;
+	ssc_per = DIV_ROUND_CLOSEST(VCO_REF_CLK_RATE, config->ssc_freq) / 2 - 1;
 	ssc_mod = (ssc_per + 1) % (config->ssc_adj_per + 1);
 	ssc_per -= ssc_mod;
 
-	frac = regs->frac_div_start_low |
-			(regs->frac_div_start_mid << 8) |
-			(regs->frac_div_start_high << 16);
-	ssc_step_size = regs->decimal_div_start;
-	ssc_step_size *= (1 << config->frac_bits);
+	frac = config->frac_div_start;
+	ssc_step_size = config->decimal_div_start;
+	ssc_step_size *= (1 << FRAC_BITS);
 	ssc_step_size += frac;
 	ssc_step_size *= config->ssc_offset;
 	ssc_step_size *= (config->ssc_adj_per + 1);
 	ssc_step_size = div_u64(ssc_step_size, (ssc_per + 1));
 	ssc_step_size = DIV_ROUND_CLOSEST_ULL(ssc_step_size, 1000000);
 
-	regs->ssc_div_per_low = ssc_per & 0xFF;
-	regs->ssc_div_per_high = (ssc_per & 0xFF00) >> 8;
-	regs->ssc_stepsize_low = (u32)(ssc_step_size & 0xFF);
-	regs->ssc_stepsize_high = (u32)((ssc_step_size & 0xFF00) >> 8);
-	regs->ssc_adjper_low = config->ssc_adj_per & 0xFF;
-	regs->ssc_adjper_high = (config->ssc_adj_per & 0xFF00) >> 8;
-
-	regs->ssc_control = config->ssc_center ? SSC_CENTER : 0;
+	config->ssc_div_per = ssc_per;
+	config->ssc_stepsize = ssc_step_size;
 
 	pr_debug("SCC: Dec:%d, frac:%llu, frac_bits:%d\n",
-		 regs->decimal_div_start, frac, config->frac_bits);
+		 config->decimal_div_start, frac, FRAC_BITS);
 	pr_debug("SSC: div_per:0x%X, stepsize:0x%X, adjper:0x%X\n",
 		 ssc_per, (u32)ssc_step_size, config->ssc_adj_per);
 }
 
-static void dsi_pll_ssc_commit(struct dsi_pll_10nm *pll)
+static void dsi_pll_ssc_commit(struct dsi_pll_10nm *pll, struct dsi_pll_config *config)
 {
 	void __iomem *base = pll->phy->pll_base;
-	struct dsi_pll_regs *regs = &pll->reg_setup;
 
-	if (pll->pll_configuration.enable_ssc) {
+	if (config->enable_ssc) {
 		pr_debug("SSC is enabled\n");
 
 		dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_STEPSIZE_LOW_1,
-			  regs->ssc_stepsize_low);
+			  config->ssc_stepsize & 0xff);
 		dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_STEPSIZE_HIGH_1,
-			  regs->ssc_stepsize_high);
+			  config->ssc_stepsize >> 8);
 		dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_DIV_PER_LOW_1,
-			  regs->ssc_div_per_low);
+			  config->ssc_div_per & 0xff);
 		dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_DIV_PER_HIGH_1,
-			  regs->ssc_div_per_high);
+			  config->ssc_div_per >> 8);
 		dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_DIV_ADJPER_LOW_1,
-			  regs->ssc_adjper_low);
+			  config->ssc_adj_per & 0xff);
 		dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_DIV_ADJPER_HIGH_1,
-			  regs->ssc_adjper_high);
+			  config->ssc_adj_per >> 8);
 		dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_SSC_CONTROL,
-			  SSC_EN | regs->ssc_control);
+			  SSC_EN | (config->ssc_center ? SSC_CENTER : 0));
 	}
 }
 
@@ -271,50 +217,48 @@  static void dsi_pll_config_hzindep_reg(struct dsi_pll_10nm *pll)
 	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_IFILT, 0x3f);
 }
 
-static void dsi_pll_commit(struct dsi_pll_10nm *pll)
+static void dsi_pll_commit(struct dsi_pll_10nm *pll, struct dsi_pll_config *config)
 {
 	void __iomem *base = pll->phy->pll_base;
-	struct dsi_pll_regs *reg = &pll->reg_setup;
 
 	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_CORE_INPUT_OVERRIDE, 0x12);
 	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_DECIMAL_DIV_START_1,
-		  reg->decimal_div_start);
+		  config->decimal_div_start);
 	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_FRAC_DIV_START_LOW_1,
-		  reg->frac_div_start_low);
+		  config->frac_div_start & 0xff);
 	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_FRAC_DIV_START_MID_1,
-		  reg->frac_div_start_mid);
+		  (config->frac_div_start & 0xff00) >> 8);
 	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_FRAC_DIV_START_HIGH_1,
-		  reg->frac_div_start_high);
-	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_PLL_LOCKDET_RATE_1,
-		  reg->pll_lockdet_rate);
+		  (config->frac_div_start & 0x30000) >> 16);
+	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_PLL_LOCKDET_RATE_1, 64);
 	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_PLL_LOCK_DELAY, 0x06);
 	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_CMODE, 0x10);
 	dsi_phy_write(base + REG_DSI_10nm_PHY_PLL_CLOCK_INVERTERS,
-		  reg->pll_clock_inverters);
+		  config->pll_clock_inverters);
 }
 
 static int dsi_pll_10nm_vco_set_rate(struct clk_hw *hw, unsigned long rate,
 				     unsigned long parent_rate)
 {
 	struct dsi_pll_10nm *pll_10nm = to_pll_10nm(hw);
+	struct dsi_pll_config config;
 
 	DBG("DSI PLL%d rate=%lu, parent's=%lu", pll_10nm->phy->id, rate,
 	    parent_rate);
 
 	pll_10nm->vco_current_rate = rate;
-	pll_10nm->vco_ref_clk_rate = VCO_REF_CLK_RATE;
 
-	dsi_pll_setup_config(pll_10nm);
+	dsi_pll_setup_config(&config);
 
-	dsi_pll_calc_dec_frac(pll_10nm);
+	dsi_pll_calc_dec_frac(pll_10nm, &config);
 
-	dsi_pll_calc_ssc(pll_10nm);
+	dsi_pll_calc_ssc(pll_10nm, &config);
 
-	dsi_pll_commit(pll_10nm);
+	dsi_pll_commit(pll_10nm, &config);
 
 	dsi_pll_config_hzindep_reg(pll_10nm);
 
-	dsi_pll_ssc_commit(pll_10nm);
+	dsi_pll_ssc_commit(pll_10nm, &config);
 
 	/* flush, ensure all register writes are done*/
 	wmb();
@@ -461,9 +405,8 @@  static unsigned long dsi_pll_10nm_vco_recalc_rate(struct clk_hw *hw,
 						  unsigned long parent_rate)
 {
 	struct dsi_pll_10nm *pll_10nm = to_pll_10nm(hw);
-	struct dsi_pll_config *config = &pll_10nm->pll_configuration;
 	void __iomem *base = pll_10nm->phy->pll_base;
-	u64 ref_clk = pll_10nm->vco_ref_clk_rate;
+	u64 ref_clk = VCO_REF_CLK_RATE;
 	u64 vco_rate = 0x0;
 	u64 multiplier;
 	u32 frac;
@@ -483,7 +426,7 @@  static unsigned long dsi_pll_10nm_vco_recalc_rate(struct clk_hw *hw,
 	 * TODO:
 	 *	1. Assumes prescaler is disabled
 	 */
-	multiplier = 1 << config->frac_bits;
+	multiplier = 1 << FRAC_BITS;
 	pll_freq = dec * (ref_clk * 2);
 	tmp64 = (ref_clk * 2 * frac);
 	pll_freq += div_u64(tmp64, multiplier);
@@ -565,7 +508,7 @@  static int dsi_10nm_restore_state(struct msm_dsi_phy *phy)
 	val |= cached->pll_mux;
 	dsi_phy_write(phy_base + REG_DSI_10nm_PHY_CMN_CLK_CFG1, val);
 
-	ret = dsi_pll_10nm_vco_set_rate(phy->vco_hw, pll_10nm->vco_current_rate, pll_10nm->vco_ref_clk_rate);
+	ret = dsi_pll_10nm_vco_set_rate(phy->vco_hw, pll_10nm->vco_current_rate, VCO_REF_CLK_RATE);
 	if (ret) {
 		DRM_DEV_ERROR(&pll_10nm->phy->pdev->dev,
 			"restore vco rate failed. ret=%d\n", ret);
diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c
index 8b4865c5796d..d08ad0c632b4 100644
--- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c
+++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c
@@ -37,51 +37,19 @@ 
 #define VCO_MIN_RATE			1300000000UL
 #define VCO_MAX_RATE			2600000000UL
 
-#define DSI_PLL_DEFAULT_VCO_POSTDIV	1
+struct dsi_pll_config {
+	u64 vco_current_rate;
 
-struct dsi_pll_input {
-	u32 fref;	/* reference clk */
-	u32 fdata;	/* bit clock rate */
-	u32 dsiclk_sel; /* Mux configuration (see diagram) */
 	u32 ssc_en;	/* SSC enable/disable */
-	u32 ldo_en;
 
 	/* fixed params */
-	u32 refclk_dbler_en;
-	u32 vco_measure_time;
-	u32 kvco_measure_time;
-	u32 bandgap_timer;
-	u32 pll_wakeup_timer;
 	u32 plllock_cnt;
-	u32 plllock_rng;
 	u32 ssc_center;
 	u32 ssc_adj_period;
 	u32 ssc_spread;
 	u32 ssc_freq;
-	u32 pll_ie_trim;
-	u32 pll_ip_trim;
-	u32 pll_iptat_trim;
-	u32 pll_cpcset_cur;
-	u32 pll_cpmset_cur;
-
-	u32 pll_icpmset;
-	u32 pll_icpcset;
-
-	u32 pll_icpmset_p;
-	u32 pll_icpmset_m;
-
-	u32 pll_icpcset_p;
-	u32 pll_icpcset_m;
-
-	u32 pll_lpf_res1;
-	u32 pll_lpf_cap1;
-	u32 pll_lpf_cap2;
-	u32 pll_c3ctrl;
-	u32 pll_r3ctrl;
-};
 
-struct dsi_pll_output {
-	u32 pll_txclk_en;
+	/* calculated */
 	u32 dec_start;
 	u32 div_frac_start;
 	u32 ssc_period;
@@ -91,19 +59,6 @@  struct dsi_pll_output {
 	u32 pll_vco_count;
 	u32 pll_kvco_div_ref;
 	u32 pll_kvco_count;
-	u32 pll_misc1;
-	u32 pll_lpf2_postdiv;
-	u32 pll_resetsm_cntrl;
-	u32 pll_resetsm_cntrl2;
-	u32 pll_resetsm_cntrl5;
-	u32 pll_kvco_code;
-
-	u32 cmn_clk_cfg0;
-	u32 cmn_clk_cfg1;
-	u32 cmn_ldo_cntrl;
-
-	u32 pll_postdiv;
-	u32 fcvo;
 };
 
 struct pll_14nm_cached_state {
@@ -117,15 +72,9 @@  struct dsi_pll_14nm {
 
 	struct msm_dsi_phy *phy;
 
-	struct dsi_pll_input in;
-	struct dsi_pll_output out;
-
 	/* protects REG_DSI_14nm_PHY_CMN_CLK_CFG0 register */
 	spinlock_t postdiv_lock;
 
-	u64 vco_current_rate;
-	u64 vco_ref_clk_rate;
-
 	struct pll_14nm_cached_state cached_state;
 
 	struct dsi_pll_14nm *slave;
@@ -195,78 +144,50 @@  static bool pll_14nm_poll_for_ready(struct dsi_pll_14nm *pll_14nm,
 	return pll_locked;
 }
 
-static void dsi_pll_14nm_input_init(struct dsi_pll_14nm *pll)
+static void dsi_pll_14nm_config_init(struct dsi_pll_config *pconf)
 {
-	pll->in.fref = pll->vco_ref_clk_rate;
-	pll->in.fdata = 0;
-	pll->in.dsiclk_sel = 1;	/* Use the /2 path in Mux */
-	pll->in.ldo_en = 0;	/* disabled for now */
-
 	/* fixed input */
-	pll->in.refclk_dbler_en = 0;
-	pll->in.vco_measure_time = 5;
-	pll->in.kvco_measure_time = 5;
-	pll->in.bandgap_timer = 4;
-	pll->in.pll_wakeup_timer = 5;
-	pll->in.plllock_cnt = 1;
-	pll->in.plllock_rng = 0;
+	pconf->plllock_cnt = 1;
 
 	/*
 	 * SSC is enabled by default. We might need DT props for configuring
 	 * some SSC params like PPM and center/down spread etc.
 	 */
-	pll->in.ssc_en = 1;
-	pll->in.ssc_center = 0;		/* down spread by default */
-	pll->in.ssc_spread = 5;		/* PPM / 1000 */
-	pll->in.ssc_freq = 31500;	/* default recommended */
-	pll->in.ssc_adj_period = 37;
-
-	pll->in.pll_ie_trim = 4;
-	pll->in.pll_ip_trim = 4;
-	pll->in.pll_cpcset_cur = 1;
-	pll->in.pll_cpmset_cur = 1;
-	pll->in.pll_icpmset = 4;
-	pll->in.pll_icpcset = 4;
-	pll->in.pll_icpmset_p = 0;
-	pll->in.pll_icpmset_m = 0;
-	pll->in.pll_icpcset_p = 0;
-	pll->in.pll_icpcset_m = 0;
-	pll->in.pll_lpf_res1 = 3;
-	pll->in.pll_lpf_cap1 = 11;
-	pll->in.pll_lpf_cap2 = 1;
-	pll->in.pll_iptat_trim = 7;
-	pll->in.pll_c3ctrl = 2;
-	pll->in.pll_r3ctrl = 1;
+	pconf->ssc_en = 1;
+	pconf->ssc_center = 0;		/* down spread by default */
+	pconf->ssc_spread = 5;		/* PPM / 1000 */
+	pconf->ssc_freq = 31500;	/* default recommended */
+	pconf->ssc_adj_period = 37;
 }
 
 #define CEIL(x, y)		(((x) + ((y) - 1)) / (y))
 
-static void pll_14nm_ssc_calc(struct dsi_pll_14nm *pll)
+static void pll_14nm_ssc_calc(struct dsi_pll_14nm *pll, struct dsi_pll_config *pconf)
 {
 	u32 period, ssc_period;
 	u32 ref, rem;
 	u64 step_size;
 
-	DBG("vco=%lld ref=%lld", pll->vco_current_rate, pll->vco_ref_clk_rate);
+	DBG("vco=%lld ref=%d", pconf->vco_current_rate, VCO_REF_CLK_RATE);
 
-	ssc_period = pll->in.ssc_freq / 500;
-	period = (u32)pll->vco_ref_clk_rate / 1000;
+	ssc_period = pconf->ssc_freq / 500;
+	period = (u32)VCO_REF_CLK_RATE / 1000;
 	ssc_period  = CEIL(period, ssc_period);
 	ssc_period -= 1;
-	pll->out.ssc_period = ssc_period;
+	pconf->ssc_period = ssc_period;
 
-	DBG("ssc freq=%d spread=%d period=%d", pll->in.ssc_freq,
-	    pll->in.ssc_spread, pll->out.ssc_period);
+	DBG("ssc freq=%d spread=%d period=%d", pconf->ssc_freq,
+	    pconf->ssc_spread, pconf->ssc_period);
 
-	step_size = (u32)pll->vco_current_rate;
-	ref = pll->vco_ref_clk_rate;
+	step_size = (u32)pconf->vco_current_rate;
+	ref = VCO_REF_CLK_RATE;
 	ref /= 1000;
 	step_size = div_u64(step_size, ref);
 	step_size <<= 20;
 	step_size = div_u64(step_size, 1000);
-	step_size *= pll->in.ssc_spread;
+	step_size *= pconf->ssc_spread;
 	step_size = div_u64(step_size, 1000);
-	step_size *= (pll->in.ssc_adj_period + 1);
+	step_size *= (pconf->ssc_adj_period + 1);
 
 	rem = 0;
 	step_size = div_u64_rem(step_size, ssc_period + 1, &rem);
@@ -277,18 +198,16 @@  static void pll_14nm_ssc_calc(struct dsi_pll_14nm *pll)
 
 	step_size &= 0x0ffff;	/* take lower 16 bits */
 
-	pll->out.ssc_step_size = step_size;
+	pconf->ssc_step_size = step_size;
 }
 
-static void pll_14nm_dec_frac_calc(struct dsi_pll_14nm *pll)
+static void pll_14nm_dec_frac_calc(struct dsi_pll_14nm *pll, struct dsi_pll_config *pconf)
 {
-	struct dsi_pll_input *pin = &pll->in;
-	struct dsi_pll_output *pout = &pll->out;
 	u64 multiplier = BIT(20);
 	u64 dec_start_multiple, dec_start, pll_comp_val;
 	u32 duration, div_frac_start;
-	u64 vco_clk_rate = pll->vco_current_rate;
-	u64 fref = pll->vco_ref_clk_rate;
+	u64 vco_clk_rate = pconf->vco_current_rate;
+	u64 fref = VCO_REF_CLK_RATE;
 
 	DBG("vco_clk_rate=%lld ref_clk_rate=%lld", vco_clk_rate, fref);
 
@@ -297,14 +216,14 @@  static void pll_14nm_dec_frac_calc(struct dsi_pll_14nm *pll)
 
 	dec_start = div_u64(dec_start_multiple, multiplier);
 
-	pout->dec_start = (u32)dec_start;
-	pout->div_frac_start = div_frac_start;
+	pconf->dec_start = (u32)dec_start;
+	pconf->div_frac_start = div_frac_start;
 
-	if (pin->plllock_cnt == 0)
+	if (pconf->plllock_cnt == 0)
 		duration = 1024;
-	else if (pin->plllock_cnt == 1)
+	else if (pconf->plllock_cnt == 1)
 		duration = 256;
-	else if (pin->plllock_cnt == 2)
+	else if (pconf->plllock_cnt == 2)
 		duration = 128;
 	else
 		duration = 32;
@@ -313,10 +232,7 @@  static void pll_14nm_dec_frac_calc(struct dsi_pll_14nm *pll)
 	pll_comp_val = div_u64(pll_comp_val, multiplier);
 	do_div(pll_comp_val, 10);
 
-	pout->plllock_cmp = (u32)pll_comp_val;
-
-	pout->pll_txclk_en = 1;
-	pout->cmn_ldo_cntrl = 0x3c;
+	pconf->plllock_cmp = (u32)pll_comp_val;
 }
 
 static u32 pll_14nm_kvco_slop(u32 vrate)
@@ -333,74 +249,66 @@  static u32 pll_14nm_kvco_slop(u32 vrate)
 	return slop;
 }
 
-static void pll_14nm_calc_vco_count(struct dsi_pll_14nm *pll)
+static void pll_14nm_calc_vco_count(struct dsi_pll_14nm *pll, struct dsi_pll_config *pconf)
 {
-	struct dsi_pll_input *pin = &pll->in;
-	struct dsi_pll_output *pout = &pll->out;
-	u64 vco_clk_rate = pll->vco_current_rate;
-	u64 fref = pll->vco_ref_clk_rate;
+	u64 vco_clk_rate = pconf->vco_current_rate;
+	u64 fref = VCO_REF_CLK_RATE;
+	u32 vco_measure_time = 5;
+	u32 kvco_measure_time = 5;
 	u64 data;
 	u32 cnt;
 
-	data = fref * pin->vco_measure_time;
+	data = fref * vco_measure_time;
 	do_div(data, 1000000);
 	data &= 0x03ff;	/* 10 bits */
 	data -= 2;
-	pout->pll_vco_div_ref = data;
+	pconf->pll_vco_div_ref = data;
 
 	data = div_u64(vco_clk_rate, 1000000);	/* unit is Mhz */
-	data *= pin->vco_measure_time;
+	data *= vco_measure_time;
 	do_div(data, 10);
-	pout->pll_vco_count = data;
+	pconf->pll_vco_count = data;
 
-	data = fref * pin->kvco_measure_time;
+	data = fref * kvco_measure_time;
 	do_div(data, 1000000);
 	data &= 0x03ff;	/* 10 bits */
 	data -= 1;
-	pout->pll_kvco_div_ref = data;
+	pconf->pll_kvco_div_ref = data;
 
 	cnt = pll_14nm_kvco_slop(vco_clk_rate);
 	cnt *= 2;
 	cnt /= 100;
-	cnt *= pin->kvco_measure_time;
-	pout->pll_kvco_count = cnt;
-
-	pout->pll_misc1 = 16;
-	pout->pll_resetsm_cntrl = 48;
-	pout->pll_resetsm_cntrl2 = pin->bandgap_timer << 3;
-	pout->pll_resetsm_cntrl5 = pin->pll_wakeup_timer;
-	pout->pll_kvco_code = 0;
+	cnt *= kvco_measure_time;
+	pconf->pll_kvco_count = cnt;
 }
 
-static void pll_db_commit_ssc(struct dsi_pll_14nm *pll)
+static void pll_db_commit_ssc(struct dsi_pll_14nm *pll, struct dsi_pll_config *pconf)
 {
 	void __iomem *base = pll->phy->pll_base;
-	struct dsi_pll_input *pin = &pll->in;
-	struct dsi_pll_output *pout = &pll->out;
 	u8 data;
 
-	data = pin->ssc_adj_period;
+	data = pconf->ssc_adj_period;
 	data &= 0x0ff;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_ADJ_PER1, data);
-	data = (pin->ssc_adj_period >> 8);
+	data = (pconf->ssc_adj_period >> 8);
 	data &= 0x03;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_ADJ_PER2, data);
 
-	data = pout->ssc_period;
+	data = pconf->ssc_period;
 	data &= 0x0ff;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_PER1, data);
-	data = (pout->ssc_period >> 8);
+	data = (pconf->ssc_period >> 8);
 	data &= 0x0ff;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_PER2, data);
 
-	data = pout->ssc_step_size;
+	data = pconf->ssc_step_size;
 	data &= 0x0ff;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_STEP_SIZE1, data);
-	data = (pout->ssc_step_size >> 8);
+	data = (pconf->ssc_step_size >> 8);
 	data &= 0x0ff;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_STEP_SIZE2, data);
 
-	data = (pin->ssc_center & 0x01);
+	data = (pconf->ssc_center & 0x01);
 	data <<= 1;
 	data |= 0x01; /* enable */
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SSC_EN_CENTER, data);
@@ -409,8 +317,7 @@  static void pll_db_commit_ssc(struct dsi_pll_14nm *pll)
 }
 
 static void pll_db_commit_common(struct dsi_pll_14nm *pll,
-				 struct dsi_pll_input *pin,
-				 struct dsi_pll_output *pout)
+				 struct dsi_pll_config *pconf)
 {
 	void __iomem *base = pll->phy->pll_base;
 	u8 data;
@@ -419,55 +326,41 @@  static void pll_db_commit_common(struct dsi_pll_14nm *pll,
 	data = 0;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_SYSCLK_EN_RESET, data);
 
-	data = pout->pll_txclk_en;
-	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_TXCLK_EN, data);
+	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_TXCLK_EN, 1);
 
-	data = pout->pll_resetsm_cntrl;
-	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL, data);
-	data = pout->pll_resetsm_cntrl2;
-	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL2, data);
-	data = pout->pll_resetsm_cntrl5;
-	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL5, data);
+	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL, 48);
+	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL2, 4 << 3); /* bandgap_timer */
+	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_RESETSM_CNTRL5, 5); /* pll_wakeup_timer */
 
-	data = pout->pll_vco_div_ref & 0xff;
+	data = pconf->pll_vco_div_ref & 0xff;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VCO_DIV_REF1, data);
-	data = (pout->pll_vco_div_ref >> 8) & 0x3;
+	data = (pconf->pll_vco_div_ref >> 8) & 0x3;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VCO_DIV_REF2, data);
 
-	data = pout->pll_kvco_div_ref & 0xff;
+	data = pconf->pll_kvco_div_ref & 0xff;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_KVCO_DIV_REF1, data);
-	data = (pout->pll_kvco_div_ref >> 8) & 0x3;
+	data = (pconf->pll_kvco_div_ref >> 8) & 0x3;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_KVCO_DIV_REF2, data);
 
-	data = pout->pll_misc1;
-	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_MISC1, data);
+	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_MISC1, 16);
 
-	data = pin->pll_ie_trim;
-	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IE_TRIM, data);
+	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IE_TRIM, 4);
 
-	data = pin->pll_ip_trim;
-	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IP_TRIM, data);
+	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IP_TRIM, 4);
 
-	data = pin->pll_cpmset_cur << 3 | pin->pll_cpcset_cur;
-	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_CP_SET_CUR, data);
+	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_CP_SET_CUR, 1 << 3 | 1);
 
-	data = pin->pll_icpcset_p << 3 | pin->pll_icpcset_m;
-	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICPCSET, data);
+	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICPCSET, 0 << 3 | 0);
 
-	data = pin->pll_icpmset_p << 3 | pin->pll_icpcset_m;
-	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICPMSET, data);
+	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICPMSET, 0 << 3 | 0);
 
-	data = pin->pll_icpmset << 3 | pin->pll_icpcset;
-	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICP_SET, data);
+	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_ICP_SET, 4 << 3 | 4);
 
-	data = pin->pll_lpf_cap2 << 4 | pin->pll_lpf_cap1;
-	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_LPF1, data);
+	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_LPF1, 1 << 4 | 11);
 
-	data = pin->pll_iptat_trim;
-	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IPTAT_TRIM, data);
+	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_IPTAT_TRIM, 7);
 
-	data = pin->pll_c3ctrl | pin->pll_r3ctrl << 4;
-	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_CRCTRL, data);
+	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_CRCTRL, 1 << 4 | 2);
 }
 
 static void pll_14nm_software_reset(struct dsi_pll_14nm *pll_14nm)
@@ -488,8 +381,7 @@  static void pll_14nm_software_reset(struct dsi_pll_14nm *pll_14nm)
 }
 
 static void pll_db_commit_14nm(struct dsi_pll_14nm *pll,
-			       struct dsi_pll_input *pin,
-			       struct dsi_pll_output *pout)
+			       struct dsi_pll_config *pconf)
 {
 	void __iomem *base = pll->phy->pll_base;
 	void __iomem *cmn_base = pll->phy->base;
@@ -497,57 +389,64 @@  static void pll_db_commit_14nm(struct dsi_pll_14nm *pll,
 
 	DBG("DSI%d PLL", pll->phy->id);
 
-	data = pout->cmn_ldo_cntrl;
-	dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_LDO_CNTRL, data);
+	dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_LDO_CNTRL, 0x3c);
 
-	pll_db_commit_common(pll, pin, pout);
+	pll_db_commit_common(pll, pconf);
 
 	pll_14nm_software_reset(pll);
 
-	data = pin->dsiclk_sel; /* set dsiclk_sel = 1  */
-	dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_CLK_CFG1, data);
+	/* Use the /2 path in Mux */
+	dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_CLK_CFG1, 1);
 
 	data = 0xff; /* data, clk, pll normal operation */
 	dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_CTRL_0, data);
 
 	/* configure the frequency dependent pll registers */
-	data = pout->dec_start;
+	data = pconf->dec_start;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_DEC_START, data);
 
-	data = pout->div_frac_start & 0xff;
+	data = pconf->div_frac_start & 0xff;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_DIV_FRAC_START1, data);
-	data = (pout->div_frac_start >> 8) & 0xff;
+	data = (pconf->div_frac_start >> 8) & 0xff;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_DIV_FRAC_START2, data);
-	data = (pout->div_frac_start >> 16) & 0xf;
+	data = (pconf->div_frac_start >> 16) & 0xf;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_DIV_FRAC_START3, data);
 
-	data = pout->plllock_cmp & 0xff;
+	data = pconf->plllock_cmp & 0xff;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLLLOCK_CMP1, data);
 
-	data = (pout->plllock_cmp >> 8) & 0xff;
+	data = (pconf->plllock_cmp >> 8) & 0xff;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLLLOCK_CMP2, data);
 
-	data = (pout->plllock_cmp >> 16) & 0x3;
+	data = (pconf->plllock_cmp >> 16) & 0x3;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLLLOCK_CMP3, data);
 
-	data = pin->plllock_cnt << 1 | pin->plllock_rng << 3;
+	data = pconf->plllock_cnt << 1 | 0 << 3; /* plllock_rng */
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLLLOCK_CMP_EN, data);
 
-	data = pout->pll_vco_count & 0xff;
+	data = pconf->pll_vco_count & 0xff;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VCO_COUNT1, data);
-	data = (pout->pll_vco_count >> 8) & 0xff;
+	data = (pconf->pll_vco_count >> 8) & 0xff;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VCO_COUNT2, data);
 
-	data = pout->pll_kvco_count & 0xff;
+	data = pconf->pll_kvco_count & 0xff;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_KVCO_COUNT1, data);
-	data = (pout->pll_kvco_count >> 8) & 0x3;
+	data = (pconf->pll_kvco_count >> 8) & 0x3;
 	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_KVCO_COUNT2, data);
 
-	data = (pout->pll_postdiv - 1) << 4 | pin->pll_lpf_res1;
-	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_LPF2_POSTDIV, data);
+	/*
+	 * High nibble configures the post divider internal to the VCO. It's
+	 * fixed to divide by 1 for now.
+	 *
+	 * 0: divided by 1
+	 * 1: divided by 2
+	 * 2: divided by 4
+	 * 3: divided by 8
+	 */
+	dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_PLL_LPF2_POSTDIV, 0 << 4 | 3);
 
-	if (pin->ssc_en)
-		pll_db_commit_ssc(pll);
+	if (pconf->ssc_en)
+		pll_db_commit_ssc(pll, pconf);
 
 	wmb();	/* make sure register committed */
 }
@@ -559,35 +458,20 @@  static int dsi_pll_14nm_vco_set_rate(struct clk_hw *hw, unsigned long rate,
 				     unsigned long parent_rate)
 {
 	struct dsi_pll_14nm *pll_14nm = to_pll_14nm(hw);
-	struct dsi_pll_input *pin = &pll_14nm->in;
-	struct dsi_pll_output *pout = &pll_14nm->out;
+	struct dsi_pll_config conf;
 
 	DBG("DSI PLL%d rate=%lu, parent's=%lu", pll_14nm->phy->id, rate,
 	    parent_rate);
 
-	pll_14nm->vco_current_rate = rate;
-	pll_14nm->vco_ref_clk_rate = VCO_REF_CLK_RATE;
-
-	dsi_pll_14nm_input_init(pll_14nm);
-
-	/*
-	 * This configures the post divider internal to the VCO. It's
-	 * fixed to divide by 1 for now.
-	 *
-	 * tx_band = pll_postdiv.
-	 * 0: divided by 1
-	 * 1: divided by 2
-	 * 2: divided by 4
-	 * 3: divided by 8
-	 */
-	pout->pll_postdiv = DSI_PLL_DEFAULT_VCO_POSTDIV;
+	dsi_pll_14nm_config_init(&conf);
+	conf.vco_current_rate = rate;
 
-	pll_14nm_dec_frac_calc(pll_14nm);
+	pll_14nm_dec_frac_calc(pll_14nm, &conf);
 
-	if (pin->ssc_en)
-		pll_14nm_ssc_calc(pll_14nm);
+	if (conf.ssc_en)
+		pll_14nm_ssc_calc(pll_14nm, &conf);
 
-	pll_14nm_calc_vco_count(pll_14nm);
+	pll_14nm_calc_vco_count(pll_14nm, &conf);
 
 	/* commit the slave DSI PLL registers if we're master. Note that we
 	 * don't lock the slave PLL. We just ensure that the PLL/PHY registers
@@ -596,10 +480,10 @@  static int dsi_pll_14nm_vco_set_rate(struct clk_hw *hw, unsigned long rate,
 	if (pll_14nm->phy->usecase == MSM_DSI_PHY_MASTER) {
 		struct dsi_pll_14nm *pll_14nm_slave = pll_14nm->slave;
 
-		pll_db_commit_14nm(pll_14nm_slave, pin, pout);
+		pll_db_commit_14nm(pll_14nm_slave, &conf);
 	}
 
-	pll_db_commit_14nm(pll_14nm, pin, pout);
+	pll_db_commit_14nm(pll_14nm, &conf);
 
 	return 0;
 }
diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c
index 4df237ad0eaf..ce6ae2fba993 100644
--- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c
+++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c
@@ -36,43 +36,24 @@ 
  */
 
 #define VCO_REF_CLK_RATE		19200000
-
-struct dsi_pll_regs {
-	u32 pll_prop_gain_rate;
-	u32 pll_lockdet_rate;
-	u32 decimal_div_start;
-	u32 frac_div_start_low;
-	u32 frac_div_start_mid;
-	u32 frac_div_start_high;
-	u32 pll_clock_inverters;
-	u32 ssc_stepsize_low;
-	u32 ssc_stepsize_high;
-	u32 ssc_div_per_low;
-	u32 ssc_div_per_high;
-	u32 ssc_adjper_low;
-	u32 ssc_adjper_high;
-	u32 ssc_control;
-};
+#define FRAC_BITS 18
 
 /* Hardware is V4.1 */
 #define DSI_PHY_7NM_QUIRK_V4_1		BIT(0)
 
 struct dsi_pll_config {
-	u32 ref_freq;
-	bool div_override;
-	u32 output_div;
-	bool ignore_frac;
-	bool disable_prescaler;
 	bool enable_ssc;
 	bool ssc_center;
-	u32 dec_bits;
-	u32 frac_bits;
-	u32 lock_timer;
 	u32 ssc_freq;
 	u32 ssc_offset;
 	u32 ssc_adj_per;
-	u32 thresh_cycles;
-	u32 refclk_cycles;
+
+	/* out */
+	u32 decimal_div_start;
+	u32 frac_div_start;
+	u32 pll_clock_inverters;
+	u32 ssc_stepsize;
+	u32 ssc_div_per;
 };
 
 struct pll_7nm_cached_state {
@@ -88,15 +69,11 @@  struct dsi_pll_7nm {
 
 	struct msm_dsi_phy *phy;
 
-	u64 vco_ref_clk_rate;
 	u64 vco_current_rate;
 
 	/* protects REG_DSI_7nm_PHY_CMN_CLK_CFG0 register */
 	spinlock_t postdiv_lock;
 
-	struct dsi_pll_config pll_configuration;
-	struct dsi_pll_regs reg_setup;
-
 	struct pll_7nm_cached_state cached_state;
 
 	struct dsi_pll_7nm *slave;
@@ -110,35 +87,20 @@  struct dsi_pll_7nm {
  */
 static struct dsi_pll_7nm *pll_7nm_list[DSI_MAX];
 
-static void dsi_pll_setup_config(struct dsi_pll_7nm *pll)
+static void dsi_pll_setup_config(struct dsi_pll_config *config)
 {
-	struct dsi_pll_config *config = &pll->pll_configuration;
-
-	config->ref_freq = pll->vco_ref_clk_rate;
-	config->output_div = 1;
-	config->dec_bits = 8;
-	config->frac_bits = 18;
-	config->lock_timer = 64;
 	config->ssc_freq = 31500;
 	config->ssc_offset = 4800;
 	config->ssc_adj_per = 2;
-	config->thresh_cycles = 32;
-	config->refclk_cycles = 256;
-
-	config->div_override = false;
-	config->ignore_frac = false;
-	config->disable_prescaler = false;
 
 	/* TODO: ssc enable */
 	config->enable_ssc = false;
 	config->ssc_center = 0;
 }
 
-static void dsi_pll_calc_dec_frac(struct dsi_pll_7nm *pll)
+static void dsi_pll_calc_dec_frac(struct dsi_pll_7nm *pll, struct dsi_pll_config *config)
 {
-	struct dsi_pll_config *config = &pll->pll_configuration;
-	struct dsi_pll_regs *regs = &pll->reg_setup;
-	u64 fref = pll->vco_ref_clk_rate;
+	u64 fref = VCO_REF_CLK_RATE;
 	u64 pll_freq;
 	u64 divider;
 	u64 dec, dec_multiple;
@@ -147,42 +109,34 @@  static void dsi_pll_calc_dec_frac(struct dsi_pll_7nm *pll)
 
 	pll_freq = pll->vco_current_rate;
 
-	if (config->disable_prescaler)
-		divider = fref;
-	else
-		divider = fref * 2;
+	divider = fref * 2;
 
-	multiplier = 1 << config->frac_bits;
+	multiplier = 1 << FRAC_BITS;
 	dec_multiple = div_u64(pll_freq * multiplier, divider);
 	div_u64_rem(dec_multiple, multiplier, &frac);
 
 	dec = div_u64(dec_multiple, multiplier);
 
 	if (!(pll->phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V4_1))
-		regs->pll_clock_inverters = 0x28;
+		config->pll_clock_inverters = 0x28;
 	else if (pll_freq <= 1000000000ULL)
-		regs->pll_clock_inverters = 0xa0;
+		config->pll_clock_inverters = 0xa0;
 	else if (pll_freq <= 2500000000ULL)
-		regs->pll_clock_inverters = 0x20;
+		config->pll_clock_inverters = 0x20;
 	else if (pll_freq <= 3020000000ULL)
-		regs->pll_clock_inverters = 0x00;
+		config->pll_clock_inverters = 0x00;
 	else
-		regs->pll_clock_inverters = 0x40;
+		config->pll_clock_inverters = 0x40;
 
-	regs->pll_lockdet_rate = config->lock_timer;
-	regs->decimal_div_start = dec;
-	regs->frac_div_start_low = (frac & 0xff);
-	regs->frac_div_start_mid = (frac & 0xff00) >> 8;
-	regs->frac_div_start_high = (frac & 0x30000) >> 16;
+	config->decimal_div_start = dec;
+	config->frac_div_start = frac;
 }
 
 #define SSC_CENTER		BIT(0)
 #define SSC_EN			BIT(1)
 
-static void dsi_pll_calc_ssc(struct dsi_pll_7nm *pll)
+static void dsi_pll_calc_ssc(struct dsi_pll_7nm *pll, struct dsi_pll_config *config)
 {
-	struct dsi_pll_config *config = &pll->pll_configuration;
-	struct dsi_pll_regs *regs = &pll->reg_setup;
 	u32 ssc_per;
 	u32 ssc_mod;
 	u64 ssc_step_size;
@@ -193,58 +147,49 @@  static void dsi_pll_calc_ssc(struct dsi_pll_7nm *pll)
 		return;
 	}
 
-	ssc_per = DIV_ROUND_CLOSEST(config->ref_freq, config->ssc_freq) / 2 - 1;
+	ssc_per = DIV_ROUND_CLOSEST(VCO_REF_CLK_RATE, config->ssc_freq) / 2 - 1;
 	ssc_mod = (ssc_per + 1) % (config->ssc_adj_per + 1);
 	ssc_per -= ssc_mod;
 
-	frac = regs->frac_div_start_low |
-			(regs->frac_div_start_mid << 8) |
-			(regs->frac_div_start_high << 16);
-	ssc_step_size = regs->decimal_div_start;
-	ssc_step_size *= (1 << config->frac_bits);
+	frac = config->frac_div_start;
+	ssc_step_size = config->decimal_div_start;
+	ssc_step_size *= (1 << FRAC_BITS);
 	ssc_step_size += frac;
 	ssc_step_size *= config->ssc_offset;
 	ssc_step_size *= (config->ssc_adj_per + 1);
 	ssc_step_size = div_u64(ssc_step_size, (ssc_per + 1));
 	ssc_step_size = DIV_ROUND_CLOSEST_ULL(ssc_step_size, 1000000);
 
-	regs->ssc_div_per_low = ssc_per & 0xFF;
-	regs->ssc_div_per_high = (ssc_per & 0xFF00) >> 8;
-	regs->ssc_stepsize_low = (u32)(ssc_step_size & 0xFF);
-	regs->ssc_stepsize_high = (u32)((ssc_step_size & 0xFF00) >> 8);
-	regs->ssc_adjper_low = config->ssc_adj_per & 0xFF;
-	regs->ssc_adjper_high = (config->ssc_adj_per & 0xFF00) >> 8;
-
-	regs->ssc_control = config->ssc_center ? SSC_CENTER : 0;
+	config->ssc_div_per = ssc_per;
+	config->ssc_stepsize = ssc_step_size;
 
 	pr_debug("SCC: Dec:%d, frac:%llu, frac_bits:%d\n",
-		 regs->decimal_div_start, frac, config->frac_bits);
+		 config->decimal_div_start, frac, FRAC_BITS);
 	pr_debug("SSC: div_per:0x%X, stepsize:0x%X, adjper:0x%X\n",
 		 ssc_per, (u32)ssc_step_size, config->ssc_adj_per);
 }
 
-static void dsi_pll_ssc_commit(struct dsi_pll_7nm *pll)
+static void dsi_pll_ssc_commit(struct dsi_pll_7nm *pll, struct dsi_pll_config *config)
 {
 	void __iomem *base = pll->phy->pll_base;
-	struct dsi_pll_regs *regs = &pll->reg_setup;
 
-	if (pll->pll_configuration.enable_ssc) {
+	if (config->enable_ssc) {
 		pr_debug("SSC is enabled\n");
 
 		dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_STEPSIZE_LOW_1,
-			  regs->ssc_stepsize_low);
+			  config->ssc_stepsize & 0xff);
 		dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_STEPSIZE_HIGH_1,
-			  regs->ssc_stepsize_high);
+			  config->ssc_stepsize >> 8);
 		dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_DIV_PER_LOW_1,
-			  regs->ssc_div_per_low);
+			  config->ssc_div_per & 0xff);
 		dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_DIV_PER_HIGH_1,
-			  regs->ssc_div_per_high);
+			  config->ssc_div_per >> 8);
 		dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_ADJPER_LOW_1,
-			  regs->ssc_adjper_low);
+			  config->ssc_adj_per & 0xff);
 		dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_ADJPER_HIGH_1,
-			  regs->ssc_adjper_high);
+			  config->ssc_adj_per >> 8);
 		dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_SSC_CONTROL,
-			  SSC_EN | regs->ssc_control);
+			  SSC_EN | (config->ssc_center ? SSC_CENTER : 0));
 	}
 }
 
@@ -296,44 +241,46 @@  static void dsi_pll_config_hzindep_reg(struct dsi_pll_7nm *pll)
 	}
 }
 
-static void dsi_pll_commit(struct dsi_pll_7nm *pll)
+static void dsi_pll_commit(struct dsi_pll_7nm *pll, struct dsi_pll_config *config)
 {
 	void __iomem *base = pll->phy->pll_base;
-	struct dsi_pll_regs *reg = &pll->reg_setup;
 
 	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_CORE_INPUT_OVERRIDE, 0x12);
-	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_DECIMAL_DIV_START_1, reg->decimal_div_start);
-	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_LOW_1, reg->frac_div_start_low);
-	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_MID_1, reg->frac_div_start_mid);
-	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_HIGH_1, reg->frac_div_start_high);
-	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_PLL_LOCKDET_RATE_1, reg->pll_lockdet_rate);
+	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_DECIMAL_DIV_START_1, config->decimal_div_start);
+	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_LOW_1,
+		  config->frac_div_start & 0xff);
+	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_MID_1,
+		  (config->frac_div_start & 0xff00) >> 8);
+	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_FRAC_DIV_START_HIGH_1,
+		  (config->frac_div_start & 0x30000) >> 16);
+	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_PLL_LOCKDET_RATE_1, 0x40);
 	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_PLL_LOCK_DELAY, 0x06);
 	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_CMODE_1, 0x10); /* TODO: 0x00 for CPHY */
-	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_CLOCK_INVERTERS, reg->pll_clock_inverters);
+	dsi_phy_write(base + REG_DSI_7nm_PHY_PLL_CLOCK_INVERTERS, config->pll_clock_inverters);
 }
 
 static int dsi_pll_7nm_vco_set_rate(struct clk_hw *hw, unsigned long rate,
 				     unsigned long parent_rate)
 {
 	struct dsi_pll_7nm *pll_7nm = to_pll_7nm(hw);
+	struct dsi_pll_config config;
 
 	DBG("DSI PLL%d rate=%lu, parent's=%lu", pll_7nm->phy->id, rate,
 	    parent_rate);
 
 	pll_7nm->vco_current_rate = rate;
-	pll_7nm->vco_ref_clk_rate = VCO_REF_CLK_RATE;
 
-	dsi_pll_setup_config(pll_7nm);
+	dsi_pll_setup_config(&config);
 
-	dsi_pll_calc_dec_frac(pll_7nm);
+	dsi_pll_calc_dec_frac(pll_7nm, &config);
 
-	dsi_pll_calc_ssc(pll_7nm);
+	dsi_pll_calc_ssc(pll_7nm, &config);
 
-	dsi_pll_commit(pll_7nm);
+	dsi_pll_commit(pll_7nm, &config);
 
 	dsi_pll_config_hzindep_reg(pll_7nm);
 
-	dsi_pll_ssc_commit(pll_7nm);
+	dsi_pll_ssc_commit(pll_7nm, &config);
 
 	/* flush, ensure all register writes are done*/
 	wmb();
@@ -486,9 +433,8 @@  static unsigned long dsi_pll_7nm_vco_recalc_rate(struct clk_hw *hw,
 						  unsigned long parent_rate)
 {
 	struct dsi_pll_7nm *pll_7nm = to_pll_7nm(hw);
-	struct dsi_pll_config *config = &pll_7nm->pll_configuration;
 	void __iomem *base = pll_7nm->phy->pll_base;
-	u64 ref_clk = pll_7nm->vco_ref_clk_rate;
+	u64 ref_clk = VCO_REF_CLK_RATE;
 	u64 vco_rate = 0x0;
 	u64 multiplier;
 	u32 frac;
@@ -508,7 +454,7 @@  static unsigned long dsi_pll_7nm_vco_recalc_rate(struct clk_hw *hw,
 	 * TODO:
 	 *	1. Assumes prescaler is disabled
 	 */
-	multiplier = 1 << config->frac_bits;
+	multiplier = 1 << FRAC_BITS;
 	pll_freq = dec * (ref_clk * 2);
 	tmp64 = (ref_clk * 2 * frac);
 	pll_freq += div_u64(tmp64, multiplier);
@@ -590,7 +536,7 @@  static int dsi_7nm_restore_state(struct msm_dsi_phy *phy)
 	val |= cached->pll_mux;
 	dsi_phy_write(phy_base + REG_DSI_7nm_PHY_CMN_CLK_CFG1, val);
 
-	ret = dsi_pll_7nm_vco_set_rate(phy->vco_hw, pll_7nm->vco_current_rate, pll_7nm->vco_ref_clk_rate);
+	ret = dsi_pll_7nm_vco_set_rate(phy->vco_hw, pll_7nm->vco_current_rate, VCO_REF_CLK_RATE);
 	if (ret) {
 		DRM_DEV_ERROR(&pll_7nm->phy->pdev->dev,
 			"restore vco rate failed. ret=%d\n", ret);