• Home
  • Raw
  • Download

Lines Matching +full:mux +full:- +full:mask

1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2011-2012 Mike Turquette, Linaro Ltd <mturquette@linaro.org>
10 #include <linux/clk-provider.h>
20 * prepare - clk_prepare only ensures that parents are prepared
21 * enable - clk_enable only ensures that parents are enabled
22 * rate - rate is only affected by parent switching. No clk_set_rate support
23 * parent - parent is adjustable through clk_set_parent
26 static inline u32 clk_mux_readl(struct clk_mux *mux) in clk_mux_readl() argument
28 if (mux->flags & CLK_MUX_BIG_ENDIAN) in clk_mux_readl()
29 return ioread32be(mux->reg); in clk_mux_readl()
31 return readl(mux->reg); in clk_mux_readl()
34 static inline void clk_mux_writel(struct clk_mux *mux, u32 val) in clk_mux_writel() argument
36 if (mux->flags & CLK_MUX_BIG_ENDIAN) in clk_mux_writel()
37 iowrite32be(val, mux->reg); in clk_mux_writel()
39 writel(val, mux->reg); in clk_mux_writel()
53 return -EINVAL; in clk_mux_val_to_index()
57 val = ffs(val) - 1; in clk_mux_val_to_index()
60 val--; in clk_mux_val_to_index()
63 return -EINVAL; in clk_mux_val_to_index()
89 struct clk_mux *mux = to_clk_mux(hw); in clk_mux_get_parent() local
92 val = clk_mux_readl(mux) >> mux->shift; in clk_mux_get_parent()
93 val &= mux->mask; in clk_mux_get_parent()
95 return clk_mux_val_to_index(hw, mux->table, mux->flags, val); in clk_mux_get_parent()
100 struct clk_mux *mux = to_clk_mux(hw); in clk_mux_set_parent() local
101 u32 val = clk_mux_index_to_val(mux->table, mux->flags, index); in clk_mux_set_parent()
105 if (mux->lock) in clk_mux_set_parent()
106 spin_lock_irqsave(mux->lock, flags); in clk_mux_set_parent()
108 __acquire(mux->lock); in clk_mux_set_parent()
110 if (mux->flags & CLK_MUX_HIWORD_MASK) { in clk_mux_set_parent()
111 reg = mux->mask << (mux->shift + 16); in clk_mux_set_parent()
113 reg = clk_mux_readl(mux); in clk_mux_set_parent()
114 reg &= ~(mux->mask << mux->shift); in clk_mux_set_parent()
116 val = val << mux->shift; in clk_mux_set_parent()
118 clk_mux_writel(mux, reg); in clk_mux_set_parent()
120 if (mux->lock) in clk_mux_set_parent()
121 spin_unlock_irqrestore(mux->lock, flags); in clk_mux_set_parent()
123 __release(mux->lock); in clk_mux_set_parent()
131 struct clk_mux *mux = to_clk_mux(hw); in clk_mux_determine_rate() local
133 return clk_mux_determine_rate_flags(hw, req, mux->flags); in clk_mux_determine_rate()
153 unsigned long flags, void __iomem *reg, u8 shift, u32 mask, in __clk_hw_register_mux() argument
156 struct clk_mux *mux; in __clk_hw_register_mux() local
160 int ret = -EINVAL; in __clk_hw_register_mux()
163 width = fls(mask) - ffs(mask) + 1; in __clk_hw_register_mux()
165 pr_err("mux value exceeds LOWORD field\n"); in __clk_hw_register_mux()
166 return ERR_PTR(-EINVAL); in __clk_hw_register_mux()
170 /* allocate the mux */ in __clk_hw_register_mux()
171 mux = kzalloc(sizeof(*mux), GFP_KERNEL); in __clk_hw_register_mux()
172 if (!mux) in __clk_hw_register_mux()
173 return ERR_PTR(-ENOMEM); in __clk_hw_register_mux()
187 mux->reg = reg; in __clk_hw_register_mux()
188 mux->shift = shift; in __clk_hw_register_mux()
189 mux->mask = mask; in __clk_hw_register_mux()
190 mux->flags = clk_mux_flags; in __clk_hw_register_mux()
191 mux->lock = lock; in __clk_hw_register_mux()
192 mux->table = table; in __clk_hw_register_mux()
193 mux->hw.init = &init; in __clk_hw_register_mux()
195 hw = &mux->hw; in __clk_hw_register_mux()
201 kfree(mux); in __clk_hw_register_mux()
211 unsigned long flags, void __iomem *reg, u8 shift, u32 mask, in clk_register_mux_table() argument
217 num_parents, flags, reg, shift, mask, in clk_register_mux_table()
221 return hw->clk; in clk_register_mux_table()
227 struct clk_mux *mux; in clk_unregister_mux() local
234 mux = to_clk_mux(hw); in clk_unregister_mux()
237 kfree(mux); in clk_unregister_mux()
243 struct clk_mux *mux; in clk_hw_unregister_mux() local
245 mux = to_clk_mux(hw); in clk_hw_unregister_mux()
248 kfree(mux); in clk_hw_unregister_mux()