diff options
author | Thierry Reding <treding@nvidia.com> | 2014-04-04 09:55:14 -0400 |
---|---|---|
committer | Peter De Schrijver <pdeschrijver@nvidia.com> | 2014-04-17 07:12:40 -0400 |
commit | c61e4e75b95bda4c6fec134aa9f08b5629b532e6 (patch) | |
tree | d51db378950004f0b606425e24be05da5fc5fa49 | |
parent | d0f02ce3b1685ef6ffe43692034599790f83e7ab (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.c | 44 |
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 | ||