diff options
author | Alexandre Courbot <acourbot@nvidia.com> | 2016-02-12 00:19:27 -0500 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2016-03-13 20:13:53 -0400 |
commit | 3c0d5d6e11c980890e9f5d6e1eb734e9297ea252 (patch) | |
tree | 0e033e4f9ab8b307a16bad4db53dae6f610a9c0d | |
parent | a08c8bae66eb42a901410e43fd48bac8948bd2da (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.c | 13 |
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; |