xref: /linux/drivers/clk/ti/mux.c (revision 6a369c584fbe98264458b9442e780f8078f2f7ad)
1*6a369c58STero Kristo /*
2*6a369c58STero Kristo  * TI Multiplexer Clock
3*6a369c58STero Kristo  *
4*6a369c58STero Kristo  * Copyright (C) 2013 Texas Instruments, Inc.
5*6a369c58STero Kristo  *
6*6a369c58STero Kristo  * Tero Kristo <t-kristo@ti.com>
7*6a369c58STero Kristo  *
8*6a369c58STero Kristo  * This program is free software; you can redistribute it and/or modify
9*6a369c58STero Kristo  * it under the terms of the GNU General Public License version 2 as
10*6a369c58STero Kristo  * published by the Free Software Foundation.
11*6a369c58STero Kristo  *
12*6a369c58STero Kristo  * This program is distributed "as is" WITHOUT ANY WARRANTY of any
13*6a369c58STero Kristo  * kind, whether express or implied; without even the implied warranty
14*6a369c58STero Kristo  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*6a369c58STero Kristo  * GNU General Public License for more details.
16*6a369c58STero Kristo  */
17*6a369c58STero Kristo 
18*6a369c58STero Kristo #include <linux/clk-provider.h>
19*6a369c58STero Kristo #include <linux/slab.h>
20*6a369c58STero Kristo #include <linux/err.h>
21*6a369c58STero Kristo #include <linux/of.h>
22*6a369c58STero Kristo #include <linux/of_address.h>
23*6a369c58STero Kristo #include <linux/clk/ti.h>
24*6a369c58STero Kristo 
25*6a369c58STero Kristo #undef pr_fmt
26*6a369c58STero Kristo #define pr_fmt(fmt) "%s: " fmt, __func__
27*6a369c58STero Kristo 
28*6a369c58STero Kristo #define to_clk_mux(_hw) container_of(_hw, struct clk_mux, hw)
29*6a369c58STero Kristo 
30*6a369c58STero Kristo static u8 ti_clk_mux_get_parent(struct clk_hw *hw)
31*6a369c58STero Kristo {
32*6a369c58STero Kristo 	struct clk_mux *mux = to_clk_mux(hw);
33*6a369c58STero Kristo 	int num_parents = __clk_get_num_parents(hw->clk);
34*6a369c58STero Kristo 	u32 val;
35*6a369c58STero Kristo 
36*6a369c58STero Kristo 	/*
37*6a369c58STero Kristo 	 * FIXME need a mux-specific flag to determine if val is bitwise or
38*6a369c58STero Kristo 	 * numeric. e.g. sys_clkin_ck's clksel field is 3 bits wide, but ranges
39*6a369c58STero Kristo 	 * from 0x1 to 0x7 (index starts at one)
40*6a369c58STero Kristo 	 * OTOH, pmd_trace_clk_mux_ck uses a separate bit for each clock, so
41*6a369c58STero Kristo 	 * val = 0x4 really means "bit 2, index starts at bit 0"
42*6a369c58STero Kristo 	 */
43*6a369c58STero Kristo 	val = ti_clk_ll_ops->clk_readl(mux->reg) >> mux->shift;
44*6a369c58STero Kristo 	val &= mux->mask;
45*6a369c58STero Kristo 
46*6a369c58STero Kristo 	if (mux->table) {
47*6a369c58STero Kristo 		int i;
48*6a369c58STero Kristo 
49*6a369c58STero Kristo 		for (i = 0; i < num_parents; i++)
50*6a369c58STero Kristo 			if (mux->table[i] == val)
51*6a369c58STero Kristo 				return i;
52*6a369c58STero Kristo 		return -EINVAL;
53*6a369c58STero Kristo 	}
54*6a369c58STero Kristo 
55*6a369c58STero Kristo 	if (val && (mux->flags & CLK_MUX_INDEX_BIT))
56*6a369c58STero Kristo 		val = ffs(val) - 1;
57*6a369c58STero Kristo 
58*6a369c58STero Kristo 	if (val && (mux->flags & CLK_MUX_INDEX_ONE))
59*6a369c58STero Kristo 		val--;
60*6a369c58STero Kristo 
61*6a369c58STero Kristo 	if (val >= num_parents)
62*6a369c58STero Kristo 		return -EINVAL;
63*6a369c58STero Kristo 
64*6a369c58STero Kristo 	return val;
65*6a369c58STero Kristo }
66*6a369c58STero Kristo 
67*6a369c58STero Kristo static int ti_clk_mux_set_parent(struct clk_hw *hw, u8 index)
68*6a369c58STero Kristo {
69*6a369c58STero Kristo 	struct clk_mux *mux = to_clk_mux(hw);
70*6a369c58STero Kristo 	u32 val;
71*6a369c58STero Kristo 	unsigned long flags = 0;
72*6a369c58STero Kristo 
73*6a369c58STero Kristo 	if (mux->table) {
74*6a369c58STero Kristo 		index = mux->table[index];
75*6a369c58STero Kristo 	} else {
76*6a369c58STero Kristo 		if (mux->flags & CLK_MUX_INDEX_BIT)
77*6a369c58STero Kristo 			index = (1 << ffs(index));
78*6a369c58STero Kristo 
79*6a369c58STero Kristo 		if (mux->flags & CLK_MUX_INDEX_ONE)
80*6a369c58STero Kristo 			index++;
81*6a369c58STero Kristo 	}
82*6a369c58STero Kristo 
83*6a369c58STero Kristo 	if (mux->lock)
84*6a369c58STero Kristo 		spin_lock_irqsave(mux->lock, flags);
85*6a369c58STero Kristo 
86*6a369c58STero Kristo 	if (mux->flags & CLK_MUX_HIWORD_MASK) {
87*6a369c58STero Kristo 		val = mux->mask << (mux->shift + 16);
88*6a369c58STero Kristo 	} else {
89*6a369c58STero Kristo 		val = ti_clk_ll_ops->clk_readl(mux->reg);
90*6a369c58STero Kristo 		val &= ~(mux->mask << mux->shift);
91*6a369c58STero Kristo 	}
92*6a369c58STero Kristo 	val |= index << mux->shift;
93*6a369c58STero Kristo 	ti_clk_ll_ops->clk_writel(val, mux->reg);
94*6a369c58STero Kristo 
95*6a369c58STero Kristo 	if (mux->lock)
96*6a369c58STero Kristo 		spin_unlock_irqrestore(mux->lock, flags);
97*6a369c58STero Kristo 
98*6a369c58STero Kristo 	return 0;
99*6a369c58STero Kristo }
100*6a369c58STero Kristo 
101*6a369c58STero Kristo const struct clk_ops ti_clk_mux_ops = {
102*6a369c58STero Kristo 	.get_parent = ti_clk_mux_get_parent,
103*6a369c58STero Kristo 	.set_parent = ti_clk_mux_set_parent,
104*6a369c58STero Kristo 	.determine_rate = __clk_mux_determine_rate,
105*6a369c58STero Kristo };
106*6a369c58STero Kristo 
107*6a369c58STero Kristo static struct clk *_register_mux(struct device *dev, const char *name,
108*6a369c58STero Kristo 				 const char **parent_names, u8 num_parents,
109*6a369c58STero Kristo 				 unsigned long flags, void __iomem *reg,
110*6a369c58STero Kristo 				 u8 shift, u32 mask, u8 clk_mux_flags,
111*6a369c58STero Kristo 				 u32 *table, spinlock_t *lock)
112*6a369c58STero Kristo {
113*6a369c58STero Kristo 	struct clk_mux *mux;
114*6a369c58STero Kristo 	struct clk *clk;
115*6a369c58STero Kristo 	struct clk_init_data init;
116*6a369c58STero Kristo 
117*6a369c58STero Kristo 	/* allocate the mux */
118*6a369c58STero Kristo 	mux = kzalloc(sizeof(*mux), GFP_KERNEL);
119*6a369c58STero Kristo 	if (!mux) {
120*6a369c58STero Kristo 		pr_err("%s: could not allocate mux clk\n", __func__);
121*6a369c58STero Kristo 		return ERR_PTR(-ENOMEM);
122*6a369c58STero Kristo 	}
123*6a369c58STero Kristo 
124*6a369c58STero Kristo 	init.name = name;
125*6a369c58STero Kristo 	init.ops = &ti_clk_mux_ops;
126*6a369c58STero Kristo 	init.flags = flags | CLK_IS_BASIC;
127*6a369c58STero Kristo 	init.parent_names = parent_names;
128*6a369c58STero Kristo 	init.num_parents = num_parents;
129*6a369c58STero Kristo 
130*6a369c58STero Kristo 	/* struct clk_mux assignments */
131*6a369c58STero Kristo 	mux->reg = reg;
132*6a369c58STero Kristo 	mux->shift = shift;
133*6a369c58STero Kristo 	mux->mask = mask;
134*6a369c58STero Kristo 	mux->flags = clk_mux_flags;
135*6a369c58STero Kristo 	mux->lock = lock;
136*6a369c58STero Kristo 	mux->table = table;
137*6a369c58STero Kristo 	mux->hw.init = &init;
138*6a369c58STero Kristo 
139*6a369c58STero Kristo 	clk = clk_register(dev, &mux->hw);
140*6a369c58STero Kristo 
141*6a369c58STero Kristo 	if (IS_ERR(clk))
142*6a369c58STero Kristo 		kfree(mux);
143*6a369c58STero Kristo 
144*6a369c58STero Kristo 	return clk;
145*6a369c58STero Kristo }
146*6a369c58STero Kristo 
147*6a369c58STero Kristo /**
148*6a369c58STero Kristo  * of_mux_clk_setup - Setup function for simple mux rate clock
149*6a369c58STero Kristo  * @node: DT node for the clock
150*6a369c58STero Kristo  *
151*6a369c58STero Kristo  * Sets up a basic clock multiplexer.
152*6a369c58STero Kristo  */
153*6a369c58STero Kristo static void of_mux_clk_setup(struct device_node *node)
154*6a369c58STero Kristo {
155*6a369c58STero Kristo 	struct clk *clk;
156*6a369c58STero Kristo 	void __iomem *reg;
157*6a369c58STero Kristo 	int num_parents;
158*6a369c58STero Kristo 	const char **parent_names;
159*6a369c58STero Kristo 	int i;
160*6a369c58STero Kristo 	u8 clk_mux_flags = 0;
161*6a369c58STero Kristo 	u32 mask = 0;
162*6a369c58STero Kristo 	u32 shift = 0;
163*6a369c58STero Kristo 	u32 flags = 0;
164*6a369c58STero Kristo 
165*6a369c58STero Kristo 	num_parents = of_clk_get_parent_count(node);
166*6a369c58STero Kristo 	if (num_parents < 2) {
167*6a369c58STero Kristo 		pr_err("mux-clock %s must have parents\n", node->name);
168*6a369c58STero Kristo 		return;
169*6a369c58STero Kristo 	}
170*6a369c58STero Kristo 	parent_names = kzalloc((sizeof(char *) * num_parents), GFP_KERNEL);
171*6a369c58STero Kristo 	if (!parent_names)
172*6a369c58STero Kristo 		goto cleanup;
173*6a369c58STero Kristo 
174*6a369c58STero Kristo 	for (i = 0; i < num_parents; i++)
175*6a369c58STero Kristo 		parent_names[i] = of_clk_get_parent_name(node, i);
176*6a369c58STero Kristo 
177*6a369c58STero Kristo 	reg = ti_clk_get_reg_addr(node, 0);
178*6a369c58STero Kristo 
179*6a369c58STero Kristo 	if (!reg)
180*6a369c58STero Kristo 		goto cleanup;
181*6a369c58STero Kristo 
182*6a369c58STero Kristo 	of_property_read_u32(node, "ti,bit-shift", &shift);
183*6a369c58STero Kristo 
184*6a369c58STero Kristo 	if (of_property_read_bool(node, "ti,index-starts-at-one"))
185*6a369c58STero Kristo 		clk_mux_flags |= CLK_MUX_INDEX_ONE;
186*6a369c58STero Kristo 
187*6a369c58STero Kristo 	if (of_property_read_bool(node, "ti,set-rate-parent"))
188*6a369c58STero Kristo 		flags |= CLK_SET_RATE_PARENT;
189*6a369c58STero Kristo 
190*6a369c58STero Kristo 	/* Generate bit-mask based on parent info */
191*6a369c58STero Kristo 	mask = num_parents;
192*6a369c58STero Kristo 	if (!(clk_mux_flags & CLK_MUX_INDEX_ONE))
193*6a369c58STero Kristo 		mask--;
194*6a369c58STero Kristo 
195*6a369c58STero Kristo 	mask = (1 << fls(mask)) - 1;
196*6a369c58STero Kristo 
197*6a369c58STero Kristo 	clk = _register_mux(NULL, node->name, parent_names, num_parents, flags,
198*6a369c58STero Kristo 			    reg, shift, mask, clk_mux_flags, NULL, NULL);
199*6a369c58STero Kristo 
200*6a369c58STero Kristo 	if (!IS_ERR(clk))
201*6a369c58STero Kristo 		of_clk_add_provider(node, of_clk_src_simple_get, clk);
202*6a369c58STero Kristo 
203*6a369c58STero Kristo cleanup:
204*6a369c58STero Kristo 	kfree(parent_names);
205*6a369c58STero Kristo }
206*6a369c58STero Kristo CLK_OF_DECLARE(mux_clk, "ti,mux-clock", of_mux_clk_setup);
207*6a369c58STero Kristo 
208*6a369c58STero Kristo static void __init of_ti_composite_mux_clk_setup(struct device_node *node)
209*6a369c58STero Kristo {
210*6a369c58STero Kristo 	struct clk_mux *mux;
211*6a369c58STero Kristo 	int num_parents;
212*6a369c58STero Kristo 	u32 val;
213*6a369c58STero Kristo 
214*6a369c58STero Kristo 	mux = kzalloc(sizeof(*mux), GFP_KERNEL);
215*6a369c58STero Kristo 	if (!mux)
216*6a369c58STero Kristo 		return;
217*6a369c58STero Kristo 
218*6a369c58STero Kristo 	mux->reg = ti_clk_get_reg_addr(node, 0);
219*6a369c58STero Kristo 
220*6a369c58STero Kristo 	if (!mux->reg)
221*6a369c58STero Kristo 		goto cleanup;
222*6a369c58STero Kristo 
223*6a369c58STero Kristo 	if (!of_property_read_u32(node, "ti,bit-shift", &val))
224*6a369c58STero Kristo 		mux->shift = val;
225*6a369c58STero Kristo 
226*6a369c58STero Kristo 	if (of_property_read_bool(node, "ti,index-starts-at-one"))
227*6a369c58STero Kristo 		mux->flags |= CLK_MUX_INDEX_ONE;
228*6a369c58STero Kristo 
229*6a369c58STero Kristo 	num_parents = of_clk_get_parent_count(node);
230*6a369c58STero Kristo 
231*6a369c58STero Kristo 	if (num_parents < 2) {
232*6a369c58STero Kristo 		pr_err("%s must have parents\n", node->name);
233*6a369c58STero Kristo 		goto cleanup;
234*6a369c58STero Kristo 	}
235*6a369c58STero Kristo 
236*6a369c58STero Kristo 	mux->mask = num_parents - 1;
237*6a369c58STero Kristo 	mux->mask = (1 << fls(mux->mask)) - 1;
238*6a369c58STero Kristo 
239*6a369c58STero Kristo 	if (!ti_clk_add_component(node, &mux->hw, CLK_COMPONENT_TYPE_MUX))
240*6a369c58STero Kristo 		return;
241*6a369c58STero Kristo 
242*6a369c58STero Kristo cleanup:
243*6a369c58STero Kristo 	kfree(mux);
244*6a369c58STero Kristo }
245*6a369c58STero Kristo CLK_OF_DECLARE(ti_composite_mux_clk_setup, "ti,composite-mux-clock",
246*6a369c58STero Kristo 	       of_ti_composite_mux_clk_setup);
247