ARM: tegra: clock: Drop CPU dvfs
[pandora-kernel.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/list.h>
24 #include <linux/clkdev.h>
25
26 #define DIV_BUS                 (1 << 0)
27 #define DIV_U71                 (1 << 1)
28 #define DIV_U71_FIXED           (1 << 2)
29 #define DIV_2                   (1 << 3)
30 #define DIV_U16                 (1 << 4)
31 #define PLL_FIXED               (1 << 5)
32 #define PLL_HAS_CPCON           (1 << 6)
33 #define MUX                     (1 << 7)
34 #define PLLD                    (1 << 8)
35 #define PERIPH_NO_RESET         (1 << 9)
36 #define PERIPH_NO_ENB           (1 << 10)
37 #define PERIPH_EMC_ENB          (1 << 11)
38 #define PERIPH_MANUAL_RESET     (1 << 12)
39 #define PLL_ALT_MISC_REG        (1 << 13)
40 #define PLLU                    (1 << 14)
41 #define ENABLE_ON_INIT          (1 << 28)
42
43 struct clk;
44
45 struct clk_mux_sel {
46         struct clk      *input;
47         u32             value;
48 };
49
50 struct clk_pll_table {
51         unsigned long   input_rate;
52         unsigned long   output_rate;
53         u16             n;
54         u16             m;
55         u8              p;
56         u8              cpcon;
57 };
58
59 struct clk_ops {
60         void            (*init)(struct clk *);
61         int             (*enable)(struct clk *);
62         void            (*disable)(struct clk *);
63         int             (*set_parent)(struct clk *, struct clk *);
64         int             (*set_rate)(struct clk *, unsigned long);
65         long            (*round_rate)(struct clk *, unsigned long);
66         void            (*reset)(struct clk *, bool);
67 };
68
69 enum clk_state {
70         UNINITIALIZED = 0,
71         ON,
72         OFF,
73 };
74
75 struct clk {
76         /* node for master clocks list */
77         struct list_head                node;
78         struct list_head                children;       /* list of children */
79         struct list_head                sibling;        /* node for children */
80 #ifdef CONFIG_DEBUG_FS
81         struct dentry                   *dent;
82         struct dentry                   *parent_dent;
83 #endif
84         struct clk_ops                  *ops;
85         struct clk                      *parent;
86         struct clk_lookup               lookup;
87         unsigned long                   rate;
88         unsigned long                   max_rate;
89         u32                             flags;
90         u32                             refcnt;
91         const char                      *name;
92         u32                             reg;
93         u32                             reg_shift;
94         unsigned int                    clk_num;
95         enum clk_state                  state;
96 #ifdef CONFIG_DEBUG_FS
97         bool                            set;
98 #endif
99
100         /* PLL */
101         unsigned long                   input_min;
102         unsigned long                   input_max;
103         unsigned long                   cf_min;
104         unsigned long                   cf_max;
105         unsigned long                   vco_min;
106         unsigned long                   vco_max;
107         const struct clk_pll_table      *pll_table;
108         int                             pll_lock_delay;
109
110         /* DIV */
111         u32                             div;
112         u32                             mul;
113
114         /* MUX */
115         const struct clk_mux_sel        *inputs;
116         u32                             sel;
117         u32                             reg_mask;
118
119         /* Virtual cpu clock */
120         struct clk                      *main;
121         struct clk                      *backup;
122 };
123
124
125 struct clk_duplicate {
126         const char *name;
127         struct clk_lookup lookup;
128 };
129
130 struct tegra_clk_init_table {
131         const char *name;
132         const char *parent;
133         unsigned long rate;
134         bool enabled;
135 };
136
137 void tegra2_init_clocks(void);
138 void tegra2_periph_reset_deassert(struct clk *c);
139 void tegra2_periph_reset_assert(struct clk *c);
140 void clk_init(struct clk *clk);
141 struct clk *tegra_get_clock_by_name(const char *name);
142 unsigned long clk_measure_input_freq(void);
143 void clk_disable_locked(struct clk *c);
144 int clk_enable_locked(struct clk *c);
145 int clk_set_parent_locked(struct clk *c, struct clk *parent);
146 int clk_set_rate_locked(struct clk *c, unsigned long rate);
147 int clk_reparent(struct clk *c, struct clk *parent);
148 void tegra_clk_init_from_table(struct tegra_clk_init_table *table);
149
150 #endif