1/*
2 *  linux/arch/arm/mach-sa1100/clock.c
3 */
4#include <linux/module.h>
5#include <linux/kernel.h>
6#include <linux/clk.h>
7#include <linux/spinlock.h>
8#include <linux/delay.h>
9#include <linux/clkdev.h>
10
11#include "clock.h"
12
13static DEFINE_SPINLOCK(clocks_lock);
14
15int clk_enable(struct clk *clk)
16{
17	unsigned long flags;
18
19	spin_lock_irqsave(&clocks_lock, flags);
20	if (clk->enabled++ == 0)
21		clk->ops->enable(clk);
22	spin_unlock_irqrestore(&clocks_lock, flags);
23
24	if (clk->delay)
25		udelay(clk->delay);
26
27	return 0;
28}
29EXPORT_SYMBOL(clk_enable);
30
31void clk_disable(struct clk *clk)
32{
33	unsigned long flags;
34
35	WARN_ON(clk->enabled == 0);
36
37	spin_lock_irqsave(&clocks_lock, flags);
38	if (--clk->enabled == 0)
39		clk->ops->disable(clk);
40	spin_unlock_irqrestore(&clocks_lock, flags);
41}
42EXPORT_SYMBOL(clk_disable);
43
44unsigned long clk_get_rate(struct clk *clk)
45{
46	unsigned long rate;
47
48	rate = clk->rate;
49	if (clk->ops->getrate)
50		rate = clk->ops->getrate(clk);
51
52	return rate;
53}
54EXPORT_SYMBOL(clk_get_rate);
55
56int clk_set_rate(struct clk *clk, unsigned long rate)
57{
58	unsigned long flags;
59	int ret = -EINVAL;
60
61	if (clk->ops->setrate) {
62		spin_lock_irqsave(&clocks_lock, flags);
63		ret = clk->ops->setrate(clk, rate);
64		spin_unlock_irqrestore(&clocks_lock, flags);
65	}
66
67	return ret;
68}
69EXPORT_SYMBOL(clk_set_rate);
70
71void clk_dummy_enable(struct clk *clk)
72{
73}
74
75void clk_dummy_disable(struct clk *clk)
76{
77}
78
79const struct clkops clk_dummy_ops = {
80	.enable		= clk_dummy_enable,
81	.disable	= clk_dummy_disable,
82};
83
84struct clk clk_dummy = {
85	.ops		= &clk_dummy_ops,
86};
87