Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
@@ -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);
+14 −0
Original line number Diff line number Diff line
@@ -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