xref: /OK3568_Linux_fs/kernel/drivers/clk/spear/clk-vco-pll.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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