aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandre Courbot <acourbot@nvidia.com>2016-02-12 00:19:27 -0500
committerBen Skeggs <bskeggs@redhat.com>2016-03-13 20:13:53 -0400
commit3c0d5d6e11c980890e9f5d6e1eb734e9297ea252 (patch)
tree0e033e4f9ab8b307a16bad4db53dae6f610a9c0d
parenta08c8bae66eb42a901410e43fd48bac8948bd2da (diff)
drm/nouveau/clk/gk20a: only restore divider to 1:1 if needed
Only restore the 1:1 divider if it is not set already. Also use the proper masks for this operation and add a second write as done in the Android code. Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/clk/gk20a.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/clk/gk20a.c b/drivers/gpu/drm/nouveau/nvkm/subdev/clk/gk20a.c
index e72e20a0d009..0746bb3e3075 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/clk/gk20a.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/clk/gk20a.c
@@ -429,9 +429,16 @@ _gk20a_pllg_program_mnp(struct gk20a_clk *clk, bool allow_slide)
429 429
430 /* restore out divider 1:1 */ 430 /* restore out divider 1:1 */
431 val = nvkm_rd32(device, GPC2CLK_OUT); 431 val = nvkm_rd32(device, GPC2CLK_OUT);
432 val &= ~GPC2CLK_OUT_VCODIV_MASK; 432 if ((val & GPC2CLK_OUT_VCODIV_MASK) !=
433 udelay(2); 433 (GPC2CLK_OUT_VCODIV1 << GPC2CLK_OUT_VCODIV_SHIFT)) {
434 nvkm_wr32(device, GPC2CLK_OUT, val); 434 val &= ~GPC2CLK_OUT_VCODIV_MASK;
435 val |= GPC2CLK_OUT_VCODIV1 << GPC2CLK_OUT_VCODIV_SHIFT;
436 udelay(2);
437 nvkm_wr32(device, GPC2CLK_OUT, val);
438 /* Intentional 2nd write to assure linear divider operation */
439 nvkm_wr32(device, GPC2CLK_OUT, val);
440 nvkm_rd32(device, GPC2CLK_OUT);
441 }
435 442
436 /* slide up to new NDIV */ 443 /* slide up to new NDIV */
437 return allow_slide ? gk20a_pllg_slide(clk, clk->n) : 0; 444 return allow_slide ? gk20a_pllg_slide(clk, clk->n) : 0;