1ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski/*
2ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski * V4L2 clock service
3ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski *
4ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski * Copyright (C) 2012-2013, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
5ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski *
6ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski * This program is free software; you can redistribute it and/or modify
7ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski * it under the terms of the GNU General Public License version 2 as
8ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski * published by the Free Software Foundation.
9ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski *
10ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski * ATTENTION: This is a temporary API and it shall be replaced by the generic
11ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski * clock API, when the latter becomes widely available.
12ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski */
13ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski
14ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski#ifndef MEDIA_V4L2_CLK_H
15ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski#define MEDIA_V4L2_CLK_H
16ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski
17ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski#include <linux/atomic.h>
18cf326dfebe612bf56c83d8fca7a7c1d1584c061fGuennadi Liakhovetski#include <linux/export.h>
19ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski#include <linux/list.h>
20ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski#include <linux/mutex.h>
21ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski
22ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetskistruct module;
23ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetskistruct device;
24ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski
25ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetskistruct v4l2_clk {
26ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski	struct list_head list;
27ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski	const struct v4l2_clk_ops *ops;
28ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski	const char *dev_id;
29ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski	const char *id;
30ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski	int enable;
31ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski	struct mutex lock; /* Protect the enable count */
32ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski	atomic_t use_count;
33ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski	void *priv;
34ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski};
35ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski
36ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetskistruct v4l2_clk_ops {
37ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski	struct module	*owner;
38ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski	int		(*enable)(struct v4l2_clk *clk);
39ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski	void		(*disable)(struct v4l2_clk *clk);
40ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski	unsigned long	(*get_rate)(struct v4l2_clk *clk);
41ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski	int		(*set_rate)(struct v4l2_clk *clk, unsigned long);
42ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski};
43ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski
44ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetskistruct v4l2_clk *v4l2_clk_register(const struct v4l2_clk_ops *ops,
45ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski				   const char *dev_name,
46ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski				   const char *name, void *priv);
47ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetskivoid v4l2_clk_unregister(struct v4l2_clk *clk);
48ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetskistruct v4l2_clk *v4l2_clk_get(struct device *dev, const char *id);
49ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetskivoid v4l2_clk_put(struct v4l2_clk *clk);
50ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetskiint v4l2_clk_enable(struct v4l2_clk *clk);
51ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetskivoid v4l2_clk_disable(struct v4l2_clk *clk);
52ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetskiunsigned long v4l2_clk_get_rate(struct v4l2_clk *clk);
53ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetskiint v4l2_clk_set_rate(struct v4l2_clk *clk, unsigned long rate);
54ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski
55cf326dfebe612bf56c83d8fca7a7c1d1584c061fGuennadi Liakhovetskistruct module;
56cf326dfebe612bf56c83d8fca7a7c1d1584c061fGuennadi Liakhovetski
57cf326dfebe612bf56c83d8fca7a7c1d1584c061fGuennadi Liakhovetskistruct v4l2_clk *__v4l2_clk_register_fixed(const char *dev_id,
58cf326dfebe612bf56c83d8fca7a7c1d1584c061fGuennadi Liakhovetski		const char *id, unsigned long rate, struct module *owner);
59cf326dfebe612bf56c83d8fca7a7c1d1584c061fGuennadi Liakhovetskivoid v4l2_clk_unregister_fixed(struct v4l2_clk *clk);
60cf326dfebe612bf56c83d8fca7a7c1d1584c061fGuennadi Liakhovetski
61cf326dfebe612bf56c83d8fca7a7c1d1584c061fGuennadi Liakhovetskistatic inline struct v4l2_clk *v4l2_clk_register_fixed(const char *dev_id,
62cf326dfebe612bf56c83d8fca7a7c1d1584c061fGuennadi Liakhovetski							const char *id,
63cf326dfebe612bf56c83d8fca7a7c1d1584c061fGuennadi Liakhovetski							unsigned long rate)
64cf326dfebe612bf56c83d8fca7a7c1d1584c061fGuennadi Liakhovetski{
65cf326dfebe612bf56c83d8fca7a7c1d1584c061fGuennadi Liakhovetski	return __v4l2_clk_register_fixed(dev_id, id, rate, THIS_MODULE);
66cf326dfebe612bf56c83d8fca7a7c1d1584c061fGuennadi Liakhovetski}
67cf326dfebe612bf56c83d8fca7a7c1d1584c061fGuennadi Liakhovetski
68774cc4c289152bfb77806ccae722a9ae2d29dd02Guennadi Liakhovetski#define v4l2_clk_name_i2c(name, size, adap, client) snprintf(name, size, \
69774cc4c289152bfb77806ccae722a9ae2d29dd02Guennadi Liakhovetski			  "%d-%04x", adap, client)
70774cc4c289152bfb77806ccae722a9ae2d29dd02Guennadi Liakhovetski
71ff5430de70e8137daccecfa1211509f95fcc8d25Guennadi Liakhovetski#endif
72