xref: /OK3568_Linux_fs/kernel/drivers/clk/ti/fapll.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or
3*4882a593Smuzhiyun  * modify it under the terms of the GNU General Public License as
4*4882a593Smuzhiyun  * published by the Free Software Foundation version 2.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * This program is distributed "as is" WITHOUT ANY WARRANTY of any
7*4882a593Smuzhiyun  * kind, whether express or implied; without even the implied warranty
8*4882a593Smuzhiyun  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9*4882a593Smuzhiyun  * GNU General Public License for more details.
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/clk.h>
13*4882a593Smuzhiyun #include <linux/clk-provider.h>
14*4882a593Smuzhiyun #include <linux/delay.h>
15*4882a593Smuzhiyun #include <linux/err.h>
16*4882a593Smuzhiyun #include <linux/io.h>
17*4882a593Smuzhiyun #include <linux/math64.h>
18*4882a593Smuzhiyun #include <linux/of.h>
19*4882a593Smuzhiyun #include <linux/of_address.h>
20*4882a593Smuzhiyun #include <linux/clk/ti.h>
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun /* FAPLL Control Register PLL_CTRL */
23*4882a593Smuzhiyun #define FAPLL_MAIN_MULT_N_SHIFT	16
24*4882a593Smuzhiyun #define FAPLL_MAIN_DIV_P_SHIFT	8
25*4882a593Smuzhiyun #define FAPLL_MAIN_LOCK		BIT(7)
26*4882a593Smuzhiyun #define FAPLL_MAIN_PLLEN	BIT(3)
27*4882a593Smuzhiyun #define FAPLL_MAIN_BP		BIT(2)
28*4882a593Smuzhiyun #define FAPLL_MAIN_LOC_CTL	BIT(0)
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #define FAPLL_MAIN_MAX_MULT_N	0xffff
31*4882a593Smuzhiyun #define FAPLL_MAIN_MAX_DIV_P	0xff
32*4882a593Smuzhiyun #define FAPLL_MAIN_CLEAR_MASK	\
33*4882a593Smuzhiyun 	((FAPLL_MAIN_MAX_MULT_N << FAPLL_MAIN_MULT_N_SHIFT) | \
34*4882a593Smuzhiyun 	 (FAPLL_MAIN_DIV_P_SHIFT << FAPLL_MAIN_DIV_P_SHIFT) | \
35*4882a593Smuzhiyun 	 FAPLL_MAIN_LOC_CTL)
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun /* FAPLL powerdown register PWD */
38*4882a593Smuzhiyun #define FAPLL_PWD_OFFSET	4
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #define MAX_FAPLL_OUTPUTS	7
41*4882a593Smuzhiyun #define FAPLL_MAX_RETRIES	1000
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #define to_fapll(_hw)		container_of(_hw, struct fapll_data, hw)
44*4882a593Smuzhiyun #define to_synth(_hw)		container_of(_hw, struct fapll_synth, hw)
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun /* The bypass bit is inverted on the ddr_pll.. */
47*4882a593Smuzhiyun #define fapll_is_ddr_pll(va)	(((u32)(va) & 0xffff) == 0x0440)
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun /*
50*4882a593Smuzhiyun  * The audio_pll_clk1 input is hard wired to the 27MHz bypass clock,
51*4882a593Smuzhiyun  * and the audio_pll_clk1 synthesizer is hardwared to 32KiHz output.
52*4882a593Smuzhiyun  */
53*4882a593Smuzhiyun #define is_ddr_pll_clk1(va)	(((u32)(va) & 0xffff) == 0x044c)
54*4882a593Smuzhiyun #define is_audio_pll_clk1(va)	(((u32)(va) & 0xffff) == 0x04a8)
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun /* Synthesizer divider register */
57*4882a593Smuzhiyun #define SYNTH_LDMDIV1		BIT(8)
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun /* Synthesizer frequency register */
60*4882a593Smuzhiyun #define SYNTH_LDFREQ		BIT(31)
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #define SYNTH_PHASE_K		8
63*4882a593Smuzhiyun #define SYNTH_MAX_INT_DIV	0xf
64*4882a593Smuzhiyun #define SYNTH_MAX_DIV_M		0xff
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun struct fapll_data {
67*4882a593Smuzhiyun 	struct clk_hw hw;
68*4882a593Smuzhiyun 	void __iomem *base;
69*4882a593Smuzhiyun 	const char *name;
70*4882a593Smuzhiyun 	struct clk *clk_ref;
71*4882a593Smuzhiyun 	struct clk *clk_bypass;
72*4882a593Smuzhiyun 	struct clk_onecell_data outputs;
73*4882a593Smuzhiyun 	bool bypass_bit_inverted;
74*4882a593Smuzhiyun };
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun struct fapll_synth {
77*4882a593Smuzhiyun 	struct clk_hw hw;
78*4882a593Smuzhiyun 	struct fapll_data *fd;
79*4882a593Smuzhiyun 	int index;
80*4882a593Smuzhiyun 	void __iomem *freq;
81*4882a593Smuzhiyun 	void __iomem *div;
82*4882a593Smuzhiyun 	const char *name;
83*4882a593Smuzhiyun 	struct clk *clk_pll;
84*4882a593Smuzhiyun };
85*4882a593Smuzhiyun 
ti_fapll_clock_is_bypass(struct fapll_data * fd)86*4882a593Smuzhiyun static bool ti_fapll_clock_is_bypass(struct fapll_data *fd)
87*4882a593Smuzhiyun {
88*4882a593Smuzhiyun 	u32 v = readl_relaxed(fd->base);
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	if (fd->bypass_bit_inverted)
91*4882a593Smuzhiyun 		return !(v & FAPLL_MAIN_BP);
92*4882a593Smuzhiyun 	else
93*4882a593Smuzhiyun 		return !!(v & FAPLL_MAIN_BP);
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun 
ti_fapll_set_bypass(struct fapll_data * fd)96*4882a593Smuzhiyun static void ti_fapll_set_bypass(struct fapll_data *fd)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun 	u32 v = readl_relaxed(fd->base);
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	if (fd->bypass_bit_inverted)
101*4882a593Smuzhiyun 		v &= ~FAPLL_MAIN_BP;
102*4882a593Smuzhiyun 	else
103*4882a593Smuzhiyun 		v |= FAPLL_MAIN_BP;
104*4882a593Smuzhiyun 	writel_relaxed(v, fd->base);
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun 
ti_fapll_clear_bypass(struct fapll_data * fd)107*4882a593Smuzhiyun static void ti_fapll_clear_bypass(struct fapll_data *fd)
108*4882a593Smuzhiyun {
109*4882a593Smuzhiyun 	u32 v = readl_relaxed(fd->base);
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	if (fd->bypass_bit_inverted)
112*4882a593Smuzhiyun 		v |= FAPLL_MAIN_BP;
113*4882a593Smuzhiyun 	else
114*4882a593Smuzhiyun 		v &= ~FAPLL_MAIN_BP;
115*4882a593Smuzhiyun 	writel_relaxed(v, fd->base);
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun 
ti_fapll_wait_lock(struct fapll_data * fd)118*4882a593Smuzhiyun static int ti_fapll_wait_lock(struct fapll_data *fd)
119*4882a593Smuzhiyun {
120*4882a593Smuzhiyun 	int retries = FAPLL_MAX_RETRIES;
121*4882a593Smuzhiyun 	u32 v;
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun 	while ((v = readl_relaxed(fd->base))) {
124*4882a593Smuzhiyun 		if (v & FAPLL_MAIN_LOCK)
125*4882a593Smuzhiyun 			return 0;
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 		if (retries-- <= 0)
128*4882a593Smuzhiyun 			break;
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun 		udelay(1);
131*4882a593Smuzhiyun 	}
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 	pr_err("%s failed to lock\n", fd->name);
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun 	return -ETIMEDOUT;
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun 
ti_fapll_enable(struct clk_hw * hw)138*4882a593Smuzhiyun static int ti_fapll_enable(struct clk_hw *hw)
139*4882a593Smuzhiyun {
140*4882a593Smuzhiyun 	struct fapll_data *fd = to_fapll(hw);
141*4882a593Smuzhiyun 	u32 v = readl_relaxed(fd->base);
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 	v |= FAPLL_MAIN_PLLEN;
144*4882a593Smuzhiyun 	writel_relaxed(v, fd->base);
145*4882a593Smuzhiyun 	ti_fapll_wait_lock(fd);
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	return 0;
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun 
ti_fapll_disable(struct clk_hw * hw)150*4882a593Smuzhiyun static void ti_fapll_disable(struct clk_hw *hw)
151*4882a593Smuzhiyun {
152*4882a593Smuzhiyun 	struct fapll_data *fd = to_fapll(hw);
153*4882a593Smuzhiyun 	u32 v = readl_relaxed(fd->base);
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 	v &= ~FAPLL_MAIN_PLLEN;
156*4882a593Smuzhiyun 	writel_relaxed(v, fd->base);
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun 
ti_fapll_is_enabled(struct clk_hw * hw)159*4882a593Smuzhiyun static int ti_fapll_is_enabled(struct clk_hw *hw)
160*4882a593Smuzhiyun {
161*4882a593Smuzhiyun 	struct fapll_data *fd = to_fapll(hw);
162*4882a593Smuzhiyun 	u32 v = readl_relaxed(fd->base);
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun 	return v & FAPLL_MAIN_PLLEN;
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
ti_fapll_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)167*4882a593Smuzhiyun static unsigned long ti_fapll_recalc_rate(struct clk_hw *hw,
168*4882a593Smuzhiyun 					  unsigned long parent_rate)
169*4882a593Smuzhiyun {
170*4882a593Smuzhiyun 	struct fapll_data *fd = to_fapll(hw);
171*4882a593Smuzhiyun 	u32 fapll_n, fapll_p, v;
172*4882a593Smuzhiyun 	u64 rate;
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	if (ti_fapll_clock_is_bypass(fd))
175*4882a593Smuzhiyun 		return parent_rate;
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun 	rate = parent_rate;
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun 	/* PLL pre-divider is P and multiplier is N */
180*4882a593Smuzhiyun 	v = readl_relaxed(fd->base);
181*4882a593Smuzhiyun 	fapll_p = (v >> 8) & 0xff;
182*4882a593Smuzhiyun 	if (fapll_p)
183*4882a593Smuzhiyun 		do_div(rate, fapll_p);
184*4882a593Smuzhiyun 	fapll_n = v >> 16;
185*4882a593Smuzhiyun 	if (fapll_n)
186*4882a593Smuzhiyun 		rate *= fapll_n;
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	return rate;
189*4882a593Smuzhiyun }
190*4882a593Smuzhiyun 
ti_fapll_get_parent(struct clk_hw * hw)191*4882a593Smuzhiyun static u8 ti_fapll_get_parent(struct clk_hw *hw)
192*4882a593Smuzhiyun {
193*4882a593Smuzhiyun 	struct fapll_data *fd = to_fapll(hw);
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun 	if (ti_fapll_clock_is_bypass(fd))
196*4882a593Smuzhiyun 		return 1;
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun 	return 0;
199*4882a593Smuzhiyun }
200*4882a593Smuzhiyun 
ti_fapll_set_div_mult(unsigned long rate,unsigned long parent_rate,u32 * pre_div_p,u32 * mult_n)201*4882a593Smuzhiyun static int ti_fapll_set_div_mult(unsigned long rate,
202*4882a593Smuzhiyun 				 unsigned long parent_rate,
203*4882a593Smuzhiyun 				 u32 *pre_div_p, u32 *mult_n)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun 	/*
206*4882a593Smuzhiyun 	 * So far no luck getting decent clock with PLL divider,
207*4882a593Smuzhiyun 	 * PLL does not seem to lock and the signal does not look
208*4882a593Smuzhiyun 	 * right. It seems the divider can only be used together
209*4882a593Smuzhiyun 	 * with the multiplier?
210*4882a593Smuzhiyun 	 */
211*4882a593Smuzhiyun 	if (rate < parent_rate) {
212*4882a593Smuzhiyun 		pr_warn("FAPLL main divider rates unsupported\n");
213*4882a593Smuzhiyun 		return -EINVAL;
214*4882a593Smuzhiyun 	}
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun 	*mult_n = rate / parent_rate;
217*4882a593Smuzhiyun 	if (*mult_n > FAPLL_MAIN_MAX_MULT_N)
218*4882a593Smuzhiyun 		return -EINVAL;
219*4882a593Smuzhiyun 	*pre_div_p = 1;
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun 	return 0;
222*4882a593Smuzhiyun }
223*4882a593Smuzhiyun 
ti_fapll_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * parent_rate)224*4882a593Smuzhiyun static long ti_fapll_round_rate(struct clk_hw *hw, unsigned long rate,
225*4882a593Smuzhiyun 				unsigned long *parent_rate)
226*4882a593Smuzhiyun {
227*4882a593Smuzhiyun 	u32 pre_div_p, mult_n;
228*4882a593Smuzhiyun 	int error;
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 	if (!rate)
231*4882a593Smuzhiyun 		return -EINVAL;
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	error = ti_fapll_set_div_mult(rate, *parent_rate,
234*4882a593Smuzhiyun 				      &pre_div_p, &mult_n);
235*4882a593Smuzhiyun 	if (error)
236*4882a593Smuzhiyun 		return error;
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 	rate = *parent_rate / pre_div_p;
239*4882a593Smuzhiyun 	rate *= mult_n;
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun 	return rate;
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun 
ti_fapll_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)244*4882a593Smuzhiyun static int ti_fapll_set_rate(struct clk_hw *hw, unsigned long rate,
245*4882a593Smuzhiyun 			     unsigned long parent_rate)
246*4882a593Smuzhiyun {
247*4882a593Smuzhiyun 	struct fapll_data *fd = to_fapll(hw);
248*4882a593Smuzhiyun 	u32 pre_div_p, mult_n, v;
249*4882a593Smuzhiyun 	int error;
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun 	if (!rate)
252*4882a593Smuzhiyun 		return -EINVAL;
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun 	error = ti_fapll_set_div_mult(rate, parent_rate,
255*4882a593Smuzhiyun 				      &pre_div_p, &mult_n);
256*4882a593Smuzhiyun 	if (error)
257*4882a593Smuzhiyun 		return error;
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun 	ti_fapll_set_bypass(fd);
260*4882a593Smuzhiyun 	v = readl_relaxed(fd->base);
261*4882a593Smuzhiyun 	v &= ~FAPLL_MAIN_CLEAR_MASK;
262*4882a593Smuzhiyun 	v |= pre_div_p << FAPLL_MAIN_DIV_P_SHIFT;
263*4882a593Smuzhiyun 	v |= mult_n << FAPLL_MAIN_MULT_N_SHIFT;
264*4882a593Smuzhiyun 	writel_relaxed(v, fd->base);
265*4882a593Smuzhiyun 	if (ti_fapll_is_enabled(hw))
266*4882a593Smuzhiyun 		ti_fapll_wait_lock(fd);
267*4882a593Smuzhiyun 	ti_fapll_clear_bypass(fd);
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun 	return 0;
270*4882a593Smuzhiyun }
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun static const struct clk_ops ti_fapll_ops = {
273*4882a593Smuzhiyun 	.enable = ti_fapll_enable,
274*4882a593Smuzhiyun 	.disable = ti_fapll_disable,
275*4882a593Smuzhiyun 	.is_enabled = ti_fapll_is_enabled,
276*4882a593Smuzhiyun 	.recalc_rate = ti_fapll_recalc_rate,
277*4882a593Smuzhiyun 	.get_parent = ti_fapll_get_parent,
278*4882a593Smuzhiyun 	.round_rate = ti_fapll_round_rate,
279*4882a593Smuzhiyun 	.set_rate = ti_fapll_set_rate,
280*4882a593Smuzhiyun };
281*4882a593Smuzhiyun 
ti_fapll_synth_enable(struct clk_hw * hw)282*4882a593Smuzhiyun static int ti_fapll_synth_enable(struct clk_hw *hw)
283*4882a593Smuzhiyun {
284*4882a593Smuzhiyun 	struct fapll_synth *synth = to_synth(hw);
285*4882a593Smuzhiyun 	u32 v = readl_relaxed(synth->fd->base + FAPLL_PWD_OFFSET);
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun 	v &= ~(1 << synth->index);
288*4882a593Smuzhiyun 	writel_relaxed(v, synth->fd->base + FAPLL_PWD_OFFSET);
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun 	return 0;
291*4882a593Smuzhiyun }
292*4882a593Smuzhiyun 
ti_fapll_synth_disable(struct clk_hw * hw)293*4882a593Smuzhiyun static void ti_fapll_synth_disable(struct clk_hw *hw)
294*4882a593Smuzhiyun {
295*4882a593Smuzhiyun 	struct fapll_synth *synth = to_synth(hw);
296*4882a593Smuzhiyun 	u32 v = readl_relaxed(synth->fd->base + FAPLL_PWD_OFFSET);
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	v |= 1 << synth->index;
299*4882a593Smuzhiyun 	writel_relaxed(v, synth->fd->base + FAPLL_PWD_OFFSET);
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun 
ti_fapll_synth_is_enabled(struct clk_hw * hw)302*4882a593Smuzhiyun static int ti_fapll_synth_is_enabled(struct clk_hw *hw)
303*4882a593Smuzhiyun {
304*4882a593Smuzhiyun 	struct fapll_synth *synth = to_synth(hw);
305*4882a593Smuzhiyun 	u32 v = readl_relaxed(synth->fd->base + FAPLL_PWD_OFFSET);
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun 	return !(v & (1 << synth->index));
308*4882a593Smuzhiyun }
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun /*
311*4882a593Smuzhiyun  * See dm816x TRM chapter 1.10.3 Flying Adder PLL fore more info
312*4882a593Smuzhiyun  */
ti_fapll_synth_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)313*4882a593Smuzhiyun static unsigned long ti_fapll_synth_recalc_rate(struct clk_hw *hw,
314*4882a593Smuzhiyun 						unsigned long parent_rate)
315*4882a593Smuzhiyun {
316*4882a593Smuzhiyun 	struct fapll_synth *synth = to_synth(hw);
317*4882a593Smuzhiyun 	u32 synth_div_m;
318*4882a593Smuzhiyun 	u64 rate;
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun 	/* The audio_pll_clk1 is hardwired to produce 32.768KiHz clock */
321*4882a593Smuzhiyun 	if (!synth->div)
322*4882a593Smuzhiyun 		return 32768;
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun 	/*
325*4882a593Smuzhiyun 	 * PLL in bypass sets the synths in bypass mode too. The PLL rate
326*4882a593Smuzhiyun 	 * can be also be set to 27MHz, so we can't use parent_rate to
327*4882a593Smuzhiyun 	 * check for bypass mode.
328*4882a593Smuzhiyun 	 */
329*4882a593Smuzhiyun 	if (ti_fapll_clock_is_bypass(synth->fd))
330*4882a593Smuzhiyun 		return parent_rate;
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun 	rate = parent_rate;
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun 	/*
335*4882a593Smuzhiyun 	 * Synth frequency integer and fractional divider.
336*4882a593Smuzhiyun 	 * Note that the phase output K is 8, so the result needs
337*4882a593Smuzhiyun 	 * to be multiplied by SYNTH_PHASE_K.
338*4882a593Smuzhiyun 	 */
339*4882a593Smuzhiyun 	if (synth->freq) {
340*4882a593Smuzhiyun 		u32 v, synth_int_div, synth_frac_div, synth_div_freq;
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun 		v = readl_relaxed(synth->freq);
343*4882a593Smuzhiyun 		synth_int_div = (v >> 24) & 0xf;
344*4882a593Smuzhiyun 		synth_frac_div = v & 0xffffff;
345*4882a593Smuzhiyun 		synth_div_freq = (synth_int_div * 10000000) + synth_frac_div;
346*4882a593Smuzhiyun 		rate *= 10000000;
347*4882a593Smuzhiyun 		do_div(rate, synth_div_freq);
348*4882a593Smuzhiyun 		rate *= SYNTH_PHASE_K;
349*4882a593Smuzhiyun 	}
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun 	/* Synth post-divider M */
352*4882a593Smuzhiyun 	synth_div_m = readl_relaxed(synth->div) & SYNTH_MAX_DIV_M;
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun 	return DIV_ROUND_UP_ULL(rate, synth_div_m);
355*4882a593Smuzhiyun }
356*4882a593Smuzhiyun 
ti_fapll_synth_get_frac_rate(struct clk_hw * hw,unsigned long parent_rate)357*4882a593Smuzhiyun static unsigned long ti_fapll_synth_get_frac_rate(struct clk_hw *hw,
358*4882a593Smuzhiyun 						  unsigned long parent_rate)
359*4882a593Smuzhiyun {
360*4882a593Smuzhiyun 	struct fapll_synth *synth = to_synth(hw);
361*4882a593Smuzhiyun 	unsigned long current_rate, frac_rate;
362*4882a593Smuzhiyun 	u32 post_div_m;
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 	current_rate = ti_fapll_synth_recalc_rate(hw, parent_rate);
365*4882a593Smuzhiyun 	post_div_m = readl_relaxed(synth->div) & SYNTH_MAX_DIV_M;
366*4882a593Smuzhiyun 	frac_rate = current_rate * post_div_m;
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun 	return frac_rate;
369*4882a593Smuzhiyun }
370*4882a593Smuzhiyun 
ti_fapll_synth_set_frac_rate(struct fapll_synth * synth,unsigned long rate,unsigned long parent_rate)371*4882a593Smuzhiyun static u32 ti_fapll_synth_set_frac_rate(struct fapll_synth *synth,
372*4882a593Smuzhiyun 					unsigned long rate,
373*4882a593Smuzhiyun 					unsigned long parent_rate)
374*4882a593Smuzhiyun {
375*4882a593Smuzhiyun 	u32 post_div_m, synth_int_div = 0, synth_frac_div = 0, v;
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun 	post_div_m = DIV_ROUND_UP_ULL((u64)parent_rate * SYNTH_PHASE_K, rate);
378*4882a593Smuzhiyun 	post_div_m = post_div_m / SYNTH_MAX_INT_DIV;
379*4882a593Smuzhiyun 	if (post_div_m > SYNTH_MAX_DIV_M)
380*4882a593Smuzhiyun 		return -EINVAL;
381*4882a593Smuzhiyun 	if (!post_div_m)
382*4882a593Smuzhiyun 		post_div_m = 1;
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun 	for (; post_div_m < SYNTH_MAX_DIV_M; post_div_m++) {
385*4882a593Smuzhiyun 		synth_int_div = DIV_ROUND_UP_ULL((u64)parent_rate *
386*4882a593Smuzhiyun 						 SYNTH_PHASE_K *
387*4882a593Smuzhiyun 						 10000000,
388*4882a593Smuzhiyun 						 rate * post_div_m);
389*4882a593Smuzhiyun 		synth_frac_div = synth_int_div % 10000000;
390*4882a593Smuzhiyun 		synth_int_div /= 10000000;
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun 		if (synth_int_div <= SYNTH_MAX_INT_DIV)
393*4882a593Smuzhiyun 			break;
394*4882a593Smuzhiyun 	}
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun 	if (synth_int_div > SYNTH_MAX_INT_DIV)
397*4882a593Smuzhiyun 		return -EINVAL;
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun 	v = readl_relaxed(synth->freq);
400*4882a593Smuzhiyun 	v &= ~0x1fffffff;
401*4882a593Smuzhiyun 	v |= (synth_int_div & SYNTH_MAX_INT_DIV) << 24;
402*4882a593Smuzhiyun 	v |= (synth_frac_div & 0xffffff);
403*4882a593Smuzhiyun 	v |= SYNTH_LDFREQ;
404*4882a593Smuzhiyun 	writel_relaxed(v, synth->freq);
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun 	return post_div_m;
407*4882a593Smuzhiyun }
408*4882a593Smuzhiyun 
ti_fapll_synth_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * parent_rate)409*4882a593Smuzhiyun static long ti_fapll_synth_round_rate(struct clk_hw *hw, unsigned long rate,
410*4882a593Smuzhiyun 				      unsigned long *parent_rate)
411*4882a593Smuzhiyun {
412*4882a593Smuzhiyun 	struct fapll_synth *synth = to_synth(hw);
413*4882a593Smuzhiyun 	struct fapll_data *fd = synth->fd;
414*4882a593Smuzhiyun 	unsigned long r;
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun 	if (ti_fapll_clock_is_bypass(fd) || !synth->div || !rate)
417*4882a593Smuzhiyun 		return -EINVAL;
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 	/* Only post divider m available with no fractional divider? */
420*4882a593Smuzhiyun 	if (!synth->freq) {
421*4882a593Smuzhiyun 		unsigned long frac_rate;
422*4882a593Smuzhiyun 		u32 synth_post_div_m;
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun 		frac_rate = ti_fapll_synth_get_frac_rate(hw, *parent_rate);
425*4882a593Smuzhiyun 		synth_post_div_m = DIV_ROUND_UP(frac_rate, rate);
426*4882a593Smuzhiyun 		r = DIV_ROUND_UP(frac_rate, synth_post_div_m);
427*4882a593Smuzhiyun 		goto out;
428*4882a593Smuzhiyun 	}
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun 	r = *parent_rate * SYNTH_PHASE_K;
431*4882a593Smuzhiyun 	if (rate > r)
432*4882a593Smuzhiyun 		goto out;
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun 	r = DIV_ROUND_UP_ULL(r, SYNTH_MAX_INT_DIV * SYNTH_MAX_DIV_M);
435*4882a593Smuzhiyun 	if (rate < r)
436*4882a593Smuzhiyun 		goto out;
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun 	r = rate;
439*4882a593Smuzhiyun out:
440*4882a593Smuzhiyun 	return r;
441*4882a593Smuzhiyun }
442*4882a593Smuzhiyun 
ti_fapll_synth_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)443*4882a593Smuzhiyun static int ti_fapll_synth_set_rate(struct clk_hw *hw, unsigned long rate,
444*4882a593Smuzhiyun 				   unsigned long parent_rate)
445*4882a593Smuzhiyun {
446*4882a593Smuzhiyun 	struct fapll_synth *synth = to_synth(hw);
447*4882a593Smuzhiyun 	struct fapll_data *fd = synth->fd;
448*4882a593Smuzhiyun 	unsigned long frac_rate, post_rate = 0;
449*4882a593Smuzhiyun 	u32 post_div_m = 0, v;
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun 	if (ti_fapll_clock_is_bypass(fd) || !synth->div || !rate)
452*4882a593Smuzhiyun 		return -EINVAL;
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun 	/* Produce the rate with just post divider M? */
455*4882a593Smuzhiyun 	frac_rate = ti_fapll_synth_get_frac_rate(hw, parent_rate);
456*4882a593Smuzhiyun 	if (frac_rate < rate) {
457*4882a593Smuzhiyun 		if (!synth->freq)
458*4882a593Smuzhiyun 			return -EINVAL;
459*4882a593Smuzhiyun 	} else {
460*4882a593Smuzhiyun 		post_div_m = DIV_ROUND_UP(frac_rate, rate);
461*4882a593Smuzhiyun 		if (post_div_m && (post_div_m <= SYNTH_MAX_DIV_M))
462*4882a593Smuzhiyun 			post_rate = DIV_ROUND_UP(frac_rate, post_div_m);
463*4882a593Smuzhiyun 		if (!synth->freq && !post_rate)
464*4882a593Smuzhiyun 			return -EINVAL;
465*4882a593Smuzhiyun 	}
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun 	/* Need to recalculate the fractional divider? */
468*4882a593Smuzhiyun 	if ((post_rate != rate) && synth->freq)
469*4882a593Smuzhiyun 		post_div_m = ti_fapll_synth_set_frac_rate(synth,
470*4882a593Smuzhiyun 							  rate,
471*4882a593Smuzhiyun 							  parent_rate);
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun 	v = readl_relaxed(synth->div);
474*4882a593Smuzhiyun 	v &= ~SYNTH_MAX_DIV_M;
475*4882a593Smuzhiyun 	v |= post_div_m;
476*4882a593Smuzhiyun 	v |= SYNTH_LDMDIV1;
477*4882a593Smuzhiyun 	writel_relaxed(v, synth->div);
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun 	return 0;
480*4882a593Smuzhiyun }
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun static const struct clk_ops ti_fapll_synt_ops = {
483*4882a593Smuzhiyun 	.enable = ti_fapll_synth_enable,
484*4882a593Smuzhiyun 	.disable = ti_fapll_synth_disable,
485*4882a593Smuzhiyun 	.is_enabled = ti_fapll_synth_is_enabled,
486*4882a593Smuzhiyun 	.recalc_rate = ti_fapll_synth_recalc_rate,
487*4882a593Smuzhiyun 	.round_rate = ti_fapll_synth_round_rate,
488*4882a593Smuzhiyun 	.set_rate = ti_fapll_synth_set_rate,
489*4882a593Smuzhiyun };
490*4882a593Smuzhiyun 
ti_fapll_synth_setup(struct fapll_data * fd,void __iomem * freq,void __iomem * div,int index,const char * name,const char * parent,struct clk * pll_clk)491*4882a593Smuzhiyun static struct clk * __init ti_fapll_synth_setup(struct fapll_data *fd,
492*4882a593Smuzhiyun 						void __iomem *freq,
493*4882a593Smuzhiyun 						void __iomem *div,
494*4882a593Smuzhiyun 						int index,
495*4882a593Smuzhiyun 						const char *name,
496*4882a593Smuzhiyun 						const char *parent,
497*4882a593Smuzhiyun 						struct clk *pll_clk)
498*4882a593Smuzhiyun {
499*4882a593Smuzhiyun 	struct clk_init_data *init;
500*4882a593Smuzhiyun 	struct fapll_synth *synth;
501*4882a593Smuzhiyun 	struct clk *clk = ERR_PTR(-ENOMEM);
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun 	init = kzalloc(sizeof(*init), GFP_KERNEL);
504*4882a593Smuzhiyun 	if (!init)
505*4882a593Smuzhiyun 		return ERR_PTR(-ENOMEM);
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun 	init->ops = &ti_fapll_synt_ops;
508*4882a593Smuzhiyun 	init->name = name;
509*4882a593Smuzhiyun 	init->parent_names = &parent;
510*4882a593Smuzhiyun 	init->num_parents = 1;
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun 	synth = kzalloc(sizeof(*synth), GFP_KERNEL);
513*4882a593Smuzhiyun 	if (!synth)
514*4882a593Smuzhiyun 		goto free;
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun 	synth->fd = fd;
517*4882a593Smuzhiyun 	synth->index = index;
518*4882a593Smuzhiyun 	synth->freq = freq;
519*4882a593Smuzhiyun 	synth->div = div;
520*4882a593Smuzhiyun 	synth->name = name;
521*4882a593Smuzhiyun 	synth->hw.init = init;
522*4882a593Smuzhiyun 	synth->clk_pll = pll_clk;
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun 	clk = clk_register(NULL, &synth->hw);
525*4882a593Smuzhiyun 	if (IS_ERR(clk)) {
526*4882a593Smuzhiyun 		pr_err("failed to register clock\n");
527*4882a593Smuzhiyun 		goto free;
528*4882a593Smuzhiyun 	}
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun 	return clk;
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun free:
533*4882a593Smuzhiyun 	kfree(synth);
534*4882a593Smuzhiyun 	kfree(init);
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun 	return clk;
537*4882a593Smuzhiyun }
538*4882a593Smuzhiyun 
ti_fapll_setup(struct device_node * node)539*4882a593Smuzhiyun static void __init ti_fapll_setup(struct device_node *node)
540*4882a593Smuzhiyun {
541*4882a593Smuzhiyun 	struct fapll_data *fd;
542*4882a593Smuzhiyun 	struct clk_init_data *init = NULL;
543*4882a593Smuzhiyun 	const char *parent_name[2];
544*4882a593Smuzhiyun 	struct clk *pll_clk;
545*4882a593Smuzhiyun 	int i;
546*4882a593Smuzhiyun 
547*4882a593Smuzhiyun 	fd = kzalloc(sizeof(*fd), GFP_KERNEL);
548*4882a593Smuzhiyun 	if (!fd)
549*4882a593Smuzhiyun 		return;
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun 	fd->outputs.clks = kzalloc(sizeof(struct clk *) *
552*4882a593Smuzhiyun 				   MAX_FAPLL_OUTPUTS + 1,
553*4882a593Smuzhiyun 				   GFP_KERNEL);
554*4882a593Smuzhiyun 	if (!fd->outputs.clks)
555*4882a593Smuzhiyun 		goto free;
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun 	init = kzalloc(sizeof(*init), GFP_KERNEL);
558*4882a593Smuzhiyun 	if (!init)
559*4882a593Smuzhiyun 		goto free;
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun 	init->ops = &ti_fapll_ops;
562*4882a593Smuzhiyun 	init->name = node->name;
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun 	init->num_parents = of_clk_get_parent_count(node);
565*4882a593Smuzhiyun 	if (init->num_parents != 2) {
566*4882a593Smuzhiyun 		pr_err("%pOFn must have two parents\n", node);
567*4882a593Smuzhiyun 		goto free;
568*4882a593Smuzhiyun 	}
569*4882a593Smuzhiyun 
570*4882a593Smuzhiyun 	of_clk_parent_fill(node, parent_name, 2);
571*4882a593Smuzhiyun 	init->parent_names = parent_name;
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun 	fd->clk_ref = of_clk_get(node, 0);
574*4882a593Smuzhiyun 	if (IS_ERR(fd->clk_ref)) {
575*4882a593Smuzhiyun 		pr_err("%pOFn could not get clk_ref\n", node);
576*4882a593Smuzhiyun 		goto free;
577*4882a593Smuzhiyun 	}
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun 	fd->clk_bypass = of_clk_get(node, 1);
580*4882a593Smuzhiyun 	if (IS_ERR(fd->clk_bypass)) {
581*4882a593Smuzhiyun 		pr_err("%pOFn could not get clk_bypass\n", node);
582*4882a593Smuzhiyun 		goto free;
583*4882a593Smuzhiyun 	}
584*4882a593Smuzhiyun 
585*4882a593Smuzhiyun 	fd->base = of_iomap(node, 0);
586*4882a593Smuzhiyun 	if (!fd->base) {
587*4882a593Smuzhiyun 		pr_err("%pOFn could not get IO base\n", node);
588*4882a593Smuzhiyun 		goto free;
589*4882a593Smuzhiyun 	}
590*4882a593Smuzhiyun 
591*4882a593Smuzhiyun 	if (fapll_is_ddr_pll(fd->base))
592*4882a593Smuzhiyun 		fd->bypass_bit_inverted = true;
593*4882a593Smuzhiyun 
594*4882a593Smuzhiyun 	fd->name = node->name;
595*4882a593Smuzhiyun 	fd->hw.init = init;
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun 	/* Register the parent PLL */
598*4882a593Smuzhiyun 	pll_clk = clk_register(NULL, &fd->hw);
599*4882a593Smuzhiyun 	if (IS_ERR(pll_clk))
600*4882a593Smuzhiyun 		goto unmap;
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun 	fd->outputs.clks[0] = pll_clk;
603*4882a593Smuzhiyun 	fd->outputs.clk_num++;
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun 	/*
606*4882a593Smuzhiyun 	 * Set up the child synthesizers starting at index 1 as the
607*4882a593Smuzhiyun 	 * PLL output is at index 0. We need to check the clock-indices
608*4882a593Smuzhiyun 	 * for numbering in case there are holes in the synth mapping,
609*4882a593Smuzhiyun 	 * and then probe the synth register to see if it has a FREQ
610*4882a593Smuzhiyun 	 * register available.
611*4882a593Smuzhiyun 	 */
612*4882a593Smuzhiyun 	for (i = 0; i < MAX_FAPLL_OUTPUTS; i++) {
613*4882a593Smuzhiyun 		const char *output_name;
614*4882a593Smuzhiyun 		void __iomem *freq, *div;
615*4882a593Smuzhiyun 		struct clk *synth_clk;
616*4882a593Smuzhiyun 		int output_instance;
617*4882a593Smuzhiyun 		u32 v;
618*4882a593Smuzhiyun 
619*4882a593Smuzhiyun 		if (of_property_read_string_index(node, "clock-output-names",
620*4882a593Smuzhiyun 						  i, &output_name))
621*4882a593Smuzhiyun 			continue;
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun 		if (of_property_read_u32_index(node, "clock-indices", i,
624*4882a593Smuzhiyun 					       &output_instance))
625*4882a593Smuzhiyun 			output_instance = i;
626*4882a593Smuzhiyun 
627*4882a593Smuzhiyun 		freq = fd->base + (output_instance * 8);
628*4882a593Smuzhiyun 		div = freq + 4;
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun 		/* Check for hardwired audio_pll_clk1 */
631*4882a593Smuzhiyun 		if (is_audio_pll_clk1(freq)) {
632*4882a593Smuzhiyun 			freq = NULL;
633*4882a593Smuzhiyun 			div = NULL;
634*4882a593Smuzhiyun 		} else {
635*4882a593Smuzhiyun 			/* Does the synthesizer have a FREQ register? */
636*4882a593Smuzhiyun 			v = readl_relaxed(freq);
637*4882a593Smuzhiyun 			if (!v)
638*4882a593Smuzhiyun 				freq = NULL;
639*4882a593Smuzhiyun 		}
640*4882a593Smuzhiyun 		synth_clk = ti_fapll_synth_setup(fd, freq, div, output_instance,
641*4882a593Smuzhiyun 						 output_name, node->name,
642*4882a593Smuzhiyun 						 pll_clk);
643*4882a593Smuzhiyun 		if (IS_ERR(synth_clk))
644*4882a593Smuzhiyun 			continue;
645*4882a593Smuzhiyun 
646*4882a593Smuzhiyun 		fd->outputs.clks[output_instance] = synth_clk;
647*4882a593Smuzhiyun 		fd->outputs.clk_num++;
648*4882a593Smuzhiyun 
649*4882a593Smuzhiyun 		clk_register_clkdev(synth_clk, output_name, NULL);
650*4882a593Smuzhiyun 	}
651*4882a593Smuzhiyun 
652*4882a593Smuzhiyun 	/* Register the child synthesizers as the FAPLL outputs */
653*4882a593Smuzhiyun 	of_clk_add_provider(node, of_clk_src_onecell_get, &fd->outputs);
654*4882a593Smuzhiyun 	/* Add clock alias for the outputs */
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun 	kfree(init);
657*4882a593Smuzhiyun 
658*4882a593Smuzhiyun 	return;
659*4882a593Smuzhiyun 
660*4882a593Smuzhiyun unmap:
661*4882a593Smuzhiyun 	iounmap(fd->base);
662*4882a593Smuzhiyun free:
663*4882a593Smuzhiyun 	if (fd->clk_bypass)
664*4882a593Smuzhiyun 		clk_put(fd->clk_bypass);
665*4882a593Smuzhiyun 	if (fd->clk_ref)
666*4882a593Smuzhiyun 		clk_put(fd->clk_ref);
667*4882a593Smuzhiyun 	kfree(fd->outputs.clks);
668*4882a593Smuzhiyun 	kfree(fd);
669*4882a593Smuzhiyun 	kfree(init);
670*4882a593Smuzhiyun }
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun CLK_OF_DECLARE(ti_fapll_clock, "ti,dm816-fapll-clock", ti_fapll_setup);
673