|  | /* | 
|  | * V4L2 clock service | 
|  | * | 
|  | * Copyright (C) 2012-2013, Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or modify | 
|  | * it under the terms of the GNU General Public License version 2 as | 
|  | * published by the Free Software Foundation. | 
|  | * | 
|  | * ATTENTION: This is a temporary API and it shall be replaced by the generic | 
|  | * clock API, when the latter becomes widely available. | 
|  | */ | 
|  |  | 
|  | #ifndef MEDIA_V4L2_CLK_H | 
|  | #define MEDIA_V4L2_CLK_H | 
|  |  | 
|  | #include <linux/atomic.h> | 
|  | #include <linux/export.h> | 
|  | #include <linux/list.h> | 
|  | #include <linux/mutex.h> | 
|  |  | 
|  | struct module; | 
|  | struct device; | 
|  |  | 
|  | struct clk; | 
|  | struct v4l2_clk { | 
|  | struct list_head list; | 
|  | const struct v4l2_clk_ops *ops; | 
|  | const char *dev_id; | 
|  | int enable; | 
|  | struct mutex lock; /* Protect the enable count */ | 
|  | atomic_t use_count; | 
|  | struct clk *clk; | 
|  | void *priv; | 
|  | }; | 
|  |  | 
|  | struct v4l2_clk_ops { | 
|  | struct module	*owner; | 
|  | int		(*enable)(struct v4l2_clk *clk); | 
|  | void		(*disable)(struct v4l2_clk *clk); | 
|  | unsigned long	(*get_rate)(struct v4l2_clk *clk); | 
|  | int		(*set_rate)(struct v4l2_clk *clk, unsigned long); | 
|  | }; | 
|  |  | 
|  | struct v4l2_clk *v4l2_clk_register(const struct v4l2_clk_ops *ops, | 
|  | const char *dev_name, | 
|  | void *priv); | 
|  | void v4l2_clk_unregister(struct v4l2_clk *clk); | 
|  | struct v4l2_clk *v4l2_clk_get(struct device *dev, const char *id); | 
|  | void v4l2_clk_put(struct v4l2_clk *clk); | 
|  | int v4l2_clk_enable(struct v4l2_clk *clk); | 
|  | 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, | 
|  | 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, | 
|  | unsigned long rate) | 
|  | { | 
|  | return __v4l2_clk_register_fixed(dev_id, rate, THIS_MODULE); | 
|  | } | 
|  |  | 
|  | #define V4L2_CLK_NAME_SIZE 64 | 
|  |  | 
|  | #define v4l2_clk_name_i2c(name, size, adap, client) snprintf(name, size, \ | 
|  | "%d-%04x", adap, client) | 
|  |  | 
|  | #define v4l2_clk_name_of(name, size, node) snprintf(name, size, \ | 
|  | "of-%pOF", node) | 
|  |  | 
|  | #endif |