aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2014-04-04 09:55:14 -0400
committerPeter De Schrijver <pdeschrijver@nvidia.com>2014-04-17 07:12:40 -0400
commitc61e4e75b95bda4c6fec134aa9f08b5629b532e6 (patch)
treed51db378950004f0b606425e24be05da5fc5fa49
parentd0f02ce3b1685ef6ffe43692034599790f83e7ab (diff)
clk: tegra: Introduce divider mask and shift helpers
Add div{m,n,p}_shift() and div{m,n,p}_mask_shifted() helpers to make the code that modifies the m-, n- and p-divider fields of PLLs shorter and easier to read. Signed-off-by: Thierry Reding <treding@nvidia.com>
-rw-r--r--drivers/clk/tegra/clk-pll.c44
1 files changed, 24 insertions, 20 deletions
diff --git a/drivers/clk/tegra/clk-pll.c b/drivers/clk/tegra/clk-pll.c
index 357911303315..1187187a1cf2 100644
--- a/drivers/clk/tegra/clk-pll.c
+++ b/drivers/clk/tegra/clk-pll.c
@@ -183,6 +183,14 @@
183#define divp_mask(p) (p->params->flags & TEGRA_PLLU ? PLLU_POST_DIVP_MASK :\ 183#define divp_mask(p) (p->params->flags & TEGRA_PLLU ? PLLU_POST_DIVP_MASK :\
184 mask(p->params->div_nmp->divp_width)) 184 mask(p->params->div_nmp->divp_width))
185 185
186#define divm_shift(p) (p)->params->div_nmp->divm_shift
187#define divn_shift(p) (p)->params->div_nmp->divn_shift
188#define divp_shift(p) (p)->params->div_nmp->divp_shift
189
190#define divm_mask_shifted(p) (divm_mask(p) << divm_shift(p))
191#define divn_mask_shifted(p) (divn_mask(p) << divn_shift(p))
192#define divp_mask_shifted(p) (divp_mask(p) << divp_shift(p))
193
186#define divm_max(p) (divm_mask(p)) 194#define divm_max(p) (divm_mask(p))
187#define divn_max(p) (divn_mask(p)) 195#define divn_max(p) (divn_mask(p))
188#define divp_max(p) (1 << (divp_mask(p))) 196#define divp_max(p) (1 << (divp_mask(p)))
@@ -476,13 +484,12 @@ static void _update_pll_mnp(struct tegra_clk_pll *pll,
476 } else { 484 } else {
477 val = pll_readl_base(pll); 485 val = pll_readl_base(pll);
478 486
479 val &= ~((divm_mask(pll) << div_nmp->divm_shift) | 487 val &= ~(divm_mask_shifted(pll) | divn_mask_shifted(pll) |
480 (divn_mask(pll) << div_nmp->divn_shift) | 488 divp_mask_shifted(pll));
481 (divp_mask(pll) << div_nmp->divp_shift));
482 489
483 val |= ((cfg->m << div_nmp->divm_shift) | 490 val |= (cfg->m << divm_shift(pll)) |
484 (cfg->n << div_nmp->divn_shift) | 491 (cfg->n << divn_shift(pll)) |
485 (cfg->p << div_nmp->divp_shift)); 492 (cfg->p << divp_shift(pll));
486 493
487 pll_writel_base(val, pll); 494 pll_writel_base(val, pll);
488 } 495 }
@@ -730,13 +737,12 @@ static int clk_plle_enable(struct clk_hw *hw)
730 if (pll->params->flags & TEGRA_PLLE_CONFIGURE) { 737 if (pll->params->flags & TEGRA_PLLE_CONFIGURE) {
731 /* configure dividers */ 738 /* configure dividers */
732 val = pll_readl_base(pll); 739 val = pll_readl_base(pll);
733 val &= ~(divp_mask(pll) << PLLE_BASE_DIVP_SHIFT | 740 val &= ~(divp_mask_shifted(pll) | divn_mask_shifted(pll) |
734 divn_mask(pll) << PLLE_BASE_DIVN_SHIFT | 741 divm_mask_shifted(pll));
735 divm_mask(pll) << PLLE_BASE_DIVM_SHIFT);
736 val &= ~(PLLE_BASE_DIVCML_MASK << PLLE_BASE_DIVCML_SHIFT); 742 val &= ~(PLLE_BASE_DIVCML_MASK << PLLE_BASE_DIVCML_SHIFT);
737 val |= sel.m << pll->params->div_nmp->divm_shift; 743 val |= sel.m << divm_shift(pll);
738 val |= sel.n << pll->params->div_nmp->divn_shift; 744 val |= sel.n << divn_shift(pll);
739 val |= sel.p << pll->params->div_nmp->divp_shift; 745 val |= sel.p << divp_shift(pll);
740 val |= sel.cpcon << PLLE_BASE_DIVCML_SHIFT; 746 val |= sel.cpcon << PLLE_BASE_DIVCML_SHIFT;
741 pll_writel_base(val, pll); 747 pll_writel_base(val, pll);
742 } 748 }
@@ -1295,12 +1301,11 @@ static int clk_plle_tegra114_enable(struct clk_hw *hw)
1295 pll_writel(val, PLLE_SS_CTRL, pll); 1301 pll_writel(val, PLLE_SS_CTRL, pll);
1296 1302
1297 val = pll_readl_base(pll); 1303 val = pll_readl_base(pll);
1298 val &= ~(divp_mask(pll) << PLLE_BASE_DIVP_SHIFT | 1304 val &= ~(divp_mask_shifted(pll) | divn_mask_shifted(pll) |
1299 divn_mask(pll) << PLLE_BASE_DIVN_SHIFT | 1305 divm_mask_shifted(pll));
1300 divm_mask(pll) << PLLE_BASE_DIVM_SHIFT);
1301 val &= ~(PLLE_BASE_DIVCML_MASK << PLLE_BASE_DIVCML_SHIFT); 1306 val &= ~(PLLE_BASE_DIVCML_MASK << PLLE_BASE_DIVCML_SHIFT);
1302 val |= sel.m << pll->params->div_nmp->divm_shift; 1307 val |= sel.m << divm_shift(pll);
1303 val |= sel.n << pll->params->div_nmp->divn_shift; 1308 val |= sel.n << divn_shift(pll);
1304 val |= sel.cpcon << PLLE_BASE_DIVCML_SHIFT; 1309 val |= sel.cpcon << PLLE_BASE_DIVCML_SHIFT;
1305 pll_writel_base(val, pll); 1310 pll_writel_base(val, pll);
1306 udelay(1); 1311 udelay(1);
@@ -1575,9 +1580,8 @@ struct clk *tegra_clk_register_pllre(const char *name, const char *parent_name,
1575 int m; 1580 int m;
1576 1581
1577 m = _pll_fixed_mdiv(pll_params, parent_rate); 1582 m = _pll_fixed_mdiv(pll_params, parent_rate);
1578 val = m << PLL_BASE_DIVM_SHIFT; 1583 val = m << divm_shift(pll);
1579 val |= (pll_params->vco_min / parent_rate) 1584 val |= (pll_params->vco_min / parent_rate) << divn_shift(pll);
1580 << PLL_BASE_DIVN_SHIFT;
1581 pll_writel_base(val, pll); 1585 pll_writel_base(val, pll);
1582 } 1586 }
1583 1587