diff options
| -rw-r--r-- | drivers/media/v4l2-core/v4l2-clk.c | 39 | ||||
| -rw-r--r-- | include/media/v4l2-clk.h | 14 |
2 files changed, 53 insertions, 0 deletions
diff --git a/drivers/media/v4l2-core/v4l2-clk.c b/drivers/media/v4l2-core/v4l2-clk.c index b67de8642b5a..e18cc0469cf8 100644 --- a/drivers/media/v4l2-core/v4l2-clk.c +++ b/drivers/media/v4l2-core/v4l2-clk.c | |||
| @@ -240,3 +240,42 @@ void v4l2_clk_unregister(struct v4l2_clk *clk) | |||
| 240 | kfree(clk); | 240 | kfree(clk); |
| 241 | } | 241 | } |
| 242 | EXPORT_SYMBOL(v4l2_clk_unregister); | 242 | EXPORT_SYMBOL(v4l2_clk_unregister); |
| 243 | |||
| 244 | struct v4l2_clk_fixed { | ||
| 245 | unsigned long rate; | ||
| 246 | struct v4l2_clk_ops ops; | ||
| 247 | }; | ||
| 248 | |||
| 249 | static unsigned long fixed_get_rate(struct v4l2_clk *clk) | ||
| 250 | { | ||
| 251 | struct v4l2_clk_fixed *priv = clk->priv; | ||
| 252 | return priv->rate; | ||
| 253 | } | ||
| 254 | |||
| 255 | struct v4l2_clk *__v4l2_clk_register_fixed(const char *dev_id, | ||
| 256 | const char *id, unsigned long rate, struct module *owner) | ||
| 257 | { | ||
| 258 | struct v4l2_clk *clk; | ||
| 259 | struct v4l2_clk_fixed *priv = kzalloc(sizeof(*priv), GFP_KERNEL); | ||
| 260 | |||
| 261 | if (!priv) | ||
| 262 | return ERR_PTR(-ENOMEM); | ||
| 263 | |||
| 264 | priv->rate = rate; | ||
| 265 | priv->ops.get_rate = fixed_get_rate; | ||
| 266 | priv->ops.owner = owner; | ||
| 267 | |||
| 268 | clk = v4l2_clk_register(&priv->ops, dev_id, id, priv); | ||
| 269 | if (IS_ERR(clk)) | ||
| 270 | kfree(priv); | ||
| 271 | |||
| 272 | return clk; | ||
| 273 | } | ||
| 274 | EXPORT_SYMBOL(__v4l2_clk_register_fixed); | ||
| 275 | |||
| 276 | void v4l2_clk_unregister_fixed(struct v4l2_clk *clk) | ||
| 277 | { | ||
| 278 | kfree(clk->priv); | ||
| 279 | v4l2_clk_unregister(clk); | ||
| 280 | } | ||
| 281 | EXPORT_SYMBOL(v4l2_clk_unregister_fixed); | ||
diff --git a/include/media/v4l2-clk.h b/include/media/v4l2-clk.h index 0503a90b48bb..a354a9d6456e 100644 --- a/include/media/v4l2-clk.h +++ b/include/media/v4l2-clk.h | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #define MEDIA_V4L2_CLK_H | 15 | #define MEDIA_V4L2_CLK_H |
| 16 | 16 | ||
| 17 | #include <linux/atomic.h> | 17 | #include <linux/atomic.h> |
| 18 | #include <linux/export.h> | ||
| 18 | #include <linux/list.h> | 19 | #include <linux/list.h> |
| 19 | #include <linux/mutex.h> | 20 | #include <linux/mutex.h> |
| 20 | 21 | ||
| @@ -51,4 +52,17 @@ void v4l2_clk_disable(struct v4l2_clk *clk); | |||
| 51 | unsigned long v4l2_clk_get_rate(struct v4l2_clk *clk); | 52 | unsigned long v4l2_clk_get_rate(struct v4l2_clk *clk); |
| 52 | int v4l2_clk_set_rate(struct v4l2_clk *clk, unsigned long rate); | 53 | int v4l2_clk_set_rate(struct v4l2_clk *clk, unsigned long rate); |
| 53 | 54 | ||
| 55 | struct module; | ||
| 56 | |||
| 57 | struct v4l2_clk *__v4l2_clk_register_fixed(const char *dev_id, | ||
| 58 | const char *id, unsigned long rate, struct module *owner); | ||
| 59 | void v4l2_clk_unregister_fixed(struct v4l2_clk *clk); | ||
| 60 | |||
| 61 | static inline struct v4l2_clk *v4l2_clk_register_fixed(const char *dev_id, | ||
| 62 | const char *id, | ||
| 63 | unsigned long rate) | ||
| 64 | { | ||
| 65 | return __v4l2_clk_register_fixed(dev_id, id, rate, THIS_MODULE); | ||
| 66 | } | ||
| 67 | |||
| 54 | #endif | 68 | #endif |
