aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeiko Stuebner <heiko@sntech.de>2015-01-30 14:28:48 -0500
committerMark Yao <mark.yao@rock-chips.com>2015-04-03 02:23:01 -0400
commit7f53fbba3cf8db8f584b26e89802413bc2e8d902 (patch)
treefda31bfb904bacd7c0011fc84cfd78b70ac8d047
parent502e95c6678505474f1056480310cd9382bacbac (diff)
drm/rockchip: fix clk enable disable mismatch in vop_crtc_mode_set
The function disables the dclk at the beginning, so don't simply return when an error happens, but instead enable the clock again, so that enable and disable calls are balanced. ret_clk is introduced to hold the clk_enable result and not mangle the original error code. Signed-off-by: Heiko Stuebner <heiko@sntech.de> Reviewed-by: Daniel Kurtz <djkurtz@chromium.org>
-rw-r--r--drivers/gpu/drm/rockchip/rockchip_drm_vop.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index d041921b3bb9..6115898efe6b 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -893,7 +893,7 @@ static int vop_crtc_mode_set(struct drm_crtc *crtc,
893 u16 vsync_len = adjusted_mode->vsync_end - adjusted_mode->vsync_start; 893 u16 vsync_len = adjusted_mode->vsync_end - adjusted_mode->vsync_start;
894 u16 vact_st = adjusted_mode->vtotal - adjusted_mode->vsync_start; 894 u16 vact_st = adjusted_mode->vtotal - adjusted_mode->vsync_start;
895 u16 vact_end = vact_st + vdisplay; 895 u16 vact_end = vact_st + vdisplay;
896 int ret; 896 int ret, ret_clk;
897 uint32_t val; 897 uint32_t val;
898 898
899 /* 899 /*
@@ -915,7 +915,8 @@ static int vop_crtc_mode_set(struct drm_crtc *crtc,
915 default: 915 default:
916 DRM_ERROR("unsupport connector_type[%d]\n", 916 DRM_ERROR("unsupport connector_type[%d]\n",
917 vop->connector_type); 917 vop->connector_type);
918 return -EINVAL; 918 ret = -EINVAL;
919 goto out;
919 }; 920 };
920 VOP_CTRL_SET(vop, out_mode, vop->connector_out_mode); 921 VOP_CTRL_SET(vop, out_mode, vop->connector_out_mode);
921 922
@@ -938,7 +939,7 @@ static int vop_crtc_mode_set(struct drm_crtc *crtc,
938 939
939 ret = vop_crtc_mode_set_base(crtc, x, y, fb); 940 ret = vop_crtc_mode_set_base(crtc, x, y, fb);
940 if (ret) 941 if (ret)
941 return ret; 942 goto out;
942 943
943 /* 944 /*
944 * reset dclk, take all mode config affect, so the clk would run in 945 * reset dclk, take all mode config affect, so the clk would run in
@@ -949,13 +950,14 @@ static int vop_crtc_mode_set(struct drm_crtc *crtc,
949 reset_control_deassert(vop->dclk_rst); 950 reset_control_deassert(vop->dclk_rst);
950 951
951 clk_set_rate(vop->dclk, adjusted_mode->clock * 1000); 952 clk_set_rate(vop->dclk, adjusted_mode->clock * 1000);
952 ret = clk_enable(vop->dclk); 953out:
953 if (ret < 0) { 954 ret_clk = clk_enable(vop->dclk);
954 dev_err(vop->dev, "failed to enable dclk - %d\n", ret); 955 if (ret_clk < 0) {
955 return ret; 956 dev_err(vop->dev, "failed to enable dclk - %d\n", ret_clk);
957 return ret_clk;
956 } 958 }
957 959
958 return 0; 960 return ret;
959} 961}
960 962
961static void vop_crtc_commit(struct drm_crtc *crtc) 963static void vop_crtc_commit(struct drm_crtc *crtc)