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