blob: eb4e9ca5c6aeda7f7aa33fda35ed2af1e648848f [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>
26#include <linux/hrtimer.h>
Jean-Christop PLAGNIOL-VILLARD6d803ba2010-11-17 10:04:33 +010027#include <linux/clkdev.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"
34#include "tegra2_dvfs.h"
Colin Crossd8611962010-01-28 16:40:29 -080035
36#define RST_DEVICES 0x004
37#define RST_DEVICES_SET 0x300
38#define RST_DEVICES_CLR 0x304
Colin Cross71fc84c2010-06-07 20:49:46 -070039#define RST_DEVICES_NUM 3
Colin Crossd8611962010-01-28 16:40:29 -080040
41#define CLK_OUT_ENB 0x010
42#define CLK_OUT_ENB_SET 0x320
43#define CLK_OUT_ENB_CLR 0x324
Colin Cross71fc84c2010-06-07 20:49:46 -070044#define CLK_OUT_ENB_NUM 3
45
46#define CLK_MASK_ARM 0x44
47#define MISC_CLK_ENB 0x48
Colin Crossd8611962010-01-28 16:40:29 -080048
49#define OSC_CTRL 0x50
50#define OSC_CTRL_OSC_FREQ_MASK (3<<30)
51#define OSC_CTRL_OSC_FREQ_13MHZ (0<<30)
52#define OSC_CTRL_OSC_FREQ_19_2MHZ (1<<30)
53#define OSC_CTRL_OSC_FREQ_12MHZ (2<<30)
54#define OSC_CTRL_OSC_FREQ_26MHZ (3<<30)
Colin Crosscea62c82010-10-04 11:49:26 -070055#define OSC_CTRL_MASK (0x3f2 | OSC_CTRL_OSC_FREQ_MASK)
Colin Crossd8611962010-01-28 16:40:29 -080056
57#define OSC_FREQ_DET 0x58
58#define OSC_FREQ_DET_TRIG (1<<31)
59
60#define OSC_FREQ_DET_STATUS 0x5C
61#define OSC_FREQ_DET_BUSY (1<<31)
62#define OSC_FREQ_DET_CNT_MASK 0xFFFF
63
Colin Cross71fc84c2010-06-07 20:49:46 -070064#define PERIPH_CLK_SOURCE_I2S1 0x100
65#define PERIPH_CLK_SOURCE_EMC 0x19c
66#define PERIPH_CLK_SOURCE_OSC 0x1fc
67#define PERIPH_CLK_SOURCE_NUM \
68 ((PERIPH_CLK_SOURCE_OSC - PERIPH_CLK_SOURCE_I2S1) / 4)
69
Colin Crossd8611962010-01-28 16:40:29 -080070#define PERIPH_CLK_SOURCE_MASK (3<<30)
71#define PERIPH_CLK_SOURCE_SHIFT 30
72#define PERIPH_CLK_SOURCE_ENABLE (1<<28)
Colin Cross71fc84c2010-06-07 20:49:46 -070073#define PERIPH_CLK_SOURCE_DIVU71_MASK 0xFF
74#define PERIPH_CLK_SOURCE_DIVU16_MASK 0xFFFF
Colin Crossd8611962010-01-28 16:40:29 -080075#define PERIPH_CLK_SOURCE_DIV_SHIFT 0
76
77#define PLL_BASE 0x0
78#define PLL_BASE_BYPASS (1<<31)
79#define PLL_BASE_ENABLE (1<<30)
80#define PLL_BASE_REF_ENABLE (1<<29)
81#define PLL_BASE_OVERRIDE (1<<28)
Colin Crossd8611962010-01-28 16:40:29 -080082#define PLL_BASE_DIVP_MASK (0x7<<20)
83#define PLL_BASE_DIVP_SHIFT 20
84#define PLL_BASE_DIVN_MASK (0x3FF<<8)
85#define PLL_BASE_DIVN_SHIFT 8
86#define PLL_BASE_DIVM_MASK (0x1F)
87#define PLL_BASE_DIVM_SHIFT 0
88
89#define PLL_OUT_RATIO_MASK (0xFF<<8)
90#define PLL_OUT_RATIO_SHIFT 8
91#define PLL_OUT_OVERRIDE (1<<2)
92#define PLL_OUT_CLKEN (1<<1)
93#define PLL_OUT_RESET_DISABLE (1<<0)
94
95#define PLL_MISC(c) (((c)->flags & PLL_ALT_MISC_REG) ? 0x4 : 0xc)
Colin Cross71fc84c2010-06-07 20:49:46 -070096
Colin Crossd8611962010-01-28 16:40:29 -080097#define PLL_MISC_DCCON_SHIFT 20
Colin Crossd8611962010-01-28 16:40:29 -080098#define PLL_MISC_CPCON_SHIFT 8
99#define PLL_MISC_CPCON_MASK (0xF<<PLL_MISC_CPCON_SHIFT)
100#define PLL_MISC_LFCON_SHIFT 4
101#define PLL_MISC_LFCON_MASK (0xF<<PLL_MISC_LFCON_SHIFT)
102#define PLL_MISC_VCOCON_SHIFT 0
103#define PLL_MISC_VCOCON_MASK (0xF<<PLL_MISC_VCOCON_SHIFT)
104
Colin Cross71fc84c2010-06-07 20:49:46 -0700105#define PLLU_BASE_POST_DIV (1<<20)
106
Colin Crossd8611962010-01-28 16:40:29 -0800107#define PLLD_MISC_CLKENABLE (1<<30)
108#define PLLD_MISC_DIV_RST (1<<23)
109#define PLLD_MISC_DCCON_SHIFT 12
110
Mike Rapoport8d685bc2010-09-27 11:26:32 +0200111#define PLLE_MISC_READY (1 << 15)
112
Colin Crossd8611962010-01-28 16:40:29 -0800113#define PERIPH_CLK_TO_ENB_REG(c) ((c->clk_num / 32) * 4)
114#define PERIPH_CLK_TO_ENB_SET_REG(c) ((c->clk_num / 32) * 8)
115#define PERIPH_CLK_TO_ENB_BIT(c) (1 << (c->clk_num % 32))
116
117#define SUPER_CLK_MUX 0x00
118#define SUPER_STATE_SHIFT 28
119#define SUPER_STATE_MASK (0xF << SUPER_STATE_SHIFT)
120#define SUPER_STATE_STANDBY (0x0 << SUPER_STATE_SHIFT)
121#define SUPER_STATE_IDLE (0x1 << SUPER_STATE_SHIFT)
122#define SUPER_STATE_RUN (0x2 << SUPER_STATE_SHIFT)
123#define SUPER_STATE_IRQ (0x3 << SUPER_STATE_SHIFT)
124#define SUPER_STATE_FIQ (0x4 << SUPER_STATE_SHIFT)
125#define SUPER_SOURCE_MASK 0xF
126#define SUPER_FIQ_SOURCE_SHIFT 12
127#define SUPER_IRQ_SOURCE_SHIFT 8
128#define SUPER_RUN_SOURCE_SHIFT 4
129#define SUPER_IDLE_SOURCE_SHIFT 0
130
131#define SUPER_CLK_DIVIDER 0x04
132
133#define BUS_CLK_DISABLE (1<<3)
134#define BUS_CLK_DIV_MASK 0x3
135
Colin Crosscea62c82010-10-04 11:49:26 -0700136#define PMC_CTRL 0x0
137 #define PMC_CTRL_BLINK_ENB (1 << 7)
138
139#define PMC_DPD_PADS_ORIDE 0x1c
140 #define PMC_DPD_PADS_ORIDE_BLINK_ENB (1 << 20)
141
142#define PMC_BLINK_TIMER_DATA_ON_SHIFT 0
143#define PMC_BLINK_TIMER_DATA_ON_MASK 0x7fff
144#define PMC_BLINK_TIMER_ENB (1 << 15)
145#define PMC_BLINK_TIMER_DATA_OFF_SHIFT 16
146#define PMC_BLINK_TIMER_DATA_OFF_MASK 0xffff
147
Colin Crossd8611962010-01-28 16:40:29 -0800148static void __iomem *reg_clk_base = IO_ADDRESS(TEGRA_CLK_RESET_BASE);
Colin Crosscea62c82010-10-04 11:49:26 -0700149static void __iomem *reg_pmc_base = IO_ADDRESS(TEGRA_PMC_BASE);
Colin Crossd8611962010-01-28 16:40:29 -0800150
151#define clk_writel(value, reg) \
152 __raw_writel(value, (u32)reg_clk_base + (reg))
153#define clk_readl(reg) \
154 __raw_readl((u32)reg_clk_base + (reg))
Colin Crosscea62c82010-10-04 11:49:26 -0700155#define pmc_writel(value, reg) \
156 __raw_writel(value, (u32)reg_pmc_base + (reg))
157#define pmc_readl(reg) \
158 __raw_readl((u32)reg_pmc_base + (reg))
Colin Crossd8611962010-01-28 16:40:29 -0800159
160unsigned long clk_measure_input_freq(void)
161{
162 u32 clock_autodetect;
163 clk_writel(OSC_FREQ_DET_TRIG | 1, OSC_FREQ_DET);
164 do {} while (clk_readl(OSC_FREQ_DET_STATUS) & OSC_FREQ_DET_BUSY);
165 clock_autodetect = clk_readl(OSC_FREQ_DET_STATUS);
166 if (clock_autodetect >= 732 - 3 && clock_autodetect <= 732 + 3) {
167 return 12000000;
168 } else if (clock_autodetect >= 794 - 3 && clock_autodetect <= 794 + 3) {
169 return 13000000;
170 } else if (clock_autodetect >= 1172 - 3 && clock_autodetect <= 1172 + 3) {
171 return 19200000;
172 } else if (clock_autodetect >= 1587 - 3 && clock_autodetect <= 1587 + 3) {
173 return 26000000;
174 } else {
175 pr_err("%s: Unexpected clock autodetect value %d", __func__, clock_autodetect);
176 BUG();
177 return 0;
178 }
179}
180
Colin Cross71fc84c2010-06-07 20:49:46 -0700181static int clk_div71_get_divider(unsigned long parent_rate, unsigned long rate)
Colin Crossd8611962010-01-28 16:40:29 -0800182{
Colin Cross71fc84c2010-06-07 20:49:46 -0700183 s64 divider_u71 = parent_rate * 2;
184 divider_u71 += rate - 1;
185 do_div(divider_u71, rate);
Colin Crossd8611962010-01-28 16:40:29 -0800186
Colin Cross71fc84c2010-06-07 20:49:46 -0700187 if (divider_u71 - 2 < 0)
188 return 0;
Colin Crossd8611962010-01-28 16:40:29 -0800189
Colin Cross71fc84c2010-06-07 20:49:46 -0700190 if (divider_u71 - 2 > 255)
Colin Crossd8611962010-01-28 16:40:29 -0800191 return -EINVAL;
192
193 return divider_u71 - 2;
194}
195
Colin Cross71fc84c2010-06-07 20:49:46 -0700196static int clk_div16_get_divider(unsigned long parent_rate, unsigned long rate)
Colin Crossd8611962010-01-28 16:40:29 -0800197{
Colin Cross71fc84c2010-06-07 20:49:46 -0700198 s64 divider_u16;
Colin Crossd8611962010-01-28 16:40:29 -0800199
Colin Cross71fc84c2010-06-07 20:49:46 -0700200 divider_u16 = parent_rate;
201 divider_u16 += rate - 1;
202 do_div(divider_u16, rate);
203
204 if (divider_u16 - 1 < 0)
205 return 0;
206
207 if (divider_u16 - 1 > 255)
208 return -EINVAL;
209
210 return divider_u16 - 1;
Colin Crossd8611962010-01-28 16:40:29 -0800211}
212
Colin Crossd8611962010-01-28 16:40:29 -0800213/* clk_m functions */
214static unsigned long tegra2_clk_m_autodetect_rate(struct clk *c)
215{
216 u32 auto_clock_control = clk_readl(OSC_CTRL) & ~OSC_CTRL_OSC_FREQ_MASK;
217
218 c->rate = clk_measure_input_freq();
219 switch (c->rate) {
220 case 12000000:
221 auto_clock_control |= OSC_CTRL_OSC_FREQ_12MHZ;
222 break;
223 case 13000000:
224 auto_clock_control |= OSC_CTRL_OSC_FREQ_13MHZ;
225 break;
226 case 19200000:
227 auto_clock_control |= OSC_CTRL_OSC_FREQ_19_2MHZ;
228 break;
229 case 26000000:
230 auto_clock_control |= OSC_CTRL_OSC_FREQ_26MHZ;
231 break;
232 default:
233 pr_err("%s: Unexpected clock rate %ld", __func__, c->rate);
234 BUG();
235 }
236 clk_writel(auto_clock_control, OSC_CTRL);
237 return c->rate;
238}
239
240static void tegra2_clk_m_init(struct clk *c)
241{
242 pr_debug("%s on clock %s\n", __func__, c->name);
243 tegra2_clk_m_autodetect_rate(c);
244}
245
246static int tegra2_clk_m_enable(struct clk *c)
247{
248 pr_debug("%s on clock %s\n", __func__, c->name);
249 return 0;
250}
251
252static void tegra2_clk_m_disable(struct clk *c)
253{
254 pr_debug("%s on clock %s\n", __func__, c->name);
255 BUG();
256}
257
258static struct clk_ops tegra_clk_m_ops = {
259 .init = tegra2_clk_m_init,
260 .enable = tegra2_clk_m_enable,
261 .disable = tegra2_clk_m_disable,
262};
263
Dima Zavin2b84cb4f2010-09-02 19:11:11 -0700264void tegra2_periph_reset_assert(struct clk *c)
265{
266 BUG_ON(!c->ops->reset);
267 c->ops->reset(c, true);
268}
269
270void tegra2_periph_reset_deassert(struct clk *c)
271{
272 BUG_ON(!c->ops->reset);
273 c->ops->reset(c, false);
274}
275
Colin Crossd8611962010-01-28 16:40:29 -0800276/* super clock functions */
277/* "super clocks" on tegra have two-stage muxes and a clock skipping
278 * super divider. We will ignore the clock skipping divider, since we
279 * can't lower the voltage when using the clock skip, but we can if we
280 * lower the PLL frequency.
281 */
282static void tegra2_super_clk_init(struct clk *c)
283{
284 u32 val;
285 int source;
286 int shift;
287 const struct clk_mux_sel *sel;
288 val = clk_readl(c->reg + SUPER_CLK_MUX);
289 c->state = ON;
290 BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
291 ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
292 shift = ((val & SUPER_STATE_MASK) == SUPER_STATE_IDLE) ?
293 SUPER_IDLE_SOURCE_SHIFT : SUPER_RUN_SOURCE_SHIFT;
294 source = (val >> shift) & SUPER_SOURCE_MASK;
295 for (sel = c->inputs; sel->input != NULL; sel++) {
296 if (sel->value == source)
297 break;
298 }
299 BUG_ON(sel->input == NULL);
300 c->parent = sel->input;
Colin Crossd8611962010-01-28 16:40:29 -0800301}
302
303static int tegra2_super_clk_enable(struct clk *c)
304{
305 clk_writel(0, c->reg + SUPER_CLK_DIVIDER);
306 return 0;
307}
308
309static void tegra2_super_clk_disable(struct clk *c)
310{
311 pr_debug("%s on clock %s\n", __func__, c->name);
312
313 /* oops - don't disable the CPU clock! */
314 BUG();
315}
316
317static int tegra2_super_clk_set_parent(struct clk *c, struct clk *p)
318{
319 u32 val;
320 const struct clk_mux_sel *sel;
321 int shift;
Colin Cross71fc84c2010-06-07 20:49:46 -0700322
Colin Crossd8611962010-01-28 16:40:29 -0800323 val = clk_readl(c->reg + SUPER_CLK_MUX);;
324 BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
325 ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
326 shift = ((val & SUPER_STATE_MASK) == SUPER_STATE_IDLE) ?
327 SUPER_IDLE_SOURCE_SHIFT : SUPER_RUN_SOURCE_SHIFT;
328 for (sel = c->inputs; sel->input != NULL; sel++) {
329 if (sel->input == p) {
Colin Crossd8611962010-01-28 16:40:29 -0800330 val &= ~(SUPER_SOURCE_MASK << shift);
331 val |= sel->value << shift;
Colin Cross71fc84c2010-06-07 20:49:46 -0700332
333 if (c->refcnt)
334 clk_enable_locked(p);
335
Colin Crossd8611962010-01-28 16:40:29 -0800336 clk_writel(val, c->reg);
Colin Cross71fc84c2010-06-07 20:49:46 -0700337
338 if (c->refcnt && c->parent)
339 clk_disable_locked(c->parent);
340
341 clk_reparent(c, p);
Colin Crossd8611962010-01-28 16:40:29 -0800342 return 0;
343 }
344 }
345 return -EINVAL;
346}
347
348static struct clk_ops tegra_super_ops = {
349 .init = tegra2_super_clk_init,
350 .enable = tegra2_super_clk_enable,
351 .disable = tegra2_super_clk_disable,
352 .set_parent = tegra2_super_clk_set_parent,
Colin Cross71fc84c2010-06-07 20:49:46 -0700353};
354
355/* virtual cpu clock functions */
356/* some clocks can not be stopped (cpu, memory bus) while the SoC is running.
357 To change the frequency of these clocks, the parent pll may need to be
358 reprogrammed, so the clock must be moved off the pll, the pll reprogrammed,
359 and then the clock moved back to the pll. To hide this sequence, a virtual
360 clock handles it.
361 */
362static void tegra2_cpu_clk_init(struct clk *c)
363{
364}
365
366static int tegra2_cpu_clk_enable(struct clk *c)
367{
368 return 0;
369}
370
371static void tegra2_cpu_clk_disable(struct clk *c)
372{
373 pr_debug("%s on clock %s\n", __func__, c->name);
374
375 /* oops - don't disable the CPU clock! */
376 BUG();
377}
378
379static int tegra2_cpu_clk_set_rate(struct clk *c, unsigned long rate)
380{
381 int ret;
382 ret = clk_set_parent_locked(c->parent, c->backup);
383 if (ret) {
384 pr_err("Failed to switch cpu to clock %s\n", c->backup->name);
385 return ret;
386 }
387
Colin Crosscea62c82010-10-04 11:49:26 -0700388 if (rate == c->backup->rate)
389 goto out;
390
Colin Cross71fc84c2010-06-07 20:49:46 -0700391 ret = clk_set_rate_locked(c->main, rate);
392 if (ret) {
393 pr_err("Failed to change cpu pll to %lu\n", rate);
394 return ret;
395 }
396
397 ret = clk_set_parent_locked(c->parent, c->main);
398 if (ret) {
399 pr_err("Failed to switch cpu to clock %s\n", c->main->name);
400 return ret;
401 }
402
Colin Crosscea62c82010-10-04 11:49:26 -0700403out:
Colin Cross71fc84c2010-06-07 20:49:46 -0700404 return 0;
405}
406
407static struct clk_ops tegra_cpu_ops = {
408 .init = tegra2_cpu_clk_init,
409 .enable = tegra2_cpu_clk_enable,
410 .disable = tegra2_cpu_clk_disable,
411 .set_rate = tegra2_cpu_clk_set_rate,
Colin Crossd8611962010-01-28 16:40:29 -0800412};
413
414/* bus clock functions */
415static void tegra2_bus_clk_init(struct clk *c)
416{
417 u32 val = clk_readl(c->reg);
418 c->state = ((val >> c->reg_shift) & BUS_CLK_DISABLE) ? OFF : ON;
419 c->div = ((val >> c->reg_shift) & BUS_CLK_DIV_MASK) + 1;
420 c->mul = 1;
Colin Crossd8611962010-01-28 16:40:29 -0800421}
422
423static int tegra2_bus_clk_enable(struct clk *c)
424{
425 u32 val = clk_readl(c->reg);
426 val &= ~(BUS_CLK_DISABLE << c->reg_shift);
427 clk_writel(val, c->reg);
428 return 0;
429}
430
431static void tegra2_bus_clk_disable(struct clk *c)
432{
433 u32 val = clk_readl(c->reg);
434 val |= BUS_CLK_DISABLE << c->reg_shift;
435 clk_writel(val, c->reg);
436}
437
438static int tegra2_bus_clk_set_rate(struct clk *c, unsigned long rate)
439{
440 u32 val = clk_readl(c->reg);
441 unsigned long parent_rate = c->parent->rate;
442 int i;
443 for (i = 1; i <= 4; i++) {
444 if (rate == parent_rate / i) {
445 val &= ~(BUS_CLK_DIV_MASK << c->reg_shift);
446 val |= (i - 1) << c->reg_shift;
447 clk_writel(val, c->reg);
448 c->div = i;
449 c->mul = 1;
450 return 0;
451 }
452 }
453 return -EINVAL;
454}
455
456static struct clk_ops tegra_bus_ops = {
457 .init = tegra2_bus_clk_init,
458 .enable = tegra2_bus_clk_enable,
459 .disable = tegra2_bus_clk_disable,
460 .set_rate = tegra2_bus_clk_set_rate,
Colin Crossd8611962010-01-28 16:40:29 -0800461};
462
Colin Crosscea62c82010-10-04 11:49:26 -0700463/* Blink output functions */
464
465static void tegra2_blink_clk_init(struct clk *c)
466{
467 u32 val;
468
469 val = pmc_readl(PMC_CTRL);
470 c->state = (val & PMC_CTRL_BLINK_ENB) ? ON : OFF;
471 c->mul = 1;
472 val = pmc_readl(c->reg);
473
474 if (val & PMC_BLINK_TIMER_ENB) {
475 unsigned int on_off;
476
477 on_off = (val >> PMC_BLINK_TIMER_DATA_ON_SHIFT) &
478 PMC_BLINK_TIMER_DATA_ON_MASK;
479 val >>= PMC_BLINK_TIMER_DATA_OFF_SHIFT;
480 val &= PMC_BLINK_TIMER_DATA_OFF_MASK;
481 on_off += val;
482 /* each tick in the blink timer is 4 32KHz clocks */
483 c->div = on_off * 4;
484 } else {
485 c->div = 1;
486 }
487}
488
489static int tegra2_blink_clk_enable(struct clk *c)
490{
491 u32 val;
492
493 val = pmc_readl(PMC_DPD_PADS_ORIDE);
494 pmc_writel(val | PMC_DPD_PADS_ORIDE_BLINK_ENB, PMC_DPD_PADS_ORIDE);
495
496 val = pmc_readl(PMC_CTRL);
497 pmc_writel(val | PMC_CTRL_BLINK_ENB, PMC_CTRL);
498
499 return 0;
500}
501
502static void tegra2_blink_clk_disable(struct clk *c)
503{
504 u32 val;
505
506 val = pmc_readl(PMC_CTRL);
507 pmc_writel(val & ~PMC_CTRL_BLINK_ENB, PMC_CTRL);
508
509 val = pmc_readl(PMC_DPD_PADS_ORIDE);
510 pmc_writel(val & ~PMC_DPD_PADS_ORIDE_BLINK_ENB, PMC_DPD_PADS_ORIDE);
511}
512
513static int tegra2_blink_clk_set_rate(struct clk *c, unsigned long rate)
514{
515 if (rate >= c->parent->rate) {
516 c->div = 1;
517 pmc_writel(0, c->reg);
518 } else {
519 unsigned int on_off;
520 u32 val;
521
522 on_off = DIV_ROUND_UP(c->parent->rate / 8, rate);
523 c->div = on_off * 8;
524
525 val = (on_off & PMC_BLINK_TIMER_DATA_ON_MASK) <<
526 PMC_BLINK_TIMER_DATA_ON_SHIFT;
527 on_off &= PMC_BLINK_TIMER_DATA_OFF_MASK;
528 on_off <<= PMC_BLINK_TIMER_DATA_OFF_SHIFT;
529 val |= on_off;
530 val |= PMC_BLINK_TIMER_ENB;
531 pmc_writel(val, c->reg);
532 }
533
534 return 0;
535}
536
537static struct clk_ops tegra_blink_clk_ops = {
538 .init = &tegra2_blink_clk_init,
539 .enable = &tegra2_blink_clk_enable,
540 .disable = &tegra2_blink_clk_disable,
541 .set_rate = &tegra2_blink_clk_set_rate,
542};
543
Colin Crossd8611962010-01-28 16:40:29 -0800544/* PLL Functions */
Colin Crossd8611962010-01-28 16:40:29 -0800545static int tegra2_pll_clk_wait_for_lock(struct clk *c)
546{
Colin Cross35c47c32010-09-16 14:59:49 -0700547 udelay(c->pll_lock_delay);
Colin Crossd8611962010-01-28 16:40:29 -0800548
549 return 0;
550}
551
552static void tegra2_pll_clk_init(struct clk *c)
553{
554 u32 val = clk_readl(c->reg + PLL_BASE);
555
556 c->state = (val & PLL_BASE_ENABLE) ? ON : OFF;
557
558 if (c->flags & PLL_FIXED && !(val & PLL_BASE_OVERRIDE)) {
559 pr_warning("Clock %s has unknown fixed frequency\n", c->name);
Colin Cross71fc84c2010-06-07 20:49:46 -0700560 c->mul = 1;
561 c->div = 1;
Colin Crossd8611962010-01-28 16:40:29 -0800562 } else if (val & PLL_BASE_BYPASS) {
Colin Cross71fc84c2010-06-07 20:49:46 -0700563 c->mul = 1;
564 c->div = 1;
Colin Crossd8611962010-01-28 16:40:29 -0800565 } else {
Colin Cross71fc84c2010-06-07 20:49:46 -0700566 c->mul = (val & PLL_BASE_DIVN_MASK) >> PLL_BASE_DIVN_SHIFT;
567 c->div = (val & PLL_BASE_DIVM_MASK) >> PLL_BASE_DIVM_SHIFT;
568 if (c->flags & PLLU)
569 c->div *= (val & PLLU_BASE_POST_DIV) ? 1 : 2;
570 else
571 c->div *= (val & PLL_BASE_DIVP_MASK) ? 2 : 1;
Colin Crossd8611962010-01-28 16:40:29 -0800572 }
Colin Crossd8611962010-01-28 16:40:29 -0800573}
574
575static int tegra2_pll_clk_enable(struct clk *c)
576{
577 u32 val;
578 pr_debug("%s on clock %s\n", __func__, c->name);
579
580 val = clk_readl(c->reg + PLL_BASE);
581 val &= ~PLL_BASE_BYPASS;
582 val |= PLL_BASE_ENABLE;
583 clk_writel(val, c->reg + PLL_BASE);
584
Colin Crossd8611962010-01-28 16:40:29 -0800585 tegra2_pll_clk_wait_for_lock(c);
586
587 return 0;
588}
589
590static void tegra2_pll_clk_disable(struct clk *c)
591{
592 u32 val;
593 pr_debug("%s on clock %s\n", __func__, c->name);
594
595 val = clk_readl(c->reg);
596 val &= ~(PLL_BASE_BYPASS | PLL_BASE_ENABLE);
597 clk_writel(val, c->reg);
598}
599
600static int tegra2_pll_clk_set_rate(struct clk *c, unsigned long rate)
601{
602 u32 val;
603 unsigned long input_rate;
604 const struct clk_pll_table *sel;
605
606 pr_debug("%s: %s %lu\n", __func__, c->name, rate);
Colin Crossd8611962010-01-28 16:40:29 -0800607
608 input_rate = c->parent->rate;
609 for (sel = c->pll_table; sel->input_rate != 0; sel++) {
610 if (sel->input_rate == input_rate && sel->output_rate == rate) {
Colin Cross71fc84c2010-06-07 20:49:46 -0700611 c->mul = sel->n;
612 c->div = sel->m * sel->p;
Colin Crossd8611962010-01-28 16:40:29 -0800613
614 val = clk_readl(c->reg + PLL_BASE);
615 if (c->flags & PLL_FIXED)
616 val |= PLL_BASE_OVERRIDE;
617 val &= ~(PLL_BASE_DIVP_MASK | PLL_BASE_DIVN_MASK |
618 PLL_BASE_DIVM_MASK);
Colin Cross71fc84c2010-06-07 20:49:46 -0700619 val |= (sel->m << PLL_BASE_DIVM_SHIFT) |
620 (sel->n << PLL_BASE_DIVN_SHIFT);
621 BUG_ON(sel->p < 1 || sel->p > 2);
622 if (c->flags & PLLU) {
623 if (sel->p == 1)
624 val |= PLLU_BASE_POST_DIV;
625 } else {
626 if (sel->p == 2)
627 val |= 1 << PLL_BASE_DIVP_SHIFT;
628 }
Colin Crossd8611962010-01-28 16:40:29 -0800629 clk_writel(val, c->reg + PLL_BASE);
630
631 if (c->flags & PLL_HAS_CPCON) {
Colin Cross71fc84c2010-06-07 20:49:46 -0700632 val = clk_readl(c->reg + PLL_MISC(c));
633 val &= ~PLL_MISC_CPCON_MASK;
634 val |= sel->cpcon << PLL_MISC_CPCON_SHIFT;
Colin Crossd8611962010-01-28 16:40:29 -0800635 clk_writel(val, c->reg + PLL_MISC(c));
636 }
637
638 if (c->state == ON)
639 tegra2_pll_clk_enable(c);
640
Colin Crossd8611962010-01-28 16:40:29 -0800641 return 0;
642 }
643 }
644 return -EINVAL;
645}
646
647static struct clk_ops tegra_pll_ops = {
648 .init = tegra2_pll_clk_init,
649 .enable = tegra2_pll_clk_enable,
650 .disable = tegra2_pll_clk_disable,
651 .set_rate = tegra2_pll_clk_set_rate,
Colin Cross71fc84c2010-06-07 20:49:46 -0700652};
653
654static void tegra2_pllx_clk_init(struct clk *c)
655{
656 tegra2_pll_clk_init(c);
657
658 if (tegra_sku_id() == 7)
659 c->max_rate = 750000000;
660}
661
662static struct clk_ops tegra_pllx_ops = {
663 .init = tegra2_pllx_clk_init,
664 .enable = tegra2_pll_clk_enable,
665 .disable = tegra2_pll_clk_disable,
666 .set_rate = tegra2_pll_clk_set_rate,
Colin Crossd8611962010-01-28 16:40:29 -0800667};
668
Mike Rapoport8d685bc2010-09-27 11:26:32 +0200669static int tegra2_plle_clk_enable(struct clk *c)
670{
671 u32 val;
672
673 pr_debug("%s on clock %s\n", __func__, c->name);
674
675 mdelay(1);
676
677 val = clk_readl(c->reg + PLL_BASE);
678 if (!(val & PLLE_MISC_READY))
679 return -EBUSY;
680
681 val = clk_readl(c->reg + PLL_BASE);
682 val |= PLL_BASE_ENABLE | PLL_BASE_BYPASS;
683 clk_writel(val, c->reg + PLL_BASE);
684
685 return 0;
686}
687
688static struct clk_ops tegra_plle_ops = {
689 .init = tegra2_pll_clk_init,
690 .enable = tegra2_plle_clk_enable,
691 .set_rate = tegra2_pll_clk_set_rate,
692};
693
Colin Crossd8611962010-01-28 16:40:29 -0800694/* Clock divider ops */
695static void tegra2_pll_div_clk_init(struct clk *c)
696{
697 u32 val = clk_readl(c->reg);
698 u32 divu71;
699 val >>= c->reg_shift;
700 c->state = (val & PLL_OUT_CLKEN) ? ON : OFF;
701 if (!(val & PLL_OUT_RESET_DISABLE))
702 c->state = OFF;
703
704 if (c->flags & DIV_U71) {
705 divu71 = (val & PLL_OUT_RATIO_MASK) >> PLL_OUT_RATIO_SHIFT;
706 c->div = (divu71 + 2);
707 c->mul = 2;
708 } else if (c->flags & DIV_2) {
709 c->div = 2;
710 c->mul = 1;
711 } else {
712 c->div = 1;
713 c->mul = 1;
714 }
Colin Crossd8611962010-01-28 16:40:29 -0800715}
716
717static int tegra2_pll_div_clk_enable(struct clk *c)
718{
719 u32 val;
720 u32 new_val;
721
722 pr_debug("%s: %s\n", __func__, c->name);
723 if (c->flags & DIV_U71) {
724 val = clk_readl(c->reg);
725 new_val = val >> c->reg_shift;
726 new_val &= 0xFFFF;
727
728 new_val |= PLL_OUT_CLKEN | PLL_OUT_RESET_DISABLE;
729
730 val &= ~(0xFFFF << c->reg_shift);
731 val |= new_val << c->reg_shift;
732 clk_writel(val, c->reg);
733 return 0;
734 } else if (c->flags & DIV_2) {
735 BUG_ON(!(c->flags & PLLD));
736 val = clk_readl(c->reg);
737 val &= ~PLLD_MISC_DIV_RST;
738 clk_writel(val, c->reg);
739 return 0;
740 }
741 return -EINVAL;
742}
743
744static void tegra2_pll_div_clk_disable(struct clk *c)
745{
746 u32 val;
747 u32 new_val;
748
749 pr_debug("%s: %s\n", __func__, c->name);
750 if (c->flags & DIV_U71) {
751 val = clk_readl(c->reg);
752 new_val = val >> c->reg_shift;
753 new_val &= 0xFFFF;
754
755 new_val &= ~(PLL_OUT_CLKEN | PLL_OUT_RESET_DISABLE);
756
757 val &= ~(0xFFFF << c->reg_shift);
758 val |= new_val << c->reg_shift;
759 clk_writel(val, c->reg);
760 } else if (c->flags & DIV_2) {
761 BUG_ON(!(c->flags & PLLD));
762 val = clk_readl(c->reg);
763 val |= PLLD_MISC_DIV_RST;
764 clk_writel(val, c->reg);
765 }
766}
767
768static int tegra2_pll_div_clk_set_rate(struct clk *c, unsigned long rate)
769{
770 u32 val;
771 u32 new_val;
772 int divider_u71;
773 pr_debug("%s: %s %lu\n", __func__, c->name, rate);
774 if (c->flags & DIV_U71) {
Colin Cross71fc84c2010-06-07 20:49:46 -0700775 divider_u71 = clk_div71_get_divider(c->parent->rate, rate);
Colin Crossd8611962010-01-28 16:40:29 -0800776 if (divider_u71 >= 0) {
777 val = clk_readl(c->reg);
778 new_val = val >> c->reg_shift;
779 new_val &= 0xFFFF;
780 if (c->flags & DIV_U71_FIXED)
781 new_val |= PLL_OUT_OVERRIDE;
782 new_val &= ~PLL_OUT_RATIO_MASK;
783 new_val |= divider_u71 << PLL_OUT_RATIO_SHIFT;
784
785 val &= ~(0xFFFF << c->reg_shift);
786 val |= new_val << c->reg_shift;
787 clk_writel(val, c->reg);
788 c->div = divider_u71 + 2;
789 c->mul = 2;
Colin Crossd8611962010-01-28 16:40:29 -0800790 return 0;
791 }
792 } else if (c->flags & DIV_2) {
Colin Cross71fc84c2010-06-07 20:49:46 -0700793 if (c->parent->rate == rate * 2)
Colin Crossd8611962010-01-28 16:40:29 -0800794 return 0;
Colin Crossd8611962010-01-28 16:40:29 -0800795 }
796 return -EINVAL;
797}
798
Colin Cross71fc84c2010-06-07 20:49:46 -0700799static long tegra2_pll_div_clk_round_rate(struct clk *c, unsigned long rate)
800{
801 int divider;
802 pr_debug("%s: %s %lu\n", __func__, c->name, rate);
803
804 if (c->flags & DIV_U71) {
805 divider = clk_div71_get_divider(c->parent->rate, rate);
806 if (divider < 0)
807 return divider;
808 return c->parent->rate * 2 / (divider + 2);
809 } else if (c->flags & DIV_2) {
810 return c->parent->rate / 2;
811 }
812 return -EINVAL;
813}
Colin Crossd8611962010-01-28 16:40:29 -0800814
815static struct clk_ops tegra_pll_div_ops = {
816 .init = tegra2_pll_div_clk_init,
817 .enable = tegra2_pll_div_clk_enable,
818 .disable = tegra2_pll_div_clk_disable,
819 .set_rate = tegra2_pll_div_clk_set_rate,
Colin Cross71fc84c2010-06-07 20:49:46 -0700820 .round_rate = tegra2_pll_div_clk_round_rate,
Colin Crossd8611962010-01-28 16:40:29 -0800821};
822
823/* Periph clk ops */
824
825static void tegra2_periph_clk_init(struct clk *c)
826{
827 u32 val = clk_readl(c->reg);
828 const struct clk_mux_sel *mux = 0;
829 const struct clk_mux_sel *sel;
830 if (c->flags & MUX) {
831 for (sel = c->inputs; sel->input != NULL; sel++) {
832 if (val >> PERIPH_CLK_SOURCE_SHIFT == sel->value)
833 mux = sel;
834 }
835 BUG_ON(!mux);
836
837 c->parent = mux->input;
838 } else {
839 c->parent = c->inputs[0].input;
840 }
841
842 if (c->flags & DIV_U71) {
Colin Cross71fc84c2010-06-07 20:49:46 -0700843 u32 divu71 = val & PERIPH_CLK_SOURCE_DIVU71_MASK;
Colin Crossd8611962010-01-28 16:40:29 -0800844 c->div = divu71 + 2;
845 c->mul = 2;
Colin Cross71fc84c2010-06-07 20:49:46 -0700846 } else if (c->flags & DIV_U16) {
847 u32 divu16 = val & PERIPH_CLK_SOURCE_DIVU16_MASK;
848 c->div = divu16 + 1;
849 c->mul = 1;
Colin Crossd8611962010-01-28 16:40:29 -0800850 } else {
851 c->div = 1;
852 c->mul = 1;
853 }
854
855 c->state = ON;
856 if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
857 PERIPH_CLK_TO_ENB_BIT(c)))
858 c->state = OFF;
859 if (!(c->flags & PERIPH_NO_RESET))
860 if (clk_readl(RST_DEVICES + PERIPH_CLK_TO_ENB_REG(c)) &
861 PERIPH_CLK_TO_ENB_BIT(c))
862 c->state = OFF;
Colin Crossd8611962010-01-28 16:40:29 -0800863}
864
865static int tegra2_periph_clk_enable(struct clk *c)
866{
867 u32 val;
868 pr_debug("%s on clock %s\n", __func__, c->name);
869
870 clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
871 CLK_OUT_ENB_SET + PERIPH_CLK_TO_ENB_SET_REG(c));
872 if (!(c->flags & PERIPH_NO_RESET) && !(c->flags & PERIPH_MANUAL_RESET))
873 clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
874 RST_DEVICES_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
875 if (c->flags & PERIPH_EMC_ENB) {
876 /* The EMC peripheral clock has 2 extra enable bits */
877 /* FIXME: Do they need to be disabled? */
878 val = clk_readl(c->reg);
879 val |= 0x3 << 24;
880 clk_writel(val, c->reg);
881 }
882 return 0;
883}
884
885static void tegra2_periph_clk_disable(struct clk *c)
886{
887 pr_debug("%s on clock %s\n", __func__, c->name);
888
889 clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
890 CLK_OUT_ENB_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
891}
892
Dima Zavin2b84cb4f2010-09-02 19:11:11 -0700893static void tegra2_periph_clk_reset(struct clk *c, bool assert)
Colin Crossd8611962010-01-28 16:40:29 -0800894{
Dima Zavin2b84cb4f2010-09-02 19:11:11 -0700895 unsigned long base = assert ? RST_DEVICES_SET : RST_DEVICES_CLR;
896
897 pr_debug("%s %s on clock %s\n", __func__,
898 assert ? "assert" : "deassert", c->name);
Colin Crossd8611962010-01-28 16:40:29 -0800899 if (!(c->flags & PERIPH_NO_RESET))
900 clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
Dima Zavin2b84cb4f2010-09-02 19:11:11 -0700901 base + PERIPH_CLK_TO_ENB_SET_REG(c));
Colin Crossd8611962010-01-28 16:40:29 -0800902}
903
Colin Crossd8611962010-01-28 16:40:29 -0800904static int tegra2_periph_clk_set_parent(struct clk *c, struct clk *p)
905{
906 u32 val;
907 const struct clk_mux_sel *sel;
908 pr_debug("%s: %s %s\n", __func__, c->name, p->name);
909 for (sel = c->inputs; sel->input != NULL; sel++) {
910 if (sel->input == p) {
Colin Crossd8611962010-01-28 16:40:29 -0800911 val = clk_readl(c->reg);
912 val &= ~PERIPH_CLK_SOURCE_MASK;
913 val |= (sel->value) << PERIPH_CLK_SOURCE_SHIFT;
Colin Cross71fc84c2010-06-07 20:49:46 -0700914
915 if (c->refcnt)
916 clk_enable_locked(p);
917
Colin Crossd8611962010-01-28 16:40:29 -0800918 clk_writel(val, c->reg);
Colin Cross71fc84c2010-06-07 20:49:46 -0700919
920 if (c->refcnt && c->parent)
921 clk_disable_locked(c->parent);
922
923 clk_reparent(c, p);
Colin Crossd8611962010-01-28 16:40:29 -0800924 return 0;
925 }
926 }
927
928 return -EINVAL;
929}
930
931static int tegra2_periph_clk_set_rate(struct clk *c, unsigned long rate)
932{
933 u32 val;
Colin Cross71fc84c2010-06-07 20:49:46 -0700934 int divider;
Colin Crossd8611962010-01-28 16:40:29 -0800935 pr_debug("%s: %lu\n", __func__, rate);
936 if (c->flags & DIV_U71) {
Colin Cross71fc84c2010-06-07 20:49:46 -0700937 divider = clk_div71_get_divider(c->parent->rate, rate);
938 if (divider >= 0) {
Colin Crossd8611962010-01-28 16:40:29 -0800939 val = clk_readl(c->reg);
Colin Cross71fc84c2010-06-07 20:49:46 -0700940 val &= ~PERIPH_CLK_SOURCE_DIVU71_MASK;
941 val |= divider;
Colin Crossd8611962010-01-28 16:40:29 -0800942 clk_writel(val, c->reg);
Colin Cross71fc84c2010-06-07 20:49:46 -0700943 c->div = divider + 2;
Colin Crossd8611962010-01-28 16:40:29 -0800944 c->mul = 2;
Colin Crossd8611962010-01-28 16:40:29 -0800945 return 0;
946 }
Colin Cross71fc84c2010-06-07 20:49:46 -0700947 } else if (c->flags & DIV_U16) {
948 divider = clk_div16_get_divider(c->parent->rate, rate);
949 if (divider >= 0) {
950 val = clk_readl(c->reg);
951 val &= ~PERIPH_CLK_SOURCE_DIVU16_MASK;
952 val |= divider;
953 clk_writel(val, c->reg);
954 c->div = divider + 1;
955 c->mul = 1;
956 return 0;
957 }
958 } else if (c->parent->rate <= rate) {
959 c->div = 1;
960 c->mul = 1;
961 return 0;
962 }
963 return -EINVAL;
964}
965
966static long tegra2_periph_clk_round_rate(struct clk *c,
967 unsigned long rate)
968{
969 int divider;
970 pr_debug("%s: %s %lu\n", __func__, c->name, rate);
971
972 if (c->flags & DIV_U71) {
973 divider = clk_div71_get_divider(c->parent->rate, rate);
974 if (divider < 0)
975 return divider;
976
977 return c->parent->rate * 2 / (divider + 2);
978 } else if (c->flags & DIV_U16) {
979 divider = clk_div16_get_divider(c->parent->rate, rate);
980 if (divider < 0)
981 return divider;
982 return c->parent->rate / (divider + 1);
Colin Crossd8611962010-01-28 16:40:29 -0800983 }
984 return -EINVAL;
985}
986
987static struct clk_ops tegra_periph_clk_ops = {
988 .init = &tegra2_periph_clk_init,
989 .enable = &tegra2_periph_clk_enable,
990 .disable = &tegra2_periph_clk_disable,
991 .set_parent = &tegra2_periph_clk_set_parent,
992 .set_rate = &tegra2_periph_clk_set_rate,
Colin Cross71fc84c2010-06-07 20:49:46 -0700993 .round_rate = &tegra2_periph_clk_round_rate,
Dima Zavin2b84cb4f2010-09-02 19:11:11 -0700994 .reset = &tegra2_periph_clk_reset,
Colin Crossd8611962010-01-28 16:40:29 -0800995};
996
997/* Clock doubler ops */
998static void tegra2_clk_double_init(struct clk *c)
999{
1000 c->mul = 2;
1001 c->div = 1;
1002 c->state = ON;
1003 if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
1004 PERIPH_CLK_TO_ENB_BIT(c)))
1005 c->state = OFF;
Colin Crossd8611962010-01-28 16:40:29 -08001006};
1007
Colin Cross71fc84c2010-06-07 20:49:46 -07001008static int tegra2_clk_double_set_rate(struct clk *c, unsigned long rate)
1009{
1010 if (rate != 2 * c->parent->rate)
1011 return -EINVAL;
1012 c->mul = 2;
1013 c->div = 1;
1014 return 0;
1015}
1016
Colin Crossd8611962010-01-28 16:40:29 -08001017static struct clk_ops tegra_clk_double_ops = {
1018 .init = &tegra2_clk_double_init,
1019 .enable = &tegra2_periph_clk_enable,
1020 .disable = &tegra2_periph_clk_disable,
Colin Cross71fc84c2010-06-07 20:49:46 -07001021 .set_rate = &tegra2_clk_double_set_rate,
1022};
1023
Colin Crosscea62c82010-10-04 11:49:26 -07001024/* Audio sync clock ops */
Colin Cross71fc84c2010-06-07 20:49:46 -07001025static void tegra2_audio_sync_clk_init(struct clk *c)
1026{
1027 int source;
1028 const struct clk_mux_sel *sel;
1029 u32 val = clk_readl(c->reg);
1030 c->state = (val & (1<<4)) ? OFF : ON;
1031 source = val & 0xf;
1032 for (sel = c->inputs; sel->input != NULL; sel++)
1033 if (sel->value == source)
1034 break;
1035 BUG_ON(sel->input == NULL);
1036 c->parent = sel->input;
1037}
1038
1039static int tegra2_audio_sync_clk_enable(struct clk *c)
1040{
1041 clk_writel(0, c->reg);
1042 return 0;
1043}
1044
1045static void tegra2_audio_sync_clk_disable(struct clk *c)
1046{
1047 clk_writel(1, c->reg);
1048}
1049
1050static int tegra2_audio_sync_clk_set_parent(struct clk *c, struct clk *p)
1051{
1052 u32 val;
1053 const struct clk_mux_sel *sel;
1054 for (sel = c->inputs; sel->input != NULL; sel++) {
1055 if (sel->input == p) {
1056 val = clk_readl(c->reg);
1057 val &= ~0xf;
1058 val |= sel->value;
1059
1060 if (c->refcnt)
1061 clk_enable_locked(p);
1062
1063 clk_writel(val, c->reg);
1064
1065 if (c->refcnt && c->parent)
1066 clk_disable_locked(c->parent);
1067
1068 clk_reparent(c, p);
1069 return 0;
1070 }
1071 }
1072
1073 return -EINVAL;
1074}
1075
1076static int tegra2_audio_sync_clk_set_rate(struct clk *c, unsigned long rate)
1077{
1078 unsigned long parent_rate;
1079 if (!c->parent) {
1080 pr_err("%s: clock has no parent\n", __func__);
1081 return -EINVAL;
1082 }
1083 parent_rate = c->parent->rate;
1084 if (rate != parent_rate) {
1085 pr_err("%s: %s/%ld differs from parent %s/%ld\n",
1086 __func__,
1087 c->name, rate,
1088 c->parent->name, parent_rate);
1089 return -EINVAL;
1090 }
1091 c->rate = parent_rate;
1092 return 0;
1093}
1094
1095static struct clk_ops tegra_audio_sync_clk_ops = {
1096 .init = tegra2_audio_sync_clk_init,
1097 .enable = tegra2_audio_sync_clk_enable,
1098 .disable = tegra2_audio_sync_clk_disable,
1099 .set_rate = tegra2_audio_sync_clk_set_rate,
1100 .set_parent = tegra2_audio_sync_clk_set_parent,
Colin Crossd8611962010-01-28 16:40:29 -08001101};
1102
Colin Crosscea62c82010-10-04 11:49:26 -07001103/* cdev1 and cdev2 (dap_mclk1 and dap_mclk2) ops */
1104
1105static void tegra2_cdev_clk_init(struct clk *c)
1106{
1107 /* We could un-tristate the cdev1 or cdev2 pingroup here; this is
1108 * currently done in the pinmux code. */
1109 c->state = ON;
1110 if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
1111 PERIPH_CLK_TO_ENB_BIT(c)))
1112 c->state = OFF;
1113}
1114
1115static int tegra2_cdev_clk_enable(struct clk *c)
1116{
1117 clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
1118 CLK_OUT_ENB_SET + PERIPH_CLK_TO_ENB_SET_REG(c));
1119 return 0;
1120}
1121
1122static void tegra2_cdev_clk_disable(struct clk *c)
1123{
1124 clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
1125 CLK_OUT_ENB_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
1126}
1127
1128static struct clk_ops tegra_cdev_clk_ops = {
1129 .init = &tegra2_cdev_clk_init,
1130 .enable = &tegra2_cdev_clk_enable,
1131 .disable = &tegra2_cdev_clk_disable,
1132};
1133
Colin Crossd8611962010-01-28 16:40:29 -08001134/* Clock definitions */
1135static struct clk tegra_clk_32k = {
1136 .name = "clk_32k",
Colin Cross71fc84c2010-06-07 20:49:46 -07001137 .rate = 32768,
Colin Crossd8611962010-01-28 16:40:29 -08001138 .ops = NULL,
Colin Cross71fc84c2010-06-07 20:49:46 -07001139 .max_rate = 32768,
Colin Crossd8611962010-01-28 16:40:29 -08001140};
1141
1142static struct clk_pll_table tegra_pll_s_table[] = {
1143 {32768, 12000000, 366, 1, 1, 0},
1144 {32768, 13000000, 397, 1, 1, 0},
1145 {32768, 19200000, 586, 1, 1, 0},
1146 {32768, 26000000, 793, 1, 1, 0},
1147 {0, 0, 0, 0, 0, 0},
1148};
1149
1150static struct clk tegra_pll_s = {
1151 .name = "pll_s",
1152 .flags = PLL_ALT_MISC_REG,
1153 .ops = &tegra_pll_ops,
1154 .reg = 0xf0,
1155 .input_min = 32768,
1156 .input_max = 32768,
1157 .parent = &tegra_clk_32k,
1158 .cf_min = 0, /* FIXME */
1159 .cf_max = 0, /* FIXME */
1160 .vco_min = 12000000,
1161 .vco_max = 26000000,
1162 .pll_table = tegra_pll_s_table,
Colin Cross71fc84c2010-06-07 20:49:46 -07001163 .max_rate = 26000000,
Colin Cross35c47c32010-09-16 14:59:49 -07001164 .pll_lock_delay = 300,
Colin Crossd8611962010-01-28 16:40:29 -08001165};
1166
1167static struct clk_mux_sel tegra_clk_m_sel[] = {
1168 { .input = &tegra_clk_32k, .value = 0},
1169 { .input = &tegra_pll_s, .value = 1},
1170 { 0, 0},
1171};
1172static struct clk tegra_clk_m = {
1173 .name = "clk_m",
1174 .flags = ENABLE_ON_INIT,
1175 .ops = &tegra_clk_m_ops,
1176 .inputs = tegra_clk_m_sel,
1177 .reg = 0x1fc,
1178 .reg_mask = (1<<28),
1179 .reg_shift = 28,
Colin Cross71fc84c2010-06-07 20:49:46 -07001180 .max_rate = 26000000,
Colin Crossd8611962010-01-28 16:40:29 -08001181};
1182
1183static struct clk_pll_table tegra_pll_c_table[] = {
1184 { 0, 0, 0, 0, 0, 0 },
1185};
1186
1187static struct clk tegra_pll_c = {
1188 .name = "pll_c",
1189 .flags = PLL_HAS_CPCON,
1190 .ops = &tegra_pll_ops,
1191 .reg = 0x80,
1192 .input_min = 2000000,
1193 .input_max = 31000000,
1194 .parent = &tegra_clk_m,
1195 .cf_min = 1000000,
1196 .cf_max = 6000000,
1197 .vco_min = 20000000,
1198 .vco_max = 1400000000,
1199 .pll_table = tegra_pll_c_table,
Colin Cross71fc84c2010-06-07 20:49:46 -07001200 .max_rate = 600000000,
Colin Cross35c47c32010-09-16 14:59:49 -07001201 .pll_lock_delay = 300,
Colin Crossd8611962010-01-28 16:40:29 -08001202};
1203
1204static struct clk tegra_pll_c_out1 = {
1205 .name = "pll_c_out1",
1206 .ops = &tegra_pll_div_ops,
1207 .flags = DIV_U71,
1208 .parent = &tegra_pll_c,
1209 .reg = 0x84,
1210 .reg_shift = 0,
Colin Cross71fc84c2010-06-07 20:49:46 -07001211 .max_rate = 600000000,
Colin Crossd8611962010-01-28 16:40:29 -08001212};
1213
1214static struct clk_pll_table tegra_pll_m_table[] = {
Colin Cross71fc84c2010-06-07 20:49:46 -07001215 { 12000000, 666000000, 666, 12, 1, 8},
1216 { 13000000, 666000000, 666, 13, 1, 8},
1217 { 19200000, 666000000, 555, 16, 1, 8},
1218 { 26000000, 666000000, 666, 26, 1, 8},
1219 { 12000000, 600000000, 600, 12, 1, 8},
1220 { 13000000, 600000000, 600, 13, 1, 8},
1221 { 19200000, 600000000, 375, 12, 1, 6},
1222 { 26000000, 600000000, 600, 26, 1, 8},
Colin Crossd8611962010-01-28 16:40:29 -08001223 { 0, 0, 0, 0, 0, 0 },
1224};
1225
1226static struct clk tegra_pll_m = {
1227 .name = "pll_m",
1228 .flags = PLL_HAS_CPCON,
1229 .ops = &tegra_pll_ops,
1230 .reg = 0x90,
1231 .input_min = 2000000,
1232 .input_max = 31000000,
1233 .parent = &tegra_clk_m,
1234 .cf_min = 1000000,
1235 .cf_max = 6000000,
1236 .vco_min = 20000000,
1237 .vco_max = 1200000000,
1238 .pll_table = tegra_pll_m_table,
Colin Cross71fc84c2010-06-07 20:49:46 -07001239 .max_rate = 800000000,
Colin Cross35c47c32010-09-16 14:59:49 -07001240 .pll_lock_delay = 300,
Colin Crossd8611962010-01-28 16:40:29 -08001241};
1242
1243static struct clk tegra_pll_m_out1 = {
1244 .name = "pll_m_out1",
1245 .ops = &tegra_pll_div_ops,
1246 .flags = DIV_U71,
1247 .parent = &tegra_pll_m,
1248 .reg = 0x94,
1249 .reg_shift = 0,
Colin Cross71fc84c2010-06-07 20:49:46 -07001250 .max_rate = 600000000,
Colin Crossd8611962010-01-28 16:40:29 -08001251};
1252
1253static struct clk_pll_table tegra_pll_p_table[] = {
1254 { 12000000, 216000000, 432, 12, 2, 8},
1255 { 13000000, 216000000, 432, 13, 2, 8},
1256 { 19200000, 216000000, 90, 4, 2, 1},
1257 { 26000000, 216000000, 432, 26, 2, 8},
1258 { 12000000, 432000000, 432, 12, 1, 8},
1259 { 13000000, 432000000, 432, 13, 1, 8},
1260 { 19200000, 432000000, 90, 4, 1, 1},
1261 { 26000000, 432000000, 432, 26, 1, 8},
1262 { 0, 0, 0, 0, 0, 0 },
1263};
1264
1265static struct clk tegra_pll_p = {
1266 .name = "pll_p",
1267 .flags = ENABLE_ON_INIT | PLL_FIXED | PLL_HAS_CPCON,
1268 .ops = &tegra_pll_ops,
1269 .reg = 0xa0,
1270 .input_min = 2000000,
1271 .input_max = 31000000,
1272 .parent = &tegra_clk_m,
1273 .cf_min = 1000000,
1274 .cf_max = 6000000,
1275 .vco_min = 20000000,
1276 .vco_max = 1400000000,
1277 .pll_table = tegra_pll_p_table,
Colin Cross71fc84c2010-06-07 20:49:46 -07001278 .max_rate = 432000000,
Colin Cross35c47c32010-09-16 14:59:49 -07001279 .pll_lock_delay = 300,
Colin Crossd8611962010-01-28 16:40:29 -08001280};
1281
1282static struct clk tegra_pll_p_out1 = {
1283 .name = "pll_p_out1",
1284 .ops = &tegra_pll_div_ops,
1285 .flags = ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED,
1286 .parent = &tegra_pll_p,
1287 .reg = 0xa4,
1288 .reg_shift = 0,
Colin Cross71fc84c2010-06-07 20:49:46 -07001289 .max_rate = 432000000,
Colin Crossd8611962010-01-28 16:40:29 -08001290};
1291
1292static struct clk tegra_pll_p_out2 = {
1293 .name = "pll_p_out2",
1294 .ops = &tegra_pll_div_ops,
1295 .flags = ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED,
1296 .parent = &tegra_pll_p,
1297 .reg = 0xa4,
1298 .reg_shift = 16,
Colin Cross71fc84c2010-06-07 20:49:46 -07001299 .max_rate = 432000000,
Colin Crossd8611962010-01-28 16:40:29 -08001300};
1301
1302static struct clk tegra_pll_p_out3 = {
1303 .name = "pll_p_out3",
1304 .ops = &tegra_pll_div_ops,
1305 .flags = ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED,
1306 .parent = &tegra_pll_p,
1307 .reg = 0xa8,
1308 .reg_shift = 0,
Colin Cross71fc84c2010-06-07 20:49:46 -07001309 .max_rate = 432000000,
Colin Crossd8611962010-01-28 16:40:29 -08001310};
1311
1312static struct clk tegra_pll_p_out4 = {
1313 .name = "pll_p_out4",
1314 .ops = &tegra_pll_div_ops,
1315 .flags = ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED,
1316 .parent = &tegra_pll_p,
1317 .reg = 0xa8,
1318 .reg_shift = 16,
Colin Cross71fc84c2010-06-07 20:49:46 -07001319 .max_rate = 432000000,
Colin Crossd8611962010-01-28 16:40:29 -08001320};
1321
1322static struct clk_pll_table tegra_pll_a_table[] = {
1323 { 28800000, 56448000, 49, 25, 1, 1},
1324 { 28800000, 73728000, 64, 25, 1, 1},
1325 { 28800000, 11289600, 49, 25, 1, 1},
1326 { 28800000, 12288000, 64, 25, 1, 1},
Colin Cross71fc84c2010-06-07 20:49:46 -07001327 { 28800000, 24000000, 5, 6, 1, 1},
Colin Crossd8611962010-01-28 16:40:29 -08001328 { 0, 0, 0, 0, 0, 0 },
1329};
1330
1331static struct clk tegra_pll_a = {
1332 .name = "pll_a",
1333 .flags = PLL_HAS_CPCON,
1334 .ops = &tegra_pll_ops,
1335 .reg = 0xb0,
1336 .input_min = 2000000,
1337 .input_max = 31000000,
1338 .parent = &tegra_pll_p_out1,
1339 .cf_min = 1000000,
1340 .cf_max = 6000000,
1341 .vco_min = 20000000,
1342 .vco_max = 1400000000,
1343 .pll_table = tegra_pll_a_table,
Colin Cross71fc84c2010-06-07 20:49:46 -07001344 .max_rate = 56448000,
Colin Cross35c47c32010-09-16 14:59:49 -07001345 .pll_lock_delay = 300,
Colin Crossd8611962010-01-28 16:40:29 -08001346};
1347
1348static struct clk tegra_pll_a_out0 = {
1349 .name = "pll_a_out0",
1350 .ops = &tegra_pll_div_ops,
1351 .flags = DIV_U71,
1352 .parent = &tegra_pll_a,
1353 .reg = 0xb4,
1354 .reg_shift = 0,
Colin Cross71fc84c2010-06-07 20:49:46 -07001355 .max_rate = 56448000,
Colin Crossd8611962010-01-28 16:40:29 -08001356};
1357
1358static struct clk_pll_table tegra_pll_d_table[] = {
Colin Crosscea62c82010-10-04 11:49:26 -07001359 { 12000000, 216000000, 216, 12, 1, 4},
1360 { 13000000, 216000000, 216, 13, 1, 4},
1361 { 19200000, 216000000, 135, 12, 1, 3},
1362 { 26000000, 216000000, 216, 26, 1, 4},
1363
1364 { 12000000, 594000000, 594, 12, 1, 8},
1365 { 13000000, 594000000, 594, 13, 1, 8},
1366 { 19200000, 594000000, 495, 16, 1, 8},
1367 { 26000000, 594000000, 594, 26, 1, 8},
1368
Colin Crossd8611962010-01-28 16:40:29 -08001369 { 12000000, 1000000000, 1000, 12, 1, 12},
1370 { 13000000, 1000000000, 1000, 13, 1, 12},
1371 { 19200000, 1000000000, 625, 12, 1, 8},
1372 { 26000000, 1000000000, 1000, 26, 1, 12},
Colin Crosscea62c82010-10-04 11:49:26 -07001373
Colin Crossd8611962010-01-28 16:40:29 -08001374 { 0, 0, 0, 0, 0, 0 },
1375};
1376
1377static struct clk tegra_pll_d = {
1378 .name = "pll_d",
1379 .flags = PLL_HAS_CPCON | PLLD,
1380 .ops = &tegra_pll_ops,
1381 .reg = 0xd0,
1382 .input_min = 2000000,
1383 .input_max = 40000000,
1384 .parent = &tegra_clk_m,
1385 .cf_min = 1000000,
1386 .cf_max = 6000000,
1387 .vco_min = 40000000,
1388 .vco_max = 1000000000,
1389 .pll_table = tegra_pll_d_table,
Colin Cross71fc84c2010-06-07 20:49:46 -07001390 .max_rate = 1000000000,
Colin Cross35c47c32010-09-16 14:59:49 -07001391 .pll_lock_delay = 1000,
Colin Crossd8611962010-01-28 16:40:29 -08001392};
1393
1394static struct clk tegra_pll_d_out0 = {
1395 .name = "pll_d_out0",
1396 .ops = &tegra_pll_div_ops,
1397 .flags = DIV_2 | PLLD,
1398 .parent = &tegra_pll_d,
Colin Cross71fc84c2010-06-07 20:49:46 -07001399 .max_rate = 500000000,
Colin Crossd8611962010-01-28 16:40:29 -08001400};
1401
1402static struct clk_pll_table tegra_pll_u_table[] = {
Colin Cross71fc84c2010-06-07 20:49:46 -07001403 { 12000000, 480000000, 960, 12, 2, 0},
1404 { 13000000, 480000000, 960, 13, 2, 0},
1405 { 19200000, 480000000, 200, 4, 2, 0},
1406 { 26000000, 480000000, 960, 26, 2, 0},
Colin Crossd8611962010-01-28 16:40:29 -08001407 { 0, 0, 0, 0, 0, 0 },
1408};
1409
1410static struct clk tegra_pll_u = {
1411 .name = "pll_u",
Colin Cross71fc84c2010-06-07 20:49:46 -07001412 .flags = PLLU,
Colin Crossd8611962010-01-28 16:40:29 -08001413 .ops = &tegra_pll_ops,
1414 .reg = 0xc0,
1415 .input_min = 2000000,
1416 .input_max = 40000000,
1417 .parent = &tegra_clk_m,
1418 .cf_min = 1000000,
1419 .cf_max = 6000000,
1420 .vco_min = 480000000,
1421 .vco_max = 960000000,
1422 .pll_table = tegra_pll_u_table,
Colin Cross71fc84c2010-06-07 20:49:46 -07001423 .max_rate = 480000000,
Colin Cross35c47c32010-09-16 14:59:49 -07001424 .pll_lock_delay = 1000,
Colin Crossd8611962010-01-28 16:40:29 -08001425};
1426
1427static struct clk_pll_table tegra_pll_x_table[] = {
Colin Cross71fc84c2010-06-07 20:49:46 -07001428 /* 1 GHz */
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 Cross71fc84c2010-06-07 20:49:46 -07001433
1434 /* 912 MHz */
1435 { 12000000, 912000000, 912, 12, 1, 12},
1436 { 13000000, 912000000, 912, 13, 1, 12},
1437 { 19200000, 912000000, 760, 16, 1, 8},
1438 { 26000000, 912000000, 912, 26, 1, 12},
1439
1440 /* 816 MHz */
1441 { 12000000, 816000000, 816, 12, 1, 12},
1442 { 13000000, 816000000, 816, 13, 1, 12},
1443 { 19200000, 816000000, 680, 16, 1, 8},
1444 { 26000000, 816000000, 816, 26, 1, 12},
1445
1446 /* 760 MHz */
1447 { 12000000, 760000000, 760, 12, 1, 12},
1448 { 13000000, 760000000, 760, 13, 1, 12},
1449 { 19200000, 760000000, 950, 24, 1, 8},
1450 { 26000000, 760000000, 760, 26, 1, 12},
1451
1452 /* 608 MHz */
1453 { 12000000, 608000000, 760, 12, 1, 12},
1454 { 13000000, 608000000, 760, 13, 1, 12},
1455 { 19200000, 608000000, 380, 12, 1, 8},
1456 { 26000000, 608000000, 760, 26, 1, 12},
1457
1458 /* 456 MHz */
1459 { 12000000, 456000000, 456, 12, 1, 12},
1460 { 13000000, 456000000, 456, 13, 1, 12},
1461 { 19200000, 456000000, 380, 16, 1, 8},
1462 { 26000000, 456000000, 456, 26, 1, 12},
1463
1464 /* 312 MHz */
1465 { 12000000, 312000000, 312, 12, 1, 12},
1466 { 13000000, 312000000, 312, 13, 1, 12},
1467 { 19200000, 312000000, 260, 16, 1, 8},
1468 { 26000000, 312000000, 312, 26, 1, 12},
1469
Colin Crossd8611962010-01-28 16:40:29 -08001470 { 0, 0, 0, 0, 0, 0 },
1471};
1472
1473static struct clk tegra_pll_x = {
1474 .name = "pll_x",
1475 .flags = PLL_HAS_CPCON | PLL_ALT_MISC_REG,
Colin Cross71fc84c2010-06-07 20:49:46 -07001476 .ops = &tegra_pllx_ops,
Colin Crossd8611962010-01-28 16:40:29 -08001477 .reg = 0xe0,
1478 .input_min = 2000000,
1479 .input_max = 31000000,
1480 .parent = &tegra_clk_m,
1481 .cf_min = 1000000,
1482 .cf_max = 6000000,
1483 .vco_min = 20000000,
1484 .vco_max = 1200000000,
1485 .pll_table = tegra_pll_x_table,
Colin Cross71fc84c2010-06-07 20:49:46 -07001486 .max_rate = 1000000000,
Colin Cross35c47c32010-09-16 14:59:49 -07001487 .pll_lock_delay = 300,
Colin Crossd8611962010-01-28 16:40:29 -08001488};
1489
Mike Rapoport8d685bc2010-09-27 11:26:32 +02001490static struct clk_pll_table tegra_pll_e_table[] = {
1491 { 12000000, 100000000, 200, 24, 1, 0 },
1492 { 0, 0, 0, 0, 0, 0 },
1493};
1494
1495static struct clk tegra_pll_e = {
1496 .name = "pll_e",
1497 .flags = PLL_ALT_MISC_REG,
1498 .ops = &tegra_plle_ops,
1499 .input_min = 12000000,
1500 .input_max = 12000000,
1501 .max_rate = 100000000,
1502 .parent = &tegra_clk_m,
1503 .reg = 0xe8,
1504 .pll_table = tegra_pll_e_table,
1505};
1506
Colin Crossd8611962010-01-28 16:40:29 -08001507static struct clk tegra_clk_d = {
1508 .name = "clk_d",
1509 .flags = PERIPH_NO_RESET,
1510 .ops = &tegra_clk_double_ops,
1511 .clk_num = 90,
1512 .reg = 0x34,
1513 .reg_shift = 12,
1514 .parent = &tegra_clk_m,
Colin Cross71fc84c2010-06-07 20:49:46 -07001515 .max_rate = 52000000,
Colin Crossd8611962010-01-28 16:40:29 -08001516};
1517
Colin Crosscea62c82010-10-04 11:49:26 -07001518/* dap_mclk1, belongs to the cdev1 pingroup. */
1519static struct clk tegra_dev1_clk = {
1520 .name = "clk_dev1",
1521 .ops = &tegra_cdev_clk_ops,
1522 .clk_num = 94,
1523 .rate = 26000000,
1524 .max_rate = 26000000,
1525};
1526
1527/* dap_mclk2, belongs to the cdev2 pingroup. */
1528static struct clk tegra_dev2_clk = {
1529 .name = "clk_dev2",
1530 .ops = &tegra_cdev_clk_ops,
1531 .clk_num = 93,
1532 .rate = 26000000,
1533 .max_rate = 26000000,
1534};
1535
Colin Cross71fc84c2010-06-07 20:49:46 -07001536/* initialized before peripheral clocks */
1537static struct clk_mux_sel mux_audio_sync_clk[8+1];
1538static const struct audio_sources {
1539 const char *name;
1540 int value;
1541} mux_audio_sync_clk_sources[] = {
1542 { .name = "spdif_in", .value = 0 },
1543 { .name = "i2s1", .value = 1 },
1544 { .name = "i2s2", .value = 2 },
1545 { .name = "pll_a_out0", .value = 4 },
1546#if 0 /* FIXME: not implemented */
1547 { .name = "ac97", .value = 3 },
1548 { .name = "ext_audio_clk2", .value = 5 },
1549 { .name = "ext_audio_clk1", .value = 6 },
1550 { .name = "ext_vimclk", .value = 7 },
1551#endif
1552 { 0, 0 }
1553};
1554
1555static struct clk tegra_clk_audio = {
1556 .name = "audio",
1557 .inputs = mux_audio_sync_clk,
1558 .reg = 0x38,
1559 .max_rate = 24000000,
1560 .ops = &tegra_audio_sync_clk_ops
1561};
1562
Colin Crossd8611962010-01-28 16:40:29 -08001563static struct clk tegra_clk_audio_2x = {
Colin Cross71fc84c2010-06-07 20:49:46 -07001564 .name = "audio_2x",
Colin Crossd8611962010-01-28 16:40:29 -08001565 .flags = PERIPH_NO_RESET,
Colin Cross71fc84c2010-06-07 20:49:46 -07001566 .max_rate = 48000000,
Colin Crossd8611962010-01-28 16:40:29 -08001567 .ops = &tegra_clk_double_ops,
1568 .clk_num = 89,
1569 .reg = 0x34,
1570 .reg_shift = 8,
Colin Cross71fc84c2010-06-07 20:49:46 -07001571 .parent = &tegra_clk_audio,
1572};
1573
1574struct clk_lookup tegra_audio_clk_lookups[] = {
1575 { .con_id = "audio", .clk = &tegra_clk_audio },
1576 { .con_id = "audio_2x", .clk = &tegra_clk_audio_2x }
1577};
1578
1579/* This is called after peripheral clocks are initialized, as the
1580 * audio_sync clock depends on some of the peripheral clocks.
1581 */
1582
1583static void init_audio_sync_clock_mux(void)
1584{
1585 int i;
1586 struct clk_mux_sel *sel = mux_audio_sync_clk;
1587 const struct audio_sources *src = mux_audio_sync_clk_sources;
1588 struct clk_lookup *lookup;
1589
1590 for (i = 0; src->name; i++, sel++, src++) {
1591 sel->input = tegra_get_clock_by_name(src->name);
1592 if (!sel->input)
1593 pr_err("%s: could not find clk %s\n", __func__,
1594 src->name);
1595 sel->value = src->value;
1596 }
1597
1598 lookup = tegra_audio_clk_lookups;
1599 for (i = 0; i < ARRAY_SIZE(tegra_audio_clk_lookups); i++, lookup++) {
1600 clk_init(lookup->clk);
1601 clkdev_add(lookup);
1602 }
Colin Crossd8611962010-01-28 16:40:29 -08001603}
Colin Crossd8611962010-01-28 16:40:29 -08001604
1605static struct clk_mux_sel mux_cclk[] = {
1606 { .input = &tegra_clk_m, .value = 0},
1607 { .input = &tegra_pll_c, .value = 1},
1608 { .input = &tegra_clk_32k, .value = 2},
1609 { .input = &tegra_pll_m, .value = 3},
1610 { .input = &tegra_pll_p, .value = 4},
1611 { .input = &tegra_pll_p_out4, .value = 5},
1612 { .input = &tegra_pll_p_out3, .value = 6},
1613 { .input = &tegra_clk_d, .value = 7},
1614 { .input = &tegra_pll_x, .value = 8},
1615 { 0, 0},
1616};
1617
1618static struct clk_mux_sel mux_sclk[] = {
1619 { .input = &tegra_clk_m, .value = 0},
1620 { .input = &tegra_pll_c_out1, .value = 1},
1621 { .input = &tegra_pll_p_out4, .value = 2},
1622 { .input = &tegra_pll_p_out3, .value = 3},
1623 { .input = &tegra_pll_p_out2, .value = 4},
1624 { .input = &tegra_clk_d, .value = 5},
1625 { .input = &tegra_clk_32k, .value = 6},
1626 { .input = &tegra_pll_m_out1, .value = 7},
1627 { 0, 0},
1628};
1629
Colin Cross71fc84c2010-06-07 20:49:46 -07001630static struct clk tegra_clk_cclk = {
1631 .name = "cclk",
Colin Crossd8611962010-01-28 16:40:29 -08001632 .inputs = mux_cclk,
1633 .reg = 0x20,
1634 .ops = &tegra_super_ops,
Colin Cross71fc84c2010-06-07 20:49:46 -07001635 .max_rate = 1000000000,
Colin Crossd8611962010-01-28 16:40:29 -08001636};
1637
Colin Cross71fc84c2010-06-07 20:49:46 -07001638static struct clk tegra_clk_sclk = {
1639 .name = "sclk",
Colin Crossd8611962010-01-28 16:40:29 -08001640 .inputs = mux_sclk,
1641 .reg = 0x28,
1642 .ops = &tegra_super_ops,
Colin Cross71fc84c2010-06-07 20:49:46 -07001643 .max_rate = 600000000,
1644};
1645
1646static struct clk tegra_clk_virtual_cpu = {
1647 .name = "cpu",
1648 .parent = &tegra_clk_cclk,
1649 .main = &tegra_pll_x,
Colin Crosscea62c82010-10-04 11:49:26 -07001650 .backup = &tegra_pll_p,
Colin Cross71fc84c2010-06-07 20:49:46 -07001651 .ops = &tegra_cpu_ops,
1652 .max_rate = 1000000000,
1653 .dvfs = &tegra_dvfs_virtual_cpu_dvfs,
Colin Crossd8611962010-01-28 16:40:29 -08001654};
1655
1656static struct clk tegra_clk_hclk = {
1657 .name = "hclk",
1658 .flags = DIV_BUS,
Colin Cross71fc84c2010-06-07 20:49:46 -07001659 .parent = &tegra_clk_sclk,
Colin Crossd8611962010-01-28 16:40:29 -08001660 .reg = 0x30,
1661 .reg_shift = 4,
1662 .ops = &tegra_bus_ops,
Colin Cross71fc84c2010-06-07 20:49:46 -07001663 .max_rate = 240000000,
Colin Crossd8611962010-01-28 16:40:29 -08001664};
1665
1666static struct clk tegra_clk_pclk = {
1667 .name = "pclk",
1668 .flags = DIV_BUS,
1669 .parent = &tegra_clk_hclk,
1670 .reg = 0x30,
1671 .reg_shift = 0,
1672 .ops = &tegra_bus_ops,
Colin Cross71fc84c2010-06-07 20:49:46 -07001673 .max_rate = 108000000,
Colin Crossd8611962010-01-28 16:40:29 -08001674};
1675
Colin Crosscea62c82010-10-04 11:49:26 -07001676static struct clk tegra_clk_blink = {
1677 .name = "blink",
1678 .parent = &tegra_clk_32k,
1679 .reg = 0x40,
1680 .ops = &tegra_blink_clk_ops,
1681 .max_rate = 32768,
1682};
1683
Colin Crossd8611962010-01-28 16:40:29 -08001684static struct clk_mux_sel mux_pllm_pllc_pllp_plla[] = {
1685 { .input = &tegra_pll_m, .value = 0},
1686 { .input = &tegra_pll_c, .value = 1},
1687 { .input = &tegra_pll_p, .value = 2},
1688 { .input = &tegra_pll_a_out0, .value = 3},
1689 { 0, 0},
1690};
1691
1692static struct clk_mux_sel mux_pllm_pllc_pllp_clkm[] = {
1693 { .input = &tegra_pll_m, .value = 0},
1694 { .input = &tegra_pll_c, .value = 1},
1695 { .input = &tegra_pll_p, .value = 2},
1696 { .input = &tegra_clk_m, .value = 3},
1697 { 0, 0},
1698};
1699
1700static struct clk_mux_sel mux_pllp_pllc_pllm_clkm[] = {
1701 { .input = &tegra_pll_p, .value = 0},
1702 { .input = &tegra_pll_c, .value = 1},
1703 { .input = &tegra_pll_m, .value = 2},
1704 { .input = &tegra_clk_m, .value = 3},
1705 { 0, 0},
1706};
1707
Colin Cross71fc84c2010-06-07 20:49:46 -07001708static struct clk_mux_sel mux_pllaout0_audio2x_pllp_clkm[] = {
1709 {.input = &tegra_pll_a_out0, .value = 0},
1710 {.input = &tegra_clk_audio_2x, .value = 1},
Colin Crossd8611962010-01-28 16:40:29 -08001711 {.input = &tegra_pll_p, .value = 2},
1712 {.input = &tegra_clk_m, .value = 3},
1713 { 0, 0},
1714};
1715
1716static struct clk_mux_sel mux_pllp_plld_pllc_clkm[] = {
1717 {.input = &tegra_pll_p, .value = 0},
1718 {.input = &tegra_pll_d_out0, .value = 1},
1719 {.input = &tegra_pll_c, .value = 2},
1720 {.input = &tegra_clk_m, .value = 3},
1721 { 0, 0},
1722};
1723
1724static struct clk_mux_sel mux_pllp_pllc_audio_clkm_clk32[] = {
1725 {.input = &tegra_pll_p, .value = 0},
1726 {.input = &tegra_pll_c, .value = 1},
Colin Cross71fc84c2010-06-07 20:49:46 -07001727 {.input = &tegra_clk_audio, .value = 2},
Colin Crossd8611962010-01-28 16:40:29 -08001728 {.input = &tegra_clk_m, .value = 3},
1729 {.input = &tegra_clk_32k, .value = 4},
1730 { 0, 0},
1731};
1732
1733static struct clk_mux_sel mux_pllp_pllc_pllm[] = {
1734 {.input = &tegra_pll_p, .value = 0},
1735 {.input = &tegra_pll_c, .value = 1},
1736 {.input = &tegra_pll_m, .value = 2},
1737 { 0, 0},
1738};
1739
1740static struct clk_mux_sel mux_clk_m[] = {
1741 { .input = &tegra_clk_m, .value = 0},
1742 { 0, 0},
1743};
1744
1745static struct clk_mux_sel mux_pllp_out3[] = {
1746 { .input = &tegra_pll_p_out3, .value = 0},
1747 { 0, 0},
1748};
1749
1750static struct clk_mux_sel mux_plld[] = {
1751 { .input = &tegra_pll_d, .value = 0},
1752 { 0, 0},
1753};
1754
1755static struct clk_mux_sel mux_clk_32k[] = {
1756 { .input = &tegra_clk_32k, .value = 0},
1757 { 0, 0},
1758};
1759
Stephen Warren1ca00342011-01-05 14:32:20 -07001760static struct clk_mux_sel mux_pclk[] = {
1761 { .input = &tegra_clk_pclk, .value = 0},
1762 { 0, 0},
1763};
1764
Colin Cross71fc84c2010-06-07 20:49:46 -07001765#define PERIPH_CLK(_name, _dev, _con, _clk_num, _reg, _max, _inputs, _flags) \
Colin Crossd8611962010-01-28 16:40:29 -08001766 { \
1767 .name = _name, \
1768 .lookup = { \
1769 .dev_id = _dev, \
1770 .con_id = _con, \
1771 }, \
1772 .ops = &tegra_periph_clk_ops, \
1773 .clk_num = _clk_num, \
1774 .reg = _reg, \
1775 .inputs = _inputs, \
1776 .flags = _flags, \
Colin Cross71fc84c2010-06-07 20:49:46 -07001777 .max_rate = _max, \
Colin Crossd8611962010-01-28 16:40:29 -08001778 }
1779
1780struct clk tegra_periph_clks[] = {
Stephen Warren1ca00342011-01-05 14:32:20 -07001781 PERIPH_CLK("apbdma", "tegra-dma", NULL, 34, 0, 108000000, mux_pclk, 0),
Colin Cross71fc84c2010-06-07 20:49:46 -07001782 PERIPH_CLK("rtc", "rtc-tegra", NULL, 4, 0, 32768, mux_clk_32k, PERIPH_NO_RESET),
1783 PERIPH_CLK("timer", "timer", NULL, 5, 0, 26000000, mux_clk_m, 0),
1784 PERIPH_CLK("i2s1", "i2s.0", NULL, 11, 0x100, 26000000, mux_pllaout0_audio2x_pllp_clkm, MUX | DIV_U71),
1785 PERIPH_CLK("i2s2", "i2s.1", NULL, 18, 0x104, 26000000, mux_pllaout0_audio2x_pllp_clkm, MUX | DIV_U71),
Colin Crossd8611962010-01-28 16:40:29 -08001786 /* FIXME: spdif has 2 clocks but 1 enable */
Colin Cross71fc84c2010-06-07 20:49:46 -07001787 PERIPH_CLK("spdif_out", "spdif_out", NULL, 10, 0x108, 100000000, mux_pllaout0_audio2x_pllp_clkm, MUX | DIV_U71),
1788 PERIPH_CLK("spdif_in", "spdif_in", NULL, 10, 0x10c, 100000000, mux_pllp_pllc_pllm, MUX | DIV_U71),
1789 PERIPH_CLK("pwm", "pwm", NULL, 17, 0x110, 432000000, mux_pllp_pllc_audio_clkm_clk32, MUX | DIV_U71),
1790 PERIPH_CLK("spi", "spi", NULL, 43, 0x114, 40000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1791 PERIPH_CLK("xio", "xio", NULL, 45, 0x120, 150000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1792 PERIPH_CLK("twc", "twc", NULL, 16, 0x12c, 150000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1793 PERIPH_CLK("sbc1", "spi_tegra.0", NULL, 41, 0x134, 160000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1794 PERIPH_CLK("sbc2", "spi_tegra.1", NULL, 44, 0x118, 160000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1795 PERIPH_CLK("sbc3", "spi_tegra.2", NULL, 46, 0x11c, 160000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1796 PERIPH_CLK("sbc4", "spi_tegra.3", NULL, 68, 0x1b4, 160000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1797 PERIPH_CLK("ide", "ide", NULL, 25, 0x144, 100000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71), /* requires min voltage */
1798 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 -08001799 /* FIXME: vfir shares an enable with uartb */
Colin Cross71fc84c2010-06-07 20:49:46 -07001800 PERIPH_CLK("vfir", "vfir", NULL, 7, 0x168, 72000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1801 PERIPH_CLK("sdmmc1", "sdhci-tegra.0", NULL, 14, 0x150, 52000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71), /* scales with voltage */
1802 PERIPH_CLK("sdmmc2", "sdhci-tegra.1", NULL, 9, 0x154, 52000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71), /* scales with voltage */
1803 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 -07001804 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 -07001805 PERIPH_CLK("vde", "vde", NULL, 61, 0x1c8, 250000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71), /* scales with voltage and process_id */
1806 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 -08001807 /* FIXME: what is la? */
Colin Cross71fc84c2010-06-07 20:49:46 -07001808 PERIPH_CLK("la", "la", NULL, 76, 0x1f8, 26000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1809 PERIPH_CLK("owr", "tegra_w1", NULL, 71, 0x1cc, 26000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71),
1810 PERIPH_CLK("nor", "nor", NULL, 42, 0x1d0, 92000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71), /* requires min voltage */
1811 PERIPH_CLK("mipi", "mipi", NULL, 50, 0x174, 60000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U71), /* scales with voltage */
1812 PERIPH_CLK("i2c1", "tegra-i2c.0", NULL, 12, 0x124, 26000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U16),
1813 PERIPH_CLK("i2c2", "tegra-i2c.1", NULL, 54, 0x198, 26000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U16),
1814 PERIPH_CLK("i2c3", "tegra-i2c.2", NULL, 67, 0x1b8, 26000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U16),
1815 PERIPH_CLK("dvc", "tegra-i2c.3", NULL, 47, 0x128, 26000000, mux_pllp_pllc_pllm_clkm, MUX | DIV_U16),
1816 PERIPH_CLK("i2c1_i2c", "tegra-i2c.0", "i2c", 0, 0, 72000000, mux_pllp_out3, 0),
1817 PERIPH_CLK("i2c2_i2c", "tegra-i2c.1", "i2c", 0, 0, 72000000, mux_pllp_out3, 0),
1818 PERIPH_CLK("i2c3_i2c", "tegra-i2c.2", "i2c", 0, 0, 72000000, mux_pllp_out3, 0),
1819 PERIPH_CLK("dvc_i2c", "tegra-i2c.3", "i2c", 0, 0, 72000000, mux_pllp_out3, 0),
Colin Crosscea62c82010-10-04 11:49:26 -07001820 PERIPH_CLK("uarta", "uart.0", NULL, 6, 0x178, 600000000, mux_pllp_pllc_pllm_clkm, MUX),
1821 PERIPH_CLK("uartb", "uart.1", NULL, 7, 0x17c, 600000000, mux_pllp_pllc_pllm_clkm, MUX),
1822 PERIPH_CLK("uartc", "uart.2", NULL, 55, 0x1a0, 600000000, mux_pllp_pllc_pllm_clkm, MUX),
1823 PERIPH_CLK("uartd", "uart.3", NULL, 65, 0x1c0, 600000000, mux_pllp_pllc_pllm_clkm, MUX),
1824 PERIPH_CLK("uarte", "uart.4", NULL, 66, 0x1c4, 600000000, mux_pllp_pllc_pllm_clkm, MUX),
Colin Cross71fc84c2010-06-07 20:49:46 -07001825 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 */
1826 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 -08001827 /* FIXME: vi and vi_sensor share an enable */
Colin Crosscea62c82010-10-04 11:49:26 -07001828 PERIPH_CLK("vi", "tegra_camera", "vi", 20, 0x148, 150000000, mux_pllm_pllc_pllp_plla, MUX | DIV_U71), /* scales with voltage and process_id */
1829 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 -07001830 PERIPH_CLK("epp", "epp", NULL, 19, 0x16c, 300000000, mux_pllm_pllc_pllp_plla, MUX | DIV_U71), /* scales with voltage and process_id */
1831 PERIPH_CLK("mpe", "mpe", NULL, 60, 0x170, 250000000, mux_pllm_pllc_pllp_plla, MUX | DIV_U71), /* scales with voltage and process_id */
1832 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 -08001833 /* FIXME: cve and tvo share an enable */
Colin Cross71fc84c2010-06-07 20:49:46 -07001834 PERIPH_CLK("cve", "cve", NULL, 49, 0x140, 250000000, mux_pllp_plld_pllc_clkm, MUX | DIV_U71), /* requires min voltage */
1835 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 -07001836 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 -07001837 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 -07001838 PERIPH_CLK("disp1", "tegradc.0", NULL, 27, 0x138, 600000000, mux_pllp_plld_pllc_clkm, MUX | DIV_U71), /* scales with voltage and process_id */
1839 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 -07001840 PERIPH_CLK("usbd", "fsl-tegra-udc", NULL, 22, 0, 480000000, mux_clk_m, 0), /* requires min voltage */
1841 PERIPH_CLK("usb2", "tegra-ehci.1", NULL, 58, 0, 480000000, mux_clk_m, 0), /* requires min voltage */
1842 PERIPH_CLK("usb3", "tegra-ehci.2", NULL, 59, 0, 480000000, mux_clk_m, 0), /* requires min voltage */
1843 PERIPH_CLK("emc", "emc", NULL, 57, 0x19c, 800000000, mux_pllm_pllc_pllp_clkm, MUX | DIV_U71 | PERIPH_EMC_ENB),
1844 PERIPH_CLK("dsi", "dsi", NULL, 48, 0, 500000000, mux_plld, 0), /* scales with voltage */
Colin Crosscea62c82010-10-04 11:49:26 -07001845 PERIPH_CLK("csi", "tegra_camera", "csi", 52, 0, 72000000, mux_pllp_out3, 0),
1846 PERIPH_CLK("isp", "tegra_camera", "isp", 23, 0, 150000000, mux_clk_m, 0), /* same frequency as VI */
1847 PERIPH_CLK("csus", "tegra_camera", "csus", 92, 0, 150000000, mux_clk_m, PERIPH_NO_RESET),
Mike Rapoport8d685bc2010-09-27 11:26:32 +02001848 PERIPH_CLK("pex", NULL, "pex", 70, 0, 26000000, mux_clk_m, PERIPH_MANUAL_RESET),
1849 PERIPH_CLK("afi", NULL, "afi", 72, 0, 26000000, mux_clk_m, PERIPH_MANUAL_RESET),
1850 PERIPH_CLK("pcie_xclk", NULL, "pcie_xclk", 74, 0, 26000000, mux_clk_m, PERIPH_MANUAL_RESET),
Colin Crossd8611962010-01-28 16:40:29 -08001851};
1852
1853#define CLK_DUPLICATE(_name, _dev, _con) \
1854 { \
1855 .name = _name, \
1856 .lookup = { \
1857 .dev_id = _dev, \
1858 .con_id = _con, \
1859 }, \
1860 }
1861
1862/* Some clocks may be used by different drivers depending on the board
1863 * configuration. List those here to register them twice in the clock lookup
1864 * table under two names.
1865 */
1866struct clk_duplicate tegra_clk_duplicates[] = {
1867 CLK_DUPLICATE("uarta", "tegra_uart.0", NULL),
1868 CLK_DUPLICATE("uartb", "tegra_uart.1", NULL),
1869 CLK_DUPLICATE("uartc", "tegra_uart.2", NULL),
1870 CLK_DUPLICATE("uartd", "tegra_uart.3", NULL),
1871 CLK_DUPLICATE("uarte", "tegra_uart.4", NULL),
Colin Crosscea62c82010-10-04 11:49:26 -07001872 CLK_DUPLICATE("usbd", "utmip-pad", NULL),
Colin Cross71fc84c2010-06-07 20:49:46 -07001873 CLK_DUPLICATE("usbd", "tegra-ehci.0", NULL),
Colin Crosscea62c82010-10-04 11:49:26 -07001874 CLK_DUPLICATE("usbd", "tegra-otg", NULL),
1875 CLK_DUPLICATE("hdmi", "tegradc.0", "hdmi"),
1876 CLK_DUPLICATE("hdmi", "tegradc.1", "hdmi"),
1877 CLK_DUPLICATE("pwm", "tegra_pwm.0", NULL),
1878 CLK_DUPLICATE("pwm", "tegra_pwm.1", NULL),
1879 CLK_DUPLICATE("pwm", "tegra_pwm.2", NULL),
1880 CLK_DUPLICATE("pwm", "tegra_pwm.3", NULL),
Colin Crossd8611962010-01-28 16:40:29 -08001881};
1882
1883#define CLK(dev, con, ck) \
1884 { \
1885 .dev_id = dev, \
1886 .con_id = con, \
1887 .clk = ck, \
1888 }
1889
1890struct clk_lookup tegra_clk_lookups[] = {
1891 /* external root sources */
1892 CLK(NULL, "32k_clk", &tegra_clk_32k),
1893 CLK(NULL, "pll_s", &tegra_pll_s),
1894 CLK(NULL, "clk_m", &tegra_clk_m),
1895 CLK(NULL, "pll_m", &tegra_pll_m),
1896 CLK(NULL, "pll_m_out1", &tegra_pll_m_out1),
1897 CLK(NULL, "pll_c", &tegra_pll_c),
1898 CLK(NULL, "pll_c_out1", &tegra_pll_c_out1),
1899 CLK(NULL, "pll_p", &tegra_pll_p),
1900 CLK(NULL, "pll_p_out1", &tegra_pll_p_out1),
1901 CLK(NULL, "pll_p_out2", &tegra_pll_p_out2),
1902 CLK(NULL, "pll_p_out3", &tegra_pll_p_out3),
1903 CLK(NULL, "pll_p_out4", &tegra_pll_p_out4),
1904 CLK(NULL, "pll_a", &tegra_pll_a),
1905 CLK(NULL, "pll_a_out0", &tegra_pll_a_out0),
1906 CLK(NULL, "pll_d", &tegra_pll_d),
1907 CLK(NULL, "pll_d_out0", &tegra_pll_d_out0),
1908 CLK(NULL, "pll_u", &tegra_pll_u),
1909 CLK(NULL, "pll_x", &tegra_pll_x),
Mike Rapoport8d685bc2010-09-27 11:26:32 +02001910 CLK(NULL, "pll_e", &tegra_pll_e),
Colin Cross71fc84c2010-06-07 20:49:46 -07001911 CLK(NULL, "cclk", &tegra_clk_cclk),
1912 CLK(NULL, "sclk", &tegra_clk_sclk),
Colin Crossd8611962010-01-28 16:40:29 -08001913 CLK(NULL, "hclk", &tegra_clk_hclk),
1914 CLK(NULL, "pclk", &tegra_clk_pclk),
1915 CLK(NULL, "clk_d", &tegra_clk_d),
Colin Crosscea62c82010-10-04 11:49:26 -07001916 CLK(NULL, "clk_dev1", &tegra_dev1_clk),
1917 CLK(NULL, "clk_dev2", &tegra_dev2_clk),
Colin Cross71fc84c2010-06-07 20:49:46 -07001918 CLK(NULL, "cpu", &tegra_clk_virtual_cpu),
Colin Crosscea62c82010-10-04 11:49:26 -07001919 CLK(NULL, "blink", &tegra_clk_blink),
Colin Crossd8611962010-01-28 16:40:29 -08001920};
1921
1922void __init tegra2_init_clocks(void)
1923{
1924 int i;
1925 struct clk_lookup *cl;
1926 struct clk *c;
1927 struct clk_duplicate *cd;
1928
1929 for (i = 0; i < ARRAY_SIZE(tegra_clk_lookups); i++) {
1930 cl = &tegra_clk_lookups[i];
1931 clk_init(cl->clk);
1932 clkdev_add(cl);
1933 }
1934
1935 for (i = 0; i < ARRAY_SIZE(tegra_periph_clks); i++) {
1936 c = &tegra_periph_clks[i];
1937 cl = &c->lookup;
1938 cl->clk = c;
1939
1940 clk_init(cl->clk);
1941 clkdev_add(cl);
1942 }
1943
1944 for (i = 0; i < ARRAY_SIZE(tegra_clk_duplicates); i++) {
1945 cd = &tegra_clk_duplicates[i];
1946 c = tegra_get_clock_by_name(cd->name);
1947 if (c) {
1948 cl = &cd->lookup;
1949 cl->clk = c;
1950 clkdev_add(cl);
1951 } else {
1952 pr_err("%s: Unknown duplicate clock %s\n", __func__,
1953 cd->name);
1954 }
1955 }
Colin Cross71fc84c2010-06-07 20:49:46 -07001956
1957 init_audio_sync_clock_mux();
Colin Crossd8611962010-01-28 16:40:29 -08001958}
Colin Cross71fc84c2010-06-07 20:49:46 -07001959
1960#ifdef CONFIG_PM
1961static u32 clk_rst_suspend[RST_DEVICES_NUM + CLK_OUT_ENB_NUM +
Colin Crosscea62c82010-10-04 11:49:26 -07001962 PERIPH_CLK_SOURCE_NUM + 19];
Colin Cross71fc84c2010-06-07 20:49:46 -07001963
1964void tegra_clk_suspend(void)
1965{
1966 unsigned long off, i;
1967 u32 *ctx = clk_rst_suspend;
1968
1969 *ctx++ = clk_readl(OSC_CTRL) & OSC_CTRL_MASK;
Colin Crosscea62c82010-10-04 11:49:26 -07001970 *ctx++ = clk_readl(tegra_pll_p.reg + PLL_BASE);
1971 *ctx++ = clk_readl(tegra_pll_p.reg + PLL_MISC(&tegra_pll_p));
1972 *ctx++ = clk_readl(tegra_pll_c.reg + PLL_BASE);
1973 *ctx++ = clk_readl(tegra_pll_c.reg + PLL_MISC(&tegra_pll_c));
1974 *ctx++ = clk_readl(tegra_pll_a.reg + PLL_BASE);
1975 *ctx++ = clk_readl(tegra_pll_a.reg + PLL_MISC(&tegra_pll_a));
1976
1977 *ctx++ = clk_readl(tegra_pll_m_out1.reg);
1978 *ctx++ = clk_readl(tegra_pll_p_out1.reg);
1979 *ctx++ = clk_readl(tegra_pll_p_out3.reg);
1980 *ctx++ = clk_readl(tegra_pll_a_out0.reg);
1981 *ctx++ = clk_readl(tegra_pll_c_out1.reg);
1982
1983 *ctx++ = clk_readl(tegra_clk_cclk.reg);
1984 *ctx++ = clk_readl(tegra_clk_cclk.reg + SUPER_CLK_DIVIDER);
1985
1986 *ctx++ = clk_readl(tegra_clk_sclk.reg);
1987 *ctx++ = clk_readl(tegra_clk_sclk.reg + SUPER_CLK_DIVIDER);
1988 *ctx++ = clk_readl(tegra_clk_pclk.reg);
Colin Cross71fc84c2010-06-07 20:49:46 -07001989
1990 for (off = PERIPH_CLK_SOURCE_I2S1; off <= PERIPH_CLK_SOURCE_OSC;
1991 off += 4) {
1992 if (off == PERIPH_CLK_SOURCE_EMC)
1993 continue;
1994 *ctx++ = clk_readl(off);
1995 }
1996
1997 off = RST_DEVICES;
1998 for (i = 0; i < RST_DEVICES_NUM; i++, off += 4)
1999 *ctx++ = clk_readl(off);
2000
2001 off = CLK_OUT_ENB;
2002 for (i = 0; i < CLK_OUT_ENB_NUM; i++, off += 4)
2003 *ctx++ = clk_readl(off);
2004
2005 *ctx++ = clk_readl(MISC_CLK_ENB);
2006 *ctx++ = clk_readl(CLK_MASK_ARM);
2007}
2008
2009void tegra_clk_resume(void)
2010{
2011 unsigned long off, i;
2012 const u32 *ctx = clk_rst_suspend;
2013 u32 val;
2014
2015 val = clk_readl(OSC_CTRL) & ~OSC_CTRL_MASK;
2016 val |= *ctx++;
2017 clk_writel(val, OSC_CTRL);
2018
Colin Crosscea62c82010-10-04 11:49:26 -07002019 clk_writel(*ctx++, tegra_pll_p.reg + PLL_BASE);
2020 clk_writel(*ctx++, tegra_pll_p.reg + PLL_MISC(&tegra_pll_p));
2021 clk_writel(*ctx++, tegra_pll_c.reg + PLL_BASE);
2022 clk_writel(*ctx++, tegra_pll_c.reg + PLL_MISC(&tegra_pll_c));
2023 clk_writel(*ctx++, tegra_pll_a.reg + PLL_BASE);
2024 clk_writel(*ctx++, tegra_pll_a.reg + PLL_MISC(&tegra_pll_a));
2025 udelay(300);
2026
2027 clk_writel(*ctx++, tegra_pll_m_out1.reg);
2028 clk_writel(*ctx++, tegra_pll_p_out1.reg);
2029 clk_writel(*ctx++, tegra_pll_p_out3.reg);
2030 clk_writel(*ctx++, tegra_pll_a_out0.reg);
2031 clk_writel(*ctx++, tegra_pll_c_out1.reg);
2032
2033 clk_writel(*ctx++, tegra_clk_cclk.reg);
2034 clk_writel(*ctx++, tegra_clk_cclk.reg + SUPER_CLK_DIVIDER);
2035
2036 clk_writel(*ctx++, tegra_clk_sclk.reg);
2037 clk_writel(*ctx++, tegra_clk_sclk.reg + SUPER_CLK_DIVIDER);
2038 clk_writel(*ctx++, tegra_clk_pclk.reg);
2039
Colin Cross71fc84c2010-06-07 20:49:46 -07002040 /* enable all clocks before configuring clock sources */
2041 clk_writel(0xbffffff9ul, CLK_OUT_ENB);
2042 clk_writel(0xfefffff7ul, CLK_OUT_ENB + 4);
2043 clk_writel(0x77f01bfful, CLK_OUT_ENB + 8);
2044 wmb();
2045
2046 for (off = PERIPH_CLK_SOURCE_I2S1; off <= PERIPH_CLK_SOURCE_OSC;
2047 off += 4) {
2048 if (off == PERIPH_CLK_SOURCE_EMC)
2049 continue;
2050 clk_writel(*ctx++, off);
2051 }
2052 wmb();
2053
2054 off = RST_DEVICES;
2055 for (i = 0; i < RST_DEVICES_NUM; i++, off += 4)
2056 clk_writel(*ctx++, off);
2057 wmb();
2058
2059 off = CLK_OUT_ENB;
2060 for (i = 0; i < CLK_OUT_ENB_NUM; i++, off += 4)
2061 clk_writel(*ctx++, off);
2062 wmb();
2063
2064 clk_writel(*ctx++, MISC_CLK_ENB);
2065 clk_writel(*ctx++, CLK_MASK_ARM);
2066}
2067#endif