fed02b294ae0c8bba79e6d9532b5f5946b2387fc
[linux-2.6.git] / arch / arm / mach-tegra / clock.h
1 /*
2  * arch/arm/mach-tegra/include/mach/clock.h
3  *
4  * Copyright (C) 2010 Google, Inc.
5  *
6  * Author:
7  *      Colin Cross <ccross@google.com>
8  *
9  * This software is licensed under the terms of the GNU General Public
10  * License version 2, as published by the Free Software Foundation, and
11  * may be copied, distributed, and modified under those terms.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  */
19
20 #ifndef __MACH_TEGRA_CLOCK_H
21 #define __MACH_TEGRA_CLOCK_H
22
23 #include <linux/clkdev.h>
24 #include <linux/list.h>
25 #include <linux/mutex.h>
26 #include <linux/spinlock.h>
27
28 #define DIV_BUS                 (1 << 0)
29 #define DIV_U71                 (1 << 1)
30 #define DIV_U71_FIXED           (1 << 2)
31 #define DIV_2                   (1 << 3)
32 #define DIV_U16                 (1 << 4)
33 #define PLL_FIXED               (1 << 5)
34 #define PLL_HAS_CPCON           (1 << 6)
35 #define MUX                     (1 << 7)
36 #define PLLD                    (1 << 8)
37 #define PERIPH_NO_RESET         (1 << 9)
38 #define PERIPH_NO_ENB           (1 << 10)
39 #define PERIPH_EMC_ENB          (1 << 11)
40 #define PERIPH_MANUAL_RESET     (1 << 12)
41 #define PLL_ALT_MISC_REG        (1 << 13)
42 #define PLLU                    (1 << 14)
43 #define ENABLE_ON_INIT          (1 << 28)
44
45 #define MAX_SAME_LIMIT_SKU_IDS  16
46
47 struct clk;
48
49 struct clk_mux_sel {
50         struct clk      *input;
51         u32             value;
52 };
53
54 struct clk_pll_freq_table {
55         unsigned long   input_rate;
56         unsigned long   output_rate;
57         u16             n;
58         u16             m;
59         u8              p;
60         u8              cpcon;
61 };
62
63 struct clk_ops {
64         void            (*init)(struct clk *);
65         int             (*enable)(struct clk *);
66         void            (*disable)(struct clk *);
67         int             (*set_parent)(struct clk *, struct clk *);
68         int             (*set_rate)(struct clk *, unsigned long);
69         long            (*round_rate)(struct clk *, unsigned long);
70         void            (*reset)(struct clk *, bool);
71 };
72
73 enum clk_state {
74         UNINITIALIZED = 0,
75         ON,
76         OFF,
77 };
78
79 struct clk {
80         /* node for master clocks list */
81         struct list_head        node;           /* node for list of all clocks */
82         struct dvfs             *dvfs;
83         struct clk_lookup       lookup;
84
85 #ifdef CONFIG_DEBUG_FS
86         struct dentry           *dent;
87 #endif
88         bool                    set;
89         struct clk_ops          *ops;
90         unsigned long           dvfs_rate;
91         unsigned long           rate;
92         unsigned long           max_rate;
93         unsigned long           min_rate;
94         bool                    auto_dvfs;
95         bool                    cansleep;
96         u32                     flags;
97         const char              *name;
98
99         u32                     refcnt;
100         enum clk_state          state;
101         struct clk              *parent;
102         u32                     div;
103         u32                     mul;
104
105         const struct clk_mux_sel        *inputs;
106         u32                             reg;
107         u32                             reg_shift;
108
109         struct list_head                shared_bus_list;
110
111         union {
112                 struct {
113                         unsigned int                    clk_num;
114                 } periph;
115                 struct {
116                         unsigned long                   input_min;
117                         unsigned long                   input_max;
118                         unsigned long                   cf_min;
119                         unsigned long                   cf_max;
120                         unsigned long                   vco_min;
121                         unsigned long                   vco_max;
122                         const struct clk_pll_freq_table *freq_table;
123                         int                             lock_delay;
124                 } pll;
125                 struct {
126                         u32                             sel;
127                         u32                             reg_mask;
128                 } mux;
129                 struct {
130                         struct clk                      *main;
131                         struct clk                      *backup;
132                 } cpu;
133                 struct {
134                         struct list_head                node;
135                         bool                            enabled;
136                         unsigned long                   rate;
137                 } shared_bus_user;
138         } u;
139
140         struct mutex mutex;
141         spinlock_t spinlock;
142 };
143
144 struct clk_duplicate {
145         const char *name;
146         struct clk_lookup lookup;
147 };
148
149 struct tegra_clk_init_table {
150         const char *name;
151         const char *parent;
152         unsigned long rate;
153         bool enabled;
154 };
155
156 struct tegra_sku_rate_limit {
157         const char *clk_name;
158         unsigned long max_rate;
159         int sku_ids[MAX_SAME_LIMIT_SKU_IDS];
160 };
161
162 void tegra2_init_clocks(void);
163 void tegra2_periph_reset_deassert(struct clk *c);
164 void tegra2_periph_reset_assert(struct clk *c);
165 void clk_init(struct clk *clk);
166 struct clk *tegra_get_clock_by_name(const char *name);
167 unsigned long clk_measure_input_freq(void);
168 int clk_reparent(struct clk *c, struct clk *parent);
169 void tegra_clk_init_from_table(struct tegra_clk_init_table *table);
170 void clk_set_cansleep(struct clk *c);
171 unsigned long clk_get_rate_locked(struct clk *c);
172 int clk_set_rate_locked(struct clk *c, unsigned long rate);
173 void tegra2_sdmmc_tap_delay(struct clk *c, int delay);
174
175 static inline bool clk_is_auto_dvfs(struct clk *c)
176 {
177         return c->auto_dvfs;
178 }
179
180 static inline bool clk_is_dvfs(struct clk *c)
181 {
182         return (c->dvfs != NULL);
183 }
184
185 static inline bool clk_cansleep(struct clk *c)
186 {
187         return c->cansleep;
188 }
189
190 static inline void clk_lock_save(struct clk *c, unsigned long *flags)
191 {
192         if (clk_cansleep(c)) {
193                 *flags = 0;
194                 mutex_lock(&c->mutex);
195         } else {
196                 spin_lock_irqsave(&c->spinlock, *flags);
197         }
198 }
199
200 static inline void clk_unlock_restore(struct clk *c, unsigned long *flags)
201 {
202         if (clk_cansleep(c))
203                 mutex_unlock(&c->mutex);
204         else
205                 spin_unlock_irqrestore(&c->spinlock, *flags);
206 }
207
208 static inline void clk_lock_init(struct clk *c)
209 {
210         mutex_init(&c->mutex);
211         spin_lock_init(&c->spinlock);
212 }
213
214 #ifdef CONFIG_CPU_FREQ
215 struct cpufreq_frequency_table;
216
217 struct tegra_cpufreq_table_data {
218         struct cpufreq_frequency_table *freq_table;
219         int throttle_lowest_index;
220         int throttle_highest_index;
221 };
222 struct tegra_cpufreq_table_data *tegra_cpufreq_table_get(void);
223 #endif
224
225 #endif