xref: /OK3568_Linux_fs/kernel/drivers/clk/at91/clk-audio-pll.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *  Copyright (C) 2016 Atmel Corporation,
4*4882a593Smuzhiyun  *		       Songjun Wu <songjun.wu@atmel.com>,
5*4882a593Smuzhiyun  *                     Nicolas Ferre <nicolas.ferre@atmel.com>
6*4882a593Smuzhiyun  *  Copyright (C) 2017 Free Electrons,
7*4882a593Smuzhiyun  *		       Quentin Schulz <quentin.schulz@free-electrons.com>
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * The Sama5d2 SoC has two audio PLLs (PMC and PAD) that shares the same parent
10*4882a593Smuzhiyun  * (FRAC). FRAC can output between 620 and 700MHz and only multiply the rate of
11*4882a593Smuzhiyun  * its own parent. PMC and PAD can then divide the FRAC rate to best match the
12*4882a593Smuzhiyun  * asked rate.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * Traits of FRAC clock:
15*4882a593Smuzhiyun  * enable - clk_enable writes nd, fracr parameters and enables PLL
16*4882a593Smuzhiyun  * rate - rate is adjustable.
17*4882a593Smuzhiyun  *        clk->rate = parent->rate * ((nd + 1) + (fracr / 2^22))
18*4882a593Smuzhiyun  * parent - fixed parent.  No clk_set_parent support
19*4882a593Smuzhiyun  *
20*4882a593Smuzhiyun  * Traits of PMC clock:
21*4882a593Smuzhiyun  * enable - clk_enable writes qdpmc, and enables PMC output
22*4882a593Smuzhiyun  * rate - rate is adjustable.
23*4882a593Smuzhiyun  *        clk->rate = parent->rate / (qdpmc + 1)
24*4882a593Smuzhiyun  * parent - fixed parent.  No clk_set_parent support
25*4882a593Smuzhiyun  *
26*4882a593Smuzhiyun  * Traits of PAD clock:
27*4882a593Smuzhiyun  * enable - clk_enable writes divisors and enables PAD output
28*4882a593Smuzhiyun  * rate - rate is adjustable.
29*4882a593Smuzhiyun  *        clk->rate = parent->rate / (qdaudio * div))
30*4882a593Smuzhiyun  * parent - fixed parent.  No clk_set_parent support
31*4882a593Smuzhiyun  */
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #include <linux/clk.h>
34*4882a593Smuzhiyun #include <linux/clk-provider.h>
35*4882a593Smuzhiyun #include <linux/clk/at91_pmc.h>
36*4882a593Smuzhiyun #include <linux/of.h>
37*4882a593Smuzhiyun #include <linux/mfd/syscon.h>
38*4882a593Smuzhiyun #include <linux/regmap.h>
39*4882a593Smuzhiyun #include <linux/slab.h>
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #include "pmc.h"
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #define AUDIO_PLL_DIV_FRAC	BIT(22)
44*4882a593Smuzhiyun #define AUDIO_PLL_ND_MAX	(AT91_PMC_AUDIO_PLL_ND_MASK >> \
45*4882a593Smuzhiyun 					AT91_PMC_AUDIO_PLL_ND_OFFSET)
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define AUDIO_PLL_QDPAD(qd, div)	((AT91_PMC_AUDIO_PLL_QDPAD_EXTDIV(qd) & \
48*4882a593Smuzhiyun 					  AT91_PMC_AUDIO_PLL_QDPAD_EXTDIV_MASK) | \
49*4882a593Smuzhiyun 					 (AT91_PMC_AUDIO_PLL_QDPAD_DIV(div) & \
50*4882a593Smuzhiyun 					  AT91_PMC_AUDIO_PLL_QDPAD_DIV_MASK))
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define AUDIO_PLL_QDPMC_MAX		(AT91_PMC_AUDIO_PLL_QDPMC_MASK >> \
53*4882a593Smuzhiyun 						AT91_PMC_AUDIO_PLL_QDPMC_OFFSET)
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define AUDIO_PLL_FOUT_MIN	620000000UL
56*4882a593Smuzhiyun #define AUDIO_PLL_FOUT_MAX	700000000UL
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun struct clk_audio_frac {
59*4882a593Smuzhiyun 	struct clk_hw hw;
60*4882a593Smuzhiyun 	struct regmap *regmap;
61*4882a593Smuzhiyun 	u32 fracr;
62*4882a593Smuzhiyun 	u8 nd;
63*4882a593Smuzhiyun };
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun struct clk_audio_pad {
66*4882a593Smuzhiyun 	struct clk_hw hw;
67*4882a593Smuzhiyun 	struct regmap *regmap;
68*4882a593Smuzhiyun 	u8 qdaudio;
69*4882a593Smuzhiyun 	u8 div;
70*4882a593Smuzhiyun };
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun struct clk_audio_pmc {
73*4882a593Smuzhiyun 	struct clk_hw hw;
74*4882a593Smuzhiyun 	struct regmap *regmap;
75*4882a593Smuzhiyun 	u8 qdpmc;
76*4882a593Smuzhiyun };
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun #define to_clk_audio_frac(hw) container_of(hw, struct clk_audio_frac, hw)
79*4882a593Smuzhiyun #define to_clk_audio_pad(hw) container_of(hw, struct clk_audio_pad, hw)
80*4882a593Smuzhiyun #define to_clk_audio_pmc(hw) container_of(hw, struct clk_audio_pmc, hw)
81*4882a593Smuzhiyun 
clk_audio_pll_frac_enable(struct clk_hw * hw)82*4882a593Smuzhiyun static int clk_audio_pll_frac_enable(struct clk_hw *hw)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun 	struct clk_audio_frac *frac = to_clk_audio_frac(hw);
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	regmap_update_bits(frac->regmap, AT91_PMC_AUDIO_PLL0,
87*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_RESETN, 0);
88*4882a593Smuzhiyun 	regmap_update_bits(frac->regmap, AT91_PMC_AUDIO_PLL0,
89*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_RESETN,
90*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_RESETN);
91*4882a593Smuzhiyun 	regmap_update_bits(frac->regmap, AT91_PMC_AUDIO_PLL1,
92*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_FRACR_MASK, frac->fracr);
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	/*
95*4882a593Smuzhiyun 	 * reset and enable have to be done in 2 separated writes
96*4882a593Smuzhiyun 	 * for AT91_PMC_AUDIO_PLL0
97*4882a593Smuzhiyun 	 */
98*4882a593Smuzhiyun 	regmap_update_bits(frac->regmap, AT91_PMC_AUDIO_PLL0,
99*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_PLLEN |
100*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_ND_MASK,
101*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_PLLEN |
102*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_ND(frac->nd));
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 	return 0;
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun 
clk_audio_pll_pad_enable(struct clk_hw * hw)107*4882a593Smuzhiyun static int clk_audio_pll_pad_enable(struct clk_hw *hw)
108*4882a593Smuzhiyun {
109*4882a593Smuzhiyun 	struct clk_audio_pad *apad_ck = to_clk_audio_pad(hw);
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	regmap_update_bits(apad_ck->regmap, AT91_PMC_AUDIO_PLL1,
112*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_QDPAD_MASK,
113*4882a593Smuzhiyun 			   AUDIO_PLL_QDPAD(apad_ck->qdaudio, apad_ck->div));
114*4882a593Smuzhiyun 	regmap_update_bits(apad_ck->regmap, AT91_PMC_AUDIO_PLL0,
115*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_PADEN, AT91_PMC_AUDIO_PLL_PADEN);
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 	return 0;
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun 
clk_audio_pll_pmc_enable(struct clk_hw * hw)120*4882a593Smuzhiyun static int clk_audio_pll_pmc_enable(struct clk_hw *hw)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun 	struct clk_audio_pmc *apmc_ck = to_clk_audio_pmc(hw);
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	regmap_update_bits(apmc_ck->regmap, AT91_PMC_AUDIO_PLL0,
125*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_PMCEN |
126*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_QDPMC_MASK,
127*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_PMCEN |
128*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_QDPMC(apmc_ck->qdpmc));
129*4882a593Smuzhiyun 	return 0;
130*4882a593Smuzhiyun }
131*4882a593Smuzhiyun 
clk_audio_pll_frac_disable(struct clk_hw * hw)132*4882a593Smuzhiyun static void clk_audio_pll_frac_disable(struct clk_hw *hw)
133*4882a593Smuzhiyun {
134*4882a593Smuzhiyun 	struct clk_audio_frac *frac = to_clk_audio_frac(hw);
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun 	regmap_update_bits(frac->regmap, AT91_PMC_AUDIO_PLL0,
137*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_PLLEN, 0);
138*4882a593Smuzhiyun 	/* do it in 2 separated writes */
139*4882a593Smuzhiyun 	regmap_update_bits(frac->regmap, AT91_PMC_AUDIO_PLL0,
140*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_RESETN, 0);
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun 
clk_audio_pll_pad_disable(struct clk_hw * hw)143*4882a593Smuzhiyun static void clk_audio_pll_pad_disable(struct clk_hw *hw)
144*4882a593Smuzhiyun {
145*4882a593Smuzhiyun 	struct clk_audio_pad *apad_ck = to_clk_audio_pad(hw);
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	regmap_update_bits(apad_ck->regmap, AT91_PMC_AUDIO_PLL0,
148*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_PADEN, 0);
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun 
clk_audio_pll_pmc_disable(struct clk_hw * hw)151*4882a593Smuzhiyun static void clk_audio_pll_pmc_disable(struct clk_hw *hw)
152*4882a593Smuzhiyun {
153*4882a593Smuzhiyun 	struct clk_audio_pmc *apmc_ck = to_clk_audio_pmc(hw);
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 	regmap_update_bits(apmc_ck->regmap, AT91_PMC_AUDIO_PLL0,
156*4882a593Smuzhiyun 			   AT91_PMC_AUDIO_PLL_PMCEN, 0);
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun 
clk_audio_pll_fout(unsigned long parent_rate,unsigned long nd,unsigned long fracr)159*4882a593Smuzhiyun static unsigned long clk_audio_pll_fout(unsigned long parent_rate,
160*4882a593Smuzhiyun 					unsigned long nd, unsigned long fracr)
161*4882a593Smuzhiyun {
162*4882a593Smuzhiyun 	unsigned long long fr = (unsigned long long)parent_rate * fracr;
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun 	pr_debug("A PLL: %s, fr = %llu\n", __func__, fr);
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	fr = DIV_ROUND_CLOSEST_ULL(fr, AUDIO_PLL_DIV_FRAC);
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun 	pr_debug("A PLL: %s, fr = %llu\n", __func__, fr);
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun 	return parent_rate * (nd + 1) + fr;
171*4882a593Smuzhiyun }
172*4882a593Smuzhiyun 
clk_audio_pll_frac_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)173*4882a593Smuzhiyun static unsigned long clk_audio_pll_frac_recalc_rate(struct clk_hw *hw,
174*4882a593Smuzhiyun 						    unsigned long parent_rate)
175*4882a593Smuzhiyun {
176*4882a593Smuzhiyun 	struct clk_audio_frac *frac = to_clk_audio_frac(hw);
177*4882a593Smuzhiyun 	unsigned long fout;
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun 	fout = clk_audio_pll_fout(parent_rate, frac->nd, frac->fracr);
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 	pr_debug("A PLL: %s, fout = %lu (nd = %u, fracr = %lu)\n", __func__,
182*4882a593Smuzhiyun 		 fout, frac->nd, (unsigned long)frac->fracr);
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 	return fout;
185*4882a593Smuzhiyun }
186*4882a593Smuzhiyun 
clk_audio_pll_pad_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)187*4882a593Smuzhiyun static unsigned long clk_audio_pll_pad_recalc_rate(struct clk_hw *hw,
188*4882a593Smuzhiyun 						   unsigned long parent_rate)
189*4882a593Smuzhiyun {
190*4882a593Smuzhiyun 	struct clk_audio_pad *apad_ck = to_clk_audio_pad(hw);
191*4882a593Smuzhiyun 	unsigned long apad_rate = 0;
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 	if (apad_ck->qdaudio && apad_ck->div)
194*4882a593Smuzhiyun 		apad_rate = parent_rate / (apad_ck->qdaudio * apad_ck->div);
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	pr_debug("A PLL/PAD: %s, apad_rate = %lu (div = %u, qdaudio = %u)\n",
197*4882a593Smuzhiyun 		 __func__, apad_rate, apad_ck->div, apad_ck->qdaudio);
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	return apad_rate;
200*4882a593Smuzhiyun }
201*4882a593Smuzhiyun 
clk_audio_pll_pmc_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)202*4882a593Smuzhiyun static unsigned long clk_audio_pll_pmc_recalc_rate(struct clk_hw *hw,
203*4882a593Smuzhiyun 						   unsigned long parent_rate)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun 	struct clk_audio_pmc *apmc_ck = to_clk_audio_pmc(hw);
206*4882a593Smuzhiyun 	unsigned long apmc_rate = 0;
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun 	apmc_rate = parent_rate / (apmc_ck->qdpmc + 1);
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	pr_debug("A PLL/PMC: %s, apmc_rate = %lu (qdpmc = %u)\n", __func__,
211*4882a593Smuzhiyun 		 apmc_rate, apmc_ck->qdpmc);
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun 	return apmc_rate;
214*4882a593Smuzhiyun }
215*4882a593Smuzhiyun 
clk_audio_pll_frac_compute_frac(unsigned long rate,unsigned long parent_rate,unsigned long * nd,unsigned long * fracr)216*4882a593Smuzhiyun static int clk_audio_pll_frac_compute_frac(unsigned long rate,
217*4882a593Smuzhiyun 					   unsigned long parent_rate,
218*4882a593Smuzhiyun 					   unsigned long *nd,
219*4882a593Smuzhiyun 					   unsigned long *fracr)
220*4882a593Smuzhiyun {
221*4882a593Smuzhiyun 	unsigned long long tmp, rem;
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun 	if (!rate)
224*4882a593Smuzhiyun 		return -EINVAL;
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun 	tmp = rate;
227*4882a593Smuzhiyun 	rem = do_div(tmp, parent_rate);
228*4882a593Smuzhiyun 	if (!tmp || tmp >= AUDIO_PLL_ND_MAX)
229*4882a593Smuzhiyun 		return -EINVAL;
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun 	*nd = tmp - 1;
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	tmp = rem * AUDIO_PLL_DIV_FRAC;
234*4882a593Smuzhiyun 	tmp = DIV_ROUND_CLOSEST_ULL(tmp, parent_rate);
235*4882a593Smuzhiyun 	if (tmp > AT91_PMC_AUDIO_PLL_FRACR_MASK)
236*4882a593Smuzhiyun 		return -EINVAL;
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 	/* we can cast here as we verified the bounds just above */
239*4882a593Smuzhiyun 	*fracr = (unsigned long)tmp;
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun 	return 0;
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun 
clk_audio_pll_frac_determine_rate(struct clk_hw * hw,struct clk_rate_request * req)244*4882a593Smuzhiyun static int clk_audio_pll_frac_determine_rate(struct clk_hw *hw,
245*4882a593Smuzhiyun 					     struct clk_rate_request *req)
246*4882a593Smuzhiyun {
247*4882a593Smuzhiyun 	unsigned long fracr, nd;
248*4882a593Smuzhiyun 	int ret;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	pr_debug("A PLL: %s, rate = %lu (parent_rate = %lu)\n", __func__,
251*4882a593Smuzhiyun 		 req->rate, req->best_parent_rate);
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	req->rate = clamp(req->rate, AUDIO_PLL_FOUT_MIN, AUDIO_PLL_FOUT_MAX);
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun 	req->min_rate = max(req->min_rate, AUDIO_PLL_FOUT_MIN);
256*4882a593Smuzhiyun 	req->max_rate = min(req->max_rate, AUDIO_PLL_FOUT_MAX);
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	ret = clk_audio_pll_frac_compute_frac(req->rate, req->best_parent_rate,
259*4882a593Smuzhiyun 					      &nd, &fracr);
260*4882a593Smuzhiyun 	if (ret)
261*4882a593Smuzhiyun 		return ret;
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	req->rate = clk_audio_pll_fout(req->best_parent_rate, nd, fracr);
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun 	req->best_parent_hw = clk_hw_get_parent(hw);
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun 	pr_debug("A PLL: %s, best_rate = %lu (nd = %lu, fracr = %lu)\n",
268*4882a593Smuzhiyun 		 __func__, req->rate, nd, fracr);
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun 	return 0;
271*4882a593Smuzhiyun }
272*4882a593Smuzhiyun 
clk_audio_pll_pad_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * parent_rate)273*4882a593Smuzhiyun static long clk_audio_pll_pad_round_rate(struct clk_hw *hw, unsigned long rate,
274*4882a593Smuzhiyun 					 unsigned long *parent_rate)
275*4882a593Smuzhiyun {
276*4882a593Smuzhiyun 	struct clk_hw *pclk = clk_hw_get_parent(hw);
277*4882a593Smuzhiyun 	long best_rate = -EINVAL;
278*4882a593Smuzhiyun 	unsigned long best_parent_rate;
279*4882a593Smuzhiyun 	unsigned long tmp_qd;
280*4882a593Smuzhiyun 	u32 div;
281*4882a593Smuzhiyun 	long tmp_rate;
282*4882a593Smuzhiyun 	int tmp_diff;
283*4882a593Smuzhiyun 	int best_diff = -1;
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun 	pr_debug("A PLL/PAD: %s, rate = %lu (parent_rate = %lu)\n", __func__,
286*4882a593Smuzhiyun 		 rate, *parent_rate);
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun 	/*
289*4882a593Smuzhiyun 	 * Rate divisor is actually made of two different divisors, multiplied
290*4882a593Smuzhiyun 	 * between themselves before dividing the rate.
291*4882a593Smuzhiyun 	 * tmp_qd goes from 1 to 31 and div is either 2 or 3.
292*4882a593Smuzhiyun 	 * In order to avoid testing twice the rate divisor (e.g. divisor 12 can
293*4882a593Smuzhiyun 	 * be found with (tmp_qd, div) = (2, 6) or (3, 4)), we remove any loop
294*4882a593Smuzhiyun 	 * for a rate divisor when div is 2 and tmp_qd is a multiple of 3.
295*4882a593Smuzhiyun 	 * We cannot inverse it (condition div is 3 and tmp_qd is even) or we
296*4882a593Smuzhiyun 	 * would miss some rate divisor that aren't reachable with div being 2
297*4882a593Smuzhiyun 	 * (e.g. rate divisor 90 is made with div = 3 and tmp_qd = 30, thus
298*4882a593Smuzhiyun 	 * tmp_qd is even so we skip it because we think div 2 could make this
299*4882a593Smuzhiyun 	 * rate divisor which isn't possible since tmp_qd has to be <= 31).
300*4882a593Smuzhiyun 	 */
301*4882a593Smuzhiyun 	for (tmp_qd = 1; tmp_qd < AT91_PMC_AUDIO_PLL_QDPAD_EXTDIV_MAX; tmp_qd++)
302*4882a593Smuzhiyun 		for (div = 2; div <= 3; div++) {
303*4882a593Smuzhiyun 			if (div == 2 && tmp_qd % 3 == 0)
304*4882a593Smuzhiyun 				continue;
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun 			best_parent_rate = clk_hw_round_rate(pclk,
307*4882a593Smuzhiyun 							rate * tmp_qd * div);
308*4882a593Smuzhiyun 			tmp_rate = best_parent_rate / (div * tmp_qd);
309*4882a593Smuzhiyun 			tmp_diff = abs(rate - tmp_rate);
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 			if (best_diff < 0 || best_diff > tmp_diff) {
312*4882a593Smuzhiyun 				*parent_rate = best_parent_rate;
313*4882a593Smuzhiyun 				best_rate = tmp_rate;
314*4882a593Smuzhiyun 				best_diff = tmp_diff;
315*4882a593Smuzhiyun 			}
316*4882a593Smuzhiyun 		}
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	pr_debug("A PLL/PAD: %s, best_rate = %ld, best_parent_rate = %lu\n",
319*4882a593Smuzhiyun 		 __func__, best_rate, best_parent_rate);
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun 	return best_rate;
322*4882a593Smuzhiyun }
323*4882a593Smuzhiyun 
clk_audio_pll_pmc_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * parent_rate)324*4882a593Smuzhiyun static long clk_audio_pll_pmc_round_rate(struct clk_hw *hw, unsigned long rate,
325*4882a593Smuzhiyun 					 unsigned long *parent_rate)
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun 	struct clk_hw *pclk = clk_hw_get_parent(hw);
328*4882a593Smuzhiyun 	long best_rate = -EINVAL;
329*4882a593Smuzhiyun 	unsigned long best_parent_rate = 0;
330*4882a593Smuzhiyun 	u32 tmp_qd = 0, div;
331*4882a593Smuzhiyun 	long tmp_rate;
332*4882a593Smuzhiyun 	int tmp_diff;
333*4882a593Smuzhiyun 	int best_diff = -1;
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 	pr_debug("A PLL/PMC: %s, rate = %lu (parent_rate = %lu)\n", __func__,
336*4882a593Smuzhiyun 		 rate, *parent_rate);
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun 	if (!rate)
339*4882a593Smuzhiyun 		return 0;
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 	best_parent_rate = clk_round_rate(pclk->clk, 1);
342*4882a593Smuzhiyun 	div = max(best_parent_rate / rate, 1UL);
343*4882a593Smuzhiyun 	for (; div <= AUDIO_PLL_QDPMC_MAX; div++) {
344*4882a593Smuzhiyun 		best_parent_rate = clk_round_rate(pclk->clk, rate * div);
345*4882a593Smuzhiyun 		tmp_rate = best_parent_rate / div;
346*4882a593Smuzhiyun 		tmp_diff = abs(rate - tmp_rate);
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun 		if (best_diff < 0 || best_diff > tmp_diff) {
349*4882a593Smuzhiyun 			*parent_rate = best_parent_rate;
350*4882a593Smuzhiyun 			best_rate = tmp_rate;
351*4882a593Smuzhiyun 			best_diff = tmp_diff;
352*4882a593Smuzhiyun 			tmp_qd = div;
353*4882a593Smuzhiyun 			if (!best_diff)
354*4882a593Smuzhiyun 				break;	/* got exact match */
355*4882a593Smuzhiyun 		}
356*4882a593Smuzhiyun 	}
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun 	pr_debug("A PLL/PMC: %s, best_rate = %ld, best_parent_rate = %lu (qd = %d)\n",
359*4882a593Smuzhiyun 		 __func__, best_rate, *parent_rate, tmp_qd - 1);
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun 	return best_rate;
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun 
clk_audio_pll_frac_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)364*4882a593Smuzhiyun static int clk_audio_pll_frac_set_rate(struct clk_hw *hw, unsigned long rate,
365*4882a593Smuzhiyun 				       unsigned long parent_rate)
366*4882a593Smuzhiyun {
367*4882a593Smuzhiyun 	struct clk_audio_frac *frac = to_clk_audio_frac(hw);
368*4882a593Smuzhiyun 	unsigned long fracr, nd;
369*4882a593Smuzhiyun 	int ret;
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun 	pr_debug("A PLL: %s, rate = %lu (parent_rate = %lu)\n", __func__, rate,
372*4882a593Smuzhiyun 		 parent_rate);
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun 	if (rate < AUDIO_PLL_FOUT_MIN || rate > AUDIO_PLL_FOUT_MAX)
375*4882a593Smuzhiyun 		return -EINVAL;
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun 	ret = clk_audio_pll_frac_compute_frac(rate, parent_rate, &nd, &fracr);
378*4882a593Smuzhiyun 	if (ret)
379*4882a593Smuzhiyun 		return ret;
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun 	frac->nd = nd;
382*4882a593Smuzhiyun 	frac->fracr = fracr;
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun 	return 0;
385*4882a593Smuzhiyun }
386*4882a593Smuzhiyun 
clk_audio_pll_pad_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)387*4882a593Smuzhiyun static int clk_audio_pll_pad_set_rate(struct clk_hw *hw, unsigned long rate,
388*4882a593Smuzhiyun 				      unsigned long parent_rate)
389*4882a593Smuzhiyun {
390*4882a593Smuzhiyun 	struct clk_audio_pad *apad_ck = to_clk_audio_pad(hw);
391*4882a593Smuzhiyun 	u8 tmp_div;
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun 	pr_debug("A PLL/PAD: %s, rate = %lu (parent_rate = %lu)\n", __func__,
394*4882a593Smuzhiyun 		 rate, parent_rate);
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun 	if (!rate)
397*4882a593Smuzhiyun 		return -EINVAL;
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun 	tmp_div = parent_rate / rate;
400*4882a593Smuzhiyun 	if (tmp_div % 3 == 0) {
401*4882a593Smuzhiyun 		apad_ck->qdaudio = tmp_div / 3;
402*4882a593Smuzhiyun 		apad_ck->div = 3;
403*4882a593Smuzhiyun 	} else {
404*4882a593Smuzhiyun 		apad_ck->qdaudio = tmp_div / 2;
405*4882a593Smuzhiyun 		apad_ck->div = 2;
406*4882a593Smuzhiyun 	}
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun 	return 0;
409*4882a593Smuzhiyun }
410*4882a593Smuzhiyun 
clk_audio_pll_pmc_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)411*4882a593Smuzhiyun static int clk_audio_pll_pmc_set_rate(struct clk_hw *hw, unsigned long rate,
412*4882a593Smuzhiyun 				      unsigned long parent_rate)
413*4882a593Smuzhiyun {
414*4882a593Smuzhiyun 	struct clk_audio_pmc *apmc_ck = to_clk_audio_pmc(hw);
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun 	if (!rate)
417*4882a593Smuzhiyun 		return -EINVAL;
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 	pr_debug("A PLL/PMC: %s, rate = %lu (parent_rate = %lu)\n", __func__,
420*4882a593Smuzhiyun 		 rate, parent_rate);
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun 	apmc_ck->qdpmc = parent_rate / rate - 1;
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun 	return 0;
425*4882a593Smuzhiyun }
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun static const struct clk_ops audio_pll_frac_ops = {
428*4882a593Smuzhiyun 	.enable = clk_audio_pll_frac_enable,
429*4882a593Smuzhiyun 	.disable = clk_audio_pll_frac_disable,
430*4882a593Smuzhiyun 	.recalc_rate = clk_audio_pll_frac_recalc_rate,
431*4882a593Smuzhiyun 	.determine_rate = clk_audio_pll_frac_determine_rate,
432*4882a593Smuzhiyun 	.set_rate = clk_audio_pll_frac_set_rate,
433*4882a593Smuzhiyun };
434*4882a593Smuzhiyun 
435*4882a593Smuzhiyun static const struct clk_ops audio_pll_pad_ops = {
436*4882a593Smuzhiyun 	.enable = clk_audio_pll_pad_enable,
437*4882a593Smuzhiyun 	.disable = clk_audio_pll_pad_disable,
438*4882a593Smuzhiyun 	.recalc_rate = clk_audio_pll_pad_recalc_rate,
439*4882a593Smuzhiyun 	.round_rate = clk_audio_pll_pad_round_rate,
440*4882a593Smuzhiyun 	.set_rate = clk_audio_pll_pad_set_rate,
441*4882a593Smuzhiyun };
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun static const struct clk_ops audio_pll_pmc_ops = {
444*4882a593Smuzhiyun 	.enable = clk_audio_pll_pmc_enable,
445*4882a593Smuzhiyun 	.disable = clk_audio_pll_pmc_disable,
446*4882a593Smuzhiyun 	.recalc_rate = clk_audio_pll_pmc_recalc_rate,
447*4882a593Smuzhiyun 	.round_rate = clk_audio_pll_pmc_round_rate,
448*4882a593Smuzhiyun 	.set_rate = clk_audio_pll_pmc_set_rate,
449*4882a593Smuzhiyun };
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun struct clk_hw * __init
at91_clk_register_audio_pll_frac(struct regmap * regmap,const char * name,const char * parent_name)452*4882a593Smuzhiyun at91_clk_register_audio_pll_frac(struct regmap *regmap, const char *name,
453*4882a593Smuzhiyun 				 const char *parent_name)
454*4882a593Smuzhiyun {
455*4882a593Smuzhiyun 	struct clk_audio_frac *frac_ck;
456*4882a593Smuzhiyun 	struct clk_init_data init = {};
457*4882a593Smuzhiyun 	int ret;
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun 	frac_ck = kzalloc(sizeof(*frac_ck), GFP_KERNEL);
460*4882a593Smuzhiyun 	if (!frac_ck)
461*4882a593Smuzhiyun 		return ERR_PTR(-ENOMEM);
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun 	init.name = name;
464*4882a593Smuzhiyun 	init.ops = &audio_pll_frac_ops;
465*4882a593Smuzhiyun 	init.parent_names = &parent_name;
466*4882a593Smuzhiyun 	init.num_parents = 1;
467*4882a593Smuzhiyun 	init.flags = CLK_SET_RATE_GATE;
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun 	frac_ck->hw.init = &init;
470*4882a593Smuzhiyun 	frac_ck->regmap = regmap;
471*4882a593Smuzhiyun 
472*4882a593Smuzhiyun 	ret = clk_hw_register(NULL, &frac_ck->hw);
473*4882a593Smuzhiyun 	if (ret) {
474*4882a593Smuzhiyun 		kfree(frac_ck);
475*4882a593Smuzhiyun 		return ERR_PTR(ret);
476*4882a593Smuzhiyun 	}
477*4882a593Smuzhiyun 
478*4882a593Smuzhiyun 	return &frac_ck->hw;
479*4882a593Smuzhiyun }
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun struct clk_hw * __init
at91_clk_register_audio_pll_pad(struct regmap * regmap,const char * name,const char * parent_name)482*4882a593Smuzhiyun at91_clk_register_audio_pll_pad(struct regmap *regmap, const char *name,
483*4882a593Smuzhiyun 				const char *parent_name)
484*4882a593Smuzhiyun {
485*4882a593Smuzhiyun 	struct clk_audio_pad *apad_ck;
486*4882a593Smuzhiyun 	struct clk_init_data init;
487*4882a593Smuzhiyun 	int ret;
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun 	apad_ck = kzalloc(sizeof(*apad_ck), GFP_KERNEL);
490*4882a593Smuzhiyun 	if (!apad_ck)
491*4882a593Smuzhiyun 		return ERR_PTR(-ENOMEM);
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun 	init.name = name;
494*4882a593Smuzhiyun 	init.ops = &audio_pll_pad_ops;
495*4882a593Smuzhiyun 	init.parent_names = &parent_name;
496*4882a593Smuzhiyun 	init.num_parents = 1;
497*4882a593Smuzhiyun 	init.flags = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
498*4882a593Smuzhiyun 		CLK_SET_RATE_PARENT;
499*4882a593Smuzhiyun 
500*4882a593Smuzhiyun 	apad_ck->hw.init = &init;
501*4882a593Smuzhiyun 	apad_ck->regmap = regmap;
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun 	ret = clk_hw_register(NULL, &apad_ck->hw);
504*4882a593Smuzhiyun 	if (ret) {
505*4882a593Smuzhiyun 		kfree(apad_ck);
506*4882a593Smuzhiyun 		return ERR_PTR(ret);
507*4882a593Smuzhiyun 	}
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun 	return &apad_ck->hw;
510*4882a593Smuzhiyun }
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun struct clk_hw * __init
at91_clk_register_audio_pll_pmc(struct regmap * regmap,const char * name,const char * parent_name)513*4882a593Smuzhiyun at91_clk_register_audio_pll_pmc(struct regmap *regmap, const char *name,
514*4882a593Smuzhiyun 				const char *parent_name)
515*4882a593Smuzhiyun {
516*4882a593Smuzhiyun 	struct clk_audio_pmc *apmc_ck;
517*4882a593Smuzhiyun 	struct clk_init_data init;
518*4882a593Smuzhiyun 	int ret;
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun 	apmc_ck = kzalloc(sizeof(*apmc_ck), GFP_KERNEL);
521*4882a593Smuzhiyun 	if (!apmc_ck)
522*4882a593Smuzhiyun 		return ERR_PTR(-ENOMEM);
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun 	init.name = name;
525*4882a593Smuzhiyun 	init.ops = &audio_pll_pmc_ops;
526*4882a593Smuzhiyun 	init.parent_names = &parent_name;
527*4882a593Smuzhiyun 	init.num_parents = 1;
528*4882a593Smuzhiyun 	init.flags = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
529*4882a593Smuzhiyun 		CLK_SET_RATE_PARENT;
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun 	apmc_ck->hw.init = &init;
532*4882a593Smuzhiyun 	apmc_ck->regmap = regmap;
533*4882a593Smuzhiyun 
534*4882a593Smuzhiyun 	ret = clk_hw_register(NULL, &apmc_ck->hw);
535*4882a593Smuzhiyun 	if (ret) {
536*4882a593Smuzhiyun 		kfree(apmc_ck);
537*4882a593Smuzhiyun 		return ERR_PTR(ret);
538*4882a593Smuzhiyun 	}
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun 	return &apmc_ck->hw;
541*4882a593Smuzhiyun }
542