Lines Matching full:clk
9 #include <linux/clk.h>
19 #include <media/v4l2-clk.h>
27 struct v4l2_clk *clk; in v4l2_clk_find() local
29 list_for_each_entry(clk, &clk_list, list) in v4l2_clk_find()
30 if (!strcmp(dev_id, clk->dev_id)) in v4l2_clk_find()
31 return clk; in v4l2_clk_find()
38 struct v4l2_clk *clk; in v4l2_clk_get() local
39 struct clk *ccf_clk = clk_get(dev, id); in v4l2_clk_get()
46 clk = kzalloc(sizeof(*clk), GFP_KERNEL); in v4l2_clk_get()
47 if (!clk) { in v4l2_clk_get()
51 clk->clk = ccf_clk; in v4l2_clk_get()
53 return clk; in v4l2_clk_get()
57 clk = v4l2_clk_find(dev_name(dev)); in v4l2_clk_get()
60 if (PTR_ERR(clk) == -ENODEV && dev->of_node) { in v4l2_clk_get()
62 clk = v4l2_clk_find(clk_name); in v4l2_clk_get()
65 if (!IS_ERR(clk)) in v4l2_clk_get()
66 atomic_inc(&clk->use_count); in v4l2_clk_get()
69 return clk; in v4l2_clk_get()
73 void v4l2_clk_put(struct v4l2_clk *clk) in v4l2_clk_put() argument
77 if (IS_ERR(clk)) in v4l2_clk_put()
80 if (clk->clk) { in v4l2_clk_put()
81 clk_put(clk->clk); in v4l2_clk_put()
82 kfree(clk); in v4l2_clk_put()
89 if (tmp == clk) in v4l2_clk_put()
90 atomic_dec(&clk->use_count); in v4l2_clk_put()
96 static int v4l2_clk_lock_driver(struct v4l2_clk *clk) in v4l2_clk_lock_driver() argument
104 if (tmp == clk) { in v4l2_clk_lock_driver()
105 ret = !try_module_get(clk->ops->owner); in v4l2_clk_lock_driver()
116 static void v4l2_clk_unlock_driver(struct v4l2_clk *clk) in v4l2_clk_unlock_driver() argument
118 module_put(clk->ops->owner); in v4l2_clk_unlock_driver()
121 int v4l2_clk_enable(struct v4l2_clk *clk) in v4l2_clk_enable() argument
125 if (clk->clk) in v4l2_clk_enable()
126 return clk_prepare_enable(clk->clk); in v4l2_clk_enable()
128 ret = v4l2_clk_lock_driver(clk); in v4l2_clk_enable()
132 mutex_lock(&clk->lock); in v4l2_clk_enable()
134 if (++clk->enable == 1 && clk->ops->enable) { in v4l2_clk_enable()
135 ret = clk->ops->enable(clk); in v4l2_clk_enable()
137 clk->enable--; in v4l2_clk_enable()
140 mutex_unlock(&clk->lock); in v4l2_clk_enable()
150 void v4l2_clk_disable(struct v4l2_clk *clk) in v4l2_clk_disable() argument
154 if (clk->clk) in v4l2_clk_disable()
155 return clk_disable_unprepare(clk->clk); in v4l2_clk_disable()
157 mutex_lock(&clk->lock); in v4l2_clk_disable()
159 enable = --clk->enable; in v4l2_clk_disable()
161 clk->dev_id)) in v4l2_clk_disable()
162 clk->enable++; in v4l2_clk_disable()
163 else if (!enable && clk->ops->disable) in v4l2_clk_disable()
164 clk->ops->disable(clk); in v4l2_clk_disable()
166 mutex_unlock(&clk->lock); in v4l2_clk_disable()
168 v4l2_clk_unlock_driver(clk); in v4l2_clk_disable()
172 unsigned long v4l2_clk_get_rate(struct v4l2_clk *clk) in v4l2_clk_get_rate() argument
176 if (clk->clk) in v4l2_clk_get_rate()
177 return clk_get_rate(clk->clk); in v4l2_clk_get_rate()
179 ret = v4l2_clk_lock_driver(clk); in v4l2_clk_get_rate()
183 mutex_lock(&clk->lock); in v4l2_clk_get_rate()
184 if (!clk->ops->get_rate) in v4l2_clk_get_rate()
187 ret = clk->ops->get_rate(clk); in v4l2_clk_get_rate()
188 mutex_unlock(&clk->lock); in v4l2_clk_get_rate()
190 v4l2_clk_unlock_driver(clk); in v4l2_clk_get_rate()
196 int v4l2_clk_set_rate(struct v4l2_clk *clk, unsigned long rate) in v4l2_clk_set_rate() argument
200 if (clk->clk) { in v4l2_clk_set_rate()
201 long r = clk_round_rate(clk->clk, rate); in v4l2_clk_set_rate()
204 return clk_set_rate(clk->clk, r); in v4l2_clk_set_rate()
207 ret = v4l2_clk_lock_driver(clk); in v4l2_clk_set_rate()
212 mutex_lock(&clk->lock); in v4l2_clk_set_rate()
213 if (!clk->ops->set_rate) in v4l2_clk_set_rate()
216 ret = clk->ops->set_rate(clk, rate); in v4l2_clk_set_rate()
217 mutex_unlock(&clk->lock); in v4l2_clk_set_rate()
219 v4l2_clk_unlock_driver(clk); in v4l2_clk_set_rate()
229 struct v4l2_clk *clk; in v4l2_clk_register() local
235 clk = kzalloc(sizeof(struct v4l2_clk), GFP_KERNEL); in v4l2_clk_register()
236 if (!clk) in v4l2_clk_register()
239 clk->dev_id = kstrdup(dev_id, GFP_KERNEL); in v4l2_clk_register()
240 if (!clk->dev_id) { in v4l2_clk_register()
244 clk->ops = ops; in v4l2_clk_register()
245 clk->priv = priv; in v4l2_clk_register()
246 atomic_set(&clk->use_count, 0); in v4l2_clk_register()
247 mutex_init(&clk->lock); in v4l2_clk_register()
255 list_add_tail(&clk->list, &clk_list); in v4l2_clk_register()
258 return clk; in v4l2_clk_register()
262 kfree(clk->dev_id); in v4l2_clk_register()
263 kfree(clk); in v4l2_clk_register()
268 void v4l2_clk_unregister(struct v4l2_clk *clk) in v4l2_clk_unregister() argument
270 if (WARN(atomic_read(&clk->use_count), in v4l2_clk_unregister()
272 __func__, clk->dev_id)) in v4l2_clk_unregister()
276 list_del(&clk->list); in v4l2_clk_unregister()
279 kfree(clk->dev_id); in v4l2_clk_unregister()
280 kfree(clk); in v4l2_clk_unregister()
289 static unsigned long fixed_get_rate(struct v4l2_clk *clk) in fixed_get_rate() argument
291 struct v4l2_clk_fixed *priv = clk->priv; in fixed_get_rate()
298 struct v4l2_clk *clk; in __v4l2_clk_register_fixed() local
308 clk = v4l2_clk_register(&priv->ops, dev_id, priv); in __v4l2_clk_register_fixed()
309 if (IS_ERR(clk)) in __v4l2_clk_register_fixed()
312 return clk; in __v4l2_clk_register_fixed()
316 void v4l2_clk_unregister_fixed(struct v4l2_clk *clk) in v4l2_clk_unregister_fixed() argument
318 kfree(clk->priv); in v4l2_clk_unregister_fixed()
319 v4l2_clk_unregister(clk); in v4l2_clk_unregister_fixed()