]>
Commit | Line | Data |
---|---|---|
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 | ||
13 | static DEFINE_SPINLOCK(clocks_lock); | |
14 | ||
15 | int 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 | } | |
29 | EXPORT_SYMBOL(clk_enable); | |
30 | ||
31 | void 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 | } | |
42 | EXPORT_SYMBOL(clk_disable); | |
43 | ||
44 | unsigned 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 | } | |
54 | EXPORT_SYMBOL(clk_get_rate); | |
55 | ||
56 | void clk_dummy_enable(struct clk *clk) | |
57 | { | |
58 | } | |
59 | ||
60 | void clk_dummy_disable(struct clk *clk) | |
61 | { | |
62 | } | |
63 | ||
64 | const struct clkops clk_dummy_ops = { | |
65 | .enable = clk_dummy_enable, | |
66 | .disable = clk_dummy_disable, | |
67 | }; | |
68 | ||
69 | struct clk clk_dummy = { | |
70 | .ops = &clk_dummy_ops, | |
71 | }; |