aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Frid <afrid@nvidia.com>2017-07-25 06:34:07 -0400
committerStephen Boyd <sboyd@codeaurora.org>2017-08-23 18:59:24 -0400
commita851ea2b9e1084a7bb02403ca03667e162e226fe (patch)
treeebd8c577f1bea603f2b6a84c4c92d3d09bdd5624
parentbc7b34a2fb78661b2980d949aad8edc39c253e3a (diff)
clk: tegra: Fix T210 effective NDIV calculation
Don't take the fractional part into account to calculate the effective NDIV if fractional ndiv is not enabled. Signed-off-by: Alex Frid <afrid@nvidia.com> Signed-off-by: Peter De Schrijver <pdeschrijver@nvidia.com> Tested-by: Thierry Reding <treding@nvidia.com> Acked-by: Thierry Reding <treding@nvidia.com> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
-rw-r--r--drivers/clk/tegra/clk-tegra210.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/clk/tegra/clk-tegra210.c b/drivers/clk/tegra/clk-tegra210.c
index dc4a81328d5a..a4d7d94b6436 100644
--- a/drivers/clk/tegra/clk-tegra210.c
+++ b/drivers/clk/tegra/clk-tegra210.c
@@ -241,6 +241,9 @@
241#define PLL_SDM_COEFF BIT(13) 241#define PLL_SDM_COEFF BIT(13)
242#define sdin_din_to_data(din) ((u16)((din) ? : 0xFFFFU)) 242#define sdin_din_to_data(din) ((u16)((din) ? : 0xFFFFU))
243#define sdin_data_to_din(dat) (((dat) == 0xFFFFU) ? 0 : (s16)dat) 243#define sdin_data_to_din(dat) (((dat) == 0xFFFFU) ? 0 : (s16)dat)
244/* This macro returns ndiv effective scaled to SDM range */
245#define sdin_get_n_eff(cfg) ((cfg)->n * PLL_SDM_COEFF + ((cfg)->sdm_data ? \
246 (PLL_SDM_COEFF/2 + sdin_data_to_din((cfg)->sdm_data)) : 0))
244 247
245/* Tegra CPU clock and reset control regs */ 248/* Tegra CPU clock and reset control regs */
246#define CLK_RST_CONTROLLER_CPU_CMPLX_STATUS 0x470 249#define CLK_RST_CONTROLLER_CPU_CMPLX_STATUS 0x470
@@ -1288,8 +1291,7 @@ static int tegra210_pll_fixed_mdiv_cfg(struct clk_hw *hw,
1288 s -= PLL_SDM_COEFF / 2; 1291 s -= PLL_SDM_COEFF / 2;
1289 cfg->sdm_data = sdin_din_to_data(s); 1292 cfg->sdm_data = sdin_din_to_data(s);
1290 } 1293 }
1291 cfg->output_rate *= cfg->n * PLL_SDM_COEFF + PLL_SDM_COEFF/2 + 1294 cfg->output_rate *= sdin_get_n_eff(cfg);
1292 sdin_data_to_din(cfg->sdm_data);
1293 cfg->output_rate /= p * cfg->m * PLL_SDM_COEFF; 1295 cfg->output_rate /= p * cfg->m * PLL_SDM_COEFF;
1294 } else { 1296 } else {
1295 cfg->output_rate *= cfg->n; 1297 cfg->output_rate *= cfg->n;
@@ -1314,8 +1316,7 @@ static int tegra210_pll_fixed_mdiv_cfg(struct clk_hw *hw,
1314 */ 1316 */
1315static void tegra210_clk_pll_set_gain(struct tegra_clk_pll_freq_table *cfg) 1317static void tegra210_clk_pll_set_gain(struct tegra_clk_pll_freq_table *cfg)
1316{ 1318{
1317 cfg->n = cfg->n * PLL_SDM_COEFF + PLL_SDM_COEFF/2 + 1319 cfg->n = sdin_get_n_eff(cfg);
1318 sdin_data_to_din(cfg->sdm_data);
1319 cfg->m *= PLL_SDM_COEFF; 1320 cfg->m *= PLL_SDM_COEFF;
1320} 1321}
1321 1322