12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2b9e0d40cSSantosh Shilimkar /*
3b9e0d40cSSantosh Shilimkar * PLL clock driver for Keystone devices
4b9e0d40cSSantosh Shilimkar *
5b9e0d40cSSantosh Shilimkar * Copyright (C) 2013 Texas Instruments Inc.
6b9e0d40cSSantosh Shilimkar * Murali Karicheri <m-karicheri2@ti.com>
7b9e0d40cSSantosh Shilimkar * Santosh Shilimkar <santosh.shilimkar@ti.com>
8b9e0d40cSSantosh Shilimkar */
9b9e0d40cSSantosh Shilimkar #include <linux/clk-provider.h>
10b9e0d40cSSantosh Shilimkar #include <linux/err.h>
11b9e0d40cSSantosh Shilimkar #include <linux/io.h>
12b9e0d40cSSantosh Shilimkar #include <linux/slab.h>
13b9e0d40cSSantosh Shilimkar #include <linux/of_address.h>
14b9e0d40cSSantosh Shilimkar #include <linux/of.h>
15b9e0d40cSSantosh Shilimkar #include <linux/module.h>
16b9e0d40cSSantosh Shilimkar
17b9e0d40cSSantosh Shilimkar #define PLLM_LOW_MASK 0x3f
18b9e0d40cSSantosh Shilimkar #define PLLM_HIGH_MASK 0x7ffc0
19b9e0d40cSSantosh Shilimkar #define MAIN_PLLM_HIGH_MASK 0x7f000
20b9e0d40cSSantosh Shilimkar #define PLLM_HIGH_SHIFT 6
21b9e0d40cSSantosh Shilimkar #define PLLD_MASK 0x3f
22dbb4e67fSMurali Karicheri #define CLKOD_MASK 0x780000
23dbb4e67fSMurali Karicheri #define CLKOD_SHIFT 19
24b9e0d40cSSantosh Shilimkar
25b9e0d40cSSantosh Shilimkar /**
26b9e0d40cSSantosh Shilimkar * struct clk_pll_data - pll data structure
27b9e0d40cSSantosh Shilimkar * @has_pllctrl: If set to non zero, lower 6 bits of multiplier is in pllm
28b9e0d40cSSantosh Shilimkar * register of pll controller, else it is in the pll_ctrl0((bit 11-6)
29b9e0d40cSSantosh Shilimkar * @phy_pllm: Physical address of PLLM in pll controller. Used when
30b9e0d40cSSantosh Shilimkar * has_pllctrl is non zero.
31b9e0d40cSSantosh Shilimkar * @phy_pll_ctl0: Physical address of PLL ctrl0. This could be that of
32b9e0d40cSSantosh Shilimkar * Main PLL or any other PLLs in the device such as ARM PLL, DDR PLL
33b9e0d40cSSantosh Shilimkar * or PA PLL available on keystone2. These PLLs are controlled by
34b9e0d40cSSantosh Shilimkar * this register. Main PLL is controlled by a PLL controller.
3502fdfd70SMurali Karicheri * @pllm: PLL register map address for multiplier bits
3602fdfd70SMurali Karicheri * @pllod: PLL register map address for post divider bits
37b9e0d40cSSantosh Shilimkar * @pll_ctl0: PLL controller map address
38b9e0d40cSSantosh Shilimkar * @pllm_lower_mask: multiplier lower mask
39b9e0d40cSSantosh Shilimkar * @pllm_upper_mask: multiplier upper mask
40b9e0d40cSSantosh Shilimkar * @pllm_upper_shift: multiplier upper shift
41b9e0d40cSSantosh Shilimkar * @plld_mask: divider mask
42dbb4e67fSMurali Karicheri * @clkod_mask: output divider mask
43dbb4e67fSMurali Karicheri * @clkod_shift: output divider shift
44dbb4e67fSMurali Karicheri * @plld_mask: divider mask
45dbb4e67fSMurali Karicheri * @postdiv: Fixed post divider
46b9e0d40cSSantosh Shilimkar */
47b9e0d40cSSantosh Shilimkar struct clk_pll_data {
48b9e0d40cSSantosh Shilimkar bool has_pllctrl;
49b9e0d40cSSantosh Shilimkar u32 phy_pllm;
50b9e0d40cSSantosh Shilimkar u32 phy_pll_ctl0;
51b9e0d40cSSantosh Shilimkar void __iomem *pllm;
5202fdfd70SMurali Karicheri void __iomem *pllod;
53b9e0d40cSSantosh Shilimkar void __iomem *pll_ctl0;
54b9e0d40cSSantosh Shilimkar u32 pllm_lower_mask;
55b9e0d40cSSantosh Shilimkar u32 pllm_upper_mask;
56b9e0d40cSSantosh Shilimkar u32 pllm_upper_shift;
57b9e0d40cSSantosh Shilimkar u32 plld_mask;
58dbb4e67fSMurali Karicheri u32 clkod_mask;
59dbb4e67fSMurali Karicheri u32 clkod_shift;
60b9e0d40cSSantosh Shilimkar u32 postdiv;
61b9e0d40cSSantosh Shilimkar };
62b9e0d40cSSantosh Shilimkar
63b9e0d40cSSantosh Shilimkar /**
64b9e0d40cSSantosh Shilimkar * struct clk_pll - Main pll clock
65b9e0d40cSSantosh Shilimkar * @hw: clk_hw for the pll
66b9e0d40cSSantosh Shilimkar * @pll_data: PLL driver specific data
67b9e0d40cSSantosh Shilimkar */
68b9e0d40cSSantosh Shilimkar struct clk_pll {
69b9e0d40cSSantosh Shilimkar struct clk_hw hw;
70b9e0d40cSSantosh Shilimkar struct clk_pll_data *pll_data;
71b9e0d40cSSantosh Shilimkar };
72b9e0d40cSSantosh Shilimkar
73b9e0d40cSSantosh Shilimkar #define to_clk_pll(_hw) container_of(_hw, struct clk_pll, hw)
74b9e0d40cSSantosh Shilimkar
clk_pllclk_recalc(struct clk_hw * hw,unsigned long parent_rate)75b9e0d40cSSantosh Shilimkar static unsigned long clk_pllclk_recalc(struct clk_hw *hw,
76b9e0d40cSSantosh Shilimkar unsigned long parent_rate)
77b9e0d40cSSantosh Shilimkar {
78b9e0d40cSSantosh Shilimkar struct clk_pll *pll = to_clk_pll(hw);
79b9e0d40cSSantosh Shilimkar struct clk_pll_data *pll_data = pll->pll_data;
80b9e0d40cSSantosh Shilimkar unsigned long rate = parent_rate;
81b9e0d40cSSantosh Shilimkar u32 mult = 0, prediv, postdiv, val;
82b9e0d40cSSantosh Shilimkar
83b9e0d40cSSantosh Shilimkar /*
84b9e0d40cSSantosh Shilimkar * get bits 0-5 of multiplier from pllctrl PLLM register
85b9e0d40cSSantosh Shilimkar * if has_pllctrl is non zero
86b9e0d40cSSantosh Shilimkar */
87b9e0d40cSSantosh Shilimkar if (pll_data->has_pllctrl) {
88b9e0d40cSSantosh Shilimkar val = readl(pll_data->pllm);
89b9e0d40cSSantosh Shilimkar mult = (val & pll_data->pllm_lower_mask);
90b9e0d40cSSantosh Shilimkar }
91b9e0d40cSSantosh Shilimkar
92b9e0d40cSSantosh Shilimkar /* bit6-12 of PLLM is in Main PLL control register */
93b9e0d40cSSantosh Shilimkar val = readl(pll_data->pll_ctl0);
94b9e0d40cSSantosh Shilimkar mult |= ((val & pll_data->pllm_upper_mask)
95b9e0d40cSSantosh Shilimkar >> pll_data->pllm_upper_shift);
96b9e0d40cSSantosh Shilimkar prediv = (val & pll_data->plld_mask);
97dbb4e67fSMurali Karicheri
98dbb4e67fSMurali Karicheri if (!pll_data->has_pllctrl)
99dbb4e67fSMurali Karicheri /* read post divider from od bits*/
100dbb4e67fSMurali Karicheri postdiv = ((val & pll_data->clkod_mask) >>
101dbb4e67fSMurali Karicheri pll_data->clkod_shift) + 1;
10202fdfd70SMurali Karicheri else if (pll_data->pllod) {
10302fdfd70SMurali Karicheri postdiv = readl(pll_data->pllod);
10402fdfd70SMurali Karicheri postdiv = ((postdiv & pll_data->clkod_mask) >>
10502fdfd70SMurali Karicheri pll_data->clkod_shift) + 1;
10602fdfd70SMurali Karicheri } else
107b9e0d40cSSantosh Shilimkar postdiv = pll_data->postdiv;
108b9e0d40cSSantosh Shilimkar
109b9e0d40cSSantosh Shilimkar rate /= (prediv + 1);
110b9e0d40cSSantosh Shilimkar rate = (rate * (mult + 1));
111b9e0d40cSSantosh Shilimkar rate /= postdiv;
112b9e0d40cSSantosh Shilimkar
113b9e0d40cSSantosh Shilimkar return rate;
114b9e0d40cSSantosh Shilimkar }
115b9e0d40cSSantosh Shilimkar
116b9e0d40cSSantosh Shilimkar static const struct clk_ops clk_pll_ops = {
117b9e0d40cSSantosh Shilimkar .recalc_rate = clk_pllclk_recalc,
118b9e0d40cSSantosh Shilimkar };
119b9e0d40cSSantosh Shilimkar
clk_register_pll(struct device * dev,const char * name,const char * parent_name,struct clk_pll_data * pll_data)120b9e0d40cSSantosh Shilimkar static struct clk *clk_register_pll(struct device *dev,
121b9e0d40cSSantosh Shilimkar const char *name,
122b9e0d40cSSantosh Shilimkar const char *parent_name,
123b9e0d40cSSantosh Shilimkar struct clk_pll_data *pll_data)
124b9e0d40cSSantosh Shilimkar {
125b9e0d40cSSantosh Shilimkar struct clk_init_data init;
126b9e0d40cSSantosh Shilimkar struct clk_pll *pll;
127b9e0d40cSSantosh Shilimkar struct clk *clk;
128b9e0d40cSSantosh Shilimkar
129b9e0d40cSSantosh Shilimkar pll = kzalloc(sizeof(*pll), GFP_KERNEL);
130b9e0d40cSSantosh Shilimkar if (!pll)
131b9e0d40cSSantosh Shilimkar return ERR_PTR(-ENOMEM);
132b9e0d40cSSantosh Shilimkar
133b9e0d40cSSantosh Shilimkar init.name = name;
134b9e0d40cSSantosh Shilimkar init.ops = &clk_pll_ops;
135b9e0d40cSSantosh Shilimkar init.flags = 0;
136b9e0d40cSSantosh Shilimkar init.parent_names = (parent_name ? &parent_name : NULL);
137b9e0d40cSSantosh Shilimkar init.num_parents = (parent_name ? 1 : 0);
138b9e0d40cSSantosh Shilimkar
139b9e0d40cSSantosh Shilimkar pll->pll_data = pll_data;
140b9e0d40cSSantosh Shilimkar pll->hw.init = &init;
141b9e0d40cSSantosh Shilimkar
142b9e0d40cSSantosh Shilimkar clk = clk_register(NULL, &pll->hw);
143b9e0d40cSSantosh Shilimkar if (IS_ERR(clk))
144b9e0d40cSSantosh Shilimkar goto out;
145b9e0d40cSSantosh Shilimkar
146b9e0d40cSSantosh Shilimkar return clk;
147b9e0d40cSSantosh Shilimkar out:
148b9e0d40cSSantosh Shilimkar kfree(pll);
149b9e0d40cSSantosh Shilimkar return NULL;
150b9e0d40cSSantosh Shilimkar }
151b9e0d40cSSantosh Shilimkar
152b9e0d40cSSantosh Shilimkar /**
1535170d55eSJulia Lawall * _of_pll_clk_init - PLL initialisation via DT
154b9e0d40cSSantosh Shilimkar * @node: device tree node for this clock
155b9e0d40cSSantosh Shilimkar * @pllctrl: If true, lower 6 bits of multiplier is in pllm register of
156b30c6450SGeliang Tang * pll controller, else it is in the control register0(bit 11-6)
157b9e0d40cSSantosh Shilimkar */
_of_pll_clk_init(struct device_node * node,bool pllctrl)158b9e0d40cSSantosh Shilimkar static void __init _of_pll_clk_init(struct device_node *node, bool pllctrl)
159b9e0d40cSSantosh Shilimkar {
160b9e0d40cSSantosh Shilimkar struct clk_pll_data *pll_data;
161b9e0d40cSSantosh Shilimkar const char *parent_name;
162b9e0d40cSSantosh Shilimkar struct clk *clk;
163b9e0d40cSSantosh Shilimkar int i;
164b9e0d40cSSantosh Shilimkar
165b9e0d40cSSantosh Shilimkar pll_data = kzalloc(sizeof(*pll_data), GFP_KERNEL);
166b9e0d40cSSantosh Shilimkar if (!pll_data) {
167b9e0d40cSSantosh Shilimkar pr_err("%s: Out of memory\n", __func__);
168b9e0d40cSSantosh Shilimkar return;
169b9e0d40cSSantosh Shilimkar }
170b9e0d40cSSantosh Shilimkar
171b9e0d40cSSantosh Shilimkar parent_name = of_clk_get_parent_name(node, 0);
172dbb4e67fSMurali Karicheri if (of_property_read_u32(node, "fixed-postdiv", &pll_data->postdiv)) {
173dbb4e67fSMurali Karicheri /* assume the PLL has output divider register bits */
174dbb4e67fSMurali Karicheri pll_data->clkod_mask = CLKOD_MASK;
175dbb4e67fSMurali Karicheri pll_data->clkod_shift = CLKOD_SHIFT;
17602fdfd70SMurali Karicheri
17702fdfd70SMurali Karicheri /*
17802fdfd70SMurali Karicheri * Check if there is an post-divider register. If not
17902fdfd70SMurali Karicheri * assume od bits are part of control register.
18002fdfd70SMurali Karicheri */
18102fdfd70SMurali Karicheri i = of_property_match_string(node, "reg-names",
18202fdfd70SMurali Karicheri "post-divider");
18302fdfd70SMurali Karicheri pll_data->pllod = of_iomap(node, i);
184dbb4e67fSMurali Karicheri }
185b9e0d40cSSantosh Shilimkar
186b9e0d40cSSantosh Shilimkar i = of_property_match_string(node, "reg-names", "control");
187b9e0d40cSSantosh Shilimkar pll_data->pll_ctl0 = of_iomap(node, i);
188b9e0d40cSSantosh Shilimkar if (!pll_data->pll_ctl0) {
189b9e0d40cSSantosh Shilimkar pr_err("%s: ioremap failed\n", __func__);
19002fdfd70SMurali Karicheri iounmap(pll_data->pllod);
191b9e0d40cSSantosh Shilimkar goto out;
192b9e0d40cSSantosh Shilimkar }
193b9e0d40cSSantosh Shilimkar
194b9e0d40cSSantosh Shilimkar pll_data->pllm_lower_mask = PLLM_LOW_MASK;
195b9e0d40cSSantosh Shilimkar pll_data->pllm_upper_shift = PLLM_HIGH_SHIFT;
196b9e0d40cSSantosh Shilimkar pll_data->plld_mask = PLLD_MASK;
197b9e0d40cSSantosh Shilimkar pll_data->has_pllctrl = pllctrl;
198b9e0d40cSSantosh Shilimkar if (!pll_data->has_pllctrl) {
199b9e0d40cSSantosh Shilimkar pll_data->pllm_upper_mask = PLLM_HIGH_MASK;
200b9e0d40cSSantosh Shilimkar } else {
201b9e0d40cSSantosh Shilimkar pll_data->pllm_upper_mask = MAIN_PLLM_HIGH_MASK;
202b9e0d40cSSantosh Shilimkar i = of_property_match_string(node, "reg-names", "multiplier");
203b9e0d40cSSantosh Shilimkar pll_data->pllm = of_iomap(node, i);
204b9e0d40cSSantosh Shilimkar if (!pll_data->pllm) {
205b9e0d40cSSantosh Shilimkar iounmap(pll_data->pll_ctl0);
20602fdfd70SMurali Karicheri iounmap(pll_data->pllod);
207b9e0d40cSSantosh Shilimkar goto out;
208b9e0d40cSSantosh Shilimkar }
209b9e0d40cSSantosh Shilimkar }
210b9e0d40cSSantosh Shilimkar
211b9e0d40cSSantosh Shilimkar clk = clk_register_pll(NULL, node->name, parent_name, pll_data);
212a995c50dSMinjie Du if (!IS_ERR_OR_NULL(clk)) {
213b9e0d40cSSantosh Shilimkar of_clk_add_provider(node, of_clk_src_simple_get, clk);
214b9e0d40cSSantosh Shilimkar return;
215b9e0d40cSSantosh Shilimkar }
216b9e0d40cSSantosh Shilimkar
217b9e0d40cSSantosh Shilimkar out:
218e665f029SRob Herring pr_err("%s: error initializing pll %pOFn\n", __func__, node);
219b9e0d40cSSantosh Shilimkar kfree(pll_data);
220b9e0d40cSSantosh Shilimkar }
221b9e0d40cSSantosh Shilimkar
222b9e0d40cSSantosh Shilimkar /**
223b9e0d40cSSantosh Shilimkar * of_keystone_pll_clk_init - PLL initialisation DT wrapper
224b9e0d40cSSantosh Shilimkar * @node: device tree node for this clock
225b9e0d40cSSantosh Shilimkar */
of_keystone_pll_clk_init(struct device_node * node)226b9e0d40cSSantosh Shilimkar static void __init of_keystone_pll_clk_init(struct device_node *node)
227b9e0d40cSSantosh Shilimkar {
228b9e0d40cSSantosh Shilimkar _of_pll_clk_init(node, false);
229b9e0d40cSSantosh Shilimkar }
230b9e0d40cSSantosh Shilimkar CLK_OF_DECLARE(keystone_pll_clock, "ti,keystone,pll-clock",
231b9e0d40cSSantosh Shilimkar of_keystone_pll_clk_init);
232b9e0d40cSSantosh Shilimkar
233b9e0d40cSSantosh Shilimkar /**
2345170d55eSJulia Lawall * of_keystone_main_pll_clk_init - Main PLL initialisation DT wrapper
235b9e0d40cSSantosh Shilimkar * @node: device tree node for this clock
236b9e0d40cSSantosh Shilimkar */
of_keystone_main_pll_clk_init(struct device_node * node)237b9e0d40cSSantosh Shilimkar static void __init of_keystone_main_pll_clk_init(struct device_node *node)
238b9e0d40cSSantosh Shilimkar {
239b9e0d40cSSantosh Shilimkar _of_pll_clk_init(node, true);
240b9e0d40cSSantosh Shilimkar }
241b9e0d40cSSantosh Shilimkar CLK_OF_DECLARE(keystone_main_pll_clock, "ti,keystone,main-pll-clock",
242b9e0d40cSSantosh Shilimkar of_keystone_main_pll_clk_init);
243b9e0d40cSSantosh Shilimkar
244b9e0d40cSSantosh Shilimkar /**
245b9e0d40cSSantosh Shilimkar * of_pll_div_clk_init - PLL divider setup function
246b9e0d40cSSantosh Shilimkar * @node: device tree node for this clock
247b9e0d40cSSantosh Shilimkar */
of_pll_div_clk_init(struct device_node * node)248b9e0d40cSSantosh Shilimkar static void __init of_pll_div_clk_init(struct device_node *node)
249b9e0d40cSSantosh Shilimkar {
250b9e0d40cSSantosh Shilimkar const char *parent_name;
251b9e0d40cSSantosh Shilimkar void __iomem *reg;
252b9e0d40cSSantosh Shilimkar u32 shift, mask;
253b9e0d40cSSantosh Shilimkar struct clk *clk;
254b9e0d40cSSantosh Shilimkar const char *clk_name = node->name;
255b9e0d40cSSantosh Shilimkar
256b9e0d40cSSantosh Shilimkar of_property_read_string(node, "clock-output-names", &clk_name);
257b9e0d40cSSantosh Shilimkar reg = of_iomap(node, 0);
258b9e0d40cSSantosh Shilimkar if (!reg) {
259b9e0d40cSSantosh Shilimkar pr_err("%s: ioremap failed\n", __func__);
260b9e0d40cSSantosh Shilimkar return;
261b9e0d40cSSantosh Shilimkar }
262b9e0d40cSSantosh Shilimkar
263b9e0d40cSSantosh Shilimkar parent_name = of_clk_get_parent_name(node, 0);
264b9e0d40cSSantosh Shilimkar if (!parent_name) {
265b9e0d40cSSantosh Shilimkar pr_err("%s: missing parent clock\n", __func__);
266113ff9c9SArvind Yadav iounmap(reg);
267b9e0d40cSSantosh Shilimkar return;
268b9e0d40cSSantosh Shilimkar }
269b9e0d40cSSantosh Shilimkar
270b9e0d40cSSantosh Shilimkar if (of_property_read_u32(node, "bit-shift", &shift)) {
271b9e0d40cSSantosh Shilimkar pr_err("%s: missing 'shift' property\n", __func__);
272113ff9c9SArvind Yadav iounmap(reg);
273b9e0d40cSSantosh Shilimkar return;
274b9e0d40cSSantosh Shilimkar }
275b9e0d40cSSantosh Shilimkar
276b9e0d40cSSantosh Shilimkar if (of_property_read_u32(node, "bit-mask", &mask)) {
277b9e0d40cSSantosh Shilimkar pr_err("%s: missing 'bit-mask' property\n", __func__);
278113ff9c9SArvind Yadav iounmap(reg);
279b9e0d40cSSantosh Shilimkar return;
280b9e0d40cSSantosh Shilimkar }
281b9e0d40cSSantosh Shilimkar
282b9e0d40cSSantosh Shilimkar clk = clk_register_divider(NULL, clk_name, parent_name, 0, reg, shift,
283b9e0d40cSSantosh Shilimkar mask, 0, NULL);
284*82fce514SDan Carpenter if (IS_ERR(clk)) {
285b9e0d40cSSantosh Shilimkar pr_err("%s: error registering divider %s\n", __func__, clk_name);
286113ff9c9SArvind Yadav iounmap(reg);
287*82fce514SDan Carpenter return;
288113ff9c9SArvind Yadav }
289*82fce514SDan Carpenter
290*82fce514SDan Carpenter of_clk_add_provider(node, of_clk_src_simple_get, clk);
291b9e0d40cSSantosh Shilimkar }
292b9e0d40cSSantosh Shilimkar CLK_OF_DECLARE(pll_divider_clock, "ti,keystone,pll-divider-clock", of_pll_div_clk_init);
293b9e0d40cSSantosh Shilimkar
294b9e0d40cSSantosh Shilimkar /**
295b9e0d40cSSantosh Shilimkar * of_pll_mux_clk_init - PLL mux setup function
296b9e0d40cSSantosh Shilimkar * @node: device tree node for this clock
297b9e0d40cSSantosh Shilimkar */
of_pll_mux_clk_init(struct device_node * node)298b9e0d40cSSantosh Shilimkar static void __init of_pll_mux_clk_init(struct device_node *node)
299b9e0d40cSSantosh Shilimkar {
300b9e0d40cSSantosh Shilimkar void __iomem *reg;
301b9e0d40cSSantosh Shilimkar u32 shift, mask;
302b9e0d40cSSantosh Shilimkar struct clk *clk;
303b9e0d40cSSantosh Shilimkar const char *parents[2];
304b9e0d40cSSantosh Shilimkar const char *clk_name = node->name;
305b9e0d40cSSantosh Shilimkar
306b9e0d40cSSantosh Shilimkar of_property_read_string(node, "clock-output-names", &clk_name);
307b9e0d40cSSantosh Shilimkar reg = of_iomap(node, 0);
308b9e0d40cSSantosh Shilimkar if (!reg) {
309b9e0d40cSSantosh Shilimkar pr_err("%s: ioremap failed\n", __func__);
310b9e0d40cSSantosh Shilimkar return;
311b9e0d40cSSantosh Shilimkar }
312b9e0d40cSSantosh Shilimkar
3135f23eff7SDinh Nguyen of_clk_parent_fill(node, parents, 2);
314b9e0d40cSSantosh Shilimkar if (!parents[0] || !parents[1]) {
315b9e0d40cSSantosh Shilimkar pr_err("%s: missing parent clocks\n", __func__);
316b9e0d40cSSantosh Shilimkar return;
317b9e0d40cSSantosh Shilimkar }
318b9e0d40cSSantosh Shilimkar
319b9e0d40cSSantosh Shilimkar if (of_property_read_u32(node, "bit-shift", &shift)) {
320b9e0d40cSSantosh Shilimkar pr_err("%s: missing 'shift' property\n", __func__);
321b9e0d40cSSantosh Shilimkar return;
322b9e0d40cSSantosh Shilimkar }
323b9e0d40cSSantosh Shilimkar
324b9e0d40cSSantosh Shilimkar if (of_property_read_u32(node, "bit-mask", &mask)) {
325b9e0d40cSSantosh Shilimkar pr_err("%s: missing 'bit-mask' property\n", __func__);
326b9e0d40cSSantosh Shilimkar return;
327b9e0d40cSSantosh Shilimkar }
328b9e0d40cSSantosh Shilimkar
329b9e0d40cSSantosh Shilimkar clk = clk_register_mux(NULL, clk_name, (const char **)&parents,
330b9e0d40cSSantosh Shilimkar ARRAY_SIZE(parents) , 0, reg, shift, mask,
331b9e0d40cSSantosh Shilimkar 0, NULL);
332*82fce514SDan Carpenter if (IS_ERR(clk)) {
333b9e0d40cSSantosh Shilimkar pr_err("%s: error registering mux %s\n", __func__, clk_name);
334*82fce514SDan Carpenter return;
335*82fce514SDan Carpenter }
336*82fce514SDan Carpenter
337*82fce514SDan Carpenter of_clk_add_provider(node, of_clk_src_simple_get, clk);
338b9e0d40cSSantosh Shilimkar }
339b9e0d40cSSantosh Shilimkar CLK_OF_DECLARE(pll_mux_clock, "ti,keystone,pll-mux-clock", of_pll_mux_clk_init);
3409e6dbc3dSArnd Bergmann
3419e6dbc3dSArnd Bergmann MODULE_LICENSE("GPL");
3429e6dbc3dSArnd Bergmann MODULE_DESCRIPTION("PLL clock driver for Keystone devices");
3439e6dbc3dSArnd Bergmann MODULE_AUTHOR("Murali Karicheri <m-karicheri2@ti.com>");
3449e6dbc3dSArnd Bergmann MODULE_AUTHOR("Santosh Shilimkar <santosh.shilimkar@ti.com>");
345