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