diff options
author | Alexandre Courbot <acourbot@nvidia.com> | 2016-02-05 17:10:14 +0900 |
---|---|---|
committer | Alexandre Courbot <acourbot@nvidia.com> | 2016-02-26 10:24:28 +0900 |
commit | 4b4eec067943022b4a1b756f00043a92352a9ca3 (patch) | |
tree | a6f5b44942789aaedd076215dfa528dc8f109007 | |
parent | 54d51aad0407b8566fd21f894331c8d8e77e172a (diff) | |
download | nouveau-4b4eec067943022b4a1b756f00043a92352a9ca3.tar.gz |
fold disable functions in
-rw-r--r-- | drm/nouveau/nvkm/subdev/clk/gk20a.c | 44 | ||||
-rw-r--r-- | drm/nouveau/nvkm/subdev/clk/gm20b.c | 61 |
2 files changed, 46 insertions, 59 deletions
diff --git a/drm/nouveau/nvkm/subdev/clk/gk20a.c b/drm/nouveau/nvkm/subdev/clk/gk20a.c index 209e7e736..d46423a68 100644 --- a/drm/nouveau/nvkm/subdev/clk/gk20a.c +++ b/drm/nouveau/nvkm/subdev/clk/gk20a.c @@ -383,30 +383,6 @@ gk20a_pllg_program_mnp(struct gk20a_clk *clk) return err; } -static void -gk20a_pllg_disable(struct gk20a_clk *clk) -{ - struct nvkm_device *device = clk->base.subdev.device; - u32 val; - - /* slide to VCO min */ - val = nvkm_rd32(device, GPCPLL_CFG); - if (val & GPCPLL_CFG_ENABLE) { - u32 coeff, m, n_lo; - - coeff = nvkm_rd32(device, GPCPLL_COEFF); - m = (coeff >> GPCPLL_COEFF_M_SHIFT) & MASK(GPCPLL_COEFF_M_WIDTH); - n_lo = DIV_ROUND_UP(m * clk->params->min_vco, - clk->parent_rate / KHZ); - gk20a_pllg_slide(clk, n_lo); - } - - /* put PLL in bypass before disabling it */ - nvkm_mask(device, SEL_VCO, BIT(SEL_VCO_GPC2CLK_OUT_SHIFT), 0); - - _gk20a_pllg_disable(clk); -} - #define GK20A_CLK_GPC_MDIV 1000 static struct nvkm_pstate @@ -547,8 +523,26 @@ gk20a_clk_tidy(struct nvkm_clk *base) static void gk20a_clk_fini(struct nvkm_clk *base) { + struct nvkm_device *device = base->subdev.device; struct gk20a_clk *clk = gk20a_clk(base); - gk20a_pllg_disable(clk); + u32 val; + + /* slide to VCO min */ + val = nvkm_rd32(device, GPCPLL_CFG); + if (val & GPCPLL_CFG_ENABLE) { + u32 coeff, m, n_lo; + + coeff = nvkm_rd32(device, GPCPLL_COEFF); + m = (coeff >> GPCPLL_COEFF_M_SHIFT) & MASK(GPCPLL_COEFF_M_WIDTH); + n_lo = DIV_ROUND_UP(m * clk->params->min_vco, + clk->parent_rate / KHZ); + gk20a_pllg_slide(clk, n_lo); + } + + /* put PLL in bypass before disabling it */ + nvkm_mask(device, SEL_VCO, BIT(SEL_VCO_GPC2CLK_OUT_SHIFT), 0); + + _gk20a_pllg_disable(clk); } static int diff --git a/drm/nouveau/nvkm/subdev/clk/gm20b.c b/drm/nouveau/nvkm/subdev/clk/gm20b.c index 86ec3e2cf..949b6447b 100644 --- a/drm/nouveau/nvkm/subdev/clk/gm20b.c +++ b/drm/nouveau/nvkm/subdev/clk/gm20b.c @@ -887,39 +887,6 @@ calibration_done: return 0; } -static void -gm20b_pllg_disable(struct gm20b_clk *clk) -{ - struct nvkm_subdev *subdev = &clk->base.base.subdev; - struct nvkm_device *device = subdev->device; - u32 val; - - /* slide to VCO min */ - val = nvkm_rd32(device, GPCPLL_CFG); - if (val & GPCPLL_CFG_ENABLE) { - struct gm20b_gpcpll gpcpll; - gpcpll.pll = clk->base.pll; - gpcpll.dvfs = clk->dvfs; - gpcpll.rate = clk->base.rate; - - gk20a_pllg_read_mnp(&clk->base.base, &gpcpll.pll); - gpcpll.pll.n = DIV_ROUND_UP(gpcpll.pll.m * clk->base.params->min_vco, - clk->base.parent_rate / KHZ); - if (clk->base.napll_enabled) - gm20b_clk_calc_dfs_ndiv(clk, &gpcpll.dvfs, gpcpll.dvfs.uv, - gpcpll.pll.n); - gm20b_pllg_slide(clk, &gpcpll); - } - - /* put PLL in bypass before disabling it */ - nvkm_mask(device, SEL_VCO, BIT(SEL_VCO_GPC2CLK_OUT_SHIFT), 0); - - /* clear SYNC_MODE before disabling PLL */ - nvkm_mask(device, GPCPLL_CFG, ~(0x1 << GPCPLL_CFG_SYNC_MODE), 0); - - _gm20b_pllg_disable(clk); -} - #define GM20B_CLK_GPC_MDIV 1000 static struct nvkm_pstate @@ -1065,8 +1032,34 @@ gm20b_clk_tidy(struct nvkm_clk *clk) static void gm20b_clk_fini(struct nvkm_clk *base) { + struct nvkm_device *device = base->subdev.device; struct gm20b_clk *clk = gm20b_clk(base); - gm20b_pllg_disable(clk); + u32 val; + + /* slide to VCO min */ + val = nvkm_rd32(device, GPCPLL_CFG); + if (val & GPCPLL_CFG_ENABLE) { + struct gm20b_gpcpll gpcpll; + gpcpll.pll = clk->base.pll; + gpcpll.dvfs = clk->dvfs; + gpcpll.rate = clk->base.rate; + + gk20a_pllg_read_mnp(&clk->base.base, &gpcpll.pll); + gpcpll.pll.n = DIV_ROUND_UP(gpcpll.pll.m * clk->base.params->min_vco, + clk->base.parent_rate / KHZ); + if (clk->base.napll_enabled) + gm20b_clk_calc_dfs_ndiv(clk, &gpcpll.dvfs, gpcpll.dvfs.uv, + gpcpll.pll.n); + gm20b_pllg_slide(clk, &gpcpll); + } + + /* put PLL in bypass before disabling it */ + nvkm_mask(device, SEL_VCO, BIT(SEL_VCO_GPC2CLK_OUT_SHIFT), 0); + + /* clear SYNC_MODE before disabling PLL */ + nvkm_mask(device, GPCPLL_CFG, ~(0x1 << GPCPLL_CFG_SYNC_MODE), 0); + + _gm20b_pllg_disable(clk); } static int |