aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clk/ti/mux.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/clk/ti/mux.c')
-rw-r--r--drivers/clk/ti/mux.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/clk/ti/mux.c b/drivers/clk/ti/mux.c
index d4705803f3d3..69a4308a5a98 100644
--- a/drivers/clk/ti/mux.c
+++ b/drivers/clk/ti/mux.c
@@ -86,6 +86,7 @@ static int ti_clk_mux_set_parent(struct clk_hw *hw, u8 index)
86 } 86 }
87 val |= index << mux->shift; 87 val |= index << mux->shift;
88 ti_clk_ll_ops->clk_writel(val, &mux->reg); 88 ti_clk_ll_ops->clk_writel(val, &mux->reg);
89 ti_clk_latch(&mux->reg, mux->latch);
89 90
90 return 0; 91 return 0;
91} 92}
@@ -100,7 +101,7 @@ static struct clk *_register_mux(struct device *dev, const char *name,
100 const char * const *parent_names, 101 const char * const *parent_names,
101 u8 num_parents, unsigned long flags, 102 u8 num_parents, unsigned long flags,
102 struct clk_omap_reg *reg, u8 shift, u32 mask, 103 struct clk_omap_reg *reg, u8 shift, u32 mask,
103 u8 clk_mux_flags, u32 *table) 104 s8 latch, u8 clk_mux_flags, u32 *table)
104{ 105{
105 struct clk_omap_mux *mux; 106 struct clk_omap_mux *mux;
106 struct clk *clk; 107 struct clk *clk;
@@ -121,6 +122,7 @@ static struct clk *_register_mux(struct device *dev, const char *name,
121 memcpy(&mux->reg, reg, sizeof(*reg)); 122 memcpy(&mux->reg, reg, sizeof(*reg));
122 mux->shift = shift; 123 mux->shift = shift;
123 mux->mask = mask; 124 mux->mask = mask;
125 mux->latch = latch;
124 mux->flags = clk_mux_flags; 126 mux->flags = clk_mux_flags;
125 mux->table = table; 127 mux->table = table;
126 mux->hw.init = &init; 128 mux->hw.init = &init;
@@ -160,7 +162,7 @@ struct clk *ti_clk_register_mux(struct ti_clk *setup)
160 flags |= CLK_SET_RATE_PARENT; 162 flags |= CLK_SET_RATE_PARENT;
161 163
162 return _register_mux(NULL, setup->name, mux->parents, mux->num_parents, 164 return _register_mux(NULL, setup->name, mux->parents, mux->num_parents,
163 flags, &reg, mux->bit_shift, mask, 165 flags, &reg, mux->bit_shift, mask, -EINVAL,
164 mux_flags, NULL); 166 mux_flags, NULL);
165} 167}
166 168
@@ -179,6 +181,7 @@ static void of_mux_clk_setup(struct device_node *node)
179 u8 clk_mux_flags = 0; 181 u8 clk_mux_flags = 0;
180 u32 mask = 0; 182 u32 mask = 0;
181 u32 shift = 0; 183 u32 shift = 0;
184 s32 latch = -EINVAL;
182 u32 flags = CLK_SET_RATE_NO_REPARENT; 185 u32 flags = CLK_SET_RATE_NO_REPARENT;
183 186
184 num_parents = of_clk_get_parent_count(node); 187 num_parents = of_clk_get_parent_count(node);
@@ -197,6 +200,8 @@ static void of_mux_clk_setup(struct device_node *node)
197 200
198 of_property_read_u32(node, "ti,bit-shift", &shift); 201 of_property_read_u32(node, "ti,bit-shift", &shift);
199 202
203 of_property_read_u32(node, "ti,latch-bit", &latch);
204
200 if (of_property_read_bool(node, "ti,index-starts-at-one")) 205 if (of_property_read_bool(node, "ti,index-starts-at-one"))
201 clk_mux_flags |= CLK_MUX_INDEX_ONE; 206 clk_mux_flags |= CLK_MUX_INDEX_ONE;
202 207
@@ -211,7 +216,8 @@ static void of_mux_clk_setup(struct device_node *node)
211 mask = (1 << fls(mask)) - 1; 216 mask = (1 << fls(mask)) - 1;
212 217
213 clk = _register_mux(NULL, node->name, parent_names, num_parents, 218 clk = _register_mux(NULL, node->name, parent_names, num_parents,
214 flags, &reg, shift, mask, clk_mux_flags, NULL); 219 flags, &reg, shift, mask, latch, clk_mux_flags,
220 NULL);
215 221
216 if (!IS_ERR(clk)) 222 if (!IS_ERR(clk))
217 of_clk_add_provider(node, of_clk_src_simple_get, clk); 223 of_clk_add_provider(node, of_clk_src_simple_get, clk);
@@ -234,6 +240,7 @@ struct clk_hw *ti_clk_build_component_mux(struct ti_clk_mux *setup)
234 return ERR_PTR(-ENOMEM); 240 return ERR_PTR(-ENOMEM);
235 241
236 mux->shift = setup->bit_shift; 242 mux->shift = setup->bit_shift;
243 mux->latch = -EINVAL;
237 244
238 mux->reg.index = setup->module; 245 mux->reg.index = setup->module;
239 mux->reg.offset = setup->reg; 246 mux->reg.offset = setup->reg;