Lines Matching +full:reg +full:- +full:mux
4 * Copyright (C) 2011-2012 Mike Turquette, Linaro Ltd <mturquette@linaro.org>
13 #include <linux/clk-provider.h>
23 * prepare - clk_prepare only ensures that parents are prepared
24 * enable - clk_enable only ensures that parents are enabled
25 * rate - rate is only affected by parent switching. No clk_set_rate support
26 * parent - parent is adjustable through clk_set_parent
40 return -EINVAL; in clk_mux_val_to_index()
44 val = ffs(val) - 1; in clk_mux_val_to_index()
47 val--; in clk_mux_val_to_index()
50 return -EINVAL; in clk_mux_val_to_index()
76 struct clk_mux *mux = to_clk_mux(hw); in clk_mux_get_parent() local
79 val = clk_readl(mux->reg) >> mux->shift; in clk_mux_get_parent()
80 val &= mux->mask; in clk_mux_get_parent()
82 return clk_mux_val_to_index(hw, mux->table, mux->flags, val); in clk_mux_get_parent()
87 struct clk_mux *mux = to_clk_mux(hw); in clk_mux_set_parent() local
88 u32 val = clk_mux_index_to_val(mux->table, mux->flags, index); in clk_mux_set_parent()
90 u32 reg; in clk_mux_set_parent() local
92 if (mux->lock) in clk_mux_set_parent()
93 spin_lock_irqsave(mux->lock, flags); in clk_mux_set_parent()
95 __acquire(mux->lock); in clk_mux_set_parent()
97 if (mux->flags & CLK_MUX_HIWORD_MASK) { in clk_mux_set_parent()
98 reg = mux->mask << (mux->shift + 16); in clk_mux_set_parent()
100 reg = clk_readl(mux->reg); in clk_mux_set_parent()
101 reg &= ~(mux->mask << mux->shift); in clk_mux_set_parent()
103 val = val << mux->shift; in clk_mux_set_parent()
104 reg |= val; in clk_mux_set_parent()
105 clk_writel(reg, mux->reg); in clk_mux_set_parent()
107 if (mux->lock) in clk_mux_set_parent()
108 spin_unlock_irqrestore(mux->lock, flags); in clk_mux_set_parent()
110 __release(mux->lock); in clk_mux_set_parent()
118 struct clk_mux *mux = to_clk_mux(hw); in clk_mux_determine_rate() local
120 return clk_mux_determine_rate_flags(hw, req, mux->flags); in clk_mux_determine_rate()
138 void __iomem *reg, u8 shift, u32 mask, in clk_hw_register_mux_table() argument
141 struct clk_mux *mux; in clk_hw_register_mux_table() local
148 width = fls(mask) - ffs(mask) + 1; in clk_hw_register_mux_table()
150 pr_err("mux value exceeds LOWORD field\n"); in clk_hw_register_mux_table()
151 return ERR_PTR(-EINVAL); in clk_hw_register_mux_table()
155 /* allocate the mux */ in clk_hw_register_mux_table()
156 mux = kzalloc(sizeof(*mux), GFP_KERNEL); in clk_hw_register_mux_table()
157 if (!mux) in clk_hw_register_mux_table()
158 return ERR_PTR(-ENOMEM); in clk_hw_register_mux_table()
170 mux->reg = reg; in clk_hw_register_mux_table()
171 mux->shift = shift; in clk_hw_register_mux_table()
172 mux->mask = mask; in clk_hw_register_mux_table()
173 mux->flags = clk_mux_flags; in clk_hw_register_mux_table()
174 mux->lock = lock; in clk_hw_register_mux_table()
175 mux->table = table; in clk_hw_register_mux_table()
176 mux->hw.init = &init; in clk_hw_register_mux_table()
178 hw = &mux->hw; in clk_hw_register_mux_table()
181 kfree(mux); in clk_hw_register_mux_table()
192 void __iomem *reg, u8 shift, u32 mask, in clk_register_mux_table() argument
198 flags, reg, shift, mask, clk_mux_flags, in clk_register_mux_table()
202 return hw->clk; in clk_register_mux_table()
209 void __iomem *reg, u8 shift, u8 width, in clk_register_mux() argument
212 u32 mask = BIT(width) - 1; in clk_register_mux()
215 flags, reg, shift, mask, clk_mux_flags, in clk_register_mux()
223 void __iomem *reg, u8 shift, u8 width, in clk_hw_register_mux() argument
226 u32 mask = BIT(width) - 1; in clk_hw_register_mux()
229 flags, reg, shift, mask, clk_mux_flags, in clk_hw_register_mux()
236 struct clk_mux *mux; in clk_unregister_mux() local
243 mux = to_clk_mux(hw); in clk_unregister_mux()
246 kfree(mux); in clk_unregister_mux()
252 struct clk_mux *mux; in clk_hw_unregister_mux() local
254 mux = to_clk_mux(hw); in clk_hw_unregister_mux()
257 kfree(mux); in clk_hw_unregister_mux()