blob: ea07f513e90c5b389b44316616d2edbe5c6b9180 [file] [log] [blame]
Colin Crossd8611962010-01-28 16:40:29 -08001/*
2 * arch/arm/mach-tegra/tegra2_clocks.c
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#include <linux/kernel.h>
21#include <linux/module.h>
22#include <linux/list.h>
23#include <linux/spinlock.h>
24#include <linux/delay.h>
25#include <linux/io.h>
Jean-Christop PLAGNIOL-VILLARD6d803ba2010-11-17 10:04:33 +010026#include <linux/clkdev.h>
Colin Cross4729fd72011-02-12 16:43:05 -080027#include <linux/clk.h>
Colin Crossd8611962010-01-28 16:40:29 -080028
29#include <mach/iomap.h>
Colin Cross2ea67fd2010-10-04 08:49:49 -070030#include <mach/suspend.h>
Colin Crossd8611962010-01-28 16:40:29 -080031
32#include "clock.h"
Colin Cross71fc84c2010-06-07 20:49:46 -070033#include "fuse.h"
Colin Crossd8611962010-01-28 16:40:29 -080034
35#define RST_DEVICES 0x004
36#define RST_DEVICES_SET 0x300
37#define RST_DEVICES_CLR 0x304
Colin Cross71fc84c2010-06-07 20:49:46 -070038#define RST_DEVICES_NUM 3
Colin Crossd8611962010-01-28 16:40:29 -080039
40#define CLK_OUT_ENB 0x010
41#define CLK_OUT_ENB_SET 0x320
42#define CLK_OUT_ENB_CLR 0x324
Colin Cross71fc84c2010-06-07 20:49:46 -070043#define CLK_OUT_ENB_NUM 3
44
45#define CLK_MASK_ARM 0x44
46#define MISC_CLK_ENB 0x48
Colin Crossd8611962010-01-28 16:40:29 -080047
48#define OSC_CTRL 0x50
49#define OSC_CTRL_OSC_FREQ_MASK (3<<30)
50#define OSC_CTRL_OSC_FREQ_13MHZ (0<<30)
51#define OSC_CTRL_OSC_FREQ_19_2MHZ (1<<30)
52#define OSC_CTRL_OSC_FREQ_12MHZ (2<<30)
53#define OSC_CTRL_OSC_FREQ_26MHZ (3<<30)
Colin Crosscea62c82010-10-04 11:49:26 -070054#define OSC_CTRL_MASK (0x3f2 | OSC_CTRL_OSC_FREQ_MASK)
Colin Crossd8611962010-01-28 16:40:29 -080055
56#define OSC_FREQ_DET 0x58
57#define OSC_FREQ_DET_TRIG (1<<31)
58
59#define OSC_FREQ_DET_STATUS 0x5C
60#define OSC_FREQ_DET_BUSY (1<<31)
61#define OSC_FREQ_DET_CNT_MASK 0xFFFF
62
Colin Cross71fc84c2010-06-07 20:49:46 -070063#define PERIPH_CLK_SOURCE_I2S1 0x100
64#define PERIPH_CLK_SOURCE_EMC 0x19c
65#define PERIPH_CLK_SOURCE_OSC 0x1fc
66#define PERIPH_CLK_SOURCE_NUM \
67 ((PERIPH_CLK_SOURCE_OSC - PERIPH_CLK_SOURCE_I2S1) / 4)
68
Colin Crossd8611962010-01-28 16:40:29 -080069#define PERIPH_CLK_SOURCE_MASK (3<<30)
70#define PERIPH_CLK_SOURCE_SHIFT 30
71#define PERIPH_CLK_SOURCE_ENABLE (1<<28)
Colin Cross71fc84c2010-06-07 20:49:46 -070072#define PERIPH_CLK_SOURCE_DIVU71_MASK 0xFF
73#define PERIPH_CLK_SOURCE_DIVU16_MASK 0xFFFF
Colin Crossd8611962010-01-28 16:40:29 -080074#define PERIPH_CLK_SOURCE_DIV_SHIFT 0
75
76#define PLL_BASE 0x0
77#define PLL_BASE_BYPASS (1<<31)
78#define PLL_BASE_ENABLE (1<<30)
79#define PLL_BASE_REF_ENABLE (1<<29)
80#define PLL_BASE_OVERRIDE (1<<28)
Colin Crossd8611962010-01-28 16:40:29 -080081#define PLL_BASE_DIVP_MASK (0x7<<20)
82#define PLL_BASE_DIVP_SHIFT 20
83#define PLL_BASE_DIVN_MASK (0x3FF<<8)
84#define PLL_BASE_DIVN_SHIFT 8
85#define PLL_BASE_DIVM_MASK (0x1F)
86#define PLL_BASE_DIVM_SHIFT 0
87
88#define PLL_OUT_RATIO_MASK (0xFF<<8)
89#define PLL_OUT_RATIO_SHIFT 8
90#define PLL_OUT_OVERRIDE (1<<2)
91#define PLL_OUT_CLKEN (1<<1)
92#define PLL_OUT_RESET_DISABLE (1<<0)
93
94#define PLL_MISC(c) (((c)->flags & PLL_ALT_MISC_REG) ? 0x4 : 0xc)
Colin Cross71fc84c2010-06-07 20:49:46 -070095
Colin Crossd8611962010-01-28 16:40:29 -080096#define PLL_MISC_DCCON_SHIFT 20
Colin Crossd8611962010-01-28 16:40:29 -080097#define PLL_MISC_CPCON_SHIFT 8
98#define PLL_MISC_CPCON_MASK (0xF<<PLL_MISC_CPCON_SHIFT)
99#define PLL_MISC_LFCON_SHIFT 4
100#define PLL_MISC_LFCON_MASK (0xF<<PLL_MISC_LFCON_SHIFT)
101#define PLL_MISC_VCOCON_SHIFT 0
102#define PLL_MISC_VCOCON_MASK (0xF<<PLL_MISC_VCOCON_SHIFT)
103
Colin Cross71fc84c2010-06-07 20:49:46 -0700104#define PLLU_BASE_POST_DIV (1<<20)
105
Colin Crossd8611962010-01-28 16:40:29 -0800106#define PLLD_MISC_CLKENABLE (1<<30)
107#define PLLD_MISC_DIV_RST (1<<23)
108#define PLLD_MISC_DCCON_SHIFT 12
109
Mike Rapoport8d685bc2010-09-27 11:26:32 +0200110#define PLLE_MISC_READY (1 << 15)
111
Colin Crossf1519612011-02-12 16:05:31 -0800112#define PERIPH_CLK_TO_ENB_REG(c) ((c->u.periph.clk_num / 32) * 4)
113#define PERIPH_CLK_TO_ENB_SET_REG(c) ((c->u.periph.clk_num / 32) * 8)
114#define PERIPH_CLK_TO_ENB_BIT(c) (1 << (c->u.periph.clk_num % 32))
Colin Crossd8611962010-01-28 16:40:29 -0800115
116#define SUPER_CLK_MUX 0x00
117#define SUPER_STATE_SHIFT 28
118#define SUPER_STATE_MASK (0xF << SUPER_STATE_SHIFT)
119#define SUPER_STATE_STANDBY (0x0 << SUPER_STATE_SHIFT)
120#define SUPER_STATE_IDLE (0x1 << SUPER_STATE_SHIFT)
121#define SUPER_STATE_RUN (0x2 << SUPER_STATE_SHIFT)
122#define SUPER_STATE_IRQ (0x3 << SUPER_STATE_SHIFT)
123#define SUPER_STATE_FIQ (0x4 << SUPER_STATE_SHIFT)
124#define SUPER_SOURCE_MASK 0xF
125#define SUPER_FIQ_SOURCE_SHIFT 12
126#define SUPER_IRQ_SOURCE_SHIFT 8
127#define SUPER_RUN_SOURCE_SHIFT 4
128#define SUPER_IDLE_SOURCE_SHIFT 0
129
130#define SUPER_CLK_DIVIDER 0x04
131
132#define BUS_CLK_DISABLE (1<<3)
133#define BUS_CLK_DIV_MASK 0x3
134
Colin Crosscea62c82010-10-04 11:49:26 -0700135#define PMC_CTRL 0x0
136 #define PMC_CTRL_BLINK_ENB (1 << 7)
137
138#define PMC_DPD_PADS_ORIDE 0x1c
139 #define PMC_DPD_PADS_ORIDE_BLINK_ENB (1 << 20)
140
141#define PMC_BLINK_TIMER_DATA_ON_SHIFT 0
142#define PMC_BLINK_TIMER_DATA_ON_MASK 0x7fff
143#define PMC_BLINK_TIMER_ENB (1 << 15)
144#define PMC_BLINK_TIMER_DATA_OFF_SHIFT 16
145#define PMC_BLINK_TIMER_DATA_OFF_MASK 0xffff
146
Colin Crossd8611962010-01-28 16:40:29 -0800147static void __iomem *reg_clk_base = IO_ADDRESS(TEGRA_CLK_RESET_BASE);
Colin Crosscea62c82010-10-04 11:49:26 -0700148static void __iomem *reg_pmc_base = IO_ADDRESS(TEGRA_PMC_BASE);
Colin Crossd8611962010-01-28 16:40:29 -0800149
Colin Cross4729fd72011-02-12 16:43:05 -0800150/*
151 * Some clocks share a register with other clocks. Any clock op that
152 * non-atomically modifies a register used by another clock must lock
153 * clock_register_lock first.
154 */
155static DEFINE_SPINLOCK(clock_register_lock);
156
Colin Crossd8611962010-01-28 16:40:29 -0800157#define clk_writel(value, reg) \
158 __raw_writel(value, (u32)reg_clk_base + (reg))
159#define clk_readl(reg) \
160 __raw_readl((u32)reg_clk_base + (reg))
Colin Crosscea62c82010-10-04 11:49:26 -0700161#define pmc_writel(value, reg) \
162 __raw_writel(value, (u32)reg_pmc_base + (reg))
163#define pmc_readl(reg) \
164 __raw_readl((u32)reg_pmc_base + (reg))
Colin Crossd8611962010-01-28 16:40:29 -0800165
166unsigned long clk_measure_input_freq(void)
167{
168 u32 clock_autodetect;
169 clk_writel(OSC_FREQ_DET_TRIG | 1, OSC_FREQ_DET);
170 do {} while (clk_readl(OSC_FREQ_DET_STATUS) & OSC_FREQ_DET_BUSY);
171 clock_autodetect = clk_readl(OSC_FREQ_DET_STATUS);
172 if (clock_autodetect >= 732 - 3 && clock_autodetect <= 732 + 3) {
173 return 12000000;
174 } else if (clock_autodetect >= 794 - 3 && clock_autodetect <= 794 + 3) {
175 return 13000000;
176 } else if (clock_autodetect >= 1172 - 3 && clock_autodetect <= 1172 + 3) {
177 return 19200000;
178 } else if (clock_autodetect >= 1587 - 3 && clock_autodetect <= 1587 + 3) {
179 return 26000000;
180 } else {
181 pr_err("%s: Unexpected clock autodetect value %d", __func__, clock_autodetect);
182 BUG();
183 return 0;
184 }
185}
186
Colin Cross71fc84c2010-06-07 20:49:46 -0700187static int clk_div71_get_divider(unsigned long parent_rate, unsigned long rate)
Colin Crossd8611962010-01-28 16:40:29 -0800188{
Colin Cross71fc84c2010-06-07 20:49:46 -0700189 s64 divider_u71 = parent_rate * 2;
190 divider_u71 += rate - 1;
191 do_div(divider_u71, rate);
Colin Crossd8611962010-01-28 16:40:29 -0800192
Colin Cross71fc84c2010-06-07 20:49:46 -0700193 if (divider_u71 - 2 < 0)
194 return 0;
Colin Crossd8611962010-01-28 16:40:29 -0800195
Colin Cross71fc84c2010-06-07 20:49:46 -0700196 if (divider_u71 - 2 > 255)
Colin Crossd8611962010-01-28 16:40:29 -0800197 return -EINVAL;
198
199 return divider_u71 - 2;
200}
201
Colin Cross71fc84c2010-06-07 20:49:46 -0700202static int clk_div16_get_divider(unsigned long parent_rate, unsigned long rate)
Colin Crossd8611962010-01-28 16:40:29 -0800203{
Colin Cross71fc84c2010-06-07 20:49:46 -0700204 s64 divider_u16;
Colin Crossd8611962010-01-28 16:40:29 -0800205
Colin Cross71fc84c2010-06-07 20:49:46 -0700206 divider_u16 = parent_rate;
207 divider_u16 += rate - 1;
208 do_div(divider_u16, rate);
209
210 if (divider_u16 - 1 < 0)
211 return 0;
212
213 if (divider_u16 - 1 > 255)
214 return -EINVAL;
215
216 return divider_u16 - 1;
Colin Crossd8611962010-01-28 16:40:29 -0800217}
218
Colin Crossd8611962010-01-28 16:40:29 -0800219/* clk_m functions */
220static unsigned long tegra2_clk_m_autodetect_rate(struct clk *c)
221{
222 u32 auto_clock_control = clk_readl(OSC_CTRL) & ~OSC_CTRL_OSC_FREQ_MASK;
223
224 c->rate = clk_measure_input_freq();
225 switch (c->rate) {
226 case 12000000:
227 auto_clock_control |= OSC_CTRL_OSC_FREQ_12MHZ;
228 break;
229 case 13000000:
230 auto_clock_control |= OSC_CTRL_OSC_FREQ_13MHZ;
231 break;
232 case 19200000:
233 auto_clock_control |= OSC_CTRL_OSC_FREQ_19_2MHZ;
234 break;
235 case 26000000:
236 auto_clock_control |= OSC_CTRL_OSC_FREQ_26MHZ;
237 break;
238 default:
239 pr_err("%s: Unexpected clock rate %ld", __func__, c->rate);
240 BUG();
241 }
242 clk_writel(auto_clock_control, OSC_CTRL);
243 return c->rate;
244}
245
246static void tegra2_clk_m_init(struct clk *c)
247{
248 pr_debug("%s on clock %s\n", __func__, c->name);
249 tegra2_clk_m_autodetect_rate(c);
250}
251
252static int tegra2_clk_m_enable(struct clk *c)
253{
254 pr_debug("%s on clock %s\n", __func__, c->name);
255 return 0;
256}
257
258static void tegra2_clk_m_disable(struct clk *c)
259{
260 pr_debug("%s on clock %s\n", __func__, c->name);
261 BUG();
262}
263
264static struct clk_ops tegra_clk_m_ops = {
265 .init = tegra2_clk_m_init,
266 .enable = tegra2_clk_m_enable,
267 .disable = tegra2_clk_m_disable,
268};
269
Dima Zavin2b84cb4f2010-09-02 19:11:11 -0700270void tegra2_periph_reset_assert(struct clk *c)
271{
272 BUG_ON(!c->ops->reset);
273 c->ops->reset(c, true);
274}
275
276void tegra2_periph_reset_deassert(struct clk *c)
277{
278 BUG_ON(!c->ops->reset);
279 c->ops->reset(c, false);
280}
281
Colin Crossd8611962010-01-28 16:40:29 -0800282/* super clock functions */
283/* "super clocks" on tegra have two-stage muxes and a clock skipping
284 * super divider. We will ignore the clock skipping divider, since we
285 * can't lower the voltage when using the clock skip, but we can if we
286 * lower the PLL frequency.
287 */
288static void tegra2_super_clk_init(struct clk *c)
289{
290 u32 val;
291 int source;
292 int shift;
293 const struct clk_mux_sel *sel;
294 val = clk_readl(c->reg + SUPER_CLK_MUX);
295 c->state = ON;
296 BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
297 ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
298 shift = ((val & SUPER_STATE_MASK) == SUPER_STATE_IDLE) ?
299 SUPER_IDLE_SOURCE_SHIFT : SUPER_RUN_SOURCE_SHIFT;
300 source = (val >> shift) & SUPER_SOURCE_MASK;
301 for (sel = c->inputs; sel->input != NULL; sel++) {
302 if (sel->value == source)
303 break;
304 }
305 BUG_ON(sel->input == NULL);
306 c->parent = sel->input;
Colin Crossd8611962010-01-28 16:40:29 -0800307}
308
309static int tegra2_super_clk_enable(struct clk *c)
310{
311 clk_writel(0, c->reg + SUPER_CLK_DIVIDER);
312 return 0;
313}
314
315static void tegra2_super_clk_disable(struct clk *c)
316{
317 pr_debug("%s on clock %s\n", __func__, c->name);
318
319 /* oops - don't disable the CPU clock! */
320 BUG();
321}
322
323static int tegra2_super_clk_set_parent(struct clk *c, struct clk *p)
324{
325 u32 val;
326 const struct clk_mux_sel *sel;
327 int shift;
Colin Cross71fc84c2010-06-07 20:49:46 -0700328
Colin Crossd8611962010-01-28 16:40:29 -0800329 val = clk_readl(c->reg + SUPER_CLK_MUX);;
330 BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
331 ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
332 shift = ((val & SUPER_STATE_MASK) == SUPER_STATE_IDLE) ?
333 SUPER_IDLE_SOURCE_SHIFT : SUPER_RUN_SOURCE_SHIFT;
334 for (sel = c->inputs; sel->input != NULL; sel++) {
335 if (sel->input == p) {
Colin Crossd8611962010-01-28 16:40:29 -0800336 val &= ~(SUPER_SOURCE_MASK << shift);
337 val |= sel->value << shift;
Colin Cross71fc84c2010-06-07 20:49:46 -0700338
339 if (c->refcnt)
Colin Cross4729fd72011-02-12 16:43:05 -0800340 clk_enable(p);
Colin Cross71fc84c2010-06-07 20:49:46 -0700341
Colin Crossd8611962010-01-28 16:40:29 -0800342 clk_writel(val, c->reg);
Colin Cross71fc84c2010-06-07 20:49:46 -0700343
344 if (c->refcnt && c->parent)
Colin Cross4729fd72011-02-12 16:43:05 -0800345 clk_disable(c->parent);
Colin Cross71fc84c2010-06-07 20:49:46 -0700346
347 clk_reparent(c, p);
Colin Crossd8611962010-01-28 16:40:29 -0800348 return 0;
349 }
350 }
351 return -EINVAL;
352}
353
354static struct clk_ops tegra_super_ops = {
355 .init = tegra2_super_clk_init,
356 .enable = tegra2_super_clk_enable,
357 .disable = tegra2_super_clk_disable,
358 .set_parent = tegra2_super_clk_set_parent,
Colin Cross71fc84c2010-06-07 20:49:46 -0700359};
360
361/* virtual cpu clock functions */
362/* some clocks can not be stopped (cpu, memory bus) while the SoC is running.
363 To change the frequency of these clocks, the parent pll may need to be
364 reprogrammed, so the clock must be moved off the pll, the pll reprogrammed,
365 and then the clock moved back to the pll. To hide this sequence, a virtual
366 clock handles it.
367 */
368static void tegra2_cpu_clk_init(struct clk *c)
369{
370}
371
372static int tegra2_cpu_clk_enable(struct clk *c)
373{
374 return 0;
375}
376
377static void tegra2_cpu_clk_disable(struct clk *c)
378{
379 pr_debug("%s on clock %s\n", __func__, c->name);
380
381 /* oops - don't disable the CPU clock! */
382 BUG();
383}
384
385static int tegra2_cpu_clk_set_rate(struct clk *c, unsigned long rate)
386{
387 int ret;
Colin Cross4729fd72011-02-12 16:43:05 -0800388 ret = clk_set_parent(c->parent, c->u.cpu.backup);
Colin Cross71fc84c2010-06-07 20:49:46 -0700389 if (ret) {
Colin Crossf1519612011-02-12 16:05:31 -0800390 pr_err("Failed to switch cpu to clock %s\n", c->u.cpu.backup->name);
Colin Cross71fc84c2010-06-07 20:49:46 -0700391 return ret;
392 }
393
Colin Cross4729fd72011-02-12 16:43:05 -0800394 if (rate == clk_get_rate(c->u.cpu.backup))
Colin Crosscea62c82010-10-04 11:49:26 -0700395 goto out;
396
Colin Cross4729fd72011-02-12 16:43:05 -0800397 ret = clk_set_rate(c->u.cpu.main, rate);
Colin Cross71fc84c2010-06-07 20:49:46 -0700398 if (ret) {
399 pr_err("Failed to change cpu pll to %lu\n", rate);
400 return ret;
401 }
402
Colin Cross4729fd72011-02-12 16:43:05 -0800403 ret = clk_set_parent(c->parent, c->u.cpu.main);
Colin Cross71fc84c2010-06-07 20:49:46 -0700404 if (ret) {
Colin Crossf1519612011-02-12 16:05:31 -0800405 pr_err("Failed to switch cpu to clock %s\n", c->u.cpu.main->name);
Colin Cross71fc84c2010-06-07 20:49:46 -0700406 return ret;
407 }
408
Colin Crosscea62c82010-10-04 11:49:26 -0700409out:
Colin Cross71fc84c2010-06-07 20:49:46 -0700410 return 0;
411}
412
413static struct clk_ops tegra_cpu_ops = {
414 .init = tegra2_cpu_clk_init,
415 .enable = tegra2_cpu_clk_enable,
416 .disable = tegra2_cpu_clk_disable,
417 .set_rate = tegra2_cpu_clk_set_rate,
Colin Crossd8611962010-01-28 16:40:29 -0800418};
419
420/* bus clock functions */
421static void tegra2_bus_clk_init(struct clk *c)
422{
423 u32 val = clk_readl(c->reg);
424 c->state = ((val >> c->reg_shift) & BUS_CLK_DISABLE) ? OFF : ON;
425 c->div = ((val >> c->reg_shift) & BUS_CLK_DIV_MASK) + 1;
426 c->mul = 1;
Colin Crossd8611962010-01-28 16:40:29 -0800427}
428
429static int tegra2_bus_clk_enable(struct clk *c)
430{
Colin Cross4729fd72011-02-12 16:43:05 -0800431 u32 val;
432 unsigned long flags;
433
434 spin_lock_irqsave(&clock_register_lock, flags);
435
436 val = clk_readl(c->reg);
Colin Crossd8611962010-01-28 16:40:29 -0800437 val &= ~(BUS_CLK_DISABLE << c->reg_shift);
438 clk_writel(val, c->reg);
Colin Cross4729fd72011-02-12 16:43:05 -0800439
440 spin_unlock_irqrestore(&clock_register_lock, flags);
441
Colin Crossd8611962010-01-28 16:40:29 -0800442 return 0;
443}
444
445static void tegra2_bus_clk_disable(struct clk *c)
446{
Colin Cross4729fd72011-02-12 16:43:05 -0800447 u32 val;
448 unsigned long flags;
449
450 spin_lock_irqsave(&clock_register_lock, flags);
451
452 val = clk_readl(c->reg);
Colin Crossd8611962010-01-28 16:40:29 -0800453 val |= BUS_CLK_DISABLE << c->reg_shift;
454 clk_writel(val, c->reg);
Colin Cross4729fd72011-02-12 16:43:05 -0800455
456 spin_unlock_irqrestore(&clock_register_lock, flags);
Colin Crossd8611962010-01-28 16:40:29 -0800457}
458
459static int tegra2_bus_clk_set_rate(struct clk *c, unsigned long rate)
460{
Colin Cross4729fd72011-02-12 16:43:05 -0800461 u32 val;
462 unsigned long parent_rate = clk_get_rate(c->parent);
463 unsigned long flags;
464 int ret = -EINVAL;
Colin Crossd8611962010-01-28 16:40:29 -0800465 int i;
Colin Cross4729fd72011-02-12 16:43:05 -0800466
467 spin_lock_irqsave(&clock_register_lock, flags);
468
469 val = clk_readl(c->reg);
Colin Crossd8611962010-01-28 16:40:29 -0800470 for (i = 1; i <= 4; i++) {
471 if (rate == parent_rate / i) {
472 val &= ~(BUS_CLK_DIV_MASK << c->reg_shift);
473 val |= (i - 1) << c->reg_shift;
474 clk_writel(val, c->reg);
475 c->div = i;
476 c->mul = 1;
Colin Cross4729fd72011-02-12 16:43:05 -0800477 ret = 0;
478 break;
Colin Crossd8611962010-01-28 16:40:29 -0800479 }
480 }
Colin Cross4729fd72011-02-12 16:43:05 -0800481
482 spin_unlock_irqrestore(&clock_register_lock, flags);
483
484 return ret;
Colin Crossd8611962010-01-28 16:40:29 -0800485}
486
487static struct clk_ops tegra_bus_ops = {
488 .init = tegra2_bus_clk_init,
489 .enable = tegra2_bus_clk_enable,
490 .disable = tegra2_bus_clk_disable,
491 .set_rate = tegra2_bus_clk_set_rate,
Colin Crossd8611962010-01-28 16:40:29 -0800492};
493
Colin Crosscea62c82010-10-04 11:49:26 -0700494/* Blink output functions */
495
496static void tegra2_blink_clk_init(struct clk *c)
497{
498 u32 val;
499
500 val = pmc_readl(PMC_CTRL);
501 c->state = (val & PMC_CTRL_BLINK_ENB) ? ON : OFF;
502 c->mul = 1;
503 val = pmc_readl(c->reg);
504
505 if (val & PMC_BLINK_TIMER_ENB) {
506 unsigned int on_off;
507
508 on_off = (val >> PMC_BLINK_TIMER_DATA_ON_SHIFT) &
509 PMC_BLINK_TIMER_DATA_ON_MASK;
510 val >>= PMC_BLINK_TIMER_DATA_OFF_SHIFT;
511 val &= PMC_BLINK_TIMER_DATA_OFF_MASK;
512 on_off += val;
513 /* each tick in the blink timer is 4 32KHz clocks */
514 c->div = on_off * 4;
515 } else {
516 c->div = 1;
517 }
518}
519
520static int tegra2_blink_clk_enable(struct clk *c)
521{
522 u32 val;
523
524 val = pmc_readl(PMC_DPD_PADS_ORIDE);
525 pmc_writel(val | PMC_DPD_PADS_ORIDE_BLINK_ENB, PMC_DPD_PADS_ORIDE);
526
527 val = pmc_readl(PMC_CTRL);
528 pmc_writel(val | PMC_CTRL_BLINK_ENB, PMC_CTRL);
529
530 return 0;
531}
532
533static void tegra2_blink_clk_disable(struct clk *c)
534{
535 u32 val;
536
537 val = pmc_readl(PMC_CTRL);
538 pmc_writel(val & ~PMC_CTRL_BLINK_ENB, PMC_CTRL);
539
540 val = pmc_readl(PMC_DPD_PADS_ORIDE);
541 pmc_writel(val & ~PMC_DPD_PADS_ORIDE_BLINK_ENB, PMC_DPD_PADS_ORIDE);
542}
543
544static int tegra2_blink_clk_set_rate(struct clk *c, unsigned long rate)
545{
Colin Cross4729fd72011-02-12 16:43:05 -0800546 unsigned long parent_rate = clk_get_rate(c->parent);
547 if (rate >= parent_rate) {
Colin Crosscea62c82010-10-04 11:49:26 -0700548 c->div = 1;
549 pmc_writel(0, c->reg);
550 } else {
551 unsigned int on_off;
552 u32 val;
553
Colin Cross4729fd72011-02-12 16:43:05 -0800554 on_off = DIV_ROUND_UP(parent_rate / 8, rate);
Colin Crosscea62c82010-10-04 11:49:26 -0700555 c->div = on_off * 8;
556
557 val = (on_off & PMC_BLINK_TIMER_DATA_ON_MASK) <<
558 PMC_BLINK_TIMER_DATA_ON_SHIFT;
559 on_off &= PMC_BLINK_TIMER_DATA_OFF_MASK;
560 on_off <<= PMC_BLINK_TIMER_DATA_OFF_SHIFT;
561 val |= on_off;
562 val |= PMC_BLINK_TIMER_ENB;
563 pmc_writel(val, c->reg);
564 }
565
566 return 0;
567}
568
569static struct clk_ops tegra_blink_clk_ops = {
570 .init = &tegra2_blink_clk_init,
571 .enable = &tegra2_blink_clk_enable,
572 .disable = &tegra2_blink_clk_disable,
573 .set_rate = &tegra2_blink_clk_set_rate,
574};
575
Colin Crossd8611962010-01-28 16:40:29 -0800576/* PLL Functions */
Colin Crossd8611962010-01-28 16:40:29 -0800577static int tegra2_pll_clk_wait_for_lock(struct clk *c)
578{
Colin Crossf1519612011-02-12 16:05:31 -0800579 udelay(c->u.pll.lock_delay);
Colin Crossd8611962010-01-28 16:40:29 -0800580
581 return 0;
582}
583
584static void tegra2_pll_clk_init(struct clk *c)
585{
586 u32 val = clk_readl(c->reg + PLL_BASE);
587
588 c->state = (val & PLL_BASE_ENABLE) ? ON : OFF;
589
590 if (c->flags & PLL_FIXED && !(val & PLL_BASE_OVERRIDE)) {
591 pr_warning("Clock %s has unknown fixed frequency\n", c->name);
Colin Cross71fc84c2010-06-07 20:49:46 -0700592 c->mul = 1;
593 c->div = 1;
Colin Crossd8611962010-01-28 16:40:29 -0800594 } else if (val & PLL_BASE_BYPASS) {
Colin Cross71fc84c2010-06-07 20:49:46 -0700595 c->mul = 1;
596 c->div = 1;
Colin Crossd8611962010-01-28 16:40:29 -0800597 } else {
Colin Cross71fc84c2010-06-07 20:49:46 -0700598 c->mul = (val & PLL_BASE_DIVN_MASK) >> PLL_BASE_DIVN_SHIFT;
599 c->div = (val & PLL_BASE_DIVM_MASK) >> PLL_BASE_DIVM_SHIFT;
600 if (c->flags & PLLU)
601 c->div *= (val & PLLU_BASE_POST_DIV) ? 1 : 2;
602 else
603 c->div *= (val & PLL_BASE_DIVP_MASK) ? 2 : 1;
Colin Crossd8611962010-01-28 16:40:29 -0800604 }
Colin Crossd8611962010-01-28 16:40:29 -0800605}
606
607static int tegra2_pll_clk_enable(struct clk *c)
608{
609 u32 val;
610 pr_debug("%s on clock %s\n", __func__, c->name);
611
612 val = clk_readl(c->reg + PLL_BASE);
613 val &= ~PLL_BASE_BYPASS;
614 val |= PLL_BASE_ENABLE;
615 clk_writel(val, c->reg + PLL_BASE);
616
Colin Crossd8611962010-01-28 16:40:29 -0800617 tegra2_pll_clk_wait_for_lock(c);
618
619 return 0;
620}
621
622static void tegra2_pll_clk_disable(struct clk *c)
623{
624 u32 val;
625 pr_debug("%s on clock %s\n", __func__, c->name);
626
627 val = clk_readl(c->reg);
628 val &= ~(PLL_BASE_BYPASS | PLL_BASE_ENABLE);
629 clk_writel(val, c->reg);
630}
631
632static int tegra2_pll_clk_set_rate(struct clk *c, unsigned long rate)
633{
634 u32 val;
635 unsigned long input_rate;
Colin Crossf1519612011-02-12 16:05:31 -0800636 const struct clk_pll_freq_table *sel;
Colin Crossd8611962010-01-28 16:40:29 -0800637
638 pr_debug("%s: %s %lu\n", __func__, c->name, rate);
Colin Crossd8611962010-01-28 16:40:29 -0800639
Colin Cross4729fd72011-02-12 16:43:05 -0800640 input_rate = clk_get_rate(c->parent);
Colin Crossf1519612011-02-12 16:05:31 -0800641 for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++) {
Colin Crossd8611962010-01-28 16:40:29 -0800642 if (sel->input_rate == input_rate && sel->output_rate == rate) {
Colin Cross71fc84c2010-06-07 20:49:46 -0700643 c->mul = sel->n;
644 c->div = sel->m * sel->p;
Colin Crossd8611962010-01-28 16:40:29 -0800645
646 val = clk_readl(c->reg + PLL_BASE);
647 if (c->flags & PLL_FIXED)
648 val |= PLL_BASE_OVERRIDE;
649 val &= ~(PLL_BASE_DIVP_MASK | PLL_BASE_DIVN_MASK |
650 PLL_BASE_DIVM_MASK);
Colin Cross71fc84c2010-06-07 20:49:46 -0700651 val |= (sel->m << PLL_BASE_DIVM_SHIFT) |
652 (sel->n << PLL_BASE_DIVN_SHIFT);
653 BUG_ON(sel->p < 1 || sel->p > 2);
654 if (c->flags & PLLU) {
655 if (sel->p == 1)
656 val |= PLLU_BASE_POST_DIV;
657 } else {
658 if (sel->p == 2)
659 val |= 1 << PLL_BASE_DIVP_SHIFT;
660 }
Colin Crossd8611962010-01-28 16:40:29 -0800661 clk_writel(val, c->reg + PLL_BASE);
662
663 if (c->flags & PLL_HAS_CPCON) {
Colin Cross71fc84c2010-06-07 20:49:46 -0700664 val = clk_readl(c->reg + PLL_MISC(c));
665 val &= ~PLL_MISC_CPCON_MASK;
666 val |= sel->cpcon << PLL_MISC_CPCON_SHIFT;
Colin Crossd8611962010-01-28 16:40:29 -0800667 clk_writel(val, c->reg + PLL_MISC(c));
668 }
669
670 if (c->state == ON)
671 tegra2_pll_clk_enable(c);
672
Colin Crossd8611962010-01-28 16:40:29 -0800673 return 0;
674 }
675 }
676 return -EINVAL;
677}
678
679static struct clk_ops tegra_pll_ops = {
680 .init = tegra2_pll_clk_init,
681 .enable = tegra2_pll_clk_enable,
682 .disable = tegra2_pll_clk_disable,
683 .set_rate = tegra2_pll_clk_set_rate,
Colin Cross71fc84c2010-06-07 20:49:46 -0700684};
685
686static void tegra2_pllx_clk_init(struct clk *c)
687{
688 tegra2_pll_clk_init(c);
689
690 if (tegra_sku_id() == 7)
691 c->max_rate = 750000000;
692}
693
694static struct clk_ops tegra_pllx_ops = {
695 .init = tegra2_pllx_clk_init,
696 .enable = tegra2_pll_clk_enable,
697 .disable = tegra2_pll_clk_disable,
698 .set_rate = tegra2_pll_clk_set_rate,
Colin Crossd8611962010-01-28 16:40:29 -0800699};
700
Mike Rapoport8d685bc2010-09-27 11:26:32 +0200701static int tegra2_plle_clk_enable(struct clk *c)
702{
703 u32 val;
704
705 pr_debug("%s on clock %s\n", __func__, c->name);
706
707 mdelay(1);
708
709 val = clk_readl(c->reg + PLL_BASE);
710 if (!(val & PLLE_MISC_READY))
711 return -EBUSY;
712
713 val = clk_readl(c->reg + PLL_BASE);
714 val |= PLL_BASE_ENABLE | PLL_BASE_BYPASS;
715 clk_writel(val, c->reg + PLL_BASE);
716
717 return 0;
718}
719
720static struct clk_ops tegra_plle_ops = {
721 .init = tegra2_pll_clk_init,
722 .enable = tegra2_plle_clk_enable,
723 .set_rate = tegra2_pll_clk_set_rate,
724};
725
Colin Crossd8611962010-01-28 16:40:29 -0800726/* Clock divider ops */
727static void tegra2_pll_div_clk_init(struct clk *c)
728{
729 u32 val = clk_readl(c->reg);
730 u32 divu71;
731 val >>= c->reg_shift;
732 c->state = (val & PLL_OUT_CLKEN) ? ON : OFF;
733 if (!(val & PLL_OUT_RESET_DISABLE))
734 c->state = OFF;
735
736 if (c->flags & DIV_U71) {
737 divu71 = (val & PLL_OUT_RATIO_MASK) >> PLL_OUT_RATIO_SHIFT;
738 c->div = (divu71 + 2);
739 c->mul = 2;
740 } else if (c->flags & DIV_2) {
741 c->div = 2;
742 c->mul = 1;
743 } else {
744 c->div = 1;
745 c->mul = 1;
746 }
Colin Crossd8611962010-01-28 16:40:29 -0800747}
748
749static int tegra2_pll_div_clk_enable(struct clk *c)
750{
751 u32 val;
752 u32 new_val;
Colin Cross4729fd72011-02-12 16:43:05 -0800753 unsigned long flags;
Colin Crossd8611962010-01-28 16:40:29 -0800754
755 pr_debug("%s: %s\n", __func__, c->name);
756 if (c->flags & DIV_U71) {
Colin Cross4729fd72011-02-12 16:43:05 -0800757 spin_lock_irqsave(&clock_register_lock, flags);
Colin Crossd8611962010-01-28 16:40:29 -0800758 val = clk_readl(c->reg);
759 new_val = val >> c->reg_shift;
760 new_val &= 0xFFFF;
761
762 new_val |= PLL_OUT_CLKEN | PLL_OUT_RESET_DISABLE;
763
764 val &= ~(0xFFFF << c->reg_shift);
765 val |= new_val << c->reg_shift;
766 clk_writel(val, c->reg);
Colin Cross4729fd72011-02-12 16:43:05 -0800767 spin_unlock_irqrestore(&clock_register_lock, flags);
Colin Crossd8611962010-01-28 16:40:29 -0800768 return 0;
769 } else if (c->flags & DIV_2) {
770 BUG_ON(!(c->flags & PLLD));
Colin Cross4729fd72011-02-12 16:43:05 -0800771 spin_lock_irqsave(&clock_register_lock, flags);
Colin Crossd8611962010-01-28 16:40:29 -0800772 val = clk_readl(c->reg);
773 val &= ~PLLD_MISC_DIV_RST;
774 clk_writel(val, c->reg);
Colin Cross4729fd72011-02-12 16:43:05 -0800775 spin_unlock_irqrestore(&clock_register_lock, flags);
Colin Crossd8611962010-01-28 16:40:29 -0800776 return 0;
777 }
778 return -EINVAL;
779}
780
781static void tegra2_pll_div_clk_disable(struct clk *c)
782{
783 u32 val;
784 u32 new_val;
Colin Cross4729fd72011-02-12 16:43:05 -0800785 unsigned long flags;
Colin Crossd8611962010-01-28 16:40:29 -0800786
787 pr_debug("%s: %s\n", __func__, c->name);
788 if (c->flags & DIV_U71) {
Colin Cross4729fd72011-02-12 16:43:05 -0800789 spin_lock_irqsave(&clock_register_lock, flags);
Colin Crossd8611962010-01-28 16:40:29 -0800790 val = clk_readl(c->reg);
791 new_val = val >> c->reg_shift;
792 new_val &= 0xFFFF;
793
794 new_val &= ~(PLL_OUT_CLKEN | PLL_OUT_RESET_DISABLE);
795
796 val &= ~(0xFFFF << c->reg_shift);
797 val |= new_val << c->reg_shift;
798 clk_writel(val, c->reg);
Colin Cross4729fd72011-02-12 16:43:05 -0800799 spin_unlock_irqrestore(&clock_register_lock, flags);
Colin Crossd8611962010-01-28 16:40:29 -0800800 } else if (c->flags & DIV_2) {
801 BUG_ON(!(c->flags & PLLD));
Colin Cross4729fd72011-02-12 16:43:05 -0800802 spin_lock_irqsave(&clock_register_lock, flags);
Colin Crossd8611962010-01-28 16:40:29 -0800803 val = clk_readl(c->reg);
804 val |= PLLD_MISC_DIV_RST;
805 clk_writel(val, c->reg);
Colin Cross4729fd72011-02-12 16:43:05 -0800806 spin_unlock_irqrestore(&clock_register_lock, flags);
Colin Crossd8611962010-01-28 16:40:29 -0800807 }
808}
809
810static int tegra2_pll_div_clk_set_rate(struct clk *c, unsigned long rate)
811{
812 u32 val;
813 u32 new_val;
814 int divider_u71;
Colin Cross4729fd72011-02-12 16:43:05 -0800815 unsigned long parent_rate = clk_get_rate(c->parent);
816 unsigned long flags;
817
Colin Crossd8611962010-01-28 16:40:29 -0800818 pr_debug("%s: %s %lu\n", __func__, c->name, rate);
819 if (c->flags & DIV_U71) {
Colin Cross4729fd72011-02-12 16:43:05 -0800820 divider_u71 = clk_div71_get_divider(parent_rate, rate);
Colin Crossd8611962010-01-28 16:40:29 -0800821 if (divider_u71 >= 0) {
Colin Cross4729fd72011-02-12 16:43:05 -0800822 spin_lock_irqsave(&clock_register_lock, flags);
Colin Crossd8611962010-01-28 16:40:29 -0800823 val = clk_readl(c->reg);
824 new_val = val >> c->reg_shift;
825 new_val &= 0xFFFF;
826 if (c->flags & DIV_U71_FIXED)
827 new_val |= PLL_OUT_OVERRIDE;
828 new_val &= ~PLL_OUT_RATIO_MASK;
829 new_val |= divider_u71 << PLL_OUT_RATIO_SHIFT;
830
831 val &= ~(0xFFFF << c->reg_shift);
832 val |= new_val << c->reg_shift;
833 clk_writel(val, c->reg);
834 c->div = divider_u71 + 2;
835 c->mul = 2;
Colin Cross4729fd72011-02-12 16:43:05 -0800836 spin_unlock_irqrestore(&clock_register_lock, flags);
Colin Crossd8611962010-01-28 16:40:29 -0800837 return 0;
838 }
839 } else if (c->flags & DIV_2) {
Colin Cross4729fd72011-02-12 16:43:05 -0800840 if (parent_rate == rate * 2)
Colin Crossd8611962010-01-28 16:40:29 -0800841 return 0;
Colin Crossd8611962010-01-28 16:40:29 -0800842 }
843 return -EINVAL;
844}
845
Colin Cross71fc84c2010-06-07 20:49:46 -0700846static long tegra2_pll_div_clk_round_rate(struct clk *c, unsigned long rate)
847{
848 int divider;
Colin Cross4729fd72011-02-12 16:43:05 -0800849 unsigned long parent_rate = clk_get_rate(c->parent);
Colin Cross71fc84c2010-06-07 20:49:46 -0700850 pr_debug("%s: %s %lu\n", __func__, c->name, rate);
851
852 if (c->flags & DIV_U71) {
Colin Cross4729fd72011-02-12 16:43:05 -0800853 divider = clk_div71_get_divider(parent_rate, rate);
Colin Cross71fc84c2010-06-07 20:49:46 -0700854 if (divider < 0)
855 return divider;
Colin Cross4729fd72011-02-12 16:43:05 -0800856 return parent_rate * 2 / (divider + 2);
Colin Cross71fc84c2010-06-07 20:49:46 -0700857 } else if (c->flags & DIV_2) {
Colin Cross4729fd72011-02-12 16:43:05 -0800858 return parent_rate / 2;
Colin Cross71fc84c2010-06-07 20:49:46 -0700859 }
860 return -EINVAL;
861}
Colin Crossd8611962010-01-28 16:40:29 -0800862
863static struct clk_ops tegra_pll_div_ops = {
864 .init = tegra2_pll_div_clk_init,
865 .enable = tegra2_pll_div_clk_enable,
866 .disable = tegra2_pll_div_clk_disable,
867 .set_rate = tegra2_pll_div_clk_set_rate,
Colin Cross71fc84c2010-06-07 20:49:46 -0700868 .round_rate = tegra2_pll_div_clk_round_rate,
Colin Crossd8611962010-01-28 16:40:29 -0800869};
870
871/* Periph clk ops */
872
873static void tegra2_periph_clk_init(struct clk *c)
874{
875 u32 val = clk_readl(c->reg);
876 const struct clk_mux_sel *mux = 0;
877 const struct clk_mux_sel *sel;
878 if (c->flags & MUX) {
879 for (sel = c->inputs; sel->input != NULL; sel++) {
880 if (val >> PERIPH_CLK_SOURCE_SHIFT == sel->value)
881 mux = sel;
882 }
883 BUG_ON(!mux);
884
885 c->parent = mux->input;
886 } else {
887 c->parent = c->inputs[0].input;
888 }
889
890 if (c->flags & DIV_U71) {
Colin Cross71fc84c2010-06-07 20:49:46 -0700891 u32 divu71 = val & PERIPH_CLK_SOURCE_DIVU71_MASK;
Colin Crossd8611962010-01-28 16:40:29 -0800892 c->div = divu71 + 2;
893 c->mul = 2;
Colin Cross71fc84c2010-06-07 20:49:46 -0700894 } else if (c->flags & DIV_U16) {
895 u32 divu16 = val & PERIPH_CLK_SOURCE_DIVU16_MASK;
896 c->div = divu16 + 1;
897 c->mul = 1;
Colin Crossd8611962010-01-28 16:40:29 -0800898 } else {
899 c->div = 1;
900 c->mul = 1;
901 }
902
903 c->state = ON;
904 if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
905 PERIPH_CLK_TO_ENB_BIT(c)))
906 c->state = OFF;
907 if (!(c->flags & PERIPH_NO_RESET))
908 if (clk_readl(RST_DEVICES + PERIPH_CLK_TO_ENB_REG(c)) &
909 PERIPH_CLK_TO_ENB_BIT(c))
910 c->state = OFF;
Colin Crossd8611962010-01-28 16:40:29 -0800911}
912
913static int tegra2_periph_clk_enable(struct clk *c)
914{
915 u32 val;
916 pr_debug("%s on clock %s\n", __func__, c->name);
917
918 clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
919 CLK_OUT_ENB_SET + PERIPH_CLK_TO_ENB_SET_REG(c));
920 if (!(c->flags & PERIPH_NO_RESET) && !(c->flags & PERIPH_MANUAL_RESET))
921 clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
922 RST_DEVICES_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
923 if (c->flags & PERIPH_EMC_ENB) {
924 /* The EMC peripheral clock has 2 extra enable bits */
925 /* FIXME: Do they need to be disabled? */
926 val = clk_readl(c->reg);
927 val |= 0x3 << 24;
928 clk_writel(val, c->reg);
929 }
930 return 0;
931}
932
933static void tegra2_periph_clk_disable(struct clk *c)
934{
935 pr_debug("%s on clock %s\n", __func__, c->name);
936
937 clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
938 CLK_OUT_ENB_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
939}
940
Dima Zavin2b84cb4f2010-09-02 19:11:11 -0700941static void tegra2_periph_clk_reset(struct clk *c, bool assert)
Colin Crossd8611962010-01-28 16:40:29 -0800942{
Dima Zavin2b84cb4f2010-09-02 19:11:11 -0700943 unsigned long base = assert ? RST_DEVICES_SET : RST_DEVICES_CLR;
944
945 pr_debug("%s %s on clock %s\n", __func__,
946 assert ? "assert" : "deassert", c->name);
Colin Crossd8611962010-01-28 16:40:29 -0800947 if (!(c->flags & PERIPH_NO_RESET))
948 clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
Dima Zavin2b84cb4f2010-09-02 19:11:11 -0700949 base + PERIPH_CLK_TO_ENB_SET_REG(c));
Colin Crossd8611962010-01-28 16:40:29 -0800950}
951
Colin Crossd8611962010-01-28 16:40:29 -0800952static int tegra2_periph_clk_set_parent(struct clk *c, struct clk *p)
953{
954 u32 val;
955 const struct clk_mux_sel *sel;
956 pr_debug("%s: %s %s\n", __func__, c->name, p->name);
957 for (sel = c->inputs; sel->input != NULL; sel++) {
958 if (sel->input == p) {
Colin Crossd8611962010-01-28 16:40:29 -0800959 val = clk_readl(c->reg);
960 val &= ~PERIPH_CLK_SOURCE_MASK;
961 val |= (sel->value) << PERIPH_CLK_SOURCE_SHIFT;
Colin Cross71fc84c2010-06-07 20:49:46 -0700962
963 if (c->refcnt)
Colin Cross4729fd72011-02-12 16:43:05 -0800964 clk_enable(p);
Colin Cross71fc84c2010-06-07 20:49:46 -0700965
Colin Crossd8611962010-01-28 16:40:29 -0800966 clk_writel(val, c->reg);
Colin Cross71fc84c2010-06-07 20:49:46 -0700967
968 if (c->refcnt && c->parent)
Colin Cross4729fd72011-02-12 16:43:05 -0800969 clk_disable(c->parent);
Colin Cross71fc84c2010-06-07 20:49:46 -0700970
971 clk_reparent(c, p);
Colin Crossd8611962010-01-28 16:40:29 -0800972 return 0;
973 }
974 }
975
976 return -EINVAL;
977}
978
979static int tegra2_periph_clk_set_rate(struct clk *c, unsigned long rate)
980{
981 u32 val;
Colin Cross71fc84c2010-06-07 20:49:46 -0700982 int divider;
Colin Cross4729fd72011-02-12 16:43:05 -0800983 unsigned long parent_rate = clk_get_rate(c->parent);
984
Colin Crossd8611962010-01-28 16:40:29 -0800985 if (c->flags & DIV_U71) {
Colin Cross4729fd72011-02-12 16:43:05 -0800986 divider = clk_div71_get_divider(parent_rate, rate);
Colin Cross71fc84c2010-06-07 20:49:46 -0700987 if (divider >= 0) {
Colin Crossd8611962010-01-28 16:40:29 -0800988 val = clk_readl(c->reg);
Colin Cross71fc84c2010-06-07 20:49:46 -0700989 val &= ~PERIPH_CLK_SOURCE_DIVU71_MASK;
990 val |= divider;
Colin Crossd8611962010-01-28 16:40:29 -0800991 clk_writel(val, c->reg);
Colin Cross71fc84c2010-06-07 20:49:46 -0700992 c->div = divider + 2;
Colin Crossd8611962010-01-28 16:40:29 -0800993 c->mul = 2;
Colin Crossd8611962010-01-28 16:40:29 -0800994 return 0;
995 }
Colin Cross71fc84c2010-06-07 20:49:46 -0700996 } else if (c->flags & DIV_U16) {
Colin Cross4729fd72011-02-12 16:43:05 -0800997 divider = clk_div16_get_divider(parent_rate, rate);
Colin Cross71fc84c2010-06-07 20:49:46 -0700998 if (divider >= 0) {
999 val = clk_readl(c->reg);
1000 val &= ~PERIPH_CLK_SOURCE_DIVU16_MASK;
1001 val |= divider;
1002 clk_writel(val, c->reg);
1003 c->div = divider + 1;
1004 c->mul = 1;
1005 return 0;
1006 }
Colin Cross4729fd72011-02-12 16:43:05 -08001007 } else if (parent_rate <= rate) {
Colin Cross71fc84c2010-06-07 20:49:46 -07001008 c->div = 1;
1009 c->mul = 1;
1010 return 0;
1011 }
1012 return -EINVAL;
1013}
1014
1015static long tegra2_periph_clk_round_rate(struct clk *c,
1016 unsigned long rate)
1017{
1018 int divider;
Colin Cross4729fd72011-02-12 16:43:05 -08001019 unsigned long parent_rate = clk_get_rate(c->parent);
Colin Cross71fc84c2010-06-07 20:49:46 -07001020 pr_debug("%s: %s %lu\n", __func__, c->name, rate);
1021
1022 if (c->flags & DIV_U71) {
Colin Cross4729fd72011-02-12 16:43:05 -08001023 divider = clk_div71_get_divider(parent_rate, rate);
Colin Cross71fc84c2010-06-07 20:49:46 -07001024 if (divider < 0)
1025 return divider;
1026
Colin Cross4729fd72011-02-12 16:43:05 -08001027 return parent_rate * 2 / (divider + 2);
Colin Cross71fc84c2010-06-07 20:49:46 -07001028 } else if (c->flags & DIV_U16) {
Colin Cross4729fd72011-02-12 16:43:05 -08001029 divider = clk_div16_get_divider(parent_rate, rate);
Colin Cross71fc84c2010-06-07 20:49:46 -07001030 if (divider < 0)
1031 return divider;
Colin Cross4729fd72011-02-12 16:43:05 -08001032 return parent_rate / (divider + 1);
Colin Crossd8611962010-01-28 16:40:29 -08001033 }
1034 return -EINVAL;
1035}
1036
1037static struct clk_ops tegra_periph_clk_ops = {
1038 .init = &tegra2_periph_clk_init,
1039 .enable = &tegra2_periph_clk_enable,
1040 .disable = &tegra2_periph_clk_disable,
1041 .set_parent = &tegra2_periph_clk_set_parent,
1042 .set_rate = &tegra2_periph_clk_set_rate,
Colin Cross71fc84c2010-06-07 20:49:46 -07001043 .round_rate = &tegra2_periph_clk_round_rate,
Dima Zavin2b84cb4f2010-09-02 19:11:11 -07001044 .reset = &tegra2_periph_clk_reset,
Colin Crossd8611962010-01-28 16:40:29 -08001045};
1046
1047/* Clock doubler ops */
1048static void tegra2_clk_double_init(struct clk *c)
1049{
1050 c->mul = 2;
1051 c->div = 1;
1052 c->state = ON;
1053 if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
1054 PERIPH_CLK_TO_ENB_BIT(c)))
1055 c->state = OFF;
Colin Crossd8611962010-01-28 16:40:29 -08001056};
1057
Colin Cross71fc84c2010-06-07 20:49:46 -07001058static int tegra2_clk_double_set_rate(struct clk *c, unsigned long rate)
1059{
Colin Cross4729fd72011-02-12 16:43:05 -08001060 if (rate != 2 * clk_get_rate(c->parent))
Colin Cross71fc84c2010-06-07 20:49:46 -07001061 return -EINVAL;
1062 c->mul = 2;
1063 c->div = 1;
1064 return 0;
1065}
1066
Colin Crossd8611962010-01-28 16:40:29 -08001067static struct clk_ops tegra_clk_double_ops = {
1068 .init = &tegra2_clk_double_init,
1069 .enable = &tegra2_periph_clk_enable,
1070 .disable = &tegra2_periph_clk_disable,
Colin Cross71fc84c2010-06-07 20:49:46 -07001071 .set_rate = &tegra2_clk_double_set_rate,
1072};
1073
Colin Crosscea62c82010-10-04 11:49:26 -07001074/* Audio sync clock ops */
Colin Cross71fc84c2010-06-07 20:49:46 -07001075static void tegra2_audio_sync_clk_init(struct clk *c)
1076{
1077 int source;
1078 const struct clk_mux_sel *sel;
1079 u32 val = clk_readl(c->reg);
1080 c->state = (val & (1<<4)) ? OFF : ON;
1081 source = val & 0xf;
1082 for (sel = c->inputs; sel->input != NULL; sel++)
1083 if (sel->value == source)
1084 break;
1085 BUG_ON(sel->input == NULL);
1086 c->parent = sel->input;
1087}
1088
1089static int tegra2_audio_sync_clk_enable(struct clk *c)
1090{
1091 clk_writel(0, c->reg);
1092 return 0;
1093}
1094
1095static void tegra2_audio_sync_clk_disable(struct clk *c)
1096{
1097 clk_writel(1, c->reg);
1098}
1099
1100static int tegra2_audio_sync_clk_set_parent(struct clk *c, struct clk *p)
1101{
1102 u32 val;
1103 const struct clk_mux_sel *sel;
1104 for (sel = c->inputs; sel->input != NULL; sel++) {
1105 if (sel->input == p) {
1106 val = clk_readl(c->reg);
1107 val &= ~0xf;
1108 val |= sel->value;
1109
1110 if (c->refcnt)
Colin Cross4729fd72011-02-12 16:43:05 -08001111 clk_enable(p);
Colin Cross71fc84c2010-06-07 20:49:46 -07001112
1113 clk_writel(val, c->reg);
1114
1115 if (c->refcnt && c->parent)
Colin Cross4729fd72011-02-12 16:43:05 -08001116 clk_disable(c->parent);
Colin Cross71fc84c2010-06-07 20:49:46 -07001117
1118 clk_reparent(c, p);
1119 return 0;
1120 }
1121 }
1122
1123 return -EINVAL;
1124}
1125
1126static int tegra2_audio_sync_clk_set_rate(struct clk *c, unsigned long rate)
1127{
1128 unsigned long parent_rate;
1129 if (!c->parent) {
1130 pr_err("%s: clock has no parent\n", __func__);
1131 return -EINVAL;
1132 }
1133 parent_rate = c->parent->rate;
1134 if (rate != parent_rate) {
1135 pr_err("%s: %s/%ld differs from parent %s/%ld\n",
1136 __func__,
1137 c->name, rate,
1138 c->parent->name, parent_rate);
1139 return -EINVAL;
1140 }
1141 c->rate = parent_rate;
1142 return 0;
1143}
1144
1145static struct clk_ops tegra_audio_sync_clk_ops = {
1146 .init = tegra2_audio_sync_clk_init,
1147 .enable = tegra2_audio_sync_clk_enable,
1148 .disable = tegra2_audio_sync_clk_disable,
1149 .set_rate = tegra2_audio_sync_clk_set_rate,
1150 .set_parent = tegra2_audio_sync_clk_set_parent,
Colin Crossd8611962010-01-28 16:40:29 -08001151};
1152
Colin Crosscea62c82010-10-04 11:49:26 -07001153/* cdev1 and cdev2 (dap_mclk1 and dap_mclk2) ops */
1154
1155static void tegra2_cdev_clk_init(struct clk *c)
1156{
1157 /* We could un-tristate the cdev1 or cdev2 pingroup here; this is
1158 * currently done in the pinmux code. */
1159 c->state = ON;
1160 if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
1161 PERIPH_CLK_TO_ENB_BIT(c)))
1162 c->state = OFF;
1163}
1164
1165static int tegra2_cdev_clk_enable(struct clk *c)
1166{
1167 clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
1168 CLK_OUT_ENB_SET + PERIPH_CLK_TO_ENB_SET_REG(c));
1169 return 0;
1170}
1171
1172static void tegra2_cdev_clk_disable(struct clk *c)
1173{
1174 clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
1175 CLK_OUT_ENB_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
1176}
1177
1178static struct clk_ops tegra_cdev_clk_ops = {
1179 .init = &tegra2_cdev_clk_init,
1180 .enable = &tegra2_cdev_clk_enable,
1181 .disable = &tegra2_cdev_clk_disable,
1182};
1183
Colin Crossd8611962010-01-28 16:40:29 -08001184/* Clock definitions */
1185static struct clk tegra_clk_32k = {
1186 .name = "clk_32k",
Colin Cross71fc84c2010-06-07 20:49:46 -07001187 .rate = 32768,
Colin Crossd8611962010-01-28 16:40:29 -08001188 .ops = NULL,
Colin Cross71fc84c2010-06-07 20:49:46 -07001189 .max_rate = 32768,
Colin Crossd8611962010-01-28 16:40:29 -08001190};
1191
Colin Crossf1519612011-02-12 16:05:31 -08001192static struct clk_pll_freq_table tegra_pll_s_freq_table[] = {
Colin Crossd8611962010-01-28 16:40:29 -08001193 {32768, 12000000, 366, 1, 1, 0},
1194 {32768, 13000000, 397, 1, 1, 0},
1195 {32768, 19200000, 586, 1, 1, 0},
1196 {32768, 26000000, 793, 1, 1, 0},
1197 {0, 0, 0, 0, 0, 0},
1198};
1199
1200static struct clk tegra_pll_s = {
1201 .name = "pll_s",
1202 .flags = PLL_ALT_MISC_REG,
1203 .ops = &tegra_pll_ops,
Colin Crossd8611962010-01-28 16:40:29 -08001204 .parent = &tegra_clk_32k,
Colin Cross71fc84c2010-06-07 20:49:46 -07001205 .max_rate = 26000000,
Colin Crossf1519612011-02-12 16:05:31 -08001206 .reg = 0xf0,
1207 .u.pll = {
1208 .input_min = 32768,
1209 .input_max = 32768,
1210 .cf_min = 0, /* FIXME */
1211 .cf_max = 0, /* FIXME */
1212 .vco_min = 12000000,
1213 .vco_max = 26000000,
1214 .freq_table = tegra_pll_s_freq_table,
1215 .lock_delay = 300,
1216 },
Colin Crossd8611962010-01-28 16:40:29 -08001217};
1218
1219static struct clk_mux_sel tegra_clk_m_sel[] = {
1220 { .input = &tegra_clk_32k, .value = 0},
1221 { .input = &tegra_pll_s, .value = 1},
1222 { 0, 0},
1223};
Colin Crossf1519612011-02-12 16:05:31 -08001224
Colin Crossd8611962010-01-28 16:40:29 -08001225static struct clk tegra_clk_m = {
1226 .name = "clk_m",
1227 .flags = ENABLE_ON_INIT,
1228 .ops = &tegra_clk_m_ops,
1229 .inputs = tegra_clk_m_sel,
1230 .reg = 0x1fc,
Colin Crossd8611962010-01-28 16:40:29 -08001231 .reg_shift = 28,
Colin Cross71fc84c2010-06-07 20:49:46 -07001232 .max_rate = 26000000,
Colin Crossd8611962010-01-28 16:40:29 -08001233};
1234
Colin Crossf1519612011-02-12 16:05:31 -08001235static struct clk_pll_freq_table tegra_pll_c_freq_table[] = {
Colin Crossd8611962010-01-28 16:40:29 -08001236 { 0, 0, 0, 0, 0, 0 },
1237};
1238
1239static struct clk tegra_pll_c = {
1240 .name = "pll_c",
1241 .flags = PLL_HAS_CPCON,
1242 .ops = &tegra_pll_ops,
1243 .reg = 0x80,
Colin Crossd8611962010-01-28 16:40:29 -08001244 .parent = &tegra_clk_m,
Colin Cross71fc84c2010-06-07 20:49:46 -07001245 .max_rate = 600000000,
Colin Crossf1519612011-02-12 16:05:31 -08001246 .u.pll = {
1247 .input_min = 2000000,
1248 .input_max = 31000000,
1249 .cf_min = 1000000,
1250 .cf_max = 6000000,
1251 .vco_min = 20000000,
1252 .vco_max = 1400000000,
1253 .freq_table = tegra_pll_c_freq_table,
1254 .lock_delay = 300,
1255 },
Colin Crossd8611962010-01-28 16:40:29 -08001256};
1257
1258static struct clk tegra_pll_c_out1 = {
1259 .name = "pll_c_out1",
1260 .ops = &tegra_pll_div_ops,
1261 .flags = DIV_U71,
1262 .parent = &tegra_pll_c,
1263 .reg = 0x84,
1264 .reg_shift = 0,
Colin Cross71fc84c2010-06-07 20:49:46 -07001265 .max_rate = 600000000,
Colin Crossd8611962010-01-28 16:40:29 -08001266};
1267
Colin Crossf1519612011-02-12 16:05:31 -08001268static struct clk_pll_freq_table tegra_pll_m_freq_table[] = {
Colin Cross71fc84c2010-06-07 20:49:46 -07001269 { 12000000, 666000000, 666, 12, 1, 8},
1270 { 13000000, 666000000, 666, 13, 1, 8},
1271 { 19200000, 666000000, 555, 16, 1, 8},
1272 { 26000000, 666000000, 666, 26, 1, 8},
1273 { 12000000, 600000000, 600, 12, 1, 8},
1274 { 13000000, 600000000, 600, 13, 1, 8},
1275 { 19200000, 600000000, 375, 12, 1, 6},
1276 { 26000000, 600000000, 600, 26, 1, 8},
Colin Crossd8611962010-01-28 16:40:29 -08001277 { 0, 0, 0, 0, 0, 0 },
1278};
1279
1280static struct clk tegra_pll_m = {
1281 .name = "pll_m",
1282 .flags = PLL_HAS_CPCON,
1283 .ops = &tegra_pll_ops,
1284 .reg = 0x90,
Colin Crossd8611962010-01-28 16:40:29 -08001285 .parent = &tegra_clk_m,
Colin Cross71fc84c2010-06-07 20:49:46 -07001286 .max_rate = 800000000,
Colin Crossf1519612011-02-12 16:05:31 -08001287 .u.pll = {
1288 .input_min = 2000000,
1289 .input_max = 31000000,
1290 .cf_min = 1000000,
1291 .cf_max = 6000000,
1292 .vco_min = 20000000,
1293 .vco_max = 1200000000,
1294 .freq_table = tegra_pll_m_freq_table,
1295 .lock_delay = 300,
1296 },
Colin Crossd8611962010-01-28 16:40:29 -08001297};
1298
1299static struct clk tegra_pll_m_out1 = {
1300 .name = "pll_m_out1",
1301 .ops = &tegra_pll_div_ops,
1302 .flags = DIV_U71,
1303 .parent = &tegra_pll_m,
1304 .reg = 0x94,
1305 .reg_shift = 0,
Colin Cross71fc84c2010-06-07 20:49:46 -07001306 .max_rate = 600000000,
Colin Crossd8611962010-01-28 16:40:29 -08001307};
1308
Colin Crossf1519612011-02-12 16:05:31 -08001309static struct clk_pll_freq_table tegra_pll_p_freq_table[] = {
Colin Crossd8611962010-01-28 16:40:29 -08001310 { 12000000, 216000000, 432, 12, 2, 8},
1311 { 13000000, 216000000, 432, 13, 2, 8},
1312 { 19200000, 216000000, 90, 4, 2, 1},
1313 { 26000000, 216000000, 432, 26, 2, 8},
1314 { 12000000, 432000000, 432, 12, 1, 8},
1315 { 13000000, 432000000, 432, 13, 1, 8},
1316 { 19200000, 432000000, 90, 4, 1, 1},
1317 { 26000000, 432000000, 432, 26, 1, 8},
1318 { 0, 0, 0, 0, 0, 0 },
1319};
1320
1321static struct clk tegra_pll_p = {
1322 .name = "pll_p",
1323 .flags = ENABLE_ON_INIT | PLL_FIXED | PLL_HAS_CPCON,
1324 .ops = &tegra_pll_ops,
1325 .reg = 0xa0,
Colin Crossd8611962010-01-28 16:40:29 -08001326 .parent = &tegra_clk_m,
Colin Cross71fc84c2010-06-07 20:49:46 -07001327 .max_rate = 432000000,
Colin Crossf1519612011-02-12 16:05:31 -08001328 .u.pll = {
1329 .input_min = 2000000,
1330 .input_max = 31000000,
1331 .cf_min = 1000000,
1332 .cf_max = 6000000,
1333 .vco_min = 20000000,
1334 .vco_max = 1400000000,
1335 .freq_table = tegra_pll_p_freq_table,
1336 .lock_delay = 300,
1337 },
Colin Crossd8611962010-01-28 16:40:29 -08001338};
1339
1340static struct clk tegra_pll_p_out1 = {
1341 .name = "pll_p_out1",
1342 .ops = &tegra_pll_div_ops,
1343 .flags = ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED,
1344 .parent = &tegra_pll_p,
1345 .reg = 0xa4,
1346 .reg_shift = 0,
Colin Cross71fc84c2010-06-07 20:49:46 -07001347 .max_rate = 432000000,
Colin Crossd8611962010-01-28 16:40:29 -08001348};
1349
1350static struct clk tegra_pll_p_out2 = {
1351 .name = "pll_p_out2",
1352 .ops = &tegra_pll_div_ops,
1353 .flags = ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED,
1354 .parent = &tegra_pll_p,
1355 .reg = 0xa4,
1356 .reg_shift = 16,
Colin Cross71fc84c2010-06-07 20:49:46 -07001357 .max_rate = 432000000,
Colin Crossd8611962010-01-28 16:40:29 -08001358};
1359
1360static struct clk tegra_pll_p_out3 = {
1361 .name = "pll_p_out3",
1362 .ops = &tegra_pll_div_ops,
1363 .flags = ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED,
1364 .parent = &tegra_pll_p,
1365 .reg = 0xa8,
1366 .reg_shift = 0,
Colin Cross71fc84c2010-06-07 20:49:46 -07001367 .max_rate = 432000000,
Colin Crossd8611962010-01-28 16:40:29 -08001368};
1369
1370static struct clk tegra_pll_p_out4 = {
1371 .name = "pll_p_out4",
1372 .ops = &tegra_pll_div_ops,
1373 .flags = ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED,
1374 .parent = &tegra_pll_p,
1375 .reg = 0xa8,
1376 .reg_shift = 16,
Colin Cross71fc84c2010-06-07 20:49:46 -07001377 .max_rate = 432000000,
Colin Crossd8611962010-01-28 16:40:29 -08001378};
1379
Colin Crossf1519612011-02-12 16:05:31 -08001380static struct clk_pll_freq_table tegra_pll_a_freq_table[] = {
Colin Crossd8611962010-01-28 16:40:29 -08001381 { 28800000, 56448000, 49, 25, 1, 1},
1382 { 28800000, 73728000, 64, 25, 1, 1},
1383 { 28800000, 11289600, 49, 25, 1, 1},
1384 { 28800000, 12288000, 64, 25, 1, 1},
Colin Cross71fc84c2010-06-07 20:49:46 -07001385 { 28800000, 24000000, 5, 6, 1, 1},
Colin Crossd8611962010-01-28 16:40:29 -08001386 { 0, 0, 0, 0, 0, 0 },
1387};
1388
1389static struct clk tegra_pll_a = {
1390 .name = "pll_a",
1391 .flags = PLL_HAS_CPCON,
1392 .ops = &tegra_pll_ops,
1393 .reg = 0xb0,
Colin Crossd8611962010-01-28 16:40:29 -08001394 .parent = &tegra_pll_p_out1,
Colin Cross71fc84c2010-06-07 20:49:46 -07001395 .max_rate = 56448000,
Colin Crossf1519612011-02-12 16:05:31 -08001396 .u.pll = {
1397 .input_min = 2000000,
1398 .input_max = 31000000,
1399 .cf_min = 1000000,
1400 .cf_max = 6000000,
1401 .vco_min = 20000000,
1402 .vco_max = 1400000000,
1403 .freq_table = tegra_pll_a_freq_table,
1404 .lock_delay = 300,
1405 },
Colin Crossd8611962010-01-28 16:40:29 -08001406};
1407
1408static struct clk tegra_pll_a_out0 = {
1409 .name = "pll_a_out0",
1410 .ops = &tegra_pll_div_ops,
1411 .flags = DIV_U71,
1412 .parent = &tegra_pll_a,
1413 .reg = 0xb4,
1414 .reg_shift = 0,
Colin Cross71fc84c2010-06-07 20:49:46 -07001415 .max_rate = 56448000,
Colin Crossd8611962010-01-28 16:40:29 -08001416};
1417
Colin Crossf1519612011-02-12 16:05:31 -08001418static struct clk_pll_freq_table tegra_pll_d_freq_table[] = {
Colin Crosscea62c82010-10-04 11:49:26 -07001419 { 12000000, 216000000, 216, 12, 1, 4},
1420 { 13000000, 216000000, 216, 13, 1, 4},
1421 { 19200000, 216000000, 135, 12, 1, 3},
1422 { 26000000, 216000000, 216, 26, 1, 4},
1423
1424 { 12000000, 594000000, 594, 12, 1, 8},
1425 { 13000000, 594000000, 594, 13, 1, 8},
1426 { 19200000, 594000000, 495, 16, 1, 8},
1427 { 26000000, 594000000, 594, 26, 1, 8},
1428
Colin Crossd8611962010-01-28 16:40:29 -08001429 { 12000000, 1000000000, 1000, 12, 1, 12},
1430 { 13000000, 1000000000, 1000, 13, 1, 12},
1431 { 19200000, 1000000000, 625, 12, 1, 8},
1432 { 26000000, 1000000000, 1000, 26, 1, 12},
Colin Crosscea62c82010-10-04 11:49:26 -07001433
Colin Crossd8611962010-01-28 16:40:29 -08001434 { 0, 0, 0, 0, 0, 0 },
1435};
1436
1437static struct clk tegra_pll_d = {
1438 .name = "pll_d",
1439 .flags = PLL_HAS_CPCON | PLLD,
1440 .ops = &tegra_pll_ops,
1441 .reg = 0xd0,
Colin Crossd8611962010-01-28 16:40:29 -08001442 .parent = &tegra_clk_m,
Colin Cross71fc84c2010-06-07 20:49:46 -07001443 .max_rate = 1000000000,
Colin Crossf1519612011-02-12 16:05:31 -08001444 .u.pll = {
1445 .input_min = 2000000,
1446 .input_max = 40000000,
1447 .cf_min = 1000000,
1448 .cf_max = 6000000,
1449 .vco_min = 40000000,
1450 .vco_max = 1000000000,
1451 .freq_table = tegra_pll_d_freq_table,
1452 .lock_delay = 1000,
1453 },
Colin Crossd8611962010-01-28 16:40:29 -08001454};
1455
1456static struct clk tegra_pll_d_out0 = {
1457 .name = "pll_d_out0",
1458 .ops = &tegra_pll_div_ops,
1459 .flags = DIV_2 | PLLD,
1460 .parent = &tegra_pll_d,
Colin Cross71fc84c2010-06-07 20:49:46 -07001461 .max_rate = 500000000,
Colin Crossd8611962010-01-28 16:40:29 -08001462};
1463
Colin Crossf1519612011-02-12 16:05:31 -08001464static struct clk_pll_freq_table tegra_pll_u_freq_table[] = {
Colin Cross71fc84c2010-06-07 20:49:46 -07001465 { 12000000, 480000000, 960, 12, 2, 0},
1466 { 13000000, 480000000, 960, 13, 2, 0},
1467 { 19200000, 480000000, 200, 4, 2, 0},
1468 { 26000000, 480000000, 960, 26, 2, 0},
Colin Crossd8611962010-01-28 16:40:29 -08001469 { 0, 0, 0, 0, 0, 0 },
1470};
1471
1472static struct clk tegra_pll_u = {
1473 .name = "pll_u",
Colin Cross71fc84c2010-06-07 20:49:46 -07001474 .flags = PLLU,
Colin Crossd8611962010-01-28 16:40:29 -08001475 .ops = &tegra_pll_ops,
1476 .reg = 0xc0,
Colin Crossd8611962010-01-28 16:40:29 -08001477 .parent = &tegra_clk_m,
Colin Cross71fc84c2010-06-07 20:49:46 -07001478 .max_rate = 480000000,
Colin Crossf1519612011-02-12 16:05:31 -08001479 .u.pll = {
1480 .input_min = 2000000,
1481 .input_max = 40000000,
1482 .cf_min = 1000000,
1483 .cf_max = 6000000,
1484 .vco_min = 480000000,
1485 .vco_max = 960000000,
1486 .freq_table = tegra_pll_u_freq_table,
1487 .lock_delay = 1000,
1488 },
Colin Crossd8611962010-01-28 16:40:29 -08001489};
1490
Colin Crossf1519612011-02-12 16:05:31 -08001491static struct clk_pll_freq_table tegra_pll_x_freq_table[] = {
Colin Cross71fc84c2010-06-07 20:49:46 -07001492 /* 1 GHz */
Colin Crossd8611962010-01-28 16:40:29 -08001493 { 12000000, 1000000000, 1000, 12, 1, 12},
1494 { 13000000, 1000000000, 1000, 13, 1, 12},
1495 { 19200000, 1000000000, 625, 12, 1, 8},
1496 { 26000000, 1000000000, 1000, 26, 1, 12},
Colin Cross71fc84c2010-06-07 20:49:46 -07001497
1498 /* 912 MHz */
1499 { 12000000, 912000000, 912, 12, 1, 12},
1500 { 13000000, 912000000, 912, 13, 1, 12},
1501 { 19200000, 912000000, 760, 16, 1, 8},
1502 { 26000000, 912000000, 912, 26, 1, 12},
1503
1504 /* 816 MHz */
1505 { 12000000, 816000000, 816, 12, 1, 12},
1506 { 13000000, 816000000, 816, 13, 1, 12},
1507 { 19200000, 816000000, 680, 16, 1, 8},
1508 { 26000000, 816000000, 816, 26, 1, 12},
1509
1510 /* 760 MHz */
1511 { 12000000, 760000000, 760, 12, 1, 12},
1512 { 13000000, 760000000, 760, 13, 1, 12},
1513 { 19200000, 760000000, 950, 24, 1, 8},
1514 { 26000000, 760000000, 760, 26, 1, 12},
1515
1516 /* 608 MHz */
1517 { 12000000, 608000000, 760, 12, 1, 12},
1518 { 13000000, 608000000, 760, 13, 1, 12},
1519 { 19200000, 608000000, 380, 12, 1, 8},
1520 { 26000000, 608000000, 760, 26, 1, 12},
1521
1522 /* 456 MHz */
1523 { 12000000, 456000000, 456, 12, 1, 12},
1524 { 13000000, 456000000, 456, 13, 1, 12},
1525 { 19200000, 456000000, 380, 16, 1, 8},
1526 { 26000000, 456000000, 456, 26, 1, 12},
1527
1528 /* 312 MHz */
1529 { 12000000, 312000000, 312, 12, 1, 12},
1530 { 13000000, 312000000, 312, 13, 1, 12},
1531 { 19200000, 312000000, 260, 16, 1, 8},
1532 { 26000000, 312000000, 312, 26, 1, 12},
1533
Colin Crossd8611962010-01-28 16:40:29 -08001534 { 0, 0, 0, 0, 0, 0 },
1535};
1536
1537static struct clk tegra_pll_x = {
1538 .name = "pll_x",
1539 .flags = PLL_HAS_CPCON | PLL_ALT_MISC_REG,
Colin Cross71fc84c2010-06-07 20:49:46 -07001540 .ops = &tegra_pllx_ops,
Colin Crossd8611962010-01-28 16:40:29 -08001541 .reg = 0xe0,
Colin Crossd8611962010-01-28 16:40:29 -08001542 .parent = &tegra_clk_m,
Colin Cross71fc84c2010-06-07 20:49:46 -07001543 .max_rate = 1000000000,
Colin Crossf1519612011-02-12 16:05:31 -08001544 .u.pll = {
1545 .input_min = 2000000,
1546 .input_max = 31000000,
1547 .cf_min = 1000000,
1548 .cf_max = 6000000,
1549 .vco_min = 20000000,
1550 .vco_max = 1200000000,
1551 .freq_table = tegra_pll_x_freq_table,
1552 .lock_delay = 300,
1553 },
Colin Crossd8611962010-01-28 16:40:29 -08001554};
1555
Colin Crossf1519612011-02-12 16:05:31 -08001556static struct clk_pll_freq_table tegra_pll_e_freq_table[] = {
Mike Rapoport8d685bc2010-09-27 11:26:32 +02001557 { 12000000, 100000000, 200, 24, 1, 0 },
1558 { 0, 0, 0, 0, 0, 0 },
1559};
1560
1561static struct clk tegra_pll_e = {
1562 .name = "pll_e",
1563 .flags = PLL_ALT_MISC_REG,
1564 .ops = &tegra_plle_ops,
Mike Rapoport8d685bc2010-09-27 11:26:32 +02001565 .parent = &tegra_clk_m,
1566 .reg = 0xe8,
Colin Crossf1519612011-02-12 16:05:31 -08001567 .max_rate = 100000000,
1568 .u.pll = {
1569 .input_min = 12000000,
1570 .input_max = 12000000,
1571 .freq_table = tegra_pll_e_freq_table,
1572 },
Mike Rapoport8d685bc2010-09-27 11:26:32 +02001573};
1574
Colin Crossd8611962010-01-28 16:40:29 -08001575static struct clk tegra_clk_d = {
1576 .name = "clk_d",
1577 .flags = PERIPH_NO_RESET,
1578 .ops = &tegra_clk_double_ops,
Colin Crossd8611962010-01-28 16:40:29 -08001579 .reg = 0x34,
1580 .reg_shift = 12,
1581 .parent = &tegra_clk_m,
Colin Cross71fc84c2010-06-07 20:49:46 -07001582 .max_rate = 52000000,
Colin Crossf1519612011-02-12 16:05:31 -08001583 .u.periph = {
1584 .clk_num = 90,
1585 },
Colin Crossd8611962010-01-28 16:40:29 -08001586};
1587
Colin Crosscea62c82010-10-04 11:49:26 -07001588/* dap_mclk1, belongs to the cdev1 pingroup. */
1589static struct clk tegra_dev1_clk = {
1590 .name = "clk_dev1",
1591 .ops = &tegra_cdev_clk_ops,
Colin Crosscea62c82010-10-04 11:49:26 -07001592 .rate = 26000000,
1593 .max_rate = 26000000,
Colin Crossf1519612011-02-12 16:05:31 -08001594 .u.periph = {
1595 .clk_num = 94,
1596 },
Colin Crosscea62c82010-10-04 11:49:26 -07001597};
1598
1599/* dap_mclk2, belongs to the cdev2 pingroup. */
1600static struct clk tegra_dev2_clk = {
1601 .name = "clk_dev2",
1602 .ops = &tegra_cdev_clk_ops,
Colin Crosscea62c82010-10-04 11:49:26 -07001603 .rate = 26000000,
1604 .max_rate = 26000000,
Colin Crossf1519612011-02-12 16:05:31 -08001605 .u.periph = {
1606 .clk_num = 93,
1607 },
Colin Crosscea62c82010-10-04 11:49:26 -07001608};
1609
Colin Cross71fc84c2010-06-07 20:49:46 -07001610/* initialized before peripheral clocks */
1611static struct clk_mux_sel mux_audio_sync_clk[8+1];
1612static const struct audio_sources {
1613 const char *name;
1614 int value;
1615} mux_audio_sync_clk_sources[] = {
1616 { .name = "spdif_in", .value = 0 },
1617 { .name = "i2s1", .value = 1 },
1618 { .name = "i2s2", .value = 2 },
1619 { .name = "pll_a_out0", .value = 4 },
1620#if 0 /* FIXME: not implemented */
1621 { .name = "ac97", .value = 3 },
1622 { .name = "ext_audio_clk2", .value = 5 },
1623 { .name = "ext_audio_clk1", .value = 6 },
1624 { .name = "ext_vimclk", .value = 7 },
1625#endif
1626 { 0, 0 }
1627};
1628
1629static struct clk tegra_clk_audio = {
1630 .name = "audio",
1631 .inputs = mux_audio_sync_clk,
1632 .reg = 0x38,
1633 .max_rate = 24000000,
1634 .ops = &tegra_audio_sync_clk_ops
1635};
1636
Colin Crossd8611962010-01-28 16:40:29 -08001637static struct clk tegra_clk_audio_2x = {
Colin Cross71fc84c2010-06-07 20:49:46 -07001638 .name = "audio_2x",
Colin Crossd8611962010-01-28 16:40:29 -08001639 .flags = PERIPH_NO_RESET,
Colin Cross71fc84c2010-06-07 20:49:46 -07001640 .max_rate = 48000000,
Colin Crossd8611962010-01-28 16:40:29 -08001641 .ops = &tegra_clk_double_ops,
Colin Crossd8611962010-01-28 16:40:29 -08001642 .reg = 0x34,
1643 .reg_shift = 8,
Colin Cross71fc84c2010-06-07 20:49:46 -07001644 .parent = &tegra_clk_audio,
Colin Crossf1519612011-02-12 16:05:31 -08001645 .u.periph = {
1646 .clk_num = 89,
1647 },
Colin Cross71fc84c2010-06-07 20:49:46 -07001648};
1649
1650struct clk_lookup tegra_audio_clk_lookups[] = {
1651 { .con_id = "audio", .clk = &tegra_clk_audio },
1652 { .con_id = "audio_2x", .clk = &tegra_clk_audio_2x }
1653};
1654
1655/* This is called after peripheral clocks are initialized, as the
1656 * audio_sync clock depends on some of the peripheral clocks.
1657 */
1658
1659static void init_audio_sync_clock_mux(void)
1660{
1661 int i;
1662 struct clk_mux_sel *sel = mux_audio_sync_clk;
1663 const struct audio_sources *src = mux_audio_sync_clk_sources;
1664 struct clk_lookup *lookup;
1665
1666 for (i = 0; src->name; i++, sel++, src++) {
1667 sel->input = tegra_get_clock_by_name(src->name);
1668 if (!sel->input)
1669 pr_err("%s: could not find clk %s\n", __func__,
1670 src->name);
1671 sel->value = src->value;
1672 }
1673
1674 lookup = tegra_audio_clk_lookups;
1675 for (i = 0; i < ARRAY_SIZE(tegra_audio_clk_lookups); i++, lookup++) {
1676 clk_init(lookup->clk);
1677 clkdev_add(lookup);
1678 }
Colin Crossd8611962010-01-28 16:40:29 -08001679}
Colin Crossd8611962010-01-28 16:40:29 -08001680
1681static struct clk_mux_sel mux_cclk[] = {
1682 { .input = &tegra_clk_m, .value = 0},
1683 { .input = &tegra_pll_c, .value = 1},
1684 { .input = &tegra_clk_32k, .value = 2},
1685 { .input = &tegra_pll_m, .value = 3},
1686 { .input = &tegra_pll_p, .value = 4},
1687 { .input = &tegra_pll_p_out4, .value = 5},
1688 { .input = &tegra_pll_p_out3, .value = 6},
1689 { .input = &tegra_clk_d, .value = 7},
1690 { .input = &tegra_pll_x, .value = 8},
1691 { 0, 0},
1692};
1693
1694static struct clk_mux_sel mux_sclk[] = {
1695 { .input = &tegra_clk_m, .value = 0},
1696 { .input = &tegra_pll_c_out1, .value = 1},
1697 { .input = &tegra_pll_p_out4, .value = 2},
1698 { .input = &tegra_pll_p_out3, .value = 3},
1699 { .input = &tegra_pll_p_out2, .value = 4},
1700 { .input = &tegra_clk_d, .value = 5},
1701 { .input = &tegra_clk_32k, .value = 6},
1702 { .input = &tegra_pll_m_out1, .value = 7},
1703 { 0, 0},
1704};
1705
Colin Cross71fc84c2010-06-07 20:49:46 -07001706static struct clk tegra_clk_cclk = {
1707 .name = "cclk",
Colin Crossd8611962010-01-28 16:40:29 -08001708 .inputs = mux_cclk,
1709 .reg = 0x20,
1710 .ops = &tegra_super_ops,
Colin Cross71fc84c2010-06-07 20:49:46 -07001711 .max_rate = 1000000000,
Colin Crossd8611962010-01-28 16:40:29 -08001712};
1713
Colin Cross71fc84c2010-06-07 20:49:46 -07001714static struct clk tegra_clk_sclk = {
1715 .name = "sclk",
Colin Crossd8611962010-01-28 16:40:29 -08001716 .inputs = mux_sclk,
1717 .reg = 0x28,
1718 .ops = &tegra_super_ops,
Colin Cross71fc84c2010-06-07 20:49:46 -07001719 .max_rate = 600000000,
1720};
1721
1722static struct clk tegra_clk_virtual_cpu = {
1723 .name = "cpu",
1724 .parent = &tegra_clk_cclk,
Colin Cross71fc84c2010-06-07 20:49:46 -07001725 .ops = &tegra_cpu_ops,
1726 .max_rate = 1000000000,
Colin Crossf1519612011-02-12 16:05:31 -08001727 .u.cpu = {
1728 .main = &tegra_pll_x,
1729 .backup = &tegra_pll_p,
1730 },
Colin Crossd8611962010-01-28 16:40:29 -08001731};
1732
1733static struct clk tegra_clk_hclk = {
1734 .name = "hclk",
1735 .flags = DIV_BUS,
Colin Cross71fc84c2010-06-07 20:49:46 -07001736 .parent = &tegra_clk_sclk,
Colin Crossd8611962010-01-28 16:40:29 -08001737 .reg = 0x30,
1738 .reg_shift = 4,
1739 .ops = &tegra_bus_ops,
Colin Cross71fc84c2010-06-07 20:49:46 -07001740 .max_rate = 240000000,
Colin Crossd8611962010-01-28 16:40:29 -08001741};
1742
1743static struct clk tegra_clk_pclk = {
1744 .name = "pclk",
1745 .flags = DIV_BUS,
1746 .parent = &tegra_clk_hclk,
1747 .reg = 0x30,
1748 .reg_shift = 0,
1749 .ops = &tegra_bus_ops,
Colin Cross71fc84c2010-06-07 20:49:46 -07001750 .max_rate = 108000000,
Colin Crossd8611962010-01-28 16:40:29 -08001751};
1752
Colin Crosscea62c82010-10-04 11:49:26 -07001753static struct clk tegra_clk_blink = {
1754 .name = "blink",
1755 .parent = &tegra_clk_32k,
1756 .reg = 0x40,
1757 .ops = &tegra_blink_clk_ops,
1758 .max_rate = 32768,
1759};
1760
Colin Crossd8611962010-01-28 16:40:29 -08001761static struct clk_mux_sel mux_pllm_pllc_pllp_plla[] = {
1762 { .input = &tegra_pll_m, .value = 0},
1763 { .input = &tegra_pll_c, .value = 1},
1764 { .input = &tegra_pll_p, .value = 2},
1765 { .input = &tegra_pll_a_out0, .value = 3},
1766 { 0, 0},
1767};
1768
1769static struct clk_mux_sel mux_pllm_pllc_pllp_clkm[] = {
1770 { .input = &tegra_pll_m, .value = 0},
1771 { .input = &tegra_pll_c, .value = 1},
1772 { .input = &tegra_pll_p, .value = 2},
1773 { .input = &tegra_clk_m, .value = 3},
1774 { 0, 0},
1775};
1776
1777static struct clk_mux_sel mux_pllp_pllc_pllm_clkm[] = {
1778 { .input = &tegra_pll_p, .value = 0},
1779 { .input = &tegra_pll_c, .value = 1},
1780 { .input = &tegra_pll_m, .value = 2},
1781 { .input = &tegra_clk_m, .value = 3},
1782 { 0, 0},
1783};
1784
Colin Cross71fc84c2010-06-07 20:49:46 -07001785static struct clk_mux_sel mux_pllaout0_audio2x_pllp_clkm[] = {
1786 {.input = &tegra_pll_a_out0, .value = 0},
1787 {.input = &tegra_clk_audio_2x, .value = 1},
Colin Crossd8611962010-01-28 16:40:29 -08001788 {.input = &tegra_pll_p, .value = 2},
1789 {.input = &tegra_clk_m, .value = 3},
1790 { 0, 0},
1791};
1792
1793static struct clk_mux_sel mux_pllp_plld_pllc_clkm[] = {
1794 {.input = &tegra_pll_p, .value = 0},
1795 {.input = &tegra_pll_d_out0, .value = 1},
1796 {.input = &tegra_pll_c, .value = 2},
1797 {.input = &tegra_clk_m, .value = 3},
1798 { 0, 0},
1799};
1800
1801static struct clk_mux_sel mux_pllp_pllc_audio_clkm_clk32[] = {
1802 {.input = &tegra_pll_p, .value = 0},
1803 {.input = &tegra_pll_c, .value = 1},
Colin Cross71fc84c2010-06-07 20:49:46 -07001804 {.input = &tegra_clk_audio, .value = 2},
Colin Crossd8611962010-01-28 16:40:29 -08001805 {.input = &tegra_clk_m, .value = 3},
1806 {.input = &tegra_clk_32k, .value = 4},
1807 { 0, 0},
1808};
1809
1810static struct clk_mux_sel mux_pllp_pllc_pllm[] = {
1811 {.input = &tegra_pll_p, .value = 0},
1812 {.input = &tegra_pll_c, .value = 1},
1813 {.input = &tegra_pll_m, .value = 2},
1814 { 0, 0},
1815};
1816
1817static struct clk_mux_sel mux_clk_m[] = {
1818 { .input = &tegra_clk_m, .value = 0},
1819 { 0, 0},
1820};
1821
1822static struct clk_mux_sel mux_pllp_out3[] = {
1823 { .input = &tegra_pll_p_out3, .value = 0},
1824 { 0, 0},
1825};
1826
1827static struct clk_mux_sel mux_plld[] = {
1828 { .input = &tegra_pll_d, .value = 0},
1829 { 0, 0},
1830};
1831
1832static struct clk_mux_sel mux_clk_32k[] = {
1833 { .input = &tegra_clk_32k, .value = 0},
1834 { 0, 0},
1835};
1836
Stephen Warren1ca00342011-01-05 14:32:20 -07001837static struct clk_mux_sel mux_pclk[] = {
1838 { .input = &tegra_clk_pclk, .value = 0},
1839 { 0, 0},
1840};
1841
Colin Cross71fc84c2010-06-07 20:49:46 -07001842#define PERIPH_CLK(_name, _dev, _con, _clk_num, _reg, _max, _inputs, _flags) \
Colin Crossd8611962010-01-28 16:40:29 -08001843 { \
1844 .name = _name, \
1845 .lookup = { \
1846 .dev_id = _dev, \
1847 .con_id = _con, \
1848 }, \
1849 .ops = &tegra_periph_clk_ops, \
Colin Crossd8611962010-01-28 16:40:29 -08001850 .reg = _reg, \
1851 .inputs = _inputs, \
1852 .flags = _flags, \
Colin Cross71fc84c2010-06-07 20:49:46 -07001853 .max_rate = _max, \
Colin Crossf1519612011-02-12 16:05:31 -08001854 .u.periph = { \
1855 .clk_num = _clk_num, \
1856 }, \
Colin Crossd8611962010-01-28 16:40:29 -08001857 }
1858
Colin Cross3ec349f2011-02-12 15:52:56 -08001859struct clk tegra_list_clks[] = {
Stephen Warren1ca00342011-01-05 14:32:20 -07001860 PERIPH_CLK("apbdma", "tegra-dma", NULL, 34, 0, 108000000, mux_pclk, 0),
Colin Cross71fc84c2010-06-07 20:49:46 -07001861 PERIPH_CLK("rtc", "rtc-tegra", NULL, 4, 0, 32768, mux_clk_32k, PERIPH_NO_RESET),
1862 PERIPH_CLK("timer", "timer", NULL, 5, 0, 26000000, mux_clk_m, 0),
1863 PERIPH_CLK("i2s1", "i2s.0", NULL, 11, 0x100, 26000000, mux_pllaout0_audio2x_pllp_clkm, MUX | DIV_U71),
1864 PERIPH_CLK("i2s2", "i2s.1", NULL, 18, 0x104, 26000000, mux_pllaout0_audio2x_pllp_clkm, MUX | DIV_U71),
Colin Crossd8611962010-01-28 16:40:29 -08001865 /* FIXME: spdif has 2 clocks but 1 enable */
Colin Cross71fc84c2010-06-07 20:49:46 -07001866 PERIPH_CLK("spdif_out", "spdif_out", NULL, 10, 0x108, 100000000, mux_pllaout0_audio2x_pllp_clkm, MUX | DIV_U71),
1867 PERIPH_CLK("spdif_in", "spdif_in", NULL, 10, 0x10c, 100000000, mux_pllp_pllc_pllm, MUX | DIV_U71),
1868 PERIPH_CLK("pwm", "pwm", NULL, 17, 0x110, 432000000, mux_pllp_pllc_audio_clkm_clk32, MUX | DIV_U71),
1869 PERIPH_CLK("spi", "spi", NULL, 43, 0x114, 40000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1870 PERIPH_CLK("xio", "xio", NULL, 45, 0x120, 150000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1871 PERIPH_CLK("twc", "twc", NULL, 16, 0x12c, 150000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1872 PERIPH_CLK("sbc1", "spi_tegra.0", NULL, 41, 0x134, 160000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1873 PERIPH_CLK("sbc2", "spi_tegra.1", NULL, 44, 0x118, 160000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1874 PERIPH_CLK("sbc3", "spi_tegra.2", NULL, 46, 0x11c, 160000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1875 PERIPH_CLK("sbc4", "spi_tegra.3", NULL, 68, 0x1b4, 160000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1876 PERIPH_CLK("ide", "ide", NULL, 25, 0x144, 100000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71), /* requires min voltage */
1877 PERIPH_CLK("ndflash", "tegra_nand", NULL, 13, 0x160, 164000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71), /* scales with voltage */
Colin Crossd8611962010-01-28 16:40:29 -08001878 /* FIXME: vfir shares an enable with uartb */
Colin Cross71fc84c2010-06-07 20:49:46 -07001879 PERIPH_CLK("vfir", "vfir", NULL, 7, 0x168, 72000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1880 PERIPH_CLK("sdmmc1", "sdhci-tegra.0", NULL, 14, 0x150, 52000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71), /* scales with voltage */
1881 PERIPH_CLK("sdmmc2", "sdhci-tegra.1", NULL, 9, 0x154, 52000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71), /* scales with voltage */
1882 PERIPH_CLK("sdmmc3", "sdhci-tegra.2", NULL, 69, 0x1bc, 52000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71), /* scales with voltage */
Colin Crosscea62c82010-10-04 11:49:26 -07001883 PERIPH_CLK("sdmmc4", "sdhci-tegra.3", NULL, 15, 0x164, 52000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71), /* scales with voltage */
Colin Cross71fc84c2010-06-07 20:49:46 -07001884 PERIPH_CLK("vde", "vde", NULL, 61, 0x1c8, 250000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71), /* scales with voltage and process_id */
1885 PERIPH_CLK("csite", "csite", NULL, 73, 0x1d4, 144000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71), /* max rate ??? */
Colin Crossd8611962010-01-28 16:40:29 -08001886 /* FIXME: what is la? */
Colin Cross71fc84c2010-06-07 20:49:46 -07001887 PERIPH_CLK("la", "la", NULL, 76, 0x1f8, 26000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1888 PERIPH_CLK("owr", "tegra_w1", NULL, 71, 0x1cc, 26000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1889 PERIPH_CLK("nor", "nor", NULL, 42, 0x1d0, 92000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71), /* requires min voltage */
1890 PERIPH_CLK("mipi", "mipi", NULL, 50, 0x174, 60000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71), /* scales with voltage */
1891 PERIPH_CLK("i2c1", "tegra-i2c.0", NULL, 12, 0x124, 26000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U16),
1892 PERIPH_CLK("i2c2", "tegra-i2c.1", NULL, 54, 0x198, 26000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U16),
1893 PERIPH_CLK("i2c3", "tegra-i2c.2", NULL, 67, 0x1b8, 26000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U16),
1894 PERIPH_CLK("dvc", "tegra-i2c.3", NULL, 47, 0x128, 26000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U16),
1895 PERIPH_CLK("i2c1_i2c", "tegra-i2c.0", "i2c", 0, 0, 72000000, mux_pllp_out3, 0),
1896 PERIPH_CLK("i2c2_i2c", "tegra-i2c.1", "i2c", 0, 0, 72000000, mux_pllp_out3, 0),
1897 PERIPH_CLK("i2c3_i2c", "tegra-i2c.2", "i2c", 0, 0, 72000000, mux_pllp_out3, 0),
1898 PERIPH_CLK("dvc_i2c", "tegra-i2c.3", "i2c", 0, 0, 72000000, mux_pllp_out3, 0),
Colin Crosscea62c82010-10-04 11:49:26 -07001899 PERIPH_CLK("uarta", "uart.0", NULL, 6, 0x178, 600000000, mux_pllp_pllc_pllm_clkm, MUX),
1900 PERIPH_CLK("uartb", "uart.1", NULL, 7, 0x17c, 600000000, mux_pllp_pllc_pllm_clkm, MUX),
1901 PERIPH_CLK("uartc", "uart.2", NULL, 55, 0x1a0, 600000000, mux_pllp_pllc_pllm_clkm, MUX),
1902 PERIPH_CLK("uartd", "uart.3", NULL, 65, 0x1c0, 600000000, mux_pllp_pllc_pllm_clkm, MUX),
1903 PERIPH_CLK("uarte", "uart.4", NULL, 66, 0x1c4, 600000000, mux_pllp_pllc_pllm_clkm, MUX),
Colin Cross71fc84c2010-06-07 20:49:46 -07001904 PERIPH_CLK("3d", "3d", NULL, 24, 0x158, 300000000, mux_pllm_pllc_pllp_plla, MUX | DIV_U71 | PERIPH_MANUAL_RESET), /* scales with voltage and process_id */
1905 PERIPH_CLK("2d", "2d", NULL, 21, 0x15c, 300000000, mux_pllm_pllc_pllp_plla, MUX | DIV_U71), /* scales with voltage and process_id */
Colin Crossd8611962010-01-28 16:40:29 -08001906 /* FIXME: vi and vi_sensor share an enable */
Colin Crosscea62c82010-10-04 11:49:26 -07001907 PERIPH_CLK("vi", "tegra_camera", "vi", 20, 0x148, 150000000, mux_pllm_pllc_pllp_plla, MUX | DIV_U71), /* scales with voltage and process_id */
1908 PERIPH_CLK("vi_sensor", "tegra_camera", "vi_sensor", 20, 0x1a8, 150000000, mux_pllm_pllc_pllp_plla, MUX | DIV_U71 | PERIPH_NO_RESET), /* scales with voltage and process_id */
Colin Cross71fc84c2010-06-07 20:49:46 -07001909 PERIPH_CLK("epp", "epp", NULL, 19, 0x16c, 300000000, mux_pllm_pllc_pllp_plla, MUX | DIV_U71), /* scales with voltage and process_id */
1910 PERIPH_CLK("mpe", "mpe", NULL, 60, 0x170, 250000000, mux_pllm_pllc_pllp_plla, MUX | DIV_U71), /* scales with voltage and process_id */
1911 PERIPH_CLK("host1x", "host1x", NULL, 28, 0x180, 166000000, mux_pllm_pllc_pllp_plla, MUX | DIV_U71), /* scales with voltage and process_id */
Colin Crossd8611962010-01-28 16:40:29 -08001912 /* FIXME: cve and tvo share an enable */
Colin Cross71fc84c2010-06-07 20:49:46 -07001913 PERIPH_CLK("cve", "cve", NULL, 49, 0x140, 250000000, mux_pllp_plld_pllc_clkm, MUX | DIV_U71), /* requires min voltage */
1914 PERIPH_CLK("tvo", "tvo", NULL, 49, 0x188, 250000000, mux_pllp_plld_pllc_clkm, MUX | DIV_U71), /* requires min voltage */
Colin Crosscea62c82010-10-04 11:49:26 -07001915 PERIPH_CLK("hdmi", "hdmi", NULL, 51, 0x18c, 600000000, mux_pllp_plld_pllc_clkm, MUX | DIV_U71), /* requires min voltage */
Colin Cross71fc84c2010-06-07 20:49:46 -07001916 PERIPH_CLK("tvdac", "tvdac", NULL, 53, 0x194, 250000000, mux_pllp_plld_pllc_clkm, MUX | DIV_U71), /* requires min voltage */
Colin Crosscea62c82010-10-04 11:49:26 -07001917 PERIPH_CLK("disp1", "tegradc.0", NULL, 27, 0x138, 600000000, mux_pllp_plld_pllc_clkm, MUX | DIV_U71), /* scales with voltage and process_id */
1918 PERIPH_CLK("disp2", "tegradc.1", NULL, 26, 0x13c, 600000000, mux_pllp_plld_pllc_clkm, MUX | DIV_U71), /* scales with voltage and process_id */
Colin Cross71fc84c2010-06-07 20:49:46 -07001919 PERIPH_CLK("usbd", "fsl-tegra-udc", NULL, 22, 0, 480000000, mux_clk_m, 0), /* requires min voltage */
1920 PERIPH_CLK("usb2", "tegra-ehci.1", NULL, 58, 0, 480000000, mux_clk_m, 0), /* requires min voltage */
1921 PERIPH_CLK("usb3", "tegra-ehci.2", NULL, 59, 0, 480000000, mux_clk_m, 0), /* requires min voltage */
1922 PERIPH_CLK("emc", "emc", NULL, 57, 0x19c, 800000000, mux_pllm_pllc_pllp_clkm, MUX | DIV_U71 | PERIPH_EMC_ENB),
1923 PERIPH_CLK("dsi", "dsi", NULL, 48, 0, 500000000, mux_plld, 0), /* scales with voltage */
Colin Crosscea62c82010-10-04 11:49:26 -07001924 PERIPH_CLK("csi", "tegra_camera", "csi", 52, 0, 72000000, mux_pllp_out3, 0),
1925 PERIPH_CLK("isp", "tegra_camera", "isp", 23, 0, 150000000, mux_clk_m, 0), /* same frequency as VI */
1926 PERIPH_CLK("csus", "tegra_camera", "csus", 92, 0, 150000000, mux_clk_m, PERIPH_NO_RESET),
Mike Rapoport8d685bc2010-09-27 11:26:32 +02001927 PERIPH_CLK("pex", NULL, "pex", 70, 0, 26000000, mux_clk_m, PERIPH_MANUAL_RESET),
1928 PERIPH_CLK("afi", NULL, "afi", 72, 0, 26000000, mux_clk_m, PERIPH_MANUAL_RESET),
1929 PERIPH_CLK("pcie_xclk", NULL, "pcie_xclk", 74, 0, 26000000, mux_clk_m, PERIPH_MANUAL_RESET),
Colin Crossd8611962010-01-28 16:40:29 -08001930};
1931
1932#define CLK_DUPLICATE(_name, _dev, _con) \
1933 { \
1934 .name = _name, \
1935 .lookup = { \
1936 .dev_id = _dev, \
1937 .con_id = _con, \
1938 }, \
1939 }
1940
1941/* Some clocks may be used by different drivers depending on the board
1942 * configuration. List those here to register them twice in the clock lookup
1943 * table under two names.
1944 */
1945struct clk_duplicate tegra_clk_duplicates[] = {
1946 CLK_DUPLICATE("uarta", "tegra_uart.0", NULL),
1947 CLK_DUPLICATE("uartb", "tegra_uart.1", NULL),
1948 CLK_DUPLICATE("uartc", "tegra_uart.2", NULL),
1949 CLK_DUPLICATE("uartd", "tegra_uart.3", NULL),
1950 CLK_DUPLICATE("uarte", "tegra_uart.4", NULL),
Colin Crosscea62c82010-10-04 11:49:26 -07001951 CLK_DUPLICATE("usbd", "utmip-pad", NULL),
Colin Cross71fc84c2010-06-07 20:49:46 -07001952 CLK_DUPLICATE("usbd", "tegra-ehci.0", NULL),
Colin Crosscea62c82010-10-04 11:49:26 -07001953 CLK_DUPLICATE("usbd", "tegra-otg", NULL),
1954 CLK_DUPLICATE("hdmi", "tegradc.0", "hdmi"),
1955 CLK_DUPLICATE("hdmi", "tegradc.1", "hdmi"),
1956 CLK_DUPLICATE("pwm", "tegra_pwm.0", NULL),
1957 CLK_DUPLICATE("pwm", "tegra_pwm.1", NULL),
1958 CLK_DUPLICATE("pwm", "tegra_pwm.2", NULL),
1959 CLK_DUPLICATE("pwm", "tegra_pwm.3", NULL),
Colin Crossd8611962010-01-28 16:40:29 -08001960};
1961
1962#define CLK(dev, con, ck) \
1963 { \
1964 .dev_id = dev, \
1965 .con_id = con, \
1966 .clk = ck, \
1967 }
1968
Colin Cross3ec349f2011-02-12 15:52:56 -08001969struct clk *tegra_ptr_clks[] = {
1970 &tegra_clk_32k,
1971 &tegra_pll_s,
1972 &tegra_clk_m,
1973 &tegra_pll_m,
1974 &tegra_pll_m_out1,
1975 &tegra_pll_c,
1976 &tegra_pll_c_out1,
1977 &tegra_pll_p,
1978 &tegra_pll_p_out1,
1979 &tegra_pll_p_out2,
1980 &tegra_pll_p_out3,
1981 &tegra_pll_p_out4,
1982 &tegra_pll_a,
1983 &tegra_pll_a_out0,
1984 &tegra_pll_d,
1985 &tegra_pll_d_out0,
1986 &tegra_pll_u,
1987 &tegra_pll_x,
1988 &tegra_pll_e,
1989 &tegra_clk_cclk,
1990 &tegra_clk_sclk,
1991 &tegra_clk_hclk,
1992 &tegra_clk_pclk,
1993 &tegra_clk_d,
1994 &tegra_dev1_clk,
1995 &tegra_dev2_clk,
1996 &tegra_clk_virtual_cpu,
1997 &tegra_clk_blink,
Colin Crossd8611962010-01-28 16:40:29 -08001998};
1999
Colin Cross3ec349f2011-02-12 15:52:56 -08002000static void tegra2_init_one_clock(struct clk *c)
2001{
2002 clk_init(c);
2003 if (!c->lookup.dev_id && !c->lookup.con_id)
2004 c->lookup.con_id = c->name;
2005 c->lookup.clk = c;
2006 clkdev_add(&c->lookup);
2007}
2008
Colin Crossd8611962010-01-28 16:40:29 -08002009void __init tegra2_init_clocks(void)
2010{
2011 int i;
Colin Crossd8611962010-01-28 16:40:29 -08002012 struct clk *c;
Colin Crossd8611962010-01-28 16:40:29 -08002013
Colin Cross3ec349f2011-02-12 15:52:56 -08002014 for (i = 0; i < ARRAY_SIZE(tegra_ptr_clks); i++)
2015 tegra2_init_one_clock(tegra_ptr_clks[i]);
Colin Crossd8611962010-01-28 16:40:29 -08002016
Colin Cross3ec349f2011-02-12 15:52:56 -08002017 for (i = 0; i < ARRAY_SIZE(tegra_list_clks); i++)
2018 tegra2_init_one_clock(&tegra_list_clks[i]);
Colin Crossd8611962010-01-28 16:40:29 -08002019
2020 for (i = 0; i < ARRAY_SIZE(tegra_clk_duplicates); i++) {
Colin Cross3ec349f2011-02-12 15:52:56 -08002021 c = tegra_get_clock_by_name(tegra_clk_duplicates[i].name);
2022 if (!c) {
Colin Crossd8611962010-01-28 16:40:29 -08002023 pr_err("%s: Unknown duplicate clock %s\n", __func__,
Colin Cross3ec349f2011-02-12 15:52:56 -08002024 tegra_clk_duplicates[i].name);
2025 continue;
Colin Crossd8611962010-01-28 16:40:29 -08002026 }
Colin Cross3ec349f2011-02-12 15:52:56 -08002027
2028 tegra_clk_duplicates[i].lookup.clk = c;
2029 clkdev_add(&tegra_clk_duplicates[i].lookup);
Colin Crossd8611962010-01-28 16:40:29 -08002030 }
Colin Cross71fc84c2010-06-07 20:49:46 -07002031
2032 init_audio_sync_clock_mux();
Colin Crossd8611962010-01-28 16:40:29 -08002033}
Colin Cross71fc84c2010-06-07 20:49:46 -07002034
2035#ifdef CONFIG_PM
2036static u32 clk_rst_suspend[RST_DEVICES_NUM + CLK_OUT_ENB_NUM +
Colin Crosscea62c82010-10-04 11:49:26 -07002037 PERIPH_CLK_SOURCE_NUM + 19];
Colin Cross71fc84c2010-06-07 20:49:46 -07002038
2039void tegra_clk_suspend(void)
2040{
2041 unsigned long off, i;
2042 u32 *ctx = clk_rst_suspend;
2043
2044 *ctx++ = clk_readl(OSC_CTRL) & OSC_CTRL_MASK;
Colin Crosscea62c82010-10-04 11:49:26 -07002045 *ctx++ = clk_readl(tegra_pll_p.reg + PLL_BASE);
2046 *ctx++ = clk_readl(tegra_pll_p.reg + PLL_MISC(&tegra_pll_p));
2047 *ctx++ = clk_readl(tegra_pll_c.reg + PLL_BASE);
2048 *ctx++ = clk_readl(tegra_pll_c.reg + PLL_MISC(&tegra_pll_c));
2049 *ctx++ = clk_readl(tegra_pll_a.reg + PLL_BASE);
2050 *ctx++ = clk_readl(tegra_pll_a.reg + PLL_MISC(&tegra_pll_a));
2051
2052 *ctx++ = clk_readl(tegra_pll_m_out1.reg);
2053 *ctx++ = clk_readl(tegra_pll_p_out1.reg);
2054 *ctx++ = clk_readl(tegra_pll_p_out3.reg);
2055 *ctx++ = clk_readl(tegra_pll_a_out0.reg);
2056 *ctx++ = clk_readl(tegra_pll_c_out1.reg);
2057
2058 *ctx++ = clk_readl(tegra_clk_cclk.reg);
2059 *ctx++ = clk_readl(tegra_clk_cclk.reg + SUPER_CLK_DIVIDER);
2060
2061 *ctx++ = clk_readl(tegra_clk_sclk.reg);
2062 *ctx++ = clk_readl(tegra_clk_sclk.reg + SUPER_CLK_DIVIDER);
2063 *ctx++ = clk_readl(tegra_clk_pclk.reg);
Colin Cross71fc84c2010-06-07 20:49:46 -07002064
2065 for (off = PERIPH_CLK_SOURCE_I2S1; off <= PERIPH_CLK_SOURCE_OSC;
2066 off += 4) {
2067 if (off == PERIPH_CLK_SOURCE_EMC)
2068 continue;
2069 *ctx++ = clk_readl(off);
2070 }
2071
2072 off = RST_DEVICES;
2073 for (i = 0; i < RST_DEVICES_NUM; i++, off += 4)
2074 *ctx++ = clk_readl(off);
2075
2076 off = CLK_OUT_ENB;
2077 for (i = 0; i < CLK_OUT_ENB_NUM; i++, off += 4)
2078 *ctx++ = clk_readl(off);
2079
2080 *ctx++ = clk_readl(MISC_CLK_ENB);
2081 *ctx++ = clk_readl(CLK_MASK_ARM);
2082}
2083
2084void tegra_clk_resume(void)
2085{
2086 unsigned long off, i;
2087 const u32 *ctx = clk_rst_suspend;
2088 u32 val;
2089
2090 val = clk_readl(OSC_CTRL) & ~OSC_CTRL_MASK;
2091 val |= *ctx++;
2092 clk_writel(val, OSC_CTRL);
2093
Colin Crosscea62c82010-10-04 11:49:26 -07002094 clk_writel(*ctx++, tegra_pll_p.reg + PLL_BASE);
2095 clk_writel(*ctx++, tegra_pll_p.reg + PLL_MISC(&tegra_pll_p));
2096 clk_writel(*ctx++, tegra_pll_c.reg + PLL_BASE);
2097 clk_writel(*ctx++, tegra_pll_c.reg + PLL_MISC(&tegra_pll_c));
2098 clk_writel(*ctx++, tegra_pll_a.reg + PLL_BASE);
2099 clk_writel(*ctx++, tegra_pll_a.reg + PLL_MISC(&tegra_pll_a));
2100 udelay(300);
2101
2102 clk_writel(*ctx++, tegra_pll_m_out1.reg);
2103 clk_writel(*ctx++, tegra_pll_p_out1.reg);
2104 clk_writel(*ctx++, tegra_pll_p_out3.reg);
2105 clk_writel(*ctx++, tegra_pll_a_out0.reg);
2106 clk_writel(*ctx++, tegra_pll_c_out1.reg);
2107
2108 clk_writel(*ctx++, tegra_clk_cclk.reg);
2109 clk_writel(*ctx++, tegra_clk_cclk.reg + SUPER_CLK_DIVIDER);
2110
2111 clk_writel(*ctx++, tegra_clk_sclk.reg);
2112 clk_writel(*ctx++, tegra_clk_sclk.reg + SUPER_CLK_DIVIDER);
2113 clk_writel(*ctx++, tegra_clk_pclk.reg);
2114
Colin Cross71fc84c2010-06-07 20:49:46 -07002115 /* enable all clocks before configuring clock sources */
2116 clk_writel(0xbffffff9ul, CLK_OUT_ENB);
2117 clk_writel(0xfefffff7ul, CLK_OUT_ENB + 4);
2118 clk_writel(0x77f01bfful, CLK_OUT_ENB + 8);
2119 wmb();
2120
2121 for (off = PERIPH_CLK_SOURCE_I2S1; off <= PERIPH_CLK_SOURCE_OSC;
2122 off += 4) {
2123 if (off == PERIPH_CLK_SOURCE_EMC)
2124 continue;
2125 clk_writel(*ctx++, off);
2126 }
2127 wmb();
2128
2129 off = RST_DEVICES;
2130 for (i = 0; i < RST_DEVICES_NUM; i++, off += 4)
2131 clk_writel(*ctx++, off);
2132 wmb();
2133
2134 off = CLK_OUT_ENB;
2135 for (i = 0; i < CLK_OUT_ENB_NUM; i++, off += 4)
2136 clk_writel(*ctx++, off);
2137 wmb();
2138
2139 clk_writel(*ctx++, MISC_CLK_ENB);
2140 clk_writel(*ctx++, CLK_MASK_ARM);
2141}
2142#endif