summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gm20b/clk_gm20b.c
diff options
context:
space:
mode:
authorAlex Frid <afrid@nvidia.com>2015-04-14 22:45:40 -0400
committerIshan Mittal <imittal@nvidia.com>2015-05-18 01:49:49 -0400
commitd1342b8aa2fc384b2672ffcf9d34249b6ff7868c (patch)
tree39e4e688d00228bb0bd3464a099c7f89d936c2d0 /drivers/gpu/nvgpu/gm20b/clk_gm20b.c
parent1767c779514c9bb10321e39dc8af47cab760bc2b (diff)
gpu: nvgpu: Combine delays with GM20B parameters
Added delays definitions to GPCPLL parameters structure: - locking timeout delay (applied to locking in fixed frequency mode and to PLL dynamic ramp in any mode) - lock delay for GPCPLL NA mode - IDDQ exit delay in any mode Specified delay parameters for GM20B PLL, and used this data instead of hard-coded numbers. Change-Id: I63ce0abc9ee900c36ec34b8641513db3cbb6f7d5 Signed-off-by: Alex Frid <afrid@nvidia.com> Reviewed-on: http://git-master/r/732094 Reviewed-by: Seshendra Gadagottu <sgadagottu@nvidia.com> Reviewed-by: Yu-Huan Hsu <yhsu@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gm20b/clk_gm20b.c')
-rw-r--r--drivers/gpu/nvgpu/gm20b/clk_gm20b.c22
1 files changed, 8 insertions, 14 deletions
diff --git a/drivers/gpu/nvgpu/gm20b/clk_gm20b.c b/drivers/gpu/nvgpu/gm20b/clk_gm20b.c
index d0a39bc6..16f929a8 100644
--- a/drivers/gpu/nvgpu/gm20b/clk_gm20b.c
+++ b/drivers/gpu/nvgpu/gm20b/clk_gm20b.c
@@ -56,6 +56,9 @@ static struct pll_parms gpc_pll_params = {
56 -165230, 214007, /* DFS_COEFF */ 56 -165230, 214007, /* DFS_COEFF */
57 0, 0, /* ADC char coeff - to be read from fuses */ 57 0, 0, /* ADC char coeff - to be read from fuses */
58 0x7 << 3, /* vco control in NA mode */ 58 0x7 << 3, /* vco control in NA mode */
59 500, /* Locking and ramping timeout */
60 40, /* Lock delay in NA mode */
61 5, /* IDDQ mode exit delay */
59}; 62};
60 63
61#ifdef CONFIG_DEBUG_FS 64#ifdef CONFIG_DEBUG_FS
@@ -411,7 +414,7 @@ static void clk_setup_dvfs_detection(struct gk20a *g, struct pll *gpll)
411static int clk_enbale_pll_dvfs(struct gk20a *g) 414static int clk_enbale_pll_dvfs(struct gk20a *g)
412{ 415{
413 u32 data; 416 u32 data;
414 int delay = 5; /* use for iddq exit delay & calib timeout */ 417 int delay = gpc_pll_params.iddq_exit_delay; /* iddq & calib delay */
415 struct pll_parms *p = &gpc_pll_params; 418 struct pll_parms *p = &gpc_pll_params;
416 bool calibrated = p->uvdet_slope && p->uvdet_offs; 419 bool calibrated = p->uvdet_slope && p->uvdet_offs;
417 420
@@ -527,7 +530,7 @@ static int clk_slide_gpc_pll(struct gk20a *g, struct pll *gpll)
527{ 530{
528 u32 data, coeff; 531 u32 data, coeff;
529 u32 nold, sdm_old; 532 u32 nold, sdm_old;
530 int ramp_timeout = 500; 533 int ramp_timeout = gpc_pll_params.lock_timeout;
531 534
532 /* get old coefficients */ 535 /* get old coefficients */
533 coeff = gk20a_readl(g, trim_sys_gpcpll_coeff_r()); 536 coeff = gk20a_readl(g, trim_sys_gpcpll_coeff_r());
@@ -666,7 +669,7 @@ static int clk_lock_gpc_pll_under_bypass(struct gk20a *g, struct pll *gpll)
666 trim_sys_gpcpll_cfg_iddq_power_on_v()); 669 trim_sys_gpcpll_cfg_iddq_power_on_v());
667 gk20a_writel(g, trim_sys_gpcpll_cfg_r(), cfg); 670 gk20a_writel(g, trim_sys_gpcpll_cfg_r(), cfg);
668 gk20a_readl(g, trim_sys_gpcpll_cfg_r()); 671 gk20a_readl(g, trim_sys_gpcpll_cfg_r());
669 udelay(5); 672 udelay(gpc_pll_params.iddq_exit_delay);
670 } else { 673 } else {
671 /* clear SYNC_MODE before disabling PLL */ 674 /* clear SYNC_MODE before disabling PLL */
672 cfg = set_field(cfg, trim_sys_gpcpll_cfg_sync_mode_m(), 675 cfg = set_field(cfg, trim_sys_gpcpll_cfg_sync_mode_m(),
@@ -710,7 +713,7 @@ static int clk_lock_gpc_pll_under_bypass(struct gk20a *g, struct pll *gpll)
710 /* just delay in DVFS mode (lock cannot be used) */ 713 /* just delay in DVFS mode (lock cannot be used) */
711 if (gpll->mode == GPC_PLL_MODE_DVFS) { 714 if (gpll->mode == GPC_PLL_MODE_DVFS) {
712 gk20a_readl(g, trim_sys_gpcpll_cfg_r()); 715 gk20a_readl(g, trim_sys_gpcpll_cfg_r());
713 udelay(g->clk.na_pll_delay); 716 udelay(gpc_pll_params.na_lock_delay);
714 gk20a_dbg_clk("NA config_pll under bypass: %u (%u) kHz %d mV", 717 gk20a_dbg_clk("NA config_pll under bypass: %u (%u) kHz %d mV",
715 gpll->freq, gpll->freq / 2, 718 gpll->freq, gpll->freq / 2,
716 (trim_sys_gpcpll_cfg3_dfs_testout_v( 719 (trim_sys_gpcpll_cfg3_dfs_testout_v(
@@ -730,7 +733,7 @@ static int clk_lock_gpc_pll_under_bypass(struct gk20a *g, struct pll *gpll)
730 } 733 }
731 734
732 /* wait pll lock */ 735 /* wait pll lock */
733 timeout = g->clk.pll_delay + 1; 736 timeout = gpc_pll_params.lock_timeout + 1;
734 do { 737 do {
735 udelay(1); 738 udelay(1);
736 cfg = gk20a_readl(g, trim_sys_gpcpll_cfg_r()); 739 cfg = gk20a_readl(g, trim_sys_gpcpll_cfg_r());
@@ -1088,15 +1091,6 @@ static int gm20b_init_clk_setup_sw(struct gk20a *g)
1088 return -EINVAL; 1091 return -EINVAL;
1089 } 1092 }
1090 1093
1091 /*
1092 * Locking time in both legacy and DVFS mode is 40us. However, in legacy
1093 * mode we rely on lock detection signal, and delay is just timeout
1094 * limit, so we can afford set it longer. In DVFS mode each lock inserts
1095 * specified delay, so it should be set as short as h/w allows.
1096 */
1097 clk->pll_delay = 300; /* usec */
1098 clk->na_pll_delay = 40; /* usec*/
1099
1100 clk->gpc_pll.id = GK20A_GPC_PLL; 1094 clk->gpc_pll.id = GK20A_GPC_PLL;
1101 clk->gpc_pll.clk_in = clk_get_rate(ref) / KHZ; 1095 clk->gpc_pll.clk_in = clk_get_rate(ref) / KHZ;
1102 1096