4 * Copyright (C) 2013 Texas Instruments, Inc.
6 * Tero Kristo <t-kristo@ti.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
12 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
13 * kind, whether express or implied; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
18 #include <linux/clk-provider.h>
19 #include <linux/slab.h>
20 #include <linux/err.h>
22 #include <linux/of_address.h>
23 #include <linux/clk/ti.h>
27 #define pr_fmt(fmt) "%s: " fmt, __func__
29 static unsigned int _get_table_div(const struct clk_div_table
*table
,
32 const struct clk_div_table
*clkt
;
34 for (clkt
= table
; clkt
->div
; clkt
++)
40 static void _setup_mask(struct clk_omap_divider
*divider
)
44 const struct clk_div_table
*clkt
;
49 for (clkt
= divider
->table
; clkt
->div
; clkt
++)
50 if (clkt
->val
> max_val
)
53 max_val
= divider
->max
;
55 if (!(divider
->flags
& CLK_DIVIDER_ONE_BASED
) &&
56 !(divider
->flags
& CLK_DIVIDER_POWER_OF_TWO
))
60 if (divider
->flags
& CLK_DIVIDER_POWER_OF_TWO
)
61 mask
= fls(max_val
) - 1;
65 divider
->mask
= (1 << fls(mask
)) - 1;
68 static unsigned int _get_div(struct clk_omap_divider
*divider
, unsigned int val
)
70 if (divider
->flags
& CLK_DIVIDER_ONE_BASED
)
72 if (divider
->flags
& CLK_DIVIDER_POWER_OF_TWO
)
75 return _get_table_div(divider
->table
, val
);
79 static unsigned int _get_table_val(const struct clk_div_table
*table
,
82 const struct clk_div_table
*clkt
;
84 for (clkt
= table
; clkt
->div
; clkt
++)
90 static unsigned int _get_val(struct clk_omap_divider
*divider
, u8 div
)
92 if (divider
->flags
& CLK_DIVIDER_ONE_BASED
)
94 if (divider
->flags
& CLK_DIVIDER_POWER_OF_TWO
)
97 return _get_table_val(divider
->table
, div
);
101 static unsigned long ti_clk_divider_recalc_rate(struct clk_hw
*hw
,
102 unsigned long parent_rate
)
104 struct clk_omap_divider
*divider
= to_clk_omap_divider(hw
);
105 unsigned int div
, val
;
107 val
= ti_clk_ll_ops
->clk_readl(÷r
->reg
) >> divider
->shift
;
108 val
&= divider
->mask
;
110 div
= _get_div(divider
, val
);
112 WARN(!(divider
->flags
& CLK_DIVIDER_ALLOW_ZERO
),
113 "%s: Zero divisor and CLK_DIVIDER_ALLOW_ZERO not set\n",
114 clk_hw_get_name(hw
));
118 return DIV_ROUND_UP(parent_rate
, div
);
122 * The reverse of DIV_ROUND_UP: The maximum number which
125 #define MULT_ROUND_UP(r, m) ((r) * (m) + (m) - 1)
127 static bool _is_valid_table_div(const struct clk_div_table
*table
,
130 const struct clk_div_table
*clkt
;
132 for (clkt
= table
; clkt
->div
; clkt
++)
133 if (clkt
->div
== div
)
138 static bool _is_valid_div(struct clk_omap_divider
*divider
, unsigned int div
)
140 if (divider
->flags
& CLK_DIVIDER_POWER_OF_TWO
)
141 return is_power_of_2(div
);
143 return _is_valid_table_div(divider
->table
, div
);
147 static int _div_round_up(const struct clk_div_table
*table
,
148 unsigned long parent_rate
, unsigned long rate
)
150 const struct clk_div_table
*clkt
;
152 int div
= DIV_ROUND_UP_ULL((u64
)parent_rate
, rate
);
154 for (clkt
= table
; clkt
->div
; clkt
++) {
155 if (clkt
->div
== div
)
157 else if (clkt
->div
< div
)
160 if ((clkt
->div
- div
) < (up
- div
))
167 static int _div_round(const struct clk_div_table
*table
,
168 unsigned long parent_rate
, unsigned long rate
)
171 return DIV_ROUND_UP(parent_rate
, rate
);
173 return _div_round_up(table
, parent_rate
, rate
);
176 static int ti_clk_divider_bestdiv(struct clk_hw
*hw
, unsigned long rate
,
177 unsigned long *best_parent_rate
)
179 struct clk_omap_divider
*divider
= to_clk_omap_divider(hw
);
181 unsigned long parent_rate
, best
= 0, now
, maxdiv
;
182 unsigned long parent_rate_saved
= *best_parent_rate
;
187 maxdiv
= divider
->max
;
189 if (!(clk_hw_get_flags(hw
) & CLK_SET_RATE_PARENT
)) {
190 parent_rate
= *best_parent_rate
;
191 bestdiv
= _div_round(divider
->table
, parent_rate
, rate
);
192 bestdiv
= bestdiv
== 0 ? 1 : bestdiv
;
193 bestdiv
= bestdiv
> maxdiv
? maxdiv
: bestdiv
;
198 * The maximum divider we can use without overflowing
199 * unsigned long in rate * i below
201 maxdiv
= min(ULONG_MAX
/ rate
, maxdiv
);
203 for (i
= 1; i
<= maxdiv
; i
++) {
204 if (!_is_valid_div(divider
, i
))
206 if (rate
* i
== parent_rate_saved
) {
208 * It's the most ideal case if the requested rate can be
209 * divided from parent clock without needing to change
210 * parent rate, so return the divider immediately.
212 *best_parent_rate
= parent_rate_saved
;
215 parent_rate
= clk_hw_round_rate(clk_hw_get_parent(hw
),
216 MULT_ROUND_UP(rate
, i
));
217 now
= DIV_ROUND_UP(parent_rate
, i
);
218 if (now
<= rate
&& now
> best
) {
221 *best_parent_rate
= parent_rate
;
226 bestdiv
= divider
->max
;
228 clk_hw_round_rate(clk_hw_get_parent(hw
), 1);
234 static long ti_clk_divider_round_rate(struct clk_hw
*hw
, unsigned long rate
,
235 unsigned long *prate
)
238 div
= ti_clk_divider_bestdiv(hw
, rate
, prate
);
240 return DIV_ROUND_UP(*prate
, div
);
243 static int ti_clk_divider_set_rate(struct clk_hw
*hw
, unsigned long rate
,
244 unsigned long parent_rate
)
246 struct clk_omap_divider
*divider
;
247 unsigned int div
, value
;
253 divider
= to_clk_omap_divider(hw
);
255 div
= DIV_ROUND_UP(parent_rate
, rate
);
257 if (div
> divider
->max
)
259 if (div
< divider
->min
)
262 value
= _get_val(divider
, div
);
264 val
= ti_clk_ll_ops
->clk_readl(÷r
->reg
);
265 val
&= ~(divider
->mask
<< divider
->shift
);
266 val
|= value
<< divider
->shift
;
267 ti_clk_ll_ops
->clk_writel(val
, ÷r
->reg
);
269 ti_clk_latch(÷r
->reg
, divider
->latch
);
275 * clk_divider_save_context - Save the divider value
276 * @hw: pointer struct clk_hw
278 * Save the divider value
280 static int clk_divider_save_context(struct clk_hw
*hw
)
282 struct clk_omap_divider
*divider
= to_clk_omap_divider(hw
);
285 val
= ti_clk_ll_ops
->clk_readl(÷r
->reg
) >> divider
->shift
;
286 divider
->context
= val
& divider
->mask
;
292 * clk_divider_restore_context - restore the saved the divider value
293 * @hw: pointer struct clk_hw
295 * Restore the saved the divider value
297 static void clk_divider_restore_context(struct clk_hw
*hw
)
299 struct clk_omap_divider
*divider
= to_clk_omap_divider(hw
);
302 val
= ti_clk_ll_ops
->clk_readl(÷r
->reg
);
303 val
&= ~(divider
->mask
<< divider
->shift
);
304 val
|= divider
->context
<< divider
->shift
;
305 ti_clk_ll_ops
->clk_writel(val
, ÷r
->reg
);
308 const struct clk_ops ti_clk_divider_ops
= {
309 .recalc_rate
= ti_clk_divider_recalc_rate
,
310 .round_rate
= ti_clk_divider_round_rate
,
311 .set_rate
= ti_clk_divider_set_rate
,
312 .save_context
= clk_divider_save_context
,
313 .restore_context
= clk_divider_restore_context
,
316 static struct clk
*_register_divider(struct device_node
*node
,
318 struct clk_omap_divider
*div
)
321 struct clk_init_data init
;
322 const char *parent_name
;
324 parent_name
= of_clk_get_parent_name(node
, 0);
326 init
.name
= node
->name
;
327 init
.ops
= &ti_clk_divider_ops
;
329 init
.parent_names
= (parent_name
? &parent_name
: NULL
);
330 init
.num_parents
= (parent_name
? 1 : 0);
332 div
->hw
.init
= &init
;
334 /* register the clock */
335 clk
= ti_clk_register(NULL
, &div
->hw
, node
->name
);
343 int ti_clk_parse_divider_data(int *div_table
, int num_dividers
, int max_div
,
344 u8 flags
, struct clk_omap_divider
*divider
)
348 struct clk_div_table
*tmp
;
353 divider
->max
= max_div
;
354 _setup_mask(divider
);
360 while (!num_dividers
|| i
< num_dividers
) {
361 if (div_table
[i
] == -1)
370 tmp
= kcalloc(valid_div
+ 1, sizeof(*tmp
), GFP_KERNEL
);
376 for (i
= 0; i
< num_dividers
; i
++)
377 if (div_table
[i
] > 0) {
378 tmp
[valid_div
].div
= div_table
[i
];
379 tmp
[valid_div
].val
= i
;
381 if (div_table
[i
] > max_div
)
382 max_div
= div_table
[i
];
383 if (!min_div
|| div_table
[i
] < min_div
)
384 min_div
= div_table
[i
];
387 divider
->min
= min_div
;
388 divider
->max
= max_div
;
389 divider
->table
= tmp
;
390 _setup_mask(divider
);
395 static int __init
ti_clk_get_div_table(struct device_node
*node
,
396 struct clk_omap_divider
*div
)
398 struct clk_div_table
*table
;
399 const __be32
*divspec
;
405 divspec
= of_get_property(node
, "ti,dividers", &num_div
);
414 /* Determine required size for divider table */
415 for (i
= 0; i
< num_div
; i
++) {
416 of_property_read_u32_index(node
, "ti,dividers", i
, &val
);
422 pr_err("no valid dividers for %pOFn table\n", node
);
426 table
= kcalloc(valid_div
+ 1, sizeof(*table
), GFP_KERNEL
);
432 for (i
= 0; i
< num_div
; i
++) {
433 of_property_read_u32_index(node
, "ti,dividers", i
, &val
);
435 table
[valid_div
].div
= val
;
436 table
[valid_div
].val
= i
;
446 static int _populate_divider_min_max(struct device_node
*node
,
447 struct clk_omap_divider
*divider
)
452 const struct clk_div_table
*clkt
;
454 if (!divider
->table
) {
455 /* Clk divider table not provided, determine min/max divs */
456 if (of_property_read_u32(node
, "ti,min-div", &min_div
))
459 if (of_property_read_u32(node
, "ti,max-div", &max_div
)) {
460 pr_err("no max-div for %pOFn!\n", node
);
465 for (clkt
= divider
->table
; clkt
->div
; clkt
++) {
469 if (!min_div
|| val
< min_div
)
474 divider
->min
= min_div
;
475 divider
->max
= max_div
;
476 _setup_mask(divider
);
481 static int __init
ti_clk_divider_populate(struct device_node
*node
,
482 struct clk_omap_divider
*div
,
488 ret
= ti_clk_get_reg_addr(node
, 0, &div
->reg
);
492 if (!of_property_read_u32(node
, "ti,bit-shift", &val
))
497 if (!of_property_read_u32(node
, "ti,latch-bit", &val
))
500 div
->latch
= -EINVAL
;
505 if (of_property_read_bool(node
, "ti,index-starts-at-one"))
506 div
->flags
|= CLK_DIVIDER_ONE_BASED
;
508 if (of_property_read_bool(node
, "ti,index-power-of-two"))
509 div
->flags
|= CLK_DIVIDER_POWER_OF_TWO
;
511 if (of_property_read_bool(node
, "ti,set-rate-parent"))
512 *flags
|= CLK_SET_RATE_PARENT
;
514 ret
= ti_clk_get_div_table(node
, div
);
518 return _populate_divider_min_max(node
, div
);
522 * of_ti_divider_clk_setup - Setup function for simple div rate clock
523 * @node: device node for this clock
525 * Sets up a basic divider clock.
527 static void __init
of_ti_divider_clk_setup(struct device_node
*node
)
531 struct clk_omap_divider
*div
;
533 div
= kzalloc(sizeof(*div
), GFP_KERNEL
);
537 if (ti_clk_divider_populate(node
, div
, &flags
))
540 clk
= _register_divider(node
, flags
, div
);
542 of_clk_add_provider(node
, of_clk_src_simple_get
, clk
);
543 of_ti_clk_autoidle_setup(node
);
551 CLK_OF_DECLARE(divider_clk
, "ti,divider-clock", of_ti_divider_clk_setup
);
553 static void __init
of_ti_composite_divider_clk_setup(struct device_node
*node
)
555 struct clk_omap_divider
*div
;
558 div
= kzalloc(sizeof(*div
), GFP_KERNEL
);
562 if (ti_clk_divider_populate(node
, div
, &tmp
))
565 if (!ti_clk_add_component(node
, &div
->hw
, CLK_COMPONENT_TYPE_DIVIDER
))
572 CLK_OF_DECLARE(ti_composite_divider_clk
, "ti,composite-divider-clock",
573 of_ti_composite_divider_clk_setup
);