diff options
author | Colin Cross <ccross@android.com> | 2010-01-28 19:40:29 -0500 |
---|---|---|
committer | Erik Gilling <konkers@android.com> | 2010-08-05 17:51:42 -0400 |
commit | d861196163e30c07add471562b45dce38517c9b2 (patch) | |
tree | 33c3577854f2e600e0f4dc25620f4932a31d3138 /arch/arm/mach-tegra/clock.h | |
parent | 5ad36c5f0ece31552a195f2f9e29357a2747536e (diff) |
[ARM] tegra: Add clock support
v2: fixes from Russell King:
- include linux/io.h instead of asm/io.h
- fix whitespace in Kconfig
- Use spin_lock_init to initialize lock
- Return -ENOSYS instead of BUG for unimplemented clock ops
- Use proper return values in tegra2 clock ops
additional changes:
- Rename some clocks to match dev_ids
- add rate propagation
- add debugfs entries
- add support for clock listed in clk_lookup under multiple dev_ids
v3:
- Replace per-clock locking with global clock lock
- Autodetect clock state on init
- Let clock dividers pick next lower possible frequency
- Add support for clock init tables
- Minor bug fixes
- Fix checkpatch issues
Signed-off-by: Colin Cross <ccross@android.com>
Diffstat (limited to 'arch/arm/mach-tegra/clock.h')
-rw-r--r-- | arch/arm/mach-tegra/clock.h | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/clock.h b/arch/arm/mach-tegra/clock.h new file mode 100644 index 000000000000..af7c70e2a3ba --- /dev/null +++ b/arch/arm/mach-tegra/clock.h | |||
@@ -0,0 +1,147 @@ | |||
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 <asm/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 PLL_FIXED (1 << 4) | ||
31 | #define PLL_HAS_CPCON (1 << 5) | ||
32 | #define MUX (1 << 6) | ||
33 | #define PLLD (1 << 7) | ||
34 | #define PERIPH_NO_RESET (1 << 8) | ||
35 | #define PERIPH_NO_ENB (1 << 9) | ||
36 | #define PERIPH_EMC_ENB (1 << 10) | ||
37 | #define PERIPH_MANUAL_RESET (1 << 11) | ||
38 | #define PLL_ALT_MISC_REG (1 << 12) | ||
39 | #define ENABLE_ON_INIT (1 << 28) | ||
40 | |||
41 | struct clk; | ||
42 | |||
43 | struct clk_mux_sel { | ||
44 | struct clk *input; | ||
45 | u32 value; | ||
46 | }; | ||
47 | |||
48 | struct clk_pll_table { | ||
49 | unsigned long input_rate; | ||
50 | unsigned long output_rate; | ||
51 | u16 n; | ||
52 | u16 m; | ||
53 | u8 p; | ||
54 | u8 cpcon; | ||
55 | }; | ||
56 | |||
57 | struct clk_ops { | ||
58 | void (*init)(struct clk *); | ||
59 | int (*enable)(struct clk *); | ||
60 | void (*disable)(struct clk *); | ||
61 | void (*recalc)(struct clk *); | ||
62 | int (*set_parent)(struct clk *, struct clk *); | ||
63 | int (*set_rate)(struct clk *, unsigned long); | ||
64 | unsigned long (*get_rate)(struct clk *); | ||
65 | long (*round_rate)(struct clk *, unsigned long); | ||
66 | unsigned long (*recalculate_rate)(struct clk *); | ||
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 | u32 flags; | ||
89 | u32 refcnt; | ||
90 | const char *name; | ||
91 | u32 reg; | ||
92 | u32 reg_shift; | ||
93 | unsigned int clk_num; | ||
94 | enum clk_state state; | ||
95 | #ifdef CONFIG_DEBUG_FS | ||
96 | bool set; | ||
97 | #endif | ||
98 | |||
99 | /* PLL */ | ||
100 | unsigned long input_min; | ||
101 | unsigned long input_max; | ||
102 | unsigned long cf_min; | ||
103 | unsigned long cf_max; | ||
104 | unsigned long vco_min; | ||
105 | unsigned long vco_max; | ||
106 | u32 m; | ||
107 | u32 n; | ||
108 | u32 p; | ||
109 | u32 cpcon; | ||
110 | const struct clk_pll_table *pll_table; | ||
111 | |||
112 | /* DIV */ | ||
113 | u32 div; | ||
114 | u32 mul; | ||
115 | |||
116 | /* MUX */ | ||
117 | const struct clk_mux_sel *inputs; | ||
118 | u32 sel; | ||
119 | u32 reg_mask; | ||
120 | }; | ||
121 | |||
122 | |||
123 | struct clk_duplicate { | ||
124 | const char *name; | ||
125 | struct clk_lookup lookup; | ||
126 | }; | ||
127 | |||
128 | struct tegra_clk_init_table { | ||
129 | const char *name; | ||
130 | const char *parent; | ||
131 | unsigned long rate; | ||
132 | bool enabled; | ||
133 | }; | ||
134 | |||
135 | void tegra2_init_clocks(void); | ||
136 | void tegra2_periph_reset_deassert(struct clk *c); | ||
137 | void tegra2_periph_reset_assert(struct clk *c); | ||
138 | void clk_init(struct clk *clk); | ||
139 | struct clk *tegra_get_clock_by_name(const char *name); | ||
140 | unsigned long clk_measure_input_freq(void); | ||
141 | void clk_disable_locked(struct clk *c); | ||
142 | int clk_enable_locked(struct clk *c); | ||
143 | int clk_set_parent_locked(struct clk *c, struct clk *parent); | ||
144 | int clk_reparent(struct clk *c, struct clk *parent); | ||
145 | void tegra_clk_init_from_table(struct tegra_clk_init_table *table); | ||
146 | |||
147 | #endif | ||