1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
3 | * TI Fixed Factor Clock |
4 | * |
5 | * Copyright (C) 2013 Texas Instruments, Inc. |
6 | * |
7 | * Tero Kristo <t-kristo@ti.com> |
8 | */ |
9 | |
10 | #include <linux/clk-provider.h> |
11 | #include <linux/slab.h> |
12 | #include <linux/err.h> |
13 | #include <linux/of.h> |
14 | #include <linux/of_address.h> |
15 | #include <linux/clk/ti.h> |
16 | |
17 | #include "clock.h" |
18 | |
19 | #undef pr_fmt |
20 | #define pr_fmt(fmt) "%s: " fmt, __func__ |
21 | |
22 | /** |
23 | * of_ti_fixed_factor_clk_setup - Setup function for TI fixed factor clock |
24 | * @node: device node for this clock |
25 | * |
26 | * Sets up a simple fixed factor clock based on device tree info. |
27 | */ |
28 | static void __init of_ti_fixed_factor_clk_setup(struct device_node *node) |
29 | { |
30 | struct clk *clk; |
31 | const char *clk_name = ti_dt_clk_name(np: node); |
32 | const char *parent_name; |
33 | u32 div, mult; |
34 | u32 flags = 0; |
35 | |
36 | if (of_property_read_u32(np: node, propname: "ti,clock-div" , out_value: &div)) { |
37 | pr_err("%pOFn must have a clock-div property\n" , node); |
38 | return; |
39 | } |
40 | |
41 | if (of_property_read_u32(np: node, propname: "ti,clock-mult" , out_value: &mult)) { |
42 | pr_err("%pOFn must have a clock-mult property\n" , node); |
43 | return; |
44 | } |
45 | |
46 | if (of_property_read_bool(np: node, propname: "ti,set-rate-parent" )) |
47 | flags |= CLK_SET_RATE_PARENT; |
48 | |
49 | parent_name = of_clk_get_parent_name(np: node, index: 0); |
50 | |
51 | clk = clk_register_fixed_factor(NULL, name: clk_name, parent_name, flags, |
52 | mult, div); |
53 | |
54 | if (!IS_ERR(ptr: clk)) { |
55 | of_clk_add_provider(np: node, clk_src_get: of_clk_src_simple_get, data: clk); |
56 | of_ti_clk_autoidle_setup(node); |
57 | ti_clk_add_alias(clk, con: clk_name); |
58 | } |
59 | } |
60 | CLK_OF_DECLARE(ti_fixed_factor_clk, "ti,fixed-factor-clock" , |
61 | of_ti_fixed_factor_clk_setup); |
62 | |