This Linux kernel change "drm/rockchip: Properly adjust to a true clock in adjusted_mode" is included in the Linux 4.9.187 release. This change is authored by Douglas Anderson <dianders [at] chromium.org> on Fri Jun 14 15:47:29 2019 -0700. The commit for this change in Linux stable tree is 1d13353 (patch) which is from upstream commit 99b9683. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream 99b9683.
drm/rockchip: Properly adjust to a true clock in adjusted_mode [ Upstream commit 99b9683f2142b20bad78e61f7f829e8714e45685 ] When fixing up the clock in vop_crtc_mode_fixup() we're not doing it quite correctly. Specifically if we've got the true clock 266666667 Hz, we'll perform this calculation: 266666667 / 1000 => 266666 Later when we try to set the clock we'll do clk_set_rate(266666 * 1000). The common clock framework won't actually pick the proper clock in this case since it always wants clocks <= the specified one. Let's solve this by using DIV_ROUND_UP. Fixes: b59b8de31497 ("drm/rockchip: return a true clock rate to adjusted_mode") Signed-off-by: Douglas Anderson <firstname.lastname@example.org> Signed-off-by: Sean Paul <email@example.com> Reviewed-by: Yakir Yang <firstname.lastname@example.org> Signed-off-by: Heiko Stuebner <email@example.com> Link: https://firstname.lastname@example.org Signed-off-by: Sasha Levin <email@example.com>
There are 3 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.
drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 32d87c60..5bed63e 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -865,7 +865,8 @@ static bool vop_crtc_mode_fixup(struct drm_crtc *crtc, struct vop *vop = to_vop(crtc); adjusted_mode->clock = - clk_round_rate(vop->dclk, mode->clock * 1000) / 1000; + DIV_ROUND_UP(clk_round_rate(vop->dclk, mode->clock * 1000), + 1000); return true; }