@@ -97,6 +97,20 @@ static const struct imx_pll14xx_rate_table *imx_get_pll_settings(
9797 return NULL ;
9898}
9999
100+ static long pll14xx_calc_rate (struct clk_pll14xx * pll , int mdiv , int pdiv ,
101+ int sdiv , int kdiv , unsigned long prate )
102+ {
103+ u64 fvco = prate ;
104+
105+ /* fvco = (m * 65536 + k) * Fin / (p * 65536) */
106+ fvco *= (mdiv * 65536 + kdiv );
107+ pdiv *= 65536 ;
108+
109+ do_div (fvco , pdiv << sdiv );
110+
111+ return fvco ;
112+ }
113+
100114static long clk_pll14xx_round_rate (struct clk_hw * hw , unsigned long rate ,
101115 unsigned long * prate )
102116{
@@ -113,46 +127,25 @@ static long clk_pll14xx_round_rate(struct clk_hw *hw, unsigned long rate,
113127 return rate_table [i - 1 ].rate ;
114128}
115129
116- static unsigned long clk_pll1416x_recalc_rate (struct clk_hw * hw ,
117- unsigned long parent_rate )
118- {
119- struct clk_pll14xx * pll = to_clk_pll14xx (hw );
120- u32 mdiv , pdiv , sdiv , pll_div ;
121- u64 fvco = parent_rate ;
122-
123- pll_div = readl_relaxed (pll -> base + DIV_CTL0 );
124- mdiv = FIELD_GET (MDIV_MASK , pll_div );
125- pdiv = FIELD_GET (PDIV_MASK , pll_div );
126- sdiv = FIELD_GET (SDIV_MASK , pll_div );
127-
128- fvco *= mdiv ;
129- do_div (fvco , pdiv << sdiv );
130-
131- return fvco ;
132- }
133-
134- static unsigned long clk_pll1443x_recalc_rate (struct clk_hw * hw ,
130+ static unsigned long clk_pll14xx_recalc_rate (struct clk_hw * hw ,
135131 unsigned long parent_rate )
136132{
137133 struct clk_pll14xx * pll = to_clk_pll14xx (hw );
138- u32 mdiv , pdiv , sdiv , pll_div_ctl0 , pll_div_ctl1 ;
139- short int kdiv ;
140- u64 fvco = parent_rate ;
134+ u32 mdiv , pdiv , sdiv , kdiv , pll_div_ctl0 , pll_div_ctl1 ;
141135
142136 pll_div_ctl0 = readl_relaxed (pll -> base + DIV_CTL0 );
143- pll_div_ctl1 = readl_relaxed (pll -> base + DIV_CTL1 );
144137 mdiv = FIELD_GET (MDIV_MASK , pll_div_ctl0 );
145138 pdiv = FIELD_GET (PDIV_MASK , pll_div_ctl0 );
146139 sdiv = FIELD_GET (SDIV_MASK , pll_div_ctl0 );
147- kdiv = FIELD_GET (KDIV_MASK , pll_div_ctl1 );
148140
149- /* fvco = (m * 65536 + k) * Fin / (p * 65536) */
150- fvco *= (mdiv * 65536 + kdiv );
151- pdiv *= 65536 ;
152-
153- do_div (fvco , pdiv << sdiv );
141+ if (pll -> type == PLL_1443X ) {
142+ pll_div_ctl1 = readl_relaxed (pll -> base + DIV_CTL1 );
143+ kdiv = FIELD_GET (KDIV_MASK , pll_div_ctl1 );
144+ } else {
145+ kdiv = 0 ;
146+ }
154147
155- return fvco ;
148+ return pll14xx_calc_rate ( pll , mdiv , pdiv , sdiv , kdiv , parent_rate ) ;
156149}
157150
158151static inline bool clk_pll14xx_mp_change (const struct imx_pll14xx_rate_table * rate ,
@@ -363,20 +356,20 @@ static const struct clk_ops clk_pll1416x_ops = {
363356 .prepare = clk_pll14xx_prepare ,
364357 .unprepare = clk_pll14xx_unprepare ,
365358 .is_prepared = clk_pll14xx_is_prepared ,
366- .recalc_rate = clk_pll1416x_recalc_rate ,
359+ .recalc_rate = clk_pll14xx_recalc_rate ,
367360 .round_rate = clk_pll14xx_round_rate ,
368361 .set_rate = clk_pll1416x_set_rate ,
369362};
370363
371364static const struct clk_ops clk_pll1416x_min_ops = {
372- .recalc_rate = clk_pll1416x_recalc_rate ,
365+ .recalc_rate = clk_pll14xx_recalc_rate ,
373366};
374367
375368static const struct clk_ops clk_pll1443x_ops = {
376369 .prepare = clk_pll14xx_prepare ,
377370 .unprepare = clk_pll14xx_unprepare ,
378371 .is_prepared = clk_pll14xx_is_prepared ,
379- .recalc_rate = clk_pll1443x_recalc_rate ,
372+ .recalc_rate = clk_pll14xx_recalc_rate ,
380373 .round_rate = clk_pll14xx_round_rate ,
381374 .set_rate = clk_pll1443x_set_rate ,
382375};
0 commit comments