diff options
author | Russell King <rmk+kernel@armlinux.org.uk> | 2016-10-04 17:19:57 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@armlinux.org.uk> | 2016-10-04 17:20:00 -0400 |
commit | ea908ba8f73446dfbf87ff71f7cadb1994d2c5bb (patch) | |
tree | f484dd7c9dac8bf30cfa6e768dfa115ed8664378 | |
parent | c8d2bc9bc39ebea8437fd974fdbc21847bb897a3 (diff) |
drm/armada: fix clock counts
The DPMS handling wrt clock enables/disables was incorrect: we could end
up decrementing the clock count multiple times if we transition via
several low-power DPMS states, resulting in a kernel warning. Fix this
by only testing to see whether we are entering or exiting the DPMS off
state.
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-rw-r--r-- | drivers/gpu/drm/armada/armada_crtc.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c index 2f58e9e2a59c..a51f8cbcfe26 100644 --- a/drivers/gpu/drm/armada/armada_crtc.c +++ b/drivers/gpu/drm/armada/armada_crtc.c | |||
@@ -332,17 +332,19 @@ static void armada_drm_crtc_dpms(struct drm_crtc *crtc, int dpms) | |||
332 | { | 332 | { |
333 | struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc); | 333 | struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc); |
334 | 334 | ||
335 | if (dcrtc->dpms != dpms) { | 335 | if (dpms_blanked(dcrtc->dpms) != dpms_blanked(dpms)) { |
336 | dcrtc->dpms = dpms; | ||
337 | if (!IS_ERR(dcrtc->clk) && !dpms_blanked(dpms)) | ||
338 | WARN_ON(clk_prepare_enable(dcrtc->clk)); | ||
339 | armada_drm_crtc_update(dcrtc); | ||
340 | if (!IS_ERR(dcrtc->clk) && dpms_blanked(dpms)) | ||
341 | clk_disable_unprepare(dcrtc->clk); | ||
342 | if (dpms_blanked(dpms)) | 336 | if (dpms_blanked(dpms)) |
343 | armada_drm_vblank_off(dcrtc); | 337 | armada_drm_vblank_off(dcrtc); |
344 | else | 338 | else if (!IS_ERR(dcrtc->clk)) |
339 | WARN_ON(clk_prepare_enable(dcrtc->clk)); | ||
340 | dcrtc->dpms = dpms; | ||
341 | armada_drm_crtc_update(dcrtc); | ||
342 | if (!dpms_blanked(dpms)) | ||
345 | drm_crtc_vblank_on(&dcrtc->crtc); | 343 | drm_crtc_vblank_on(&dcrtc->crtc); |
344 | else if (!IS_ERR(dcrtc->clk)) | ||
345 | clk_disable_unprepare(dcrtc->clk); | ||
346 | } else if (dcrtc->dpms != dpms) { | ||
347 | dcrtc->dpms = dpms; | ||
346 | } | 348 | } |
347 | } | 349 | } |
348 | 350 | ||