1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2015 Atmel Corporation,
4 * Nicolas Ferre <nicolas.ferre@atmel.com>
6 * Based on clk-programmable & clk-peripheral drivers by Boris BREZILLON.
9 #include <linux/bitfield.h>
10 #include <linux/clk-provider.h>
11 #include <linux/clkdev.h>
12 #include <linux/clk/at91_pmc.h>
14 #include <linux/mfd/syscon.h>
15 #include <linux/regmap.h>
19 #define GENERATED_MAX_DIV 255
21 #define GCK_INDEX_DT_AUDIO_PLL 5
23 struct clk_generated
{
25 struct regmap
*regmap
;
26 struct clk_range range
;
30 const struct clk_pcr_layout
*layout
;
32 bool audio_pll_allowed
;
35 #define to_clk_generated(hw) \
36 container_of(hw, struct clk_generated, hw)
38 static int clk_generated_enable(struct clk_hw
*hw
)
40 struct clk_generated
*gck
= to_clk_generated(hw
);
43 pr_debug("GCLK: %s, gckdiv = %d, parent id = %d\n",
44 __func__
, gck
->gckdiv
, gck
->parent_id
);
46 spin_lock_irqsave(gck
->lock
, flags
);
47 regmap_write(gck
->regmap
, gck
->layout
->offset
,
48 (gck
->id
& gck
->layout
->pid_mask
));
49 regmap_update_bits(gck
->regmap
, gck
->layout
->offset
,
50 AT91_PMC_PCR_GCKDIV_MASK
| gck
->layout
->gckcss_mask
|
51 gck
->layout
->cmd
| AT91_PMC_PCR_GCKEN
,
52 field_prep(gck
->layout
->gckcss_mask
, gck
->parent_id
) |
54 FIELD_PREP(AT91_PMC_PCR_GCKDIV_MASK
, gck
->gckdiv
) |
56 spin_unlock_irqrestore(gck
->lock
, flags
);
60 static void clk_generated_disable(struct clk_hw
*hw
)
62 struct clk_generated
*gck
= to_clk_generated(hw
);
65 spin_lock_irqsave(gck
->lock
, flags
);
66 regmap_write(gck
->regmap
, gck
->layout
->offset
,
67 (gck
->id
& gck
->layout
->pid_mask
));
68 regmap_update_bits(gck
->regmap
, gck
->layout
->offset
,
69 gck
->layout
->cmd
| AT91_PMC_PCR_GCKEN
,
71 spin_unlock_irqrestore(gck
->lock
, flags
);
74 static int clk_generated_is_enabled(struct clk_hw
*hw
)
76 struct clk_generated
*gck
= to_clk_generated(hw
);
80 spin_lock_irqsave(gck
->lock
, flags
);
81 regmap_write(gck
->regmap
, gck
->layout
->offset
,
82 (gck
->id
& gck
->layout
->pid_mask
));
83 regmap_read(gck
->regmap
, gck
->layout
->offset
, &status
);
84 spin_unlock_irqrestore(gck
->lock
, flags
);
86 return status
& AT91_PMC_PCR_GCKEN
? 1 : 0;
90 clk_generated_recalc_rate(struct clk_hw
*hw
,
91 unsigned long parent_rate
)
93 struct clk_generated
*gck
= to_clk_generated(hw
);
95 return DIV_ROUND_CLOSEST(parent_rate
, gck
->gckdiv
+ 1);
98 static void clk_generated_best_diff(struct clk_rate_request
*req
,
99 struct clk_hw
*parent
,
100 unsigned long parent_rate
, u32 div
,
101 int *best_diff
, long *best_rate
)
103 unsigned long tmp_rate
;
107 tmp_rate
= parent_rate
;
109 tmp_rate
= parent_rate
/ div
;
110 tmp_diff
= abs(req
->rate
- tmp_rate
);
112 if (*best_diff
< 0 || *best_diff
> tmp_diff
) {
113 *best_rate
= tmp_rate
;
114 *best_diff
= tmp_diff
;
115 req
->best_parent_rate
= parent_rate
;
116 req
->best_parent_hw
= parent
;
120 static int clk_generated_determine_rate(struct clk_hw
*hw
,
121 struct clk_rate_request
*req
)
123 struct clk_generated
*gck
= to_clk_generated(hw
);
124 struct clk_hw
*parent
= NULL
;
125 struct clk_rate_request req_parent
= *req
;
126 long best_rate
= -EINVAL
;
127 unsigned long min_rate
, parent_rate
;
132 for (i
= 0; i
< clk_hw_get_num_parents(hw
) - 1; i
++) {
133 parent
= clk_hw_get_parent_by_index(hw
, i
);
137 parent_rate
= clk_hw_get_rate(parent
);
138 min_rate
= DIV_ROUND_CLOSEST(parent_rate
, GENERATED_MAX_DIV
+ 1);
140 (gck
->range
.max
&& min_rate
> gck
->range
.max
))
143 div
= DIV_ROUND_CLOSEST(parent_rate
, req
->rate
);
144 if (div
> GENERATED_MAX_DIV
+ 1)
145 div
= GENERATED_MAX_DIV
+ 1;
147 clk_generated_best_diff(req
, parent
, parent_rate
, div
,
148 &best_diff
, &best_rate
);
155 * The audio_pll rate can be modified, unlike the five others clocks
156 * that should never be altered.
157 * The audio_pll can technically be used by multiple consumers. However,
158 * with the rate locking, the first consumer to enable to clock will be
159 * the one definitely setting the rate of the clock.
160 * Since audio IPs are most likely to request the same rate, we enforce
161 * that the only clks able to modify gck rate are those of audio IPs.
164 if (!gck
->audio_pll_allowed
)
167 parent
= clk_hw_get_parent_by_index(hw
, GCK_INDEX_DT_AUDIO_PLL
);
171 for (div
= 1; div
< GENERATED_MAX_DIV
+ 2; div
++) {
172 req_parent
.rate
= req
->rate
* div
;
173 __clk_determine_rate(parent
, &req_parent
);
174 clk_generated_best_diff(req
, parent
, req_parent
.rate
, div
,
175 &best_diff
, &best_rate
);
182 pr_debug("GCLK: %s, best_rate = %ld, parent clk: %s @ %ld\n",
184 __clk_get_name((req
->best_parent_hw
)->clk
),
185 req
->best_parent_rate
);
190 req
->rate
= best_rate
;
194 /* No modification of hardware as we have the flag CLK_SET_PARENT_GATE set */
195 static int clk_generated_set_parent(struct clk_hw
*hw
, u8 index
)
197 struct clk_generated
*gck
= to_clk_generated(hw
);
199 if (index
>= clk_hw_get_num_parents(hw
))
202 gck
->parent_id
= index
;
206 static u8
clk_generated_get_parent(struct clk_hw
*hw
)
208 struct clk_generated
*gck
= to_clk_generated(hw
);
210 return gck
->parent_id
;
213 /* No modification of hardware as we have the flag CLK_SET_RATE_GATE set */
214 static int clk_generated_set_rate(struct clk_hw
*hw
,
216 unsigned long parent_rate
)
218 struct clk_generated
*gck
= to_clk_generated(hw
);
224 if (gck
->range
.max
&& rate
> gck
->range
.max
)
227 div
= DIV_ROUND_CLOSEST(parent_rate
, rate
);
228 if (div
> GENERATED_MAX_DIV
+ 1 || !div
)
231 gck
->gckdiv
= div
- 1;
235 static const struct clk_ops generated_ops
= {
236 .enable
= clk_generated_enable
,
237 .disable
= clk_generated_disable
,
238 .is_enabled
= clk_generated_is_enabled
,
239 .recalc_rate
= clk_generated_recalc_rate
,
240 .determine_rate
= clk_generated_determine_rate
,
241 .get_parent
= clk_generated_get_parent
,
242 .set_parent
= clk_generated_set_parent
,
243 .set_rate
= clk_generated_set_rate
,
247 * clk_generated_startup - Initialize a given clock to its default parent and
250 * @gck: Generated clock to set the startup parameters for.
252 * Take parameters from the hardware and update local clock configuration
255 static void clk_generated_startup(struct clk_generated
*gck
)
260 spin_lock_irqsave(gck
->lock
, flags
);
261 regmap_write(gck
->regmap
, gck
->layout
->offset
,
262 (gck
->id
& gck
->layout
->pid_mask
));
263 regmap_read(gck
->regmap
, gck
->layout
->offset
, &tmp
);
264 spin_unlock_irqrestore(gck
->lock
, flags
);
266 gck
->parent_id
= field_get(gck
->layout
->gckcss_mask
, tmp
);
267 gck
->gckdiv
= FIELD_GET(AT91_PMC_PCR_GCKDIV_MASK
, tmp
);
270 struct clk_hw
* __init
271 at91_clk_register_generated(struct regmap
*regmap
, spinlock_t
*lock
,
272 const struct clk_pcr_layout
*layout
,
273 const char *name
, const char **parent_names
,
274 u8 num_parents
, u8 id
, bool pll_audio
,
275 const struct clk_range
*range
)
277 struct clk_generated
*gck
;
278 struct clk_init_data init
;
282 gck
= kzalloc(sizeof(*gck
), GFP_KERNEL
);
284 return ERR_PTR(-ENOMEM
);
287 init
.ops
= &generated_ops
;
288 init
.parent_names
= parent_names
;
289 init
.num_parents
= num_parents
;
290 init
.flags
= CLK_SET_RATE_GATE
| CLK_SET_PARENT_GATE
|
294 gck
->hw
.init
= &init
;
295 gck
->regmap
= regmap
;
298 gck
->audio_pll_allowed
= pll_audio
;
299 gck
->layout
= layout
;
301 clk_generated_startup(gck
);
303 ret
= clk_hw_register(NULL
, &gck
->hw
);