mirror of
https://github.com/torvalds/linux.git
synced 2024-11-13 07:31:45 +00:00
[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: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
This commit is contained in:
parent
d3f884a709
commit
cf326dfebe
@ -240,3 +240,42 @@ void v4l2_clk_unregister(struct v4l2_clk *clk)
|
||||
kfree(clk);
|
||||
}
|
||||
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 @@
|
||||
#define MEDIA_V4L2_CLK_H
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
@ -51,4 +52,17 @@ void v4l2_clk_disable(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);
|
||||
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user