xref: /openbmc/linux/drivers/clk/keystone/pll.c (revision b97d6790d03b763eca08847a9a5869a4291b9f9a)
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