Commit 5f5f657a authored by Jonas Karlman's avatar Jonas Karlman Committed by Heiko Stuebner

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: default avatarJonas Karlman <jonas@kwiboo.se>
Signed-off-by: default avatarHeiko Stuebner <heiko@sntech.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20240615170417.3134517-7-jonas@kwiboo.se
parent 1213b65e
...@@ -61,11 +61,13 @@ ...@@ -61,11 +61,13 @@
* @lcdsel_grf_reg: grf register offset of lcdc select * @lcdsel_grf_reg: grf register offset of lcdc select
* @lcdsel_big: reg value of selecting vop big for HDMI * @lcdsel_big: reg value of selecting vop big for HDMI
* @lcdsel_lit: reg value of selecting vop little for HDMI * @lcdsel_lit: reg value of selecting vop little for HDMI
* @max_tmds_clock: maximum TMDS clock rate supported
*/ */
struct rockchip_hdmi_chip_data { struct rockchip_hdmi_chip_data {
int lcdsel_grf_reg; int lcdsel_grf_reg;
u32 lcdsel_big; u32 lcdsel_big;
u32 lcdsel_lit; u32 lcdsel_lit;
int max_tmds_clock;
}; };
struct rockchip_hdmi { struct rockchip_hdmi {
...@@ -254,6 +256,10 @@ dw_hdmi_rockchip_mode_valid(struct dw_hdmi *dw_hdmi, void *data, ...@@ -254,6 +256,10 @@ dw_hdmi_rockchip_mode_valid(struct dw_hdmi *dw_hdmi, void *data,
bool exact_match = hdmi->plat_data->phy_force_vendor; bool exact_match = hdmi->plat_data->phy_force_vendor;
int i; int i;
if (hdmi->chip_data->max_tmds_clock &&
mode->clock > hdmi->chip_data->max_tmds_clock)
return MODE_CLOCK_HIGH;
if (hdmi->ref_clk) { if (hdmi->ref_clk) {
int rpclk = clk_round_rate(hdmi->ref_clk, pclk); int rpclk = clk_round_rate(hdmi->ref_clk, pclk);
...@@ -444,6 +450,7 @@ static const struct dw_hdmi_phy_ops rk3228_hdmi_phy_ops = { ...@@ -444,6 +450,7 @@ static const struct dw_hdmi_phy_ops rk3228_hdmi_phy_ops = {
static struct rockchip_hdmi_chip_data rk3228_chip_data = { static struct rockchip_hdmi_chip_data rk3228_chip_data = {
.lcdsel_grf_reg = -1, .lcdsel_grf_reg = -1,
.max_tmds_clock = 594000,
}; };
static const struct dw_hdmi_plat_data rk3228_hdmi_drv_data = { static const struct dw_hdmi_plat_data rk3228_hdmi_drv_data = {
...@@ -458,6 +465,7 @@ static struct rockchip_hdmi_chip_data rk3288_chip_data = { ...@@ -458,6 +465,7 @@ static struct rockchip_hdmi_chip_data rk3288_chip_data = {
.lcdsel_grf_reg = RK3288_GRF_SOC_CON6, .lcdsel_grf_reg = RK3288_GRF_SOC_CON6,
.lcdsel_big = HIWORD_UPDATE(0, RK3288_HDMI_LCDC_SEL), .lcdsel_big = HIWORD_UPDATE(0, RK3288_HDMI_LCDC_SEL),
.lcdsel_lit = HIWORD_UPDATE(RK3288_HDMI_LCDC_SEL, RK3288_HDMI_LCDC_SEL), .lcdsel_lit = HIWORD_UPDATE(RK3288_HDMI_LCDC_SEL, RK3288_HDMI_LCDC_SEL),
.max_tmds_clock = 340000,
}; };
static const struct dw_hdmi_plat_data rk3288_hdmi_drv_data = { static const struct dw_hdmi_plat_data rk3288_hdmi_drv_data = {
...@@ -478,6 +486,7 @@ static const struct dw_hdmi_phy_ops rk3328_hdmi_phy_ops = { ...@@ -478,6 +486,7 @@ static const struct dw_hdmi_phy_ops rk3328_hdmi_phy_ops = {
static struct rockchip_hdmi_chip_data rk3328_chip_data = { static struct rockchip_hdmi_chip_data rk3328_chip_data = {
.lcdsel_grf_reg = -1, .lcdsel_grf_reg = -1,
.max_tmds_clock = 594000,
}; };
static const struct dw_hdmi_plat_data rk3328_hdmi_drv_data = { static const struct dw_hdmi_plat_data rk3328_hdmi_drv_data = {
...@@ -493,6 +502,7 @@ static struct rockchip_hdmi_chip_data rk3399_chip_data = { ...@@ -493,6 +502,7 @@ static struct rockchip_hdmi_chip_data rk3399_chip_data = {
.lcdsel_grf_reg = RK3399_GRF_SOC_CON20, .lcdsel_grf_reg = RK3399_GRF_SOC_CON20,
.lcdsel_big = HIWORD_UPDATE(0, RK3399_HDMI_LCDC_SEL), .lcdsel_big = HIWORD_UPDATE(0, RK3399_HDMI_LCDC_SEL),
.lcdsel_lit = HIWORD_UPDATE(RK3399_HDMI_LCDC_SEL, RK3399_HDMI_LCDC_SEL), .lcdsel_lit = HIWORD_UPDATE(RK3399_HDMI_LCDC_SEL, RK3399_HDMI_LCDC_SEL),
.max_tmds_clock = 340000,
}; };
static const struct dw_hdmi_plat_data rk3399_hdmi_drv_data = { static const struct dw_hdmi_plat_data rk3399_hdmi_drv_data = {
...@@ -506,6 +516,7 @@ static const struct dw_hdmi_plat_data rk3399_hdmi_drv_data = { ...@@ -506,6 +516,7 @@ static const struct dw_hdmi_plat_data rk3399_hdmi_drv_data = {
static struct rockchip_hdmi_chip_data rk3568_chip_data = { static struct rockchip_hdmi_chip_data rk3568_chip_data = {
.lcdsel_grf_reg = -1, .lcdsel_grf_reg = -1,
.max_tmds_clock = 340000,
}; };
static const struct dw_hdmi_plat_data rk3568_hdmi_drv_data = { static const struct dw_hdmi_plat_data rk3568_hdmi_drv_data = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment