Commit cf326dfe authored by Guennadi Liakhovetski's avatar Guennadi Liakhovetski Committed by Mauro Carvalho Chehab

[media] V4L2: add v4l2-clock helpers to register and unregister a fixed-rate clock

Many bridges and video host controllers supply fixed rate always on clocks
to their I2C devices. This patch adds two simple helpers to register and
unregister such a clock.
Signed-off-by: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent d3f884a7
...@@ -240,3 +240,42 @@ void v4l2_clk_unregister(struct v4l2_clk *clk) ...@@ -240,3 +240,42 @@ void v4l2_clk_unregister(struct v4l2_clk *clk)
kfree(clk); kfree(clk);
} }
EXPORT_SYMBOL(v4l2_clk_unregister); EXPORT_SYMBOL(v4l2_clk_unregister);
struct v4l2_clk_fixed {
unsigned long rate;
struct v4l2_clk_ops ops;
};
static unsigned long fixed_get_rate(struct v4l2_clk *clk)
{
struct v4l2_clk_fixed *priv = clk->priv;
return priv->rate;
}
struct v4l2_clk *__v4l2_clk_register_fixed(const char *dev_id,
const char *id, unsigned long rate, struct module *owner)
{
struct v4l2_clk *clk;
struct v4l2_clk_fixed *priv = kzalloc(sizeof(*priv), GFP_KERNEL);
if (!priv)
return ERR_PTR(-ENOMEM);
priv->rate = rate;
priv->ops.get_rate = fixed_get_rate;
priv->ops.owner = owner;
clk = v4l2_clk_register(&priv->ops, dev_id, id, priv);
if (IS_ERR(clk))
kfree(priv);
return clk;
}
EXPORT_SYMBOL(__v4l2_clk_register_fixed);
void v4l2_clk_unregister_fixed(struct v4l2_clk *clk)
{
kfree(clk->priv);
v4l2_clk_unregister(clk);
}
EXPORT_SYMBOL(v4l2_clk_unregister_fixed);
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#define MEDIA_V4L2_CLK_H #define MEDIA_V4L2_CLK_H
#include <linux/atomic.h> #include <linux/atomic.h>
#include <linux/export.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/mutex.h> #include <linux/mutex.h>
...@@ -51,4 +52,17 @@ void v4l2_clk_disable(struct v4l2_clk *clk); ...@@ -51,4 +52,17 @@ void v4l2_clk_disable(struct v4l2_clk *clk);
unsigned long v4l2_clk_get_rate(struct v4l2_clk *clk); unsigned long v4l2_clk_get_rate(struct v4l2_clk *clk);
int v4l2_clk_set_rate(struct v4l2_clk *clk, unsigned long rate); int v4l2_clk_set_rate(struct v4l2_clk *clk, unsigned long rate);
struct module;
struct v4l2_clk *__v4l2_clk_register_fixed(const char *dev_id,
const char *id, unsigned long rate, struct module *owner);
void v4l2_clk_unregister_fixed(struct v4l2_clk *clk);
static inline struct v4l2_clk *v4l2_clk_register_fixed(const char *dev_id,
const char *id,
unsigned long rate)
{
return __v4l2_clk_register_fixed(dev_id, id, rate, THIS_MODULE);
}
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment