Commit | Line | Data |
---|---|---|
97d654f8 RK |
1 | /* |
2 | * linux/arch/arm/mach-sa1100/clock.c | |
3 | */ | |
4 | #include <linux/module.h> | |
5 | #include <linux/kernel.h> | |
97d654f8 RK |
6 | #include <linux/clk.h> |
7 | #include <linux/spinlock.h> | |
a6dba20c | 8 | #include <linux/delay.h> |
6d803ba7 | 9 | #include <linux/clkdev.h> |
97d654f8 | 10 | |
a6dba20c | 11 | #include "clock.h" |
97d654f8 | 12 | |
97d654f8 RK |
13 | static DEFINE_SPINLOCK(clocks_lock); |
14 | ||
97d654f8 RK |
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) | |
a6dba20c | 21 | clk->ops->enable(clk); |
97d654f8 | 22 | spin_unlock_irqrestore(&clocks_lock, flags); |
a6dba20c RK |
23 | |
24 | if (clk->delay) | |
25 | udelay(clk->delay); | |
26 | ||
97d654f8 RK |
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) | |
a6dba20c | 39 | clk->ops->disable(clk); |
97d654f8 RK |
40 | spin_unlock_irqrestore(&clocks_lock, flags); |
41 | } | |
42 | EXPORT_SYMBOL(clk_disable); | |
43 | ||
44 | unsigned long clk_get_rate(struct clk *clk) | |
45 | { | |
a6dba20c RK |
46 | unsigned long rate; |
47 | ||
48 | rate = clk->rate; | |
49 | if (clk->ops->getrate) | |
50 | rate = clk->ops->getrate(clk); | |
51 | ||
52 | return rate; | |
97d654f8 RK |
53 | } |
54 | EXPORT_SYMBOL(clk_get_rate); | |
55 | ||
52585ccd HZ |
56 | int 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 | } | |
69 | EXPORT_SYMBOL(clk_set_rate); | |
70 | ||
4029813c | 71 | void clk_dummy_enable(struct clk *clk) |
97d654f8 | 72 | { |
97d654f8 | 73 | } |
97d654f8 | 74 | |
4029813c | 75 | void clk_dummy_disable(struct clk *clk) |
97d654f8 | 76 | { |
a6dba20c RK |
77 | } |
78 | ||
4029813c EM |
79 | const struct clkops clk_dummy_ops = { |
80 | .enable = clk_dummy_enable, | |
81 | .disable = clk_dummy_disable, | |
82 | }; | |
83 | ||
84 | struct clk clk_dummy = { | |
85 | .ops = &clk_dummy_ops, | |
a6dba20c | 86 | }; |