diff options
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-clk.c')
| -rw-r--r-- | drivers/media/v4l2-core/v4l2-clk.c | 39 | 
1 files changed, 39 insertions, 0 deletions
diff --git a/drivers/media/v4l2-core/v4l2-clk.c b/drivers/media/v4l2-core/v4l2-clk.c index b67de8642b5..e18cc0469cf 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)  	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);  | 
