diff options
author | Peter De Schrijver <pdeschrijver@nvidia.com> | 2013-10-04 10:28:34 -0400 |
---|---|---|
committer | Peter De Schrijver <pdeschrijver@nvidia.com> | 2013-11-26 11:46:22 -0500 |
commit | ebe142b2ad35d5656caae35d5deefdbebe847d3b (patch) | |
tree | a083b7ced3074d874fe9ac40b9311b9a1fae9054 | |
parent | 8e9cc80aa348938078c3c1a7ab55efb3c40990e3 (diff) |
clk: tegra: move fields to tegra_clk_pll_params
Move some fields related to the PLL HW description to the tegra_clk_pll_params.
This allows some PLL code to be moved to common files later.
Signed-off-by: Peter De Schrijver <pdeschrijver@nvidia.com>
-rw-r--r-- | drivers/clk/tegra/clk-pll.c | 138 | ||||
-rw-r--r-- | drivers/clk/tegra/clk-tegra114.c | 74 | ||||
-rw-r--r-- | drivers/clk/tegra/clk-tegra20.c | 44 | ||||
-rw-r--r-- | drivers/clk/tegra/clk-tegra30.c | 62 | ||||
-rw-r--r-- | drivers/clk/tegra/clk.h | 34 |
5 files changed, 175 insertions, 177 deletions
diff --git a/drivers/clk/tegra/clk-pll.c b/drivers/clk/tegra/clk-pll.c index 48f6bffc1cee..3aa85bf2f425 100644 --- a/drivers/clk/tegra/clk-pll.c +++ b/drivers/clk/tegra/clk-pll.c | |||
@@ -150,7 +150,7 @@ | |||
150 | #define mask(w) ((1 << (w)) - 1) | 150 | #define mask(w) ((1 << (w)) - 1) |
151 | #define divm_mask(p) mask(p->params->div_nmp->divm_width) | 151 | #define divm_mask(p) mask(p->params->div_nmp->divm_width) |
152 | #define divn_mask(p) mask(p->params->div_nmp->divn_width) | 152 | #define divn_mask(p) mask(p->params->div_nmp->divn_width) |
153 | #define divp_mask(p) (p->flags & TEGRA_PLLU ? PLLU_POST_DIVP_MASK : \ | 153 | #define divp_mask(p) (p->params->flags & TEGRA_PLLU ? PLLU_POST_DIVP_MASK :\ |
154 | mask(p->params->div_nmp->divp_width)) | 154 | mask(p->params->div_nmp->divp_width)) |
155 | 155 | ||
156 | #define divm_max(p) (divm_mask(p)) | 156 | #define divm_max(p) (divm_mask(p)) |
@@ -170,10 +170,10 @@ static void clk_pll_enable_lock(struct tegra_clk_pll *pll) | |||
170 | { | 170 | { |
171 | u32 val; | 171 | u32 val; |
172 | 172 | ||
173 | if (!(pll->flags & TEGRA_PLL_USE_LOCK)) | 173 | if (!(pll->params->flags & TEGRA_PLL_USE_LOCK)) |
174 | return; | 174 | return; |
175 | 175 | ||
176 | if (!(pll->flags & TEGRA_PLL_HAS_LOCK_ENABLE)) | 176 | if (!(pll->params->flags & TEGRA_PLL_HAS_LOCK_ENABLE)) |
177 | return; | 177 | return; |
178 | 178 | ||
179 | val = pll_readl_misc(pll); | 179 | val = pll_readl_misc(pll); |
@@ -187,13 +187,13 @@ static int clk_pll_wait_for_lock(struct tegra_clk_pll *pll) | |||
187 | u32 val, lock_mask; | 187 | u32 val, lock_mask; |
188 | void __iomem *lock_addr; | 188 | void __iomem *lock_addr; |
189 | 189 | ||
190 | if (!(pll->flags & TEGRA_PLL_USE_LOCK)) { | 190 | if (!(pll->params->flags & TEGRA_PLL_USE_LOCK)) { |
191 | udelay(pll->params->lock_delay); | 191 | udelay(pll->params->lock_delay); |
192 | return 0; | 192 | return 0; |
193 | } | 193 | } |
194 | 194 | ||
195 | lock_addr = pll->clk_base; | 195 | lock_addr = pll->clk_base; |
196 | if (pll->flags & TEGRA_PLL_LOCK_MISC) | 196 | if (pll->params->flags & TEGRA_PLL_LOCK_MISC) |
197 | lock_addr += pll->params->misc_reg; | 197 | lock_addr += pll->params->misc_reg; |
198 | else | 198 | else |
199 | lock_addr += pll->params->base_reg; | 199 | lock_addr += pll->params->base_reg; |
@@ -220,7 +220,7 @@ static int clk_pll_is_enabled(struct clk_hw *hw) | |||
220 | struct tegra_clk_pll *pll = to_clk_pll(hw); | 220 | struct tegra_clk_pll *pll = to_clk_pll(hw); |
221 | u32 val; | 221 | u32 val; |
222 | 222 | ||
223 | if (pll->flags & TEGRA_PLLM) { | 223 | if (pll->params->flags & TEGRA_PLLM) { |
224 | val = readl_relaxed(pll->pmc + PMC_PLLP_WB0_OVERRIDE); | 224 | val = readl_relaxed(pll->pmc + PMC_PLLP_WB0_OVERRIDE); |
225 | if (val & PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE) | 225 | if (val & PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE) |
226 | return val & PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE ? 1 : 0; | 226 | return val & PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE ? 1 : 0; |
@@ -239,12 +239,12 @@ static void _clk_pll_enable(struct clk_hw *hw) | |||
239 | clk_pll_enable_lock(pll); | 239 | clk_pll_enable_lock(pll); |
240 | 240 | ||
241 | val = pll_readl_base(pll); | 241 | val = pll_readl_base(pll); |
242 | if (pll->flags & TEGRA_PLL_BYPASS) | 242 | if (pll->params->flags & TEGRA_PLL_BYPASS) |
243 | val &= ~PLL_BASE_BYPASS; | 243 | val &= ~PLL_BASE_BYPASS; |
244 | val |= PLL_BASE_ENABLE; | 244 | val |= PLL_BASE_ENABLE; |
245 | pll_writel_base(val, pll); | 245 | pll_writel_base(val, pll); |
246 | 246 | ||
247 | if (pll->flags & TEGRA_PLLM) { | 247 | if (pll->params->flags & TEGRA_PLLM) { |
248 | val = readl_relaxed(pll->pmc + PMC_PLLP_WB0_OVERRIDE); | 248 | val = readl_relaxed(pll->pmc + PMC_PLLP_WB0_OVERRIDE); |
249 | val |= PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE; | 249 | val |= PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE; |
250 | writel_relaxed(val, pll->pmc + PMC_PLLP_WB0_OVERRIDE); | 250 | writel_relaxed(val, pll->pmc + PMC_PLLP_WB0_OVERRIDE); |
@@ -257,12 +257,12 @@ static void _clk_pll_disable(struct clk_hw *hw) | |||
257 | u32 val; | 257 | u32 val; |
258 | 258 | ||
259 | val = pll_readl_base(pll); | 259 | val = pll_readl_base(pll); |
260 | if (pll->flags & TEGRA_PLL_BYPASS) | 260 | if (pll->params->flags & TEGRA_PLL_BYPASS) |
261 | val &= ~PLL_BASE_BYPASS; | 261 | val &= ~PLL_BASE_BYPASS; |
262 | val &= ~PLL_BASE_ENABLE; | 262 | val &= ~PLL_BASE_ENABLE; |
263 | pll_writel_base(val, pll); | 263 | pll_writel_base(val, pll); |
264 | 264 | ||
265 | if (pll->flags & TEGRA_PLLM) { | 265 | if (pll->params->flags & TEGRA_PLLM) { |
266 | val = readl_relaxed(pll->pmc + PMC_PLLP_WB0_OVERRIDE); | 266 | val = readl_relaxed(pll->pmc + PMC_PLLP_WB0_OVERRIDE); |
267 | val &= ~PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE; | 267 | val &= ~PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE; |
268 | writel_relaxed(val, pll->pmc + PMC_PLLP_WB0_OVERRIDE); | 268 | writel_relaxed(val, pll->pmc + PMC_PLLP_WB0_OVERRIDE); |
@@ -342,7 +342,7 @@ static int _get_table_rate(struct clk_hw *hw, | |||
342 | struct tegra_clk_pll *pll = to_clk_pll(hw); | 342 | struct tegra_clk_pll *pll = to_clk_pll(hw); |
343 | struct tegra_clk_pll_freq_table *sel; | 343 | struct tegra_clk_pll_freq_table *sel; |
344 | 344 | ||
345 | for (sel = pll->freq_table; sel->input_rate != 0; sel++) | 345 | for (sel = pll->params->freq_table; sel->input_rate != 0; sel++) |
346 | if (sel->input_rate == parent_rate && | 346 | if (sel->input_rate == parent_rate && |
347 | sel->output_rate == rate) | 347 | sel->output_rate == rate) |
348 | break; | 348 | break; |
@@ -432,7 +432,7 @@ static void _update_pll_mnp(struct tegra_clk_pll *pll, | |||
432 | struct tegra_clk_pll_params *params = pll->params; | 432 | struct tegra_clk_pll_params *params = pll->params; |
433 | struct div_nmp *div_nmp = params->div_nmp; | 433 | struct div_nmp *div_nmp = params->div_nmp; |
434 | 434 | ||
435 | if ((pll->flags & TEGRA_PLLM) && | 435 | if ((params->flags & TEGRA_PLLM) && |
436 | (pll_override_readl(PMC_PLLP_WB0_OVERRIDE, pll) & | 436 | (pll_override_readl(PMC_PLLP_WB0_OVERRIDE, pll) & |
437 | PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE)) { | 437 | PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE)) { |
438 | val = pll_override_readl(params->pmc_divp_reg, pll); | 438 | val = pll_override_readl(params->pmc_divp_reg, pll); |
@@ -468,7 +468,7 @@ static void _get_pll_mnp(struct tegra_clk_pll *pll, | |||
468 | struct tegra_clk_pll_params *params = pll->params; | 468 | struct tegra_clk_pll_params *params = pll->params; |
469 | struct div_nmp *div_nmp = params->div_nmp; | 469 | struct div_nmp *div_nmp = params->div_nmp; |
470 | 470 | ||
471 | if ((pll->flags & TEGRA_PLLM) && | 471 | if ((params->flags & TEGRA_PLLM) && |
472 | (pll_override_readl(PMC_PLLP_WB0_OVERRIDE, pll) & | 472 | (pll_override_readl(PMC_PLLP_WB0_OVERRIDE, pll) & |
473 | PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE)) { | 473 | PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE)) { |
474 | val = pll_override_readl(params->pmc_divp_reg, pll); | 474 | val = pll_override_readl(params->pmc_divp_reg, pll); |
@@ -497,11 +497,11 @@ static void _update_pll_cpcon(struct tegra_clk_pll *pll, | |||
497 | val &= ~(PLL_MISC_CPCON_MASK << PLL_MISC_CPCON_SHIFT); | 497 | val &= ~(PLL_MISC_CPCON_MASK << PLL_MISC_CPCON_SHIFT); |
498 | val |= cfg->cpcon << PLL_MISC_CPCON_SHIFT; | 498 | val |= cfg->cpcon << PLL_MISC_CPCON_SHIFT; |
499 | 499 | ||
500 | if (pll->flags & TEGRA_PLL_SET_LFCON) { | 500 | if (pll->params->flags & TEGRA_PLL_SET_LFCON) { |
501 | val &= ~(PLL_MISC_LFCON_MASK << PLL_MISC_LFCON_SHIFT); | 501 | val &= ~(PLL_MISC_LFCON_MASK << PLL_MISC_LFCON_SHIFT); |
502 | if (cfg->n >= PLLDU_LFCON_SET_DIVN) | 502 | if (cfg->n >= PLLDU_LFCON_SET_DIVN) |
503 | val |= 1 << PLL_MISC_LFCON_SHIFT; | 503 | val |= 1 << PLL_MISC_LFCON_SHIFT; |
504 | } else if (pll->flags & TEGRA_PLL_SET_DCCON) { | 504 | } else if (pll->params->flags & TEGRA_PLL_SET_DCCON) { |
505 | val &= ~(1 << PLL_MISC_DCCON_SHIFT); | 505 | val &= ~(1 << PLL_MISC_DCCON_SHIFT); |
506 | if (rate >= (pll->params->vco_max >> 1)) | 506 | if (rate >= (pll->params->vco_max >> 1)) |
507 | val |= 1 << PLL_MISC_DCCON_SHIFT; | 507 | val |= 1 << PLL_MISC_DCCON_SHIFT; |
@@ -523,7 +523,7 @@ static int _program_pll(struct clk_hw *hw, struct tegra_clk_pll_freq_table *cfg, | |||
523 | 523 | ||
524 | _update_pll_mnp(pll, cfg); | 524 | _update_pll_mnp(pll, cfg); |
525 | 525 | ||
526 | if (pll->flags & TEGRA_PLL_HAS_CPCON) | 526 | if (pll->params->flags & TEGRA_PLL_HAS_CPCON) |
527 | _update_pll_cpcon(pll, cfg, rate); | 527 | _update_pll_cpcon(pll, cfg, rate); |
528 | 528 | ||
529 | if (state) { | 529 | if (state) { |
@@ -542,11 +542,11 @@ static int clk_pll_set_rate(struct clk_hw *hw, unsigned long rate, | |||
542 | unsigned long flags = 0; | 542 | unsigned long flags = 0; |
543 | int ret = 0; | 543 | int ret = 0; |
544 | 544 | ||
545 | if (pll->flags & TEGRA_PLL_FIXED) { | 545 | if (pll->params->flags & TEGRA_PLL_FIXED) { |
546 | if (rate != pll->fixed_rate) { | 546 | if (rate != pll->params->fixed_rate) { |
547 | pr_err("%s: Can not change %s fixed rate %lu to %lu\n", | 547 | pr_err("%s: Can not change %s fixed rate %lu to %lu\n", |
548 | __func__, __clk_get_name(hw->clk), | 548 | __func__, __clk_get_name(hw->clk), |
549 | pll->fixed_rate, rate); | 549 | pll->params->fixed_rate, rate); |
550 | return -EINVAL; | 550 | return -EINVAL; |
551 | } | 551 | } |
552 | return 0; | 552 | return 0; |
@@ -577,11 +577,11 @@ static long clk_pll_round_rate(struct clk_hw *hw, unsigned long rate, | |||
577 | struct tegra_clk_pll *pll = to_clk_pll(hw); | 577 | struct tegra_clk_pll *pll = to_clk_pll(hw); |
578 | struct tegra_clk_pll_freq_table cfg; | 578 | struct tegra_clk_pll_freq_table cfg; |
579 | 579 | ||
580 | if (pll->flags & TEGRA_PLL_FIXED) | 580 | if (pll->params->flags & TEGRA_PLL_FIXED) |
581 | return pll->fixed_rate; | 581 | return pll->params->fixed_rate; |
582 | 582 | ||
583 | /* PLLM is used for memory; we do not change rate */ | 583 | /* PLLM is used for memory; we do not change rate */ |
584 | if (pll->flags & TEGRA_PLLM) | 584 | if (pll->params->flags & TEGRA_PLLM) |
585 | return __clk_get_rate(hw->clk); | 585 | return __clk_get_rate(hw->clk); |
586 | 586 | ||
587 | if (_get_table_rate(hw, &cfg, rate, *prate) && | 587 | if (_get_table_rate(hw, &cfg, rate, *prate) && |
@@ -604,17 +604,19 @@ static unsigned long clk_pll_recalc_rate(struct clk_hw *hw, | |||
604 | 604 | ||
605 | val = pll_readl_base(pll); | 605 | val = pll_readl_base(pll); |
606 | 606 | ||
607 | if ((pll->flags & TEGRA_PLL_BYPASS) && (val & PLL_BASE_BYPASS)) | 607 | if ((pll->params->flags & TEGRA_PLL_BYPASS) && (val & PLL_BASE_BYPASS)) |
608 | return parent_rate; | 608 | return parent_rate; |
609 | 609 | ||
610 | if ((pll->flags & TEGRA_PLL_FIXED) && !(val & PLL_BASE_OVERRIDE)) { | 610 | if ((pll->params->flags & TEGRA_PLL_FIXED) && |
611 | !(val & PLL_BASE_OVERRIDE)) { | ||
611 | struct tegra_clk_pll_freq_table sel; | 612 | struct tegra_clk_pll_freq_table sel; |
612 | if (_get_table_rate(hw, &sel, pll->fixed_rate, parent_rate)) { | 613 | if (_get_table_rate(hw, &sel, pll->params->fixed_rate, |
614 | parent_rate)) { | ||
613 | pr_err("Clock %s has unknown fixed frequency\n", | 615 | pr_err("Clock %s has unknown fixed frequency\n", |
614 | __clk_get_name(hw->clk)); | 616 | __clk_get_name(hw->clk)); |
615 | BUG(); | 617 | BUG(); |
616 | } | 618 | } |
617 | return pll->fixed_rate; | 619 | return pll->params->fixed_rate; |
618 | } | 620 | } |
619 | 621 | ||
620 | _get_pll_mnp(pll, &cfg); | 622 | _get_pll_mnp(pll, &cfg); |
@@ -682,7 +684,7 @@ static int clk_plle_enable(struct clk_hw *hw) | |||
682 | u32 val; | 684 | u32 val; |
683 | int err; | 685 | int err; |
684 | 686 | ||
685 | if (_get_table_rate(hw, &sel, pll->fixed_rate, input_rate)) | 687 | if (_get_table_rate(hw, &sel, pll->params->fixed_rate, input_rate)) |
686 | return -EINVAL; | 688 | return -EINVAL; |
687 | 689 | ||
688 | clk_pll_disable(hw); | 690 | clk_pll_disable(hw); |
@@ -698,7 +700,7 @@ static int clk_plle_enable(struct clk_hw *hw) | |||
698 | return err; | 700 | return err; |
699 | } | 701 | } |
700 | 702 | ||
701 | if (pll->flags & TEGRA_PLLE_CONFIGURE) { | 703 | if (pll->params->flags & TEGRA_PLLE_CONFIGURE) { |
702 | /* configure dividers */ | 704 | /* configure dividers */ |
703 | val = pll_readl_base(pll); | 705 | val = pll_readl_base(pll); |
704 | val &= ~(divm_mask(pll) | divn_mask(pll) | divp_mask(pll)); | 706 | val &= ~(divm_mask(pll) | divn_mask(pll) | divp_mask(pll)); |
@@ -1233,7 +1235,7 @@ static int clk_plle_tegra114_enable(struct clk_hw *hw) | |||
1233 | unsigned long flags = 0; | 1235 | unsigned long flags = 0; |
1234 | unsigned long input_rate = clk_get_rate(clk_get_parent(hw->clk)); | 1236 | unsigned long input_rate = clk_get_rate(clk_get_parent(hw->clk)); |
1235 | 1237 | ||
1236 | if (_get_table_rate(hw, &sel, pll->fixed_rate, input_rate)) | 1238 | if (_get_table_rate(hw, &sel, pll->params->fixed_rate, input_rate)) |
1237 | return -EINVAL; | 1239 | return -EINVAL; |
1238 | 1240 | ||
1239 | if (pll->lock) | 1241 | if (pll->lock) |
@@ -1320,9 +1322,8 @@ static void clk_plle_tegra114_disable(struct clk_hw *hw) | |||
1320 | #endif | 1322 | #endif |
1321 | 1323 | ||
1322 | static struct tegra_clk_pll *_tegra_init_pll(void __iomem *clk_base, | 1324 | static struct tegra_clk_pll *_tegra_init_pll(void __iomem *clk_base, |
1323 | void __iomem *pmc, unsigned long fixed_rate, | 1325 | void __iomem *pmc, struct tegra_clk_pll_params *pll_params, |
1324 | struct tegra_clk_pll_params *pll_params, u32 pll_flags, | 1326 | spinlock_t *lock) |
1325 | struct tegra_clk_pll_freq_table *freq_table, spinlock_t *lock) | ||
1326 | { | 1327 | { |
1327 | struct tegra_clk_pll *pll; | 1328 | struct tegra_clk_pll *pll; |
1328 | 1329 | ||
@@ -1333,10 +1334,7 @@ static struct tegra_clk_pll *_tegra_init_pll(void __iomem *clk_base, | |||
1333 | pll->clk_base = clk_base; | 1334 | pll->clk_base = clk_base; |
1334 | pll->pmc = pmc; | 1335 | pll->pmc = pmc; |
1335 | 1336 | ||
1336 | pll->freq_table = freq_table; | ||
1337 | pll->params = pll_params; | 1337 | pll->params = pll_params; |
1338 | pll->fixed_rate = fixed_rate; | ||
1339 | pll->flags = pll_flags; | ||
1340 | pll->lock = lock; | 1338 | pll->lock = lock; |
1341 | 1339 | ||
1342 | if (!pll_params->div_nmp) | 1340 | if (!pll_params->div_nmp) |
@@ -1365,17 +1363,15 @@ static struct clk *_tegra_clk_register_pll(struct tegra_clk_pll *pll, | |||
1365 | 1363 | ||
1366 | struct clk *tegra_clk_register_pll(const char *name, const char *parent_name, | 1364 | struct clk *tegra_clk_register_pll(const char *name, const char *parent_name, |
1367 | void __iomem *clk_base, void __iomem *pmc, | 1365 | void __iomem *clk_base, void __iomem *pmc, |
1368 | unsigned long flags, unsigned long fixed_rate, | 1366 | unsigned long flags, struct tegra_clk_pll_params *pll_params, |
1369 | struct tegra_clk_pll_params *pll_params, u32 pll_flags, | 1367 | spinlock_t *lock) |
1370 | struct tegra_clk_pll_freq_table *freq_table, spinlock_t *lock) | ||
1371 | { | 1368 | { |
1372 | struct tegra_clk_pll *pll; | 1369 | struct tegra_clk_pll *pll; |
1373 | struct clk *clk; | 1370 | struct clk *clk; |
1374 | 1371 | ||
1375 | pll_flags |= TEGRA_PLL_BYPASS; | 1372 | pll_params->flags |= TEGRA_PLL_BYPASS; |
1376 | pll_flags |= TEGRA_PLL_HAS_LOCK_ENABLE; | 1373 | pll_params->flags |= TEGRA_PLL_HAS_LOCK_ENABLE; |
1377 | pll = _tegra_init_pll(clk_base, pmc, fixed_rate, pll_params, pll_flags, | 1374 | pll = _tegra_init_pll(clk_base, pmc, pll_params, lock); |
1378 | freq_table, lock); | ||
1379 | if (IS_ERR(pll)) | 1375 | if (IS_ERR(pll)) |
1380 | return ERR_CAST(pll); | 1376 | return ERR_CAST(pll); |
1381 | 1377 | ||
@@ -1389,17 +1385,15 @@ struct clk *tegra_clk_register_pll(const char *name, const char *parent_name, | |||
1389 | 1385 | ||
1390 | struct clk *tegra_clk_register_plle(const char *name, const char *parent_name, | 1386 | struct clk *tegra_clk_register_plle(const char *name, const char *parent_name, |
1391 | void __iomem *clk_base, void __iomem *pmc, | 1387 | void __iomem *clk_base, void __iomem *pmc, |
1392 | unsigned long flags, unsigned long fixed_rate, | 1388 | unsigned long flags, struct tegra_clk_pll_params *pll_params, |
1393 | struct tegra_clk_pll_params *pll_params, u32 pll_flags, | 1389 | spinlock_t *lock) |
1394 | struct tegra_clk_pll_freq_table *freq_table, spinlock_t *lock) | ||
1395 | { | 1390 | { |
1396 | struct tegra_clk_pll *pll; | 1391 | struct tegra_clk_pll *pll; |
1397 | struct clk *clk; | 1392 | struct clk *clk; |
1398 | 1393 | ||
1399 | pll_flags |= TEGRA_PLL_LOCK_MISC | TEGRA_PLL_BYPASS; | 1394 | pll_params->flags |= TEGRA_PLL_LOCK_MISC | TEGRA_PLL_BYPASS; |
1400 | pll_flags |= TEGRA_PLL_HAS_LOCK_ENABLE; | 1395 | pll_params->flags |= TEGRA_PLL_HAS_LOCK_ENABLE; |
1401 | pll = _tegra_init_pll(clk_base, pmc, fixed_rate, pll_params, pll_flags, | 1396 | pll = _tegra_init_pll(clk_base, pmc, pll_params, lock); |
1402 | freq_table, lock); | ||
1403 | if (IS_ERR(pll)) | 1397 | if (IS_ERR(pll)) |
1404 | return ERR_CAST(pll); | 1398 | return ERR_CAST(pll); |
1405 | 1399 | ||
@@ -1458,10 +1452,8 @@ const struct clk_ops tegra_clk_plle_tegra114_ops = { | |||
1458 | 1452 | ||
1459 | struct clk *tegra_clk_register_pllxc(const char *name, const char *parent_name, | 1453 | struct clk *tegra_clk_register_pllxc(const char *name, const char *parent_name, |
1460 | void __iomem *clk_base, void __iomem *pmc, | 1454 | void __iomem *clk_base, void __iomem *pmc, |
1461 | unsigned long flags, unsigned long fixed_rate, | 1455 | unsigned long flags, |
1462 | struct tegra_clk_pll_params *pll_params, | 1456 | struct tegra_clk_pll_params *pll_params, |
1463 | u32 pll_flags, | ||
1464 | struct tegra_clk_pll_freq_table *freq_table, | ||
1465 | spinlock_t *lock) | 1457 | spinlock_t *lock) |
1466 | { | 1458 | { |
1467 | struct tegra_clk_pll *pll; | 1459 | struct tegra_clk_pll *pll; |
@@ -1498,9 +1490,8 @@ struct clk *tegra_clk_register_pllxc(const char *name, const char *parent_name, | |||
1498 | writel_relaxed(val_iddq, clk_base + pll_params->iddq_reg); | 1490 | writel_relaxed(val_iddq, clk_base + pll_params->iddq_reg); |
1499 | } | 1491 | } |
1500 | 1492 | ||
1501 | pll_flags |= TEGRA_PLL_HAS_LOCK_ENABLE; | 1493 | pll_params->flags |= TEGRA_PLL_HAS_LOCK_ENABLE; |
1502 | pll = _tegra_init_pll(clk_base, pmc, fixed_rate, pll_params, pll_flags, | 1494 | pll = _tegra_init_pll(clk_base, pmc, pll_params, lock); |
1503 | freq_table, lock); | ||
1504 | if (IS_ERR(pll)) | 1495 | if (IS_ERR(pll)) |
1505 | return ERR_CAST(pll); | 1496 | return ERR_CAST(pll); |
1506 | 1497 | ||
@@ -1514,22 +1505,19 @@ struct clk *tegra_clk_register_pllxc(const char *name, const char *parent_name, | |||
1514 | 1505 | ||
1515 | struct clk *tegra_clk_register_pllre(const char *name, const char *parent_name, | 1506 | struct clk *tegra_clk_register_pllre(const char *name, const char *parent_name, |
1516 | void __iomem *clk_base, void __iomem *pmc, | 1507 | void __iomem *clk_base, void __iomem *pmc, |
1517 | unsigned long flags, unsigned long fixed_rate, | 1508 | unsigned long flags, |
1518 | struct tegra_clk_pll_params *pll_params, | 1509 | struct tegra_clk_pll_params *pll_params, |
1519 | u32 pll_flags, | ||
1520 | struct tegra_clk_pll_freq_table *freq_table, | ||
1521 | spinlock_t *lock, unsigned long parent_rate) | 1510 | spinlock_t *lock, unsigned long parent_rate) |
1522 | { | 1511 | { |
1523 | u32 val; | 1512 | u32 val; |
1524 | struct tegra_clk_pll *pll; | 1513 | struct tegra_clk_pll *pll; |
1525 | struct clk *clk; | 1514 | struct clk *clk; |
1526 | 1515 | ||
1527 | pll_flags |= TEGRA_PLL_HAS_LOCK_ENABLE | TEGRA_PLL_LOCK_MISC; | 1516 | pll_params->flags |= TEGRA_PLL_HAS_LOCK_ENABLE | TEGRA_PLL_LOCK_MISC; |
1528 | 1517 | ||
1529 | pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate); | 1518 | pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate); |
1530 | 1519 | ||
1531 | pll = _tegra_init_pll(clk_base, pmc, fixed_rate, pll_params, pll_flags, | 1520 | pll = _tegra_init_pll(clk_base, pmc, pll_params, lock); |
1532 | freq_table, lock); | ||
1533 | if (IS_ERR(pll)) | 1521 | if (IS_ERR(pll)) |
1534 | return ERR_CAST(pll); | 1522 | return ERR_CAST(pll); |
1535 | 1523 | ||
@@ -1564,10 +1552,8 @@ struct clk *tegra_clk_register_pllre(const char *name, const char *parent_name, | |||
1564 | 1552 | ||
1565 | struct clk *tegra_clk_register_pllm(const char *name, const char *parent_name, | 1553 | struct clk *tegra_clk_register_pllm(const char *name, const char *parent_name, |
1566 | void __iomem *clk_base, void __iomem *pmc, | 1554 | void __iomem *clk_base, void __iomem *pmc, |
1567 | unsigned long flags, unsigned long fixed_rate, | 1555 | unsigned long flags, |
1568 | struct tegra_clk_pll_params *pll_params, | 1556 | struct tegra_clk_pll_params *pll_params, |
1569 | u32 pll_flags, | ||
1570 | struct tegra_clk_pll_freq_table *freq_table, | ||
1571 | spinlock_t *lock) | 1557 | spinlock_t *lock) |
1572 | { | 1558 | { |
1573 | struct tegra_clk_pll *pll; | 1559 | struct tegra_clk_pll *pll; |
@@ -1588,11 +1574,10 @@ struct clk *tegra_clk_register_pllm(const char *name, const char *parent_name, | |||
1588 | 1574 | ||
1589 | pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate); | 1575 | pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate); |
1590 | 1576 | ||
1591 | pll_flags |= TEGRA_PLL_BYPASS; | 1577 | pll_params->flags |= TEGRA_PLL_BYPASS; |
1592 | pll_flags |= TEGRA_PLL_HAS_LOCK_ENABLE; | 1578 | pll_params->flags |= TEGRA_PLL_HAS_LOCK_ENABLE; |
1593 | pll_flags |= TEGRA_PLLM; | 1579 | pll_params->flags |= TEGRA_PLLM; |
1594 | pll = _tegra_init_pll(clk_base, pmc, fixed_rate, pll_params, pll_flags, | 1580 | pll = _tegra_init_pll(clk_base, pmc, pll_params, lock); |
1595 | freq_table, lock); | ||
1596 | if (IS_ERR(pll)) | 1581 | if (IS_ERR(pll)) |
1597 | return ERR_CAST(pll); | 1582 | return ERR_CAST(pll); |
1598 | 1583 | ||
@@ -1606,10 +1591,8 @@ struct clk *tegra_clk_register_pllm(const char *name, const char *parent_name, | |||
1606 | 1591 | ||
1607 | struct clk *tegra_clk_register_pllc(const char *name, const char *parent_name, | 1592 | struct clk *tegra_clk_register_pllc(const char *name, const char *parent_name, |
1608 | void __iomem *clk_base, void __iomem *pmc, | 1593 | void __iomem *clk_base, void __iomem *pmc, |
1609 | unsigned long flags, unsigned long fixed_rate, | 1594 | unsigned long flags, |
1610 | struct tegra_clk_pll_params *pll_params, | 1595 | struct tegra_clk_pll_params *pll_params, |
1611 | u32 pll_flags, | ||
1612 | struct tegra_clk_pll_freq_table *freq_table, | ||
1613 | spinlock_t *lock) | 1596 | spinlock_t *lock) |
1614 | { | 1597 | { |
1615 | struct clk *parent, *clk; | 1598 | struct clk *parent, *clk; |
@@ -1632,9 +1615,8 @@ struct clk *tegra_clk_register_pllc(const char *name, const char *parent_name, | |||
1632 | 1615 | ||
1633 | pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate); | 1616 | pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate); |
1634 | 1617 | ||
1635 | pll_flags |= TEGRA_PLL_BYPASS; | 1618 | pll_params->flags |= TEGRA_PLL_BYPASS; |
1636 | pll = _tegra_init_pll(clk_base, pmc, fixed_rate, pll_params, pll_flags, | 1619 | pll = _tegra_init_pll(clk_base, pmc, pll_params, lock); |
1637 | freq_table, lock); | ||
1638 | if (IS_ERR(pll)) | 1620 | if (IS_ERR(pll)) |
1639 | return ERR_CAST(pll); | 1621 | return ERR_CAST(pll); |
1640 | 1622 | ||
@@ -1684,17 +1666,15 @@ struct clk *tegra_clk_register_pllc(const char *name, const char *parent_name, | |||
1684 | struct clk *tegra_clk_register_plle_tegra114(const char *name, | 1666 | struct clk *tegra_clk_register_plle_tegra114(const char *name, |
1685 | const char *parent_name, | 1667 | const char *parent_name, |
1686 | void __iomem *clk_base, unsigned long flags, | 1668 | void __iomem *clk_base, unsigned long flags, |
1687 | unsigned long fixed_rate, | ||
1688 | struct tegra_clk_pll_params *pll_params, | 1669 | struct tegra_clk_pll_params *pll_params, |
1689 | struct tegra_clk_pll_freq_table *freq_table, | ||
1690 | spinlock_t *lock) | 1670 | spinlock_t *lock) |
1691 | { | 1671 | { |
1692 | struct tegra_clk_pll *pll; | 1672 | struct tegra_clk_pll *pll; |
1693 | struct clk *clk; | 1673 | struct clk *clk; |
1694 | u32 val, val_aux; | 1674 | u32 val, val_aux; |
1695 | 1675 | ||
1696 | pll = _tegra_init_pll(clk_base, NULL, fixed_rate, pll_params, | 1676 | pll_params->flags |= TEGRA_PLL_HAS_LOCK_ENABLE; |
1697 | TEGRA_PLL_HAS_LOCK_ENABLE, freq_table, lock); | 1677 | pll = _tegra_init_pll(clk_base, NULL, pll_params, lock); |
1698 | if (IS_ERR(pll)) | 1678 | if (IS_ERR(pll)) |
1699 | return ERR_CAST(pll); | 1679 | return ERR_CAST(pll); |
1700 | 1680 | ||
diff --git a/drivers/clk/tegra/clk-tegra114.c b/drivers/clk/tegra/clk-tegra114.c index e62e4764131c..8f2ab376c53d 100644 --- a/drivers/clk/tegra/clk-tegra114.c +++ b/drivers/clk/tegra/clk-tegra114.c | |||
@@ -334,6 +334,8 @@ static struct tegra_clk_pll_params pll_c_params = { | |||
334 | .stepb_shift = 9, | 334 | .stepb_shift = 9, |
335 | .pdiv_tohw = pllxc_p, | 335 | .pdiv_tohw = pllxc_p, |
336 | .div_nmp = &pllxc_nmp, | 336 | .div_nmp = &pllxc_nmp, |
337 | .freq_table = pll_c_freq_table, | ||
338 | .flags = TEGRA_PLL_USE_LOCK, | ||
337 | }; | 339 | }; |
338 | 340 | ||
339 | static struct div_nmp pllcx_nmp = { | 341 | static struct div_nmp pllcx_nmp = { |
@@ -381,6 +383,8 @@ static struct tegra_clk_pll_params pll_c2_params = { | |||
381 | .ext_misc_reg[0] = 0x4f0, | 383 | .ext_misc_reg[0] = 0x4f0, |
382 | .ext_misc_reg[1] = 0x4f4, | 384 | .ext_misc_reg[1] = 0x4f4, |
383 | .ext_misc_reg[2] = 0x4f8, | 385 | .ext_misc_reg[2] = 0x4f8, |
386 | .freq_table = pll_cx_freq_table, | ||
387 | .flags = TEGRA_PLL_USE_LOCK, | ||
384 | }; | 388 | }; |
385 | 389 | ||
386 | static struct tegra_clk_pll_params pll_c3_params = { | 390 | static struct tegra_clk_pll_params pll_c3_params = { |
@@ -401,6 +405,8 @@ static struct tegra_clk_pll_params pll_c3_params = { | |||
401 | .ext_misc_reg[0] = 0x504, | 405 | .ext_misc_reg[0] = 0x504, |
402 | .ext_misc_reg[1] = 0x508, | 406 | .ext_misc_reg[1] = 0x508, |
403 | .ext_misc_reg[2] = 0x50c, | 407 | .ext_misc_reg[2] = 0x50c, |
408 | .freq_table = pll_cx_freq_table, | ||
409 | .flags = TEGRA_PLL_USE_LOCK, | ||
404 | }; | 410 | }; |
405 | 411 | ||
406 | static struct div_nmp pllm_nmp = { | 412 | static struct div_nmp pllm_nmp = { |
@@ -447,6 +453,8 @@ static struct tegra_clk_pll_params pll_m_params = { | |||
447 | .div_nmp = &pllm_nmp, | 453 | .div_nmp = &pllm_nmp, |
448 | .pmc_divnm_reg = PMC_PLLM_WB0_OVERRIDE, | 454 | .pmc_divnm_reg = PMC_PLLM_WB0_OVERRIDE, |
449 | .pmc_divp_reg = PMC_PLLM_WB0_OVERRIDE_2, | 455 | .pmc_divp_reg = PMC_PLLM_WB0_OVERRIDE_2, |
456 | .freq_table = pll_m_freq_table, | ||
457 | .flags = TEGRA_PLL_USE_LOCK, | ||
450 | }; | 458 | }; |
451 | 459 | ||
452 | static struct div_nmp pllp_nmp = { | 460 | static struct div_nmp pllp_nmp = { |
@@ -480,6 +488,9 @@ static struct tegra_clk_pll_params pll_p_params = { | |||
480 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, | 488 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, |
481 | .lock_delay = 300, | 489 | .lock_delay = 300, |
482 | .div_nmp = &pllp_nmp, | 490 | .div_nmp = &pllp_nmp, |
491 | .freq_table = pll_p_freq_table, | ||
492 | .flags = TEGRA_PLL_FIXED | TEGRA_PLL_USE_LOCK, | ||
493 | .fixed_rate = 408000000, | ||
483 | }; | 494 | }; |
484 | 495 | ||
485 | static struct tegra_clk_pll_freq_table pll_a_freq_table[] = { | 496 | static struct tegra_clk_pll_freq_table pll_a_freq_table[] = { |
@@ -507,6 +518,8 @@ static struct tegra_clk_pll_params pll_a_params = { | |||
507 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, | 518 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, |
508 | .lock_delay = 300, | 519 | .lock_delay = 300, |
509 | .div_nmp = &pllp_nmp, | 520 | .div_nmp = &pllp_nmp, |
521 | .freq_table = pll_a_freq_table, | ||
522 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK, | ||
510 | }; | 523 | }; |
511 | 524 | ||
512 | static struct tegra_clk_pll_freq_table pll_d_freq_table[] = { | 525 | static struct tegra_clk_pll_freq_table pll_d_freq_table[] = { |
@@ -543,6 +556,9 @@ static struct tegra_clk_pll_params pll_d_params = { | |||
543 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, | 556 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, |
544 | .lock_delay = 1000, | 557 | .lock_delay = 1000, |
545 | .div_nmp = &pllp_nmp, | 558 | .div_nmp = &pllp_nmp, |
559 | .freq_table = pll_d_freq_table, | ||
560 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | | ||
561 | TEGRA_PLL_USE_LOCK, | ||
546 | }; | 562 | }; |
547 | 563 | ||
548 | static struct tegra_clk_pll_params pll_d2_params = { | 564 | static struct tegra_clk_pll_params pll_d2_params = { |
@@ -558,6 +574,9 @@ static struct tegra_clk_pll_params pll_d2_params = { | |||
558 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, | 574 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, |
559 | .lock_delay = 1000, | 575 | .lock_delay = 1000, |
560 | .div_nmp = &pllp_nmp, | 576 | .div_nmp = &pllp_nmp, |
577 | .freq_table = pll_d_freq_table, | ||
578 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | | ||
579 | TEGRA_PLL_USE_LOCK, | ||
561 | }; | 580 | }; |
562 | 581 | ||
563 | static struct pdiv_map pllu_p[] = { | 582 | static struct pdiv_map pllu_p[] = { |
@@ -598,6 +617,9 @@ static struct tegra_clk_pll_params pll_u_params = { | |||
598 | .lock_delay = 1000, | 617 | .lock_delay = 1000, |
599 | .pdiv_tohw = pllu_p, | 618 | .pdiv_tohw = pllu_p, |
600 | .div_nmp = &pllu_nmp, | 619 | .div_nmp = &pllu_nmp, |
620 | .freq_table = pll_u_freq_table, | ||
621 | .flags = TEGRA_PLLU | TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | | ||
622 | TEGRA_PLL_USE_LOCK, | ||
601 | }; | 623 | }; |
602 | 624 | ||
603 | static struct tegra_clk_pll_freq_table pll_x_freq_table[] = { | 625 | static struct tegra_clk_pll_freq_table pll_x_freq_table[] = { |
@@ -631,6 +653,8 @@ static struct tegra_clk_pll_params pll_x_params = { | |||
631 | .stepb_shift = 24, | 653 | .stepb_shift = 24, |
632 | .pdiv_tohw = pllxc_p, | 654 | .pdiv_tohw = pllxc_p, |
633 | .div_nmp = &pllxc_nmp, | 655 | .div_nmp = &pllxc_nmp, |
656 | .freq_table = pll_x_freq_table, | ||
657 | .flags = TEGRA_PLL_USE_LOCK, | ||
634 | }; | 658 | }; |
635 | 659 | ||
636 | static struct tegra_clk_pll_freq_table pll_e_freq_table[] = { | 660 | static struct tegra_clk_pll_freq_table pll_e_freq_table[] = { |
@@ -664,6 +688,9 @@ static struct tegra_clk_pll_params pll_e_params = { | |||
664 | .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE, | 688 | .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE, |
665 | .lock_delay = 300, | 689 | .lock_delay = 300, |
666 | .div_nmp = &plle_nmp, | 690 | .div_nmp = &plle_nmp, |
691 | .freq_table = pll_e_freq_table, | ||
692 | .flags = TEGRA_PLL_FIXED, | ||
693 | .fixed_rate = 100000000, | ||
667 | }; | 694 | }; |
668 | 695 | ||
669 | static struct div_nmp pllre_nmp = { | 696 | static struct div_nmp pllre_nmp = { |
@@ -690,6 +717,7 @@ static struct tegra_clk_pll_params pll_re_vco_params = { | |||
690 | .iddq_reg = PLLRE_MISC, | 717 | .iddq_reg = PLLRE_MISC, |
691 | .iddq_bit_idx = PLLRE_IDDQ_BIT, | 718 | .iddq_bit_idx = PLLRE_IDDQ_BIT, |
692 | .div_nmp = &pllre_nmp, | 719 | .div_nmp = &pllre_nmp, |
720 | .flags = TEGRA_PLL_USE_LOCK, | ||
693 | }; | 721 | }; |
694 | 722 | ||
695 | /* possible OSC frequencies in Hz */ | 723 | /* possible OSC frequencies in Hz */ |
@@ -1086,8 +1114,7 @@ static void __init tegra114_pll_init(void __iomem *clk_base, | |||
1086 | 1114 | ||
1087 | /* PLLC */ | 1115 | /* PLLC */ |
1088 | clk = tegra_clk_register_pllxc("pll_c", "pll_ref", clk_base, | 1116 | clk = tegra_clk_register_pllxc("pll_c", "pll_ref", clk_base, |
1089 | pmc, 0, 0, &pll_c_params, TEGRA_PLL_USE_LOCK, | 1117 | pmc, 0, &pll_c_params, NULL); |
1090 | pll_c_freq_table, NULL); | ||
1091 | clk_register_clkdev(clk, "pll_c", NULL); | 1118 | clk_register_clkdev(clk, "pll_c", NULL); |
1092 | clks[TEGRA114_CLK_PLL_C] = clk; | 1119 | clks[TEGRA114_CLK_PLL_C] = clk; |
1093 | 1120 | ||
@@ -1102,24 +1129,20 @@ static void __init tegra114_pll_init(void __iomem *clk_base, | |||
1102 | clks[TEGRA114_CLK_PLL_C_OUT1] = clk; | 1129 | clks[TEGRA114_CLK_PLL_C_OUT1] = clk; |
1103 | 1130 | ||
1104 | /* PLLC2 */ | 1131 | /* PLLC2 */ |
1105 | clk = tegra_clk_register_pllc("pll_c2", "pll_ref", clk_base, pmc, 0, 0, | 1132 | clk = tegra_clk_register_pllc("pll_c2", "pll_ref", clk_base, pmc, 0, |
1106 | &pll_c2_params, TEGRA_PLL_USE_LOCK, | 1133 | &pll_c2_params, NULL); |
1107 | pll_cx_freq_table, NULL); | ||
1108 | clk_register_clkdev(clk, "pll_c2", NULL); | 1134 | clk_register_clkdev(clk, "pll_c2", NULL); |
1109 | clks[TEGRA114_CLK_PLL_C2] = clk; | 1135 | clks[TEGRA114_CLK_PLL_C2] = clk; |
1110 | 1136 | ||
1111 | /* PLLC3 */ | 1137 | /* PLLC3 */ |
1112 | clk = tegra_clk_register_pllc("pll_c3", "pll_ref", clk_base, pmc, 0, 0, | 1138 | clk = tegra_clk_register_pllc("pll_c3", "pll_ref", clk_base, pmc, 0, |
1113 | &pll_c3_params, TEGRA_PLL_USE_LOCK, | 1139 | &pll_c3_params, NULL); |
1114 | pll_cx_freq_table, NULL); | ||
1115 | clk_register_clkdev(clk, "pll_c3", NULL); | 1140 | clk_register_clkdev(clk, "pll_c3", NULL); |
1116 | clks[TEGRA114_CLK_PLL_C3] = clk; | 1141 | clks[TEGRA114_CLK_PLL_C3] = clk; |
1117 | 1142 | ||
1118 | /* PLLP */ | 1143 | /* PLLP */ |
1119 | clk = tegra_clk_register_pll("pll_p", "pll_ref", clk_base, pmc, 0, | 1144 | clk = tegra_clk_register_pll("pll_p", "pll_ref", clk_base, pmc, 0, |
1120 | 408000000, &pll_p_params, | 1145 | &pll_p_params, NULL); |
1121 | TEGRA_PLL_FIXED | TEGRA_PLL_USE_LOCK, | ||
1122 | pll_p_freq_table, NULL); | ||
1123 | clk_register_clkdev(clk, "pll_p", NULL); | 1146 | clk_register_clkdev(clk, "pll_p", NULL); |
1124 | clks[TEGRA114_CLK_PLL_P] = clk; | 1147 | clks[TEGRA114_CLK_PLL_P] = clk; |
1125 | 1148 | ||
@@ -1171,9 +1194,8 @@ static void __init tegra114_pll_init(void __iomem *clk_base, | |||
1171 | 1194 | ||
1172 | /* PLLM */ | 1195 | /* PLLM */ |
1173 | clk = tegra_clk_register_pllm("pll_m", "pll_ref", clk_base, pmc, | 1196 | clk = tegra_clk_register_pllm("pll_m", "pll_ref", clk_base, pmc, |
1174 | CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, 0, | 1197 | CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, |
1175 | &pll_m_params, TEGRA_PLL_USE_LOCK, | 1198 | &pll_m_params, NULL); |
1176 | pll_m_freq_table, NULL); | ||
1177 | clk_register_clkdev(clk, "pll_m", NULL); | 1199 | clk_register_clkdev(clk, "pll_m", NULL); |
1178 | clks[TEGRA114_CLK_PLL_M] = clk; | 1200 | clks[TEGRA114_CLK_PLL_M] = clk; |
1179 | 1201 | ||
@@ -1193,8 +1215,7 @@ static void __init tegra114_pll_init(void __iomem *clk_base, | |||
1193 | 1215 | ||
1194 | /* PLLX */ | 1216 | /* PLLX */ |
1195 | clk = tegra_clk_register_pllxc("pll_x", "pll_ref", clk_base, | 1217 | clk = tegra_clk_register_pllxc("pll_x", "pll_ref", clk_base, |
1196 | pmc, CLK_IGNORE_UNUSED, 0, &pll_x_params, | 1218 | pmc, CLK_IGNORE_UNUSED, &pll_x_params, NULL); |
1197 | TEGRA_PLL_USE_LOCK, pll_x_freq_table, NULL); | ||
1198 | clk_register_clkdev(clk, "pll_x", NULL); | 1219 | clk_register_clkdev(clk, "pll_x", NULL); |
1199 | clks[TEGRA114_CLK_PLL_X] = clk; | 1220 | clks[TEGRA114_CLK_PLL_X] = clk; |
1200 | 1221 | ||
@@ -1210,9 +1231,7 @@ static void __init tegra114_pll_init(void __iomem *clk_base, | |||
1210 | writel(val, clk_base + pll_u_params.base_reg); | 1231 | writel(val, clk_base + pll_u_params.base_reg); |
1211 | 1232 | ||
1212 | clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, pmc, 0, | 1233 | clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, pmc, 0, |
1213 | 0, &pll_u_params, TEGRA_PLLU | | 1234 | &pll_u_params, &pll_u_lock); |
1214 | TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | | ||
1215 | TEGRA_PLL_USE_LOCK, pll_u_freq_table, &pll_u_lock); | ||
1216 | clk_register_clkdev(clk, "pll_u", NULL); | 1235 | clk_register_clkdev(clk, "pll_u", NULL); |
1217 | clks[TEGRA114_CLK_PLL_U] = clk; | 1236 | clks[TEGRA114_CLK_PLL_U] = clk; |
1218 | 1237 | ||
@@ -1245,9 +1264,7 @@ static void __init tegra114_pll_init(void __iomem *clk_base, | |||
1245 | 1264 | ||
1246 | /* PLLD */ | 1265 | /* PLLD */ |
1247 | clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, pmc, 0, | 1266 | clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, pmc, 0, |
1248 | 0, &pll_d_params, | 1267 | &pll_d_params, &pll_d_lock); |
1249 | TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | | ||
1250 | TEGRA_PLL_USE_LOCK, pll_d_freq_table, &pll_d_lock); | ||
1251 | clk_register_clkdev(clk, "pll_d", NULL); | 1268 | clk_register_clkdev(clk, "pll_d", NULL); |
1252 | clks[TEGRA114_CLK_PLL_D] = clk; | 1269 | clks[TEGRA114_CLK_PLL_D] = clk; |
1253 | 1270 | ||
@@ -1259,9 +1276,7 @@ static void __init tegra114_pll_init(void __iomem *clk_base, | |||
1259 | 1276 | ||
1260 | /* PLLD2 */ | 1277 | /* PLLD2 */ |
1261 | clk = tegra_clk_register_pll("pll_d2", "pll_ref", clk_base, pmc, 0, | 1278 | clk = tegra_clk_register_pll("pll_d2", "pll_ref", clk_base, pmc, 0, |
1262 | 0, &pll_d2_params, | 1279 | &pll_d2_params, &pll_d2_lock); |
1263 | TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | | ||
1264 | TEGRA_PLL_USE_LOCK, pll_d_freq_table, &pll_d2_lock); | ||
1265 | clk_register_clkdev(clk, "pll_d2", NULL); | 1280 | clk_register_clkdev(clk, "pll_d2", NULL); |
1266 | clks[TEGRA114_CLK_PLL_D2] = clk; | 1281 | clks[TEGRA114_CLK_PLL_D2] = clk; |
1267 | 1282 | ||
@@ -1273,8 +1288,7 @@ static void __init tegra114_pll_init(void __iomem *clk_base, | |||
1273 | 1288 | ||
1274 | /* PLLA */ | 1289 | /* PLLA */ |
1275 | clk = tegra_clk_register_pll("pll_a", "pll_p_out1", clk_base, pmc, 0, | 1290 | clk = tegra_clk_register_pll("pll_a", "pll_p_out1", clk_base, pmc, 0, |
1276 | 0, &pll_a_params, TEGRA_PLL_HAS_CPCON | | 1291 | &pll_a_params, NULL); |
1277 | TEGRA_PLL_USE_LOCK, pll_a_freq_table, NULL); | ||
1278 | clk_register_clkdev(clk, "pll_a", NULL); | 1292 | clk_register_clkdev(clk, "pll_a", NULL); |
1279 | clks[TEGRA114_CLK_PLL_A] = clk; | 1293 | clks[TEGRA114_CLK_PLL_A] = clk; |
1280 | 1294 | ||
@@ -1290,8 +1304,7 @@ static void __init tegra114_pll_init(void __iomem *clk_base, | |||
1290 | 1304 | ||
1291 | /* PLLRE */ | 1305 | /* PLLRE */ |
1292 | clk = tegra_clk_register_pllre("pll_re_vco", "pll_ref", clk_base, pmc, | 1306 | clk = tegra_clk_register_pllre("pll_re_vco", "pll_ref", clk_base, pmc, |
1293 | 0, 0, &pll_re_vco_params, TEGRA_PLL_USE_LOCK, | 1307 | 0, &pll_re_vco_params, &pll_re_lock, pll_ref_freq); |
1294 | NULL, &pll_re_lock, pll_ref_freq); | ||
1295 | clk_register_clkdev(clk, "pll_re_vco", NULL); | 1308 | clk_register_clkdev(clk, "pll_re_vco", NULL); |
1296 | clks[TEGRA114_CLK_PLL_RE_VCO] = clk; | 1309 | clks[TEGRA114_CLK_PLL_RE_VCO] = clk; |
1297 | 1310 | ||
@@ -1303,8 +1316,7 @@ static void __init tegra114_pll_init(void __iomem *clk_base, | |||
1303 | 1316 | ||
1304 | /* PLLE */ | 1317 | /* PLLE */ |
1305 | clk = tegra_clk_register_plle_tegra114("pll_e_out0", "pll_ref", | 1318 | clk = tegra_clk_register_plle_tegra114("pll_e_out0", "pll_ref", |
1306 | clk_base, 0, 100000000, &pll_e_params, | 1319 | clk_base, 0, &pll_e_params, NULL); |
1307 | pll_e_freq_table, NULL); | ||
1308 | clk_register_clkdev(clk, "pll_e_out0", NULL); | 1320 | clk_register_clkdev(clk, "pll_e_out0", NULL); |
1309 | clks[TEGRA114_CLK_PLL_E_OUT0] = clk; | 1321 | clks[TEGRA114_CLK_PLL_E_OUT0] = clk; |
1310 | } | 1322 | } |
diff --git a/drivers/clk/tegra/clk-tegra20.c b/drivers/clk/tegra/clk-tegra20.c index 6bf5c339ab43..31547fde92e4 100644 --- a/drivers/clk/tegra/clk-tegra20.c +++ b/drivers/clk/tegra/clk-tegra20.c | |||
@@ -360,6 +360,8 @@ static struct tegra_clk_pll_params pll_c_params = { | |||
360 | .lock_mask = PLL_BASE_LOCK, | 360 | .lock_mask = PLL_BASE_LOCK, |
361 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, | 361 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, |
362 | .lock_delay = 300, | 362 | .lock_delay = 300, |
363 | .freq_table = pll_c_freq_table, | ||
364 | .flags = TEGRA_PLL_HAS_CPCON, | ||
363 | }; | 365 | }; |
364 | 366 | ||
365 | static struct tegra_clk_pll_params pll_m_params = { | 367 | static struct tegra_clk_pll_params pll_m_params = { |
@@ -374,6 +376,8 @@ static struct tegra_clk_pll_params pll_m_params = { | |||
374 | .lock_mask = PLL_BASE_LOCK, | 376 | .lock_mask = PLL_BASE_LOCK, |
375 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, | 377 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, |
376 | .lock_delay = 300, | 378 | .lock_delay = 300, |
379 | .freq_table = pll_m_freq_table, | ||
380 | .flags = TEGRA_PLL_HAS_CPCON, | ||
377 | }; | 381 | }; |
378 | 382 | ||
379 | static struct tegra_clk_pll_params pll_p_params = { | 383 | static struct tegra_clk_pll_params pll_p_params = { |
@@ -388,6 +392,9 @@ static struct tegra_clk_pll_params pll_p_params = { | |||
388 | .lock_mask = PLL_BASE_LOCK, | 392 | .lock_mask = PLL_BASE_LOCK, |
389 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, | 393 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, |
390 | .lock_delay = 300, | 394 | .lock_delay = 300, |
395 | .freq_table = pll_p_freq_table, | ||
396 | .flags = TEGRA_PLL_FIXED | TEGRA_PLL_HAS_CPCON, | ||
397 | .fixed_rate = 216000000, | ||
391 | }; | 398 | }; |
392 | 399 | ||
393 | static struct tegra_clk_pll_params pll_a_params = { | 400 | static struct tegra_clk_pll_params pll_a_params = { |
@@ -402,6 +409,8 @@ static struct tegra_clk_pll_params pll_a_params = { | |||
402 | .lock_mask = PLL_BASE_LOCK, | 409 | .lock_mask = PLL_BASE_LOCK, |
403 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, | 410 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, |
404 | .lock_delay = 300, | 411 | .lock_delay = 300, |
412 | .freq_table = pll_a_freq_table, | ||
413 | .flags = TEGRA_PLL_HAS_CPCON, | ||
405 | }; | 414 | }; |
406 | 415 | ||
407 | static struct tegra_clk_pll_params pll_d_params = { | 416 | static struct tegra_clk_pll_params pll_d_params = { |
@@ -416,6 +425,8 @@ static struct tegra_clk_pll_params pll_d_params = { | |||
416 | .lock_mask = PLL_BASE_LOCK, | 425 | .lock_mask = PLL_BASE_LOCK, |
417 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, | 426 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, |
418 | .lock_delay = 1000, | 427 | .lock_delay = 1000, |
428 | .freq_table = pll_d_freq_table, | ||
429 | .flags = TEGRA_PLL_HAS_CPCON, | ||
419 | }; | 430 | }; |
420 | 431 | ||
421 | static struct pdiv_map pllu_p[] = { | 432 | static struct pdiv_map pllu_p[] = { |
@@ -437,6 +448,8 @@ static struct tegra_clk_pll_params pll_u_params = { | |||
437 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, | 448 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, |
438 | .lock_delay = 1000, | 449 | .lock_delay = 1000, |
439 | .pdiv_tohw = pllu_p, | 450 | .pdiv_tohw = pllu_p, |
451 | .freq_table = pll_u_freq_table, | ||
452 | .flags = TEGRA_PLLU | TEGRA_PLL_HAS_CPCON, | ||
440 | }; | 453 | }; |
441 | 454 | ||
442 | static struct tegra_clk_pll_params pll_x_params = { | 455 | static struct tegra_clk_pll_params pll_x_params = { |
@@ -451,6 +464,8 @@ static struct tegra_clk_pll_params pll_x_params = { | |||
451 | .lock_mask = PLL_BASE_LOCK, | 464 | .lock_mask = PLL_BASE_LOCK, |
452 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, | 465 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, |
453 | .lock_delay = 300, | 466 | .lock_delay = 300, |
467 | .freq_table = pll_x_freq_table, | ||
468 | .flags = TEGRA_PLL_HAS_CPCON, | ||
454 | }; | 469 | }; |
455 | 470 | ||
456 | static struct tegra_clk_pll_params pll_e_params = { | 471 | static struct tegra_clk_pll_params pll_e_params = { |
@@ -465,6 +480,9 @@ static struct tegra_clk_pll_params pll_e_params = { | |||
465 | .lock_mask = PLLE_MISC_LOCK, | 480 | .lock_mask = PLLE_MISC_LOCK, |
466 | .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE, | 481 | .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE, |
467 | .lock_delay = 0, | 482 | .lock_delay = 0, |
483 | .freq_table = pll_e_freq_table, | ||
484 | .flags = TEGRA_PLL_FIXED, | ||
485 | .fixed_rate = 100000000, | ||
468 | }; | 486 | }; |
469 | 487 | ||
470 | static unsigned long tegra20_clk_measure_input_freq(void) | 488 | static unsigned long tegra20_clk_measure_input_freq(void) |
@@ -526,8 +544,7 @@ static void tegra20_pll_init(void) | |||
526 | 544 | ||
527 | /* PLLC */ | 545 | /* PLLC */ |
528 | clk = tegra_clk_register_pll("pll_c", "pll_ref", clk_base, NULL, 0, | 546 | clk = tegra_clk_register_pll("pll_c", "pll_ref", clk_base, NULL, 0, |
529 | 0, &pll_c_params, TEGRA_PLL_HAS_CPCON, | 547 | &pll_c_params, NULL); |
530 | pll_c_freq_table, NULL); | ||
531 | clk_register_clkdev(clk, "pll_c", NULL); | 548 | clk_register_clkdev(clk, "pll_c", NULL); |
532 | clks[pll_c] = clk; | 549 | clks[pll_c] = clk; |
533 | 550 | ||
@@ -543,8 +560,7 @@ static void tegra20_pll_init(void) | |||
543 | 560 | ||
544 | /* PLLP */ | 561 | /* PLLP */ |
545 | clk = tegra_clk_register_pll("pll_p", "pll_ref", clk_base, NULL, 0, | 562 | clk = tegra_clk_register_pll("pll_p", "pll_ref", clk_base, NULL, 0, |
546 | 216000000, &pll_p_params, TEGRA_PLL_FIXED | | 563 | &pll_p_params, NULL); |
547 | TEGRA_PLL_HAS_CPCON, pll_p_freq_table, NULL); | ||
548 | clk_register_clkdev(clk, "pll_p", NULL); | 564 | clk_register_clkdev(clk, "pll_p", NULL); |
549 | clks[pll_p] = clk; | 565 | clks[pll_p] = clk; |
550 | 566 | ||
@@ -598,9 +614,8 @@ static void tegra20_pll_init(void) | |||
598 | 614 | ||
599 | /* PLLM */ | 615 | /* PLLM */ |
600 | clk = tegra_clk_register_pll("pll_m", "pll_ref", clk_base, NULL, | 616 | clk = tegra_clk_register_pll("pll_m", "pll_ref", clk_base, NULL, |
601 | CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, 0, | 617 | CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, |
602 | &pll_m_params, TEGRA_PLL_HAS_CPCON, | 618 | &pll_m_params, NULL); |
603 | pll_m_freq_table, NULL); | ||
604 | clk_register_clkdev(clk, "pll_m", NULL); | 619 | clk_register_clkdev(clk, "pll_m", NULL); |
605 | clks[pll_m] = clk; | 620 | clks[pll_m] = clk; |
606 | 621 | ||
@@ -616,22 +631,19 @@ static void tegra20_pll_init(void) | |||
616 | 631 | ||
617 | /* PLLX */ | 632 | /* PLLX */ |
618 | clk = tegra_clk_register_pll("pll_x", "pll_ref", clk_base, NULL, 0, | 633 | clk = tegra_clk_register_pll("pll_x", "pll_ref", clk_base, NULL, 0, |
619 | 0, &pll_x_params, TEGRA_PLL_HAS_CPCON, | 634 | &pll_x_params, NULL); |
620 | pll_x_freq_table, NULL); | ||
621 | clk_register_clkdev(clk, "pll_x", NULL); | 635 | clk_register_clkdev(clk, "pll_x", NULL); |
622 | clks[pll_x] = clk; | 636 | clks[pll_x] = clk; |
623 | 637 | ||
624 | /* PLLU */ | 638 | /* PLLU */ |
625 | clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, NULL, 0, | 639 | clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, NULL, 0, |
626 | 0, &pll_u_params, TEGRA_PLLU | TEGRA_PLL_HAS_CPCON, | 640 | &pll_u_params, NULL); |
627 | pll_u_freq_table, NULL); | ||
628 | clk_register_clkdev(clk, "pll_u", NULL); | 641 | clk_register_clkdev(clk, "pll_u", NULL); |
629 | clks[pll_u] = clk; | 642 | clks[pll_u] = clk; |
630 | 643 | ||
631 | /* PLLD */ | 644 | /* PLLD */ |
632 | clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, NULL, 0, | 645 | clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, NULL, 0, |
633 | 0, &pll_d_params, TEGRA_PLL_HAS_CPCON, | 646 | &pll_d_params, NULL); |
634 | pll_d_freq_table, NULL); | ||
635 | clk_register_clkdev(clk, "pll_d", NULL); | 647 | clk_register_clkdev(clk, "pll_d", NULL); |
636 | clks[pll_d] = clk; | 648 | clks[pll_d] = clk; |
637 | 649 | ||
@@ -643,8 +655,7 @@ static void tegra20_pll_init(void) | |||
643 | 655 | ||
644 | /* PLLA */ | 656 | /* PLLA */ |
645 | clk = tegra_clk_register_pll("pll_a", "pll_p_out1", clk_base, NULL, 0, | 657 | clk = tegra_clk_register_pll("pll_a", "pll_p_out1", clk_base, NULL, 0, |
646 | 0, &pll_a_params, TEGRA_PLL_HAS_CPCON, | 658 | &pll_a_params, NULL); |
647 | pll_a_freq_table, NULL); | ||
648 | clk_register_clkdev(clk, "pll_a", NULL); | 659 | clk_register_clkdev(clk, "pll_a", NULL); |
649 | clks[pll_a] = clk; | 660 | clks[pll_a] = clk; |
650 | 661 | ||
@@ -660,8 +671,7 @@ static void tegra20_pll_init(void) | |||
660 | 671 | ||
661 | /* PLLE */ | 672 | /* PLLE */ |
662 | clk = tegra_clk_register_plle("pll_e", "pll_ref", clk_base, pmc_base, | 673 | clk = tegra_clk_register_plle("pll_e", "pll_ref", clk_base, pmc_base, |
663 | 0, 100000000, &pll_e_params, | 674 | 0, &pll_e_params, NULL); |
664 | 0, pll_e_freq_table, NULL); | ||
665 | clk_register_clkdev(clk, "pll_e", NULL); | 675 | clk_register_clkdev(clk, "pll_e", NULL); |
666 | clks[pll_e] = clk; | 676 | clks[pll_e] = clk; |
667 | } | 677 | } |
diff --git a/drivers/clk/tegra/clk-tegra30.c b/drivers/clk/tegra/clk-tegra30.c index c5db42217ba8..da540f6dc9c9 100644 --- a/drivers/clk/tegra/clk-tegra30.c +++ b/drivers/clk/tegra/clk-tegra30.c | |||
@@ -530,6 +530,8 @@ static struct tegra_clk_pll_params pll_c_params = { | |||
530 | .lock_mask = PLL_BASE_LOCK, | 530 | .lock_mask = PLL_BASE_LOCK, |
531 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, | 531 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, |
532 | .lock_delay = 300, | 532 | .lock_delay = 300, |
533 | .freq_table = pll_c_freq_table, | ||
534 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK, | ||
533 | }; | 535 | }; |
534 | 536 | ||
535 | static struct div_nmp pllm_nmp = { | 537 | static struct div_nmp pllm_nmp = { |
@@ -559,6 +561,9 @@ static struct tegra_clk_pll_params pll_m_params = { | |||
559 | .div_nmp = &pllm_nmp, | 561 | .div_nmp = &pllm_nmp, |
560 | .pmc_divnm_reg = PMC_PLLM_WB0_OVERRIDE, | 562 | .pmc_divnm_reg = PMC_PLLM_WB0_OVERRIDE, |
561 | .pmc_divp_reg = PMC_PLLM_WB0_OVERRIDE, | 563 | .pmc_divp_reg = PMC_PLLM_WB0_OVERRIDE, |
564 | .freq_table = pll_m_freq_table, | ||
565 | .flags = TEGRA_PLLM | TEGRA_PLL_HAS_CPCON | | ||
566 | TEGRA_PLL_SET_DCCON | TEGRA_PLL_USE_LOCK, | ||
562 | }; | 567 | }; |
563 | 568 | ||
564 | static struct tegra_clk_pll_params pll_p_params = { | 569 | static struct tegra_clk_pll_params pll_p_params = { |
@@ -573,6 +578,9 @@ static struct tegra_clk_pll_params pll_p_params = { | |||
573 | .lock_mask = PLL_BASE_LOCK, | 578 | .lock_mask = PLL_BASE_LOCK, |
574 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, | 579 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, |
575 | .lock_delay = 300, | 580 | .lock_delay = 300, |
581 | .freq_table = pll_p_freq_table, | ||
582 | .flags = TEGRA_PLL_FIXED | TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK, | ||
583 | .fixed_rate = 408000000, | ||
576 | }; | 584 | }; |
577 | 585 | ||
578 | static struct tegra_clk_pll_params pll_a_params = { | 586 | static struct tegra_clk_pll_params pll_a_params = { |
@@ -587,6 +595,8 @@ static struct tegra_clk_pll_params pll_a_params = { | |||
587 | .lock_mask = PLL_BASE_LOCK, | 595 | .lock_mask = PLL_BASE_LOCK, |
588 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, | 596 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, |
589 | .lock_delay = 300, | 597 | .lock_delay = 300, |
598 | .freq_table = pll_a_freq_table, | ||
599 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK, | ||
590 | }; | 600 | }; |
591 | 601 | ||
592 | static struct tegra_clk_pll_params pll_d_params = { | 602 | static struct tegra_clk_pll_params pll_d_params = { |
@@ -601,6 +611,10 @@ static struct tegra_clk_pll_params pll_d_params = { | |||
601 | .lock_mask = PLL_BASE_LOCK, | 611 | .lock_mask = PLL_BASE_LOCK, |
602 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, | 612 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, |
603 | .lock_delay = 1000, | 613 | .lock_delay = 1000, |
614 | .freq_table = pll_d_freq_table, | ||
615 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | | ||
616 | TEGRA_PLL_USE_LOCK, | ||
617 | |||
604 | }; | 618 | }; |
605 | 619 | ||
606 | static struct tegra_clk_pll_params pll_d2_params = { | 620 | static struct tegra_clk_pll_params pll_d2_params = { |
@@ -615,6 +629,9 @@ static struct tegra_clk_pll_params pll_d2_params = { | |||
615 | .lock_mask = PLL_BASE_LOCK, | 629 | .lock_mask = PLL_BASE_LOCK, |
616 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, | 630 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, |
617 | .lock_delay = 1000, | 631 | .lock_delay = 1000, |
632 | .freq_table = pll_d_freq_table, | ||
633 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | | ||
634 | TEGRA_PLL_USE_LOCK, | ||
618 | }; | 635 | }; |
619 | 636 | ||
620 | static struct tegra_clk_pll_params pll_u_params = { | 637 | static struct tegra_clk_pll_params pll_u_params = { |
@@ -630,6 +647,8 @@ static struct tegra_clk_pll_params pll_u_params = { | |||
630 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, | 647 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, |
631 | .lock_delay = 1000, | 648 | .lock_delay = 1000, |
632 | .pdiv_tohw = pllu_p, | 649 | .pdiv_tohw = pllu_p, |
650 | .freq_table = pll_u_freq_table, | ||
651 | .flags = TEGRA_PLLU | TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON, | ||
633 | }; | 652 | }; |
634 | 653 | ||
635 | static struct tegra_clk_pll_params pll_x_params = { | 654 | static struct tegra_clk_pll_params pll_x_params = { |
@@ -644,6 +663,9 @@ static struct tegra_clk_pll_params pll_x_params = { | |||
644 | .lock_mask = PLL_BASE_LOCK, | 663 | .lock_mask = PLL_BASE_LOCK, |
645 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, | 664 | .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, |
646 | .lock_delay = 300, | 665 | .lock_delay = 300, |
666 | .freq_table = pll_x_freq_table, | ||
667 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_DCCON | | ||
668 | TEGRA_PLL_USE_LOCK, | ||
647 | }; | 669 | }; |
648 | 670 | ||
649 | static struct tegra_clk_pll_params pll_e_params = { | 671 | static struct tegra_clk_pll_params pll_e_params = { |
@@ -658,6 +680,9 @@ static struct tegra_clk_pll_params pll_e_params = { | |||
658 | .lock_mask = PLLE_MISC_LOCK, | 680 | .lock_mask = PLLE_MISC_LOCK, |
659 | .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE, | 681 | .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE, |
660 | .lock_delay = 300, | 682 | .lock_delay = 300, |
683 | .freq_table = pll_e_freq_table, | ||
684 | .flags = TEGRA_PLLE_CONFIGURE | TEGRA_PLL_FIXED, | ||
685 | .fixed_rate = 100000000, | ||
661 | }; | 686 | }; |
662 | 687 | ||
663 | static void tegra30_clk_measure_input_freq(void) | 688 | static void tegra30_clk_measure_input_freq(void) |
@@ -783,9 +808,7 @@ static void __init tegra30_pll_init(void) | |||
783 | 808 | ||
784 | /* PLLC */ | 809 | /* PLLC */ |
785 | clk = tegra_clk_register_pll("pll_c", "pll_ref", clk_base, pmc_base, 0, | 810 | clk = tegra_clk_register_pll("pll_c", "pll_ref", clk_base, pmc_base, 0, |
786 | 0, &pll_c_params, | 811 | &pll_c_params, NULL); |
787 | TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK, | ||
788 | pll_c_freq_table, NULL); | ||
789 | clk_register_clkdev(clk, "pll_c", NULL); | 812 | clk_register_clkdev(clk, "pll_c", NULL); |
790 | clks[pll_c] = clk; | 813 | clks[pll_c] = clk; |
791 | 814 | ||
@@ -801,9 +824,7 @@ static void __init tegra30_pll_init(void) | |||
801 | 824 | ||
802 | /* PLLP */ | 825 | /* PLLP */ |
803 | clk = tegra_clk_register_pll("pll_p", "pll_ref", clk_base, pmc_base, 0, | 826 | clk = tegra_clk_register_pll("pll_p", "pll_ref", clk_base, pmc_base, 0, |
804 | 408000000, &pll_p_params, | 827 | &pll_p_params, NULL); |
805 | TEGRA_PLL_FIXED | TEGRA_PLL_HAS_CPCON | | ||
806 | TEGRA_PLL_USE_LOCK, pll_p_freq_table, NULL); | ||
807 | clk_register_clkdev(clk, "pll_p", NULL); | 828 | clk_register_clkdev(clk, "pll_p", NULL); |
808 | clks[pll_p] = clk; | 829 | clks[pll_p] = clk; |
809 | 830 | ||
@@ -857,10 +878,8 @@ static void __init tegra30_pll_init(void) | |||
857 | 878 | ||
858 | /* PLLM */ | 879 | /* PLLM */ |
859 | clk = tegra_clk_register_pll("pll_m", "pll_ref", clk_base, pmc_base, | 880 | clk = tegra_clk_register_pll("pll_m", "pll_ref", clk_base, pmc_base, |
860 | CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, 0, | 881 | CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, |
861 | &pll_m_params, TEGRA_PLLM | TEGRA_PLL_HAS_CPCON | | 882 | &pll_m_params, NULL); |
862 | TEGRA_PLL_SET_DCCON | TEGRA_PLL_USE_LOCK, | ||
863 | pll_m_freq_table, NULL); | ||
864 | clk_register_clkdev(clk, "pll_m", NULL); | 883 | clk_register_clkdev(clk, "pll_m", NULL); |
865 | clks[pll_m] = clk; | 884 | clks[pll_m] = clk; |
866 | 885 | ||
@@ -876,9 +895,7 @@ static void __init tegra30_pll_init(void) | |||
876 | 895 | ||
877 | /* PLLX */ | 896 | /* PLLX */ |
878 | clk = tegra_clk_register_pll("pll_x", "pll_ref", clk_base, pmc_base, 0, | 897 | clk = tegra_clk_register_pll("pll_x", "pll_ref", clk_base, pmc_base, 0, |
879 | 0, &pll_x_params, TEGRA_PLL_HAS_CPCON | | 898 | &pll_x_params, NULL); |
880 | TEGRA_PLL_SET_DCCON | TEGRA_PLL_USE_LOCK, | ||
881 | pll_x_freq_table, NULL); | ||
882 | clk_register_clkdev(clk, "pll_x", NULL); | 899 | clk_register_clkdev(clk, "pll_x", NULL); |
883 | clks[pll_x] = clk; | 900 | clks[pll_x] = clk; |
884 | 901 | ||
@@ -890,10 +907,7 @@ static void __init tegra30_pll_init(void) | |||
890 | 907 | ||
891 | /* PLLU */ | 908 | /* PLLU */ |
892 | clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, pmc_base, 0, | 909 | clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, pmc_base, 0, |
893 | 0, &pll_u_params, TEGRA_PLLU | TEGRA_PLL_HAS_CPCON | | 910 | &pll_u_params, NULL); |
894 | TEGRA_PLL_SET_LFCON, | ||
895 | pll_u_freq_table, | ||
896 | NULL); | ||
897 | clk_register_clkdev(clk, "pll_u", NULL); | 911 | clk_register_clkdev(clk, "pll_u", NULL); |
898 | clks[pll_u] = clk; | 912 | clks[pll_u] = clk; |
899 | 913 | ||
@@ -901,9 +915,7 @@ static void __init tegra30_pll_init(void) | |||
901 | 915 | ||
902 | /* PLLD */ | 916 | /* PLLD */ |
903 | clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, pmc_base, 0, | 917 | clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, pmc_base, 0, |
904 | 0, &pll_d_params, TEGRA_PLL_HAS_CPCON | | 918 | &pll_d_params, &pll_d_lock); |
905 | TEGRA_PLL_SET_LFCON | TEGRA_PLL_USE_LOCK, | ||
906 | pll_d_freq_table, &pll_d_lock); | ||
907 | clk_register_clkdev(clk, "pll_d", NULL); | 919 | clk_register_clkdev(clk, "pll_d", NULL); |
908 | clks[pll_d] = clk; | 920 | clks[pll_d] = clk; |
909 | 921 | ||
@@ -915,9 +927,7 @@ static void __init tegra30_pll_init(void) | |||
915 | 927 | ||
916 | /* PLLD2 */ | 928 | /* PLLD2 */ |
917 | clk = tegra_clk_register_pll("pll_d2", "pll_ref", clk_base, pmc_base, 0, | 929 | clk = tegra_clk_register_pll("pll_d2", "pll_ref", clk_base, pmc_base, 0, |
918 | 0, &pll_d2_params, TEGRA_PLL_HAS_CPCON | | 930 | &pll_d2_params, NULL); |
919 | TEGRA_PLL_SET_LFCON | TEGRA_PLL_USE_LOCK, | ||
920 | pll_d_freq_table, NULL); | ||
921 | clk_register_clkdev(clk, "pll_d2", NULL); | 931 | clk_register_clkdev(clk, "pll_d2", NULL); |
922 | clks[pll_d2] = clk; | 932 | clks[pll_d2] = clk; |
923 | 933 | ||
@@ -929,8 +939,7 @@ static void __init tegra30_pll_init(void) | |||
929 | 939 | ||
930 | /* PLLA */ | 940 | /* PLLA */ |
931 | clk = tegra_clk_register_pll("pll_a", "pll_p_out1", clk_base, pmc_base, | 941 | clk = tegra_clk_register_pll("pll_a", "pll_p_out1", clk_base, pmc_base, |
932 | 0, 0, &pll_a_params, TEGRA_PLL_HAS_CPCON | | 942 | 0, &pll_a_params, NULL); |
933 | TEGRA_PLL_USE_LOCK, pll_a_freq_table, NULL); | ||
934 | clk_register_clkdev(clk, "pll_a", NULL); | 943 | clk_register_clkdev(clk, "pll_a", NULL); |
935 | clks[pll_a] = clk; | 944 | clks[pll_a] = clk; |
936 | 945 | ||
@@ -950,8 +959,7 @@ static void __init tegra30_pll_init(void) | |||
950 | CLK_SET_RATE_NO_REPARENT, | 959 | CLK_SET_RATE_NO_REPARENT, |
951 | clk_base + PLLE_AUX, 2, 1, 0, NULL); | 960 | clk_base + PLLE_AUX, 2, 1, 0, NULL); |
952 | clk = tegra_clk_register_plle("pll_e", "pll_e_mux", clk_base, pmc_base, | 961 | clk = tegra_clk_register_plle("pll_e", "pll_e_mux", clk_base, pmc_base, |
953 | CLK_GET_RATE_NOCACHE, 100000000, &pll_e_params, | 962 | CLK_GET_RATE_NOCACHE, &pll_e_params, NULL); |
954 | TEGRA_PLLE_CONFIGURE, pll_e_freq_table, NULL); | ||
955 | clk_register_clkdev(clk, "pll_e", NULL); | 963 | clk_register_clkdev(clk, "pll_e", NULL); |
956 | clks[pll_e] = clk; | 964 | clks[pll_e] = clk; |
957 | } | 965 | } |
diff --git a/drivers/clk/tegra/clk.h b/drivers/clk/tegra/clk.h index a82672084718..c49df4dc5ac6 100644 --- a/drivers/clk/tegra/clk.h +++ b/drivers/clk/tegra/clk.h | |||
@@ -190,12 +190,15 @@ struct tegra_clk_pll_params { | |||
190 | u32 ext_misc_reg[3]; | 190 | u32 ext_misc_reg[3]; |
191 | u32 pmc_divnm_reg; | 191 | u32 pmc_divnm_reg; |
192 | u32 pmc_divp_reg; | 192 | u32 pmc_divp_reg; |
193 | u32 flags; | ||
193 | int stepa_shift; | 194 | int stepa_shift; |
194 | int stepb_shift; | 195 | int stepb_shift; |
195 | int lock_delay; | 196 | int lock_delay; |
196 | int max_p; | 197 | int max_p; |
197 | struct pdiv_map *pdiv_tohw; | 198 | struct pdiv_map *pdiv_tohw; |
198 | struct div_nmp *div_nmp; | 199 | struct div_nmp *div_nmp; |
200 | struct tegra_clk_pll_freq_table *freq_table; | ||
201 | unsigned long fixed_rate; | ||
199 | }; | 202 | }; |
200 | 203 | ||
201 | /** | 204 | /** |
@@ -235,10 +238,7 @@ struct tegra_clk_pll { | |||
235 | struct clk_hw hw; | 238 | struct clk_hw hw; |
236 | void __iomem *clk_base; | 239 | void __iomem *clk_base; |
237 | void __iomem *pmc; | 240 | void __iomem *pmc; |
238 | u32 flags; | ||
239 | unsigned long fixed_rate; | ||
240 | spinlock_t *lock; | 241 | spinlock_t *lock; |
241 | struct tegra_clk_pll_freq_table *freq_table; | ||
242 | struct tegra_clk_pll_params *params; | 242 | struct tegra_clk_pll_params *params; |
243 | }; | 243 | }; |
244 | 244 | ||
@@ -260,54 +260,42 @@ extern const struct clk_ops tegra_clk_pll_ops; | |||
260 | extern const struct clk_ops tegra_clk_plle_ops; | 260 | extern const struct clk_ops tegra_clk_plle_ops; |
261 | struct clk *tegra_clk_register_pll(const char *name, const char *parent_name, | 261 | struct clk *tegra_clk_register_pll(const char *name, const char *parent_name, |
262 | void __iomem *clk_base, void __iomem *pmc, | 262 | void __iomem *clk_base, void __iomem *pmc, |
263 | unsigned long flags, unsigned long fixed_rate, | 263 | unsigned long flags, struct tegra_clk_pll_params *pll_params, |
264 | struct tegra_clk_pll_params *pll_params, u32 pll_flags, | 264 | spinlock_t *lock); |
265 | struct tegra_clk_pll_freq_table *freq_table, spinlock_t *lock); | ||
266 | 265 | ||
267 | struct clk *tegra_clk_register_plle(const char *name, const char *parent_name, | 266 | struct clk *tegra_clk_register_plle(const char *name, const char *parent_name, |
268 | void __iomem *clk_base, void __iomem *pmc, | 267 | void __iomem *clk_base, void __iomem *pmc, |
269 | unsigned long flags, unsigned long fixed_rate, | 268 | unsigned long flags, struct tegra_clk_pll_params *pll_params, |
270 | struct tegra_clk_pll_params *pll_params, u32 pll_flags, | 269 | spinlock_t *lock); |
271 | struct tegra_clk_pll_freq_table *freq_table, spinlock_t *lock); | ||
272 | 270 | ||
273 | struct clk *tegra_clk_register_pllxc(const char *name, const char *parent_name, | 271 | struct clk *tegra_clk_register_pllxc(const char *name, const char *parent_name, |
274 | void __iomem *clk_base, void __iomem *pmc, | 272 | void __iomem *clk_base, void __iomem *pmc, |
275 | unsigned long flags, unsigned long fixed_rate, | 273 | unsigned long flags, |
276 | struct tegra_clk_pll_params *pll_params, | 274 | struct tegra_clk_pll_params *pll_params, |
277 | u32 pll_flags, | ||
278 | struct tegra_clk_pll_freq_table *freq_table, | ||
279 | spinlock_t *lock); | 275 | spinlock_t *lock); |
280 | 276 | ||
281 | struct clk *tegra_clk_register_pllm(const char *name, const char *parent_name, | 277 | struct clk *tegra_clk_register_pllm(const char *name, const char *parent_name, |
282 | void __iomem *clk_base, void __iomem *pmc, | 278 | void __iomem *clk_base, void __iomem *pmc, |
283 | unsigned long flags, unsigned long fixed_rate, | 279 | unsigned long flags, |
284 | struct tegra_clk_pll_params *pll_params, | 280 | struct tegra_clk_pll_params *pll_params, |
285 | u32 pll_flags, | ||
286 | struct tegra_clk_pll_freq_table *freq_table, | ||
287 | spinlock_t *lock); | 281 | spinlock_t *lock); |
288 | 282 | ||
289 | struct clk *tegra_clk_register_pllc(const char *name, const char *parent_name, | 283 | struct clk *tegra_clk_register_pllc(const char *name, const char *parent_name, |
290 | void __iomem *clk_base, void __iomem *pmc, | 284 | void __iomem *clk_base, void __iomem *pmc, |
291 | unsigned long flags, unsigned long fixed_rate, | 285 | unsigned long flags, |
292 | struct tegra_clk_pll_params *pll_params, | 286 | struct tegra_clk_pll_params *pll_params, |
293 | u32 pll_flags, | ||
294 | struct tegra_clk_pll_freq_table *freq_table, | ||
295 | spinlock_t *lock); | 287 | spinlock_t *lock); |
296 | 288 | ||
297 | struct clk *tegra_clk_register_pllre(const char *name, const char *parent_name, | 289 | struct clk *tegra_clk_register_pllre(const char *name, const char *parent_name, |
298 | void __iomem *clk_base, void __iomem *pmc, | 290 | void __iomem *clk_base, void __iomem *pmc, |
299 | unsigned long flags, unsigned long fixed_rate, | 291 | unsigned long flags, |
300 | struct tegra_clk_pll_params *pll_params, | 292 | struct tegra_clk_pll_params *pll_params, |
301 | u32 pll_flags, | ||
302 | struct tegra_clk_pll_freq_table *freq_table, | ||
303 | spinlock_t *lock, unsigned long parent_rate); | 293 | spinlock_t *lock, unsigned long parent_rate); |
304 | 294 | ||
305 | struct clk *tegra_clk_register_plle_tegra114(const char *name, | 295 | struct clk *tegra_clk_register_plle_tegra114(const char *name, |
306 | const char *parent_name, | 296 | const char *parent_name, |
307 | void __iomem *clk_base, unsigned long flags, | 297 | void __iomem *clk_base, unsigned long flags, |
308 | unsigned long fixed_rate, | ||
309 | struct tegra_clk_pll_params *pll_params, | 298 | struct tegra_clk_pll_params *pll_params, |
310 | struct tegra_clk_pll_freq_table *freq_table, | ||
311 | spinlock_t *lock); | 299 | spinlock_t *lock); |
312 | 300 | ||
313 | /** | 301 | /** |