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

drm/rockchip: dw_hdmi: Add max_tmds_clock validation

Add max_tmds_clock validation to prepare for additions and changes to
the MPLL config table. Use the same rate restrictions that is currently
applied.

The rate limit for RK3288, RK3399 and RK3568 is based on current mpll
table. The rate limit for RK3228 and RK3328 is based on the
inno-hdmi-phy pre-pll table.

Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20240615170417.3134517-7-jonas@kwiboo.se

authored by

Jonas Karlman and committed by
Heiko Stuebner
5f5f657a 1213b65e

+11
+11
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
··· 61 61 * @lcdsel_grf_reg: grf register offset of lcdc select 62 62 * @lcdsel_big: reg value of selecting vop big for HDMI 63 63 * @lcdsel_lit: reg value of selecting vop little for HDMI 64 + * @max_tmds_clock: maximum TMDS clock rate supported 64 65 */ 65 66 struct rockchip_hdmi_chip_data { 66 67 int lcdsel_grf_reg; 67 68 u32 lcdsel_big; 68 69 u32 lcdsel_lit; 70 + int max_tmds_clock; 69 71 }; 70 72 71 73 struct rockchip_hdmi { ··· 255 253 int pclk = mode->clock * 1000; 256 254 bool exact_match = hdmi->plat_data->phy_force_vendor; 257 255 int i; 256 + 257 + if (hdmi->chip_data->max_tmds_clock && 258 + mode->clock > hdmi->chip_data->max_tmds_clock) 259 + return MODE_CLOCK_HIGH; 258 260 259 261 if (hdmi->ref_clk) { 260 262 int rpclk = clk_round_rate(hdmi->ref_clk, pclk); ··· 450 444 451 445 static struct rockchip_hdmi_chip_data rk3228_chip_data = { 452 446 .lcdsel_grf_reg = -1, 447 + .max_tmds_clock = 594000, 453 448 }; 454 449 455 450 static const struct dw_hdmi_plat_data rk3228_hdmi_drv_data = { ··· 465 458 .lcdsel_grf_reg = RK3288_GRF_SOC_CON6, 466 459 .lcdsel_big = HIWORD_UPDATE(0, RK3288_HDMI_LCDC_SEL), 467 460 .lcdsel_lit = HIWORD_UPDATE(RK3288_HDMI_LCDC_SEL, RK3288_HDMI_LCDC_SEL), 461 + .max_tmds_clock = 340000, 468 462 }; 469 463 470 464 static const struct dw_hdmi_plat_data rk3288_hdmi_drv_data = { ··· 486 478 487 479 static struct rockchip_hdmi_chip_data rk3328_chip_data = { 488 480 .lcdsel_grf_reg = -1, 481 + .max_tmds_clock = 594000, 489 482 }; 490 483 491 484 static const struct dw_hdmi_plat_data rk3328_hdmi_drv_data = { ··· 502 493 .lcdsel_grf_reg = RK3399_GRF_SOC_CON20, 503 494 .lcdsel_big = HIWORD_UPDATE(0, RK3399_HDMI_LCDC_SEL), 504 495 .lcdsel_lit = HIWORD_UPDATE(RK3399_HDMI_LCDC_SEL, RK3399_HDMI_LCDC_SEL), 496 + .max_tmds_clock = 340000, 505 497 }; 506 498 507 499 static const struct dw_hdmi_plat_data rk3399_hdmi_drv_data = { ··· 516 506 517 507 static struct rockchip_hdmi_chip_data rk3568_chip_data = { 518 508 .lcdsel_grf_reg = -1, 509 + .max_tmds_clock = 340000, 519 510 }; 520 511 521 512 static const struct dw_hdmi_plat_data rk3568_hdmi_drv_data = {