1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (C) 2012 ST Microelectronics
3*4882a593Smuzhiyun * Viresh Kumar <vireshk@kernel.org>
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * This file is licensed under the terms of the GNU General Public
6*4882a593Smuzhiyun * License version 2. This program is licensed "as is" without any
7*4882a593Smuzhiyun * warranty of any kind, whether express or implied.
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * VCO-PLL clock implementation
10*4882a593Smuzhiyun */
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #define pr_fmt(fmt) "clk-vco-pll: " fmt
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun #include <linux/clk-provider.h>
15*4882a593Smuzhiyun #include <linux/slab.h>
16*4882a593Smuzhiyun #include <linux/io.h>
17*4882a593Smuzhiyun #include <linux/err.h>
18*4882a593Smuzhiyun #include "clk.h"
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun /*
21*4882a593Smuzhiyun * DOC: VCO-PLL clock
22*4882a593Smuzhiyun *
23*4882a593Smuzhiyun * VCO and PLL rate are derived from following equations:
24*4882a593Smuzhiyun *
25*4882a593Smuzhiyun * In normal mode
26*4882a593Smuzhiyun * vco = (2 * M[15:8] * Fin)/N
27*4882a593Smuzhiyun *
28*4882a593Smuzhiyun * In Dithered mode
29*4882a593Smuzhiyun * vco = (2 * M[15:0] * Fin)/(256 * N)
30*4882a593Smuzhiyun *
31*4882a593Smuzhiyun * pll_rate = pll/2^p
32*4882a593Smuzhiyun *
33*4882a593Smuzhiyun * vco and pll are very closely bound to each other, "vco needs to program:
34*4882a593Smuzhiyun * mode, m & n" and "pll needs to program p", both share common enable/disable
35*4882a593Smuzhiyun * logic.
36*4882a593Smuzhiyun *
37*4882a593Smuzhiyun * clk_register_vco_pll() registers instances of both vco & pll.
38*4882a593Smuzhiyun * CLK_SET_RATE_PARENT flag is forced for pll, as it will always pass its
39*4882a593Smuzhiyun * set_rate to vco. A single rate table exists for both the clocks, which
40*4882a593Smuzhiyun * configures m, n and p.
41*4882a593Smuzhiyun */
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun /* PLL_CTR register masks */
44*4882a593Smuzhiyun #define PLL_MODE_NORMAL 0
45*4882a593Smuzhiyun #define PLL_MODE_FRACTION 1
46*4882a593Smuzhiyun #define PLL_MODE_DITH_DSM 2
47*4882a593Smuzhiyun #define PLL_MODE_DITH_SSM 3
48*4882a593Smuzhiyun #define PLL_MODE_MASK 3
49*4882a593Smuzhiyun #define PLL_MODE_SHIFT 3
50*4882a593Smuzhiyun #define PLL_ENABLE 2
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun #define PLL_LOCK_SHIFT 0
53*4882a593Smuzhiyun #define PLL_LOCK_MASK 1
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun /* PLL FRQ register masks */
56*4882a593Smuzhiyun #define PLL_NORM_FDBK_M_MASK 0xFF
57*4882a593Smuzhiyun #define PLL_NORM_FDBK_M_SHIFT 24
58*4882a593Smuzhiyun #define PLL_DITH_FDBK_M_MASK 0xFFFF
59*4882a593Smuzhiyun #define PLL_DITH_FDBK_M_SHIFT 16
60*4882a593Smuzhiyun #define PLL_DIV_P_MASK 0x7
61*4882a593Smuzhiyun #define PLL_DIV_P_SHIFT 8
62*4882a593Smuzhiyun #define PLL_DIV_N_MASK 0xFF
63*4882a593Smuzhiyun #define PLL_DIV_N_SHIFT 0
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun #define to_clk_vco(_hw) container_of(_hw, struct clk_vco, hw)
66*4882a593Smuzhiyun #define to_clk_pll(_hw) container_of(_hw, struct clk_pll, hw)
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun /* Calculates pll clk rate for specific value of mode, m, n and p */
pll_calc_rate(struct pll_rate_tbl * rtbl,unsigned long prate,int index,unsigned long * pll_rate)69*4882a593Smuzhiyun static unsigned long pll_calc_rate(struct pll_rate_tbl *rtbl,
70*4882a593Smuzhiyun unsigned long prate, int index, unsigned long *pll_rate)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun unsigned long rate = prate;
73*4882a593Smuzhiyun unsigned int mode;
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun mode = rtbl[index].mode ? 256 : 1;
76*4882a593Smuzhiyun rate = (((2 * rate / 10000) * rtbl[index].m) / (mode * rtbl[index].n));
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun if (pll_rate)
79*4882a593Smuzhiyun *pll_rate = (rate / (1 << rtbl[index].p)) * 10000;
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun return rate * 10000;
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun
clk_pll_round_rate_index(struct clk_hw * hw,unsigned long drate,unsigned long * prate,int * index)84*4882a593Smuzhiyun static long clk_pll_round_rate_index(struct clk_hw *hw, unsigned long drate,
85*4882a593Smuzhiyun unsigned long *prate, int *index)
86*4882a593Smuzhiyun {
87*4882a593Smuzhiyun struct clk_pll *pll = to_clk_pll(hw);
88*4882a593Smuzhiyun unsigned long prev_rate, vco_prev_rate, rate = 0;
89*4882a593Smuzhiyun unsigned long vco_parent_rate =
90*4882a593Smuzhiyun clk_hw_get_rate(clk_hw_get_parent(clk_hw_get_parent(hw)));
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun if (!prate) {
93*4882a593Smuzhiyun pr_err("%s: prate is must for pll clk\n", __func__);
94*4882a593Smuzhiyun return -EINVAL;
95*4882a593Smuzhiyun }
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun for (*index = 0; *index < pll->vco->rtbl_cnt; (*index)++) {
98*4882a593Smuzhiyun prev_rate = rate;
99*4882a593Smuzhiyun vco_prev_rate = *prate;
100*4882a593Smuzhiyun *prate = pll_calc_rate(pll->vco->rtbl, vco_parent_rate, *index,
101*4882a593Smuzhiyun &rate);
102*4882a593Smuzhiyun if (drate < rate) {
103*4882a593Smuzhiyun /* previous clock was best */
104*4882a593Smuzhiyun if (*index) {
105*4882a593Smuzhiyun rate = prev_rate;
106*4882a593Smuzhiyun *prate = vco_prev_rate;
107*4882a593Smuzhiyun (*index)--;
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun break;
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun }
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun return rate;
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun
clk_pll_round_rate(struct clk_hw * hw,unsigned long drate,unsigned long * prate)116*4882a593Smuzhiyun static long clk_pll_round_rate(struct clk_hw *hw, unsigned long drate,
117*4882a593Smuzhiyun unsigned long *prate)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun int unused;
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun return clk_pll_round_rate_index(hw, drate, prate, &unused);
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun
clk_pll_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)124*4882a593Smuzhiyun static unsigned long clk_pll_recalc_rate(struct clk_hw *hw, unsigned long
125*4882a593Smuzhiyun parent_rate)
126*4882a593Smuzhiyun {
127*4882a593Smuzhiyun struct clk_pll *pll = to_clk_pll(hw);
128*4882a593Smuzhiyun unsigned long flags = 0;
129*4882a593Smuzhiyun unsigned int p;
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun if (pll->vco->lock)
132*4882a593Smuzhiyun spin_lock_irqsave(pll->vco->lock, flags);
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun p = readl_relaxed(pll->vco->cfg_reg);
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun if (pll->vco->lock)
137*4882a593Smuzhiyun spin_unlock_irqrestore(pll->vco->lock, flags);
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun p = (p >> PLL_DIV_P_SHIFT) & PLL_DIV_P_MASK;
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun return parent_rate / (1 << p);
142*4882a593Smuzhiyun }
143*4882a593Smuzhiyun
clk_pll_set_rate(struct clk_hw * hw,unsigned long drate,unsigned long prate)144*4882a593Smuzhiyun static int clk_pll_set_rate(struct clk_hw *hw, unsigned long drate,
145*4882a593Smuzhiyun unsigned long prate)
146*4882a593Smuzhiyun {
147*4882a593Smuzhiyun struct clk_pll *pll = to_clk_pll(hw);
148*4882a593Smuzhiyun struct pll_rate_tbl *rtbl = pll->vco->rtbl;
149*4882a593Smuzhiyun unsigned long flags = 0, val;
150*4882a593Smuzhiyun int i = 0;
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun clk_pll_round_rate_index(hw, drate, NULL, &i);
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun if (pll->vco->lock)
155*4882a593Smuzhiyun spin_lock_irqsave(pll->vco->lock, flags);
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun val = readl_relaxed(pll->vco->cfg_reg);
158*4882a593Smuzhiyun val &= ~(PLL_DIV_P_MASK << PLL_DIV_P_SHIFT);
159*4882a593Smuzhiyun val |= (rtbl[i].p & PLL_DIV_P_MASK) << PLL_DIV_P_SHIFT;
160*4882a593Smuzhiyun writel_relaxed(val, pll->vco->cfg_reg);
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun if (pll->vco->lock)
163*4882a593Smuzhiyun spin_unlock_irqrestore(pll->vco->lock, flags);
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun return 0;
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun static const struct clk_ops clk_pll_ops = {
169*4882a593Smuzhiyun .recalc_rate = clk_pll_recalc_rate,
170*4882a593Smuzhiyun .round_rate = clk_pll_round_rate,
171*4882a593Smuzhiyun .set_rate = clk_pll_set_rate,
172*4882a593Smuzhiyun };
173*4882a593Smuzhiyun
vco_calc_rate(struct clk_hw * hw,unsigned long prate,int index)174*4882a593Smuzhiyun static inline unsigned long vco_calc_rate(struct clk_hw *hw,
175*4882a593Smuzhiyun unsigned long prate, int index)
176*4882a593Smuzhiyun {
177*4882a593Smuzhiyun struct clk_vco *vco = to_clk_vco(hw);
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun return pll_calc_rate(vco->rtbl, prate, index, NULL);
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun
clk_vco_round_rate(struct clk_hw * hw,unsigned long drate,unsigned long * prate)182*4882a593Smuzhiyun static long clk_vco_round_rate(struct clk_hw *hw, unsigned long drate,
183*4882a593Smuzhiyun unsigned long *prate)
184*4882a593Smuzhiyun {
185*4882a593Smuzhiyun struct clk_vco *vco = to_clk_vco(hw);
186*4882a593Smuzhiyun int unused;
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun return clk_round_rate_index(hw, drate, *prate, vco_calc_rate,
189*4882a593Smuzhiyun vco->rtbl_cnt, &unused);
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun
clk_vco_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)192*4882a593Smuzhiyun static unsigned long clk_vco_recalc_rate(struct clk_hw *hw,
193*4882a593Smuzhiyun unsigned long parent_rate)
194*4882a593Smuzhiyun {
195*4882a593Smuzhiyun struct clk_vco *vco = to_clk_vco(hw);
196*4882a593Smuzhiyun unsigned long flags = 0;
197*4882a593Smuzhiyun unsigned int num = 2, den = 0, val, mode = 0;
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun if (vco->lock)
200*4882a593Smuzhiyun spin_lock_irqsave(vco->lock, flags);
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun mode = (readl_relaxed(vco->mode_reg) >> PLL_MODE_SHIFT) & PLL_MODE_MASK;
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun val = readl_relaxed(vco->cfg_reg);
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun if (vco->lock)
207*4882a593Smuzhiyun spin_unlock_irqrestore(vco->lock, flags);
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun den = (val >> PLL_DIV_N_SHIFT) & PLL_DIV_N_MASK;
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun /* calculate numerator & denominator */
212*4882a593Smuzhiyun if (!mode) {
213*4882a593Smuzhiyun /* Normal mode */
214*4882a593Smuzhiyun num *= (val >> PLL_NORM_FDBK_M_SHIFT) & PLL_NORM_FDBK_M_MASK;
215*4882a593Smuzhiyun } else {
216*4882a593Smuzhiyun /* Dithered mode */
217*4882a593Smuzhiyun num *= (val >> PLL_DITH_FDBK_M_SHIFT) & PLL_DITH_FDBK_M_MASK;
218*4882a593Smuzhiyun den *= 256;
219*4882a593Smuzhiyun }
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun if (!den) {
222*4882a593Smuzhiyun WARN(1, "%s: denominator can't be zero\n", __func__);
223*4882a593Smuzhiyun return 0;
224*4882a593Smuzhiyun }
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun return (((parent_rate / 10000) * num) / den) * 10000;
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun /* Configures new clock rate of vco */
clk_vco_set_rate(struct clk_hw * hw,unsigned long drate,unsigned long prate)230*4882a593Smuzhiyun static int clk_vco_set_rate(struct clk_hw *hw, unsigned long drate,
231*4882a593Smuzhiyun unsigned long prate)
232*4882a593Smuzhiyun {
233*4882a593Smuzhiyun struct clk_vco *vco = to_clk_vco(hw);
234*4882a593Smuzhiyun struct pll_rate_tbl *rtbl = vco->rtbl;
235*4882a593Smuzhiyun unsigned long flags = 0, val;
236*4882a593Smuzhiyun int i;
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun clk_round_rate_index(hw, drate, prate, vco_calc_rate, vco->rtbl_cnt,
239*4882a593Smuzhiyun &i);
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun if (vco->lock)
242*4882a593Smuzhiyun spin_lock_irqsave(vco->lock, flags);
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun val = readl_relaxed(vco->mode_reg);
245*4882a593Smuzhiyun val &= ~(PLL_MODE_MASK << PLL_MODE_SHIFT);
246*4882a593Smuzhiyun val |= (rtbl[i].mode & PLL_MODE_MASK) << PLL_MODE_SHIFT;
247*4882a593Smuzhiyun writel_relaxed(val, vco->mode_reg);
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun val = readl_relaxed(vco->cfg_reg);
250*4882a593Smuzhiyun val &= ~(PLL_DIV_N_MASK << PLL_DIV_N_SHIFT);
251*4882a593Smuzhiyun val |= (rtbl[i].n & PLL_DIV_N_MASK) << PLL_DIV_N_SHIFT;
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun val &= ~(PLL_DITH_FDBK_M_MASK << PLL_DITH_FDBK_M_SHIFT);
254*4882a593Smuzhiyun if (rtbl[i].mode)
255*4882a593Smuzhiyun val |= (rtbl[i].m & PLL_DITH_FDBK_M_MASK) <<
256*4882a593Smuzhiyun PLL_DITH_FDBK_M_SHIFT;
257*4882a593Smuzhiyun else
258*4882a593Smuzhiyun val |= (rtbl[i].m & PLL_NORM_FDBK_M_MASK) <<
259*4882a593Smuzhiyun PLL_NORM_FDBK_M_SHIFT;
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun writel_relaxed(val, vco->cfg_reg);
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun if (vco->lock)
264*4882a593Smuzhiyun spin_unlock_irqrestore(vco->lock, flags);
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun return 0;
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun static const struct clk_ops clk_vco_ops = {
270*4882a593Smuzhiyun .recalc_rate = clk_vco_recalc_rate,
271*4882a593Smuzhiyun .round_rate = clk_vco_round_rate,
272*4882a593Smuzhiyun .set_rate = clk_vco_set_rate,
273*4882a593Smuzhiyun };
274*4882a593Smuzhiyun
clk_register_vco_pll(const char * vco_name,const char * pll_name,const char * vco_gate_name,const char * parent_name,unsigned long flags,void __iomem * mode_reg,void __iomem * cfg_reg,struct pll_rate_tbl * rtbl,u8 rtbl_cnt,spinlock_t * lock,struct clk ** pll_clk,struct clk ** vco_gate_clk)275*4882a593Smuzhiyun struct clk *clk_register_vco_pll(const char *vco_name, const char *pll_name,
276*4882a593Smuzhiyun const char *vco_gate_name, const char *parent_name,
277*4882a593Smuzhiyun unsigned long flags, void __iomem *mode_reg, void __iomem
278*4882a593Smuzhiyun *cfg_reg, struct pll_rate_tbl *rtbl, u8 rtbl_cnt,
279*4882a593Smuzhiyun spinlock_t *lock, struct clk **pll_clk,
280*4882a593Smuzhiyun struct clk **vco_gate_clk)
281*4882a593Smuzhiyun {
282*4882a593Smuzhiyun struct clk_vco *vco;
283*4882a593Smuzhiyun struct clk_pll *pll;
284*4882a593Smuzhiyun struct clk *vco_clk, *tpll_clk, *tvco_gate_clk;
285*4882a593Smuzhiyun struct clk_init_data vco_init, pll_init;
286*4882a593Smuzhiyun const char **vco_parent_name;
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun if (!vco_name || !pll_name || !parent_name || !mode_reg || !cfg_reg ||
289*4882a593Smuzhiyun !rtbl || !rtbl_cnt) {
290*4882a593Smuzhiyun pr_err("Invalid arguments passed");
291*4882a593Smuzhiyun return ERR_PTR(-EINVAL);
292*4882a593Smuzhiyun }
293*4882a593Smuzhiyun
294*4882a593Smuzhiyun vco = kzalloc(sizeof(*vco), GFP_KERNEL);
295*4882a593Smuzhiyun if (!vco)
296*4882a593Smuzhiyun return ERR_PTR(-ENOMEM);
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun pll = kzalloc(sizeof(*pll), GFP_KERNEL);
299*4882a593Smuzhiyun if (!pll)
300*4882a593Smuzhiyun goto free_vco;
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun /* struct clk_vco assignments */
303*4882a593Smuzhiyun vco->mode_reg = mode_reg;
304*4882a593Smuzhiyun vco->cfg_reg = cfg_reg;
305*4882a593Smuzhiyun vco->rtbl = rtbl;
306*4882a593Smuzhiyun vco->rtbl_cnt = rtbl_cnt;
307*4882a593Smuzhiyun vco->lock = lock;
308*4882a593Smuzhiyun vco->hw.init = &vco_init;
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun pll->vco = vco;
311*4882a593Smuzhiyun pll->hw.init = &pll_init;
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun if (vco_gate_name) {
314*4882a593Smuzhiyun tvco_gate_clk = clk_register_gate(NULL, vco_gate_name,
315*4882a593Smuzhiyun parent_name, 0, mode_reg, PLL_ENABLE, 0, lock);
316*4882a593Smuzhiyun if (IS_ERR_OR_NULL(tvco_gate_clk))
317*4882a593Smuzhiyun goto free_pll;
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun if (vco_gate_clk)
320*4882a593Smuzhiyun *vco_gate_clk = tvco_gate_clk;
321*4882a593Smuzhiyun vco_parent_name = &vco_gate_name;
322*4882a593Smuzhiyun } else {
323*4882a593Smuzhiyun vco_parent_name = &parent_name;
324*4882a593Smuzhiyun }
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun vco_init.name = vco_name;
327*4882a593Smuzhiyun vco_init.ops = &clk_vco_ops;
328*4882a593Smuzhiyun vco_init.flags = flags;
329*4882a593Smuzhiyun vco_init.parent_names = vco_parent_name;
330*4882a593Smuzhiyun vco_init.num_parents = 1;
331*4882a593Smuzhiyun
332*4882a593Smuzhiyun pll_init.name = pll_name;
333*4882a593Smuzhiyun pll_init.ops = &clk_pll_ops;
334*4882a593Smuzhiyun pll_init.flags = CLK_SET_RATE_PARENT;
335*4882a593Smuzhiyun pll_init.parent_names = &vco_name;
336*4882a593Smuzhiyun pll_init.num_parents = 1;
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun vco_clk = clk_register(NULL, &vco->hw);
339*4882a593Smuzhiyun if (IS_ERR_OR_NULL(vco_clk))
340*4882a593Smuzhiyun goto free_pll;
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun tpll_clk = clk_register(NULL, &pll->hw);
343*4882a593Smuzhiyun if (IS_ERR_OR_NULL(tpll_clk))
344*4882a593Smuzhiyun goto free_pll;
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun if (pll_clk)
347*4882a593Smuzhiyun *pll_clk = tpll_clk;
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun return vco_clk;
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun free_pll:
352*4882a593Smuzhiyun kfree(pll);
353*4882a593Smuzhiyun free_vco:
354*4882a593Smuzhiyun kfree(vco);
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun pr_err("Failed to register vco pll clock\n");
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun return ERR_PTR(-ENOMEM);
359*4882a593Smuzhiyun }
360