diff options
Diffstat (limited to 'drivers/clk/ti/mux.c')
-rw-r--r-- | drivers/clk/ti/mux.c | 13 |
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, ®, mux->bit_shift, mask, | 165 | flags, ®, 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, ®, shift, mask, clk_mux_flags, NULL); | 219 | flags, ®, 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; |