Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

phy/rockchip: inno-hdmi: round clock rate down to closest 1000 Hz

Commit 287422a95fe2 ("drm/rockchip: Round up _before_ giving to the clock framework")
changed what rate clk_round_rate() is called with, an additional 999 Hz
added to the requsted mode clock. This has caused a regression on RK3328
and presumably also on RK3228 because the inno-hdmi-phy clock requires an
exact match of the requested rate in the pre pll config table.

When an exact match is not found the parent clock rate (24MHz) is returned
to the clk_round_rate() caller. This cause wrong pixel clock to be used and
result in no-signal when configuring a mode on RK3328.

Fix this by rounding the rate down to closest 1000 Hz in round_rate func,
this allows an exact match to be found in pre pll config table.

Fixes: 287422a95fe2 ("drm/rockchip: Round up _before_ giving to the clock framework")
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>

authored by

Jonas Karlman and committed by
Kishon Vijay Abraham I
4f510aa1 ea137a89

+4
+4
drivers/phy/rockchip/phy-rockchip-inno-hdmi.c
··· 603 603 { 604 604 const struct pre_pll_config *cfg = pre_pll_cfg_table; 605 605 606 + rate = (rate / 1000) * 1000; 607 + 606 608 for (; cfg->pixclock != 0; cfg++) 607 609 if (cfg->pixclock == rate && !cfg->fracdiv) 608 610 break; ··· 756 754 unsigned long *parent_rate) 757 755 { 758 756 const struct pre_pll_config *cfg = pre_pll_cfg_table; 757 + 758 + rate = (rate / 1000) * 1000; 759 759 760 760 for (; cfg->pixclock != 0; cfg++) 761 761 if (cfg->pixclock == rate)