From 9c4b50cda39e7ae90bbb1c129bb43098ced272a9 Mon Sep 17 00:00:00 2001 From: Jianwei Fan Date: Fri, 29 Mar 2024 15:51:56 +0800 Subject: [PATCH] media: i2c: rk628: fix set CPLL if pixclk more than 594M Signed-off-by: Jianwei Fan Change-Id: I3faaed0e7efbdb0cb5b44454c931b48f41092592 --- drivers/media/i2c/rk628/rk628_bt1120_v4l2.c | 1 + drivers/media/i2c/rk628/rk628_cru.h | 2 ++ drivers/media/i2c/rk628/rk628_csi_v4l2.c | 1 + drivers/media/i2c/rk628/rk628_hdmirx.c | 2 +- 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/media/i2c/rk628/rk628_bt1120_v4l2.c b/drivers/media/i2c/rk628/rk628_bt1120_v4l2.c index 8dbef2e82de0..b75869d179c6 100644 --- a/drivers/media/i2c/rk628/rk628_bt1120_v4l2.c +++ b/drivers/media/i2c/rk628/rk628_bt1120_v4l2.c @@ -333,6 +333,7 @@ static void rk628_hdmirx_plugout(struct v4l2_subdev *sd) rk628_hdmirx_hpd_ctrl(sd, false); rk628_hdmirx_inno_phy_power_off(sd); rk628_hdmirx_controller_reset(bt1120->rk628); + rk628_clk_set_rate(bt1120->rk628, CGU_CLK_CPLL, CPLL_REF_CLK); } static void rk628_hdmirx_config_all(struct v4l2_subdev *sd) diff --git a/drivers/media/i2c/rk628/rk628_cru.h b/drivers/media/i2c/rk628/rk628_cru.h index 48f6abe7299a..51a5476620ef 100644 --- a/drivers/media/i2c/rk628/rk628_cru.h +++ b/drivers/media/i2c/rk628/rk628_cru.h @@ -195,6 +195,8 @@ #define RGU_TXESC 30 #define RGU_CSI1 31 +#define CPLL_REF_CLK 1188000000 + unsigned long rk628_clk_get_rate(struct rk628 *rk628, unsigned int id); int rk628_clk_set_rate(struct rk628 *rk628, unsigned int id, unsigned long rate); diff --git a/drivers/media/i2c/rk628/rk628_csi_v4l2.c b/drivers/media/i2c/rk628/rk628_csi_v4l2.c index a7ab5546f071..5397cf40a7b1 100644 --- a/drivers/media/i2c/rk628/rk628_csi_v4l2.c +++ b/drivers/media/i2c/rk628/rk628_csi_v4l2.c @@ -465,6 +465,7 @@ static void rk628_hdmirx_plugout(struct v4l2_subdev *sd) rk628_hdmirx_hpd_ctrl(sd, false); rk628_hdmirx_inno_phy_power_off(sd); rk628_hdmirx_controller_reset(csi->rk628); + rk628_clk_set_rate(csi->rk628, CGU_CLK_CPLL, CPLL_REF_CLK); } static void rk628_hdmirx_config_all(struct v4l2_subdev *sd) diff --git a/drivers/media/i2c/rk628/rk628_hdmirx.c b/drivers/media/i2c/rk628/rk628_hdmirx.c index 03beaa2b3cba..8001e3df5350 100644 --- a/drivers/media/i2c/rk628/rk628_hdmirx.c +++ b/drivers/media/i2c/rk628/rk628_hdmirx.c @@ -1499,7 +1499,7 @@ int rk628_hdmirx_get_timings(struct rk628 *rk628, if (rk628->version >= RK628F_VERSION) { val = DIV_ROUND_CLOSEST_ULL(1188000000, bt->pixelclock); val *= bt->pixelclock; - if (val > 1188000000) { + if (bt->pixelclock > 594000000) { /* set pll rate according hdmirx tmds clk */ rk628_clk_set_rate(rk628, CGU_CLK_CPLL, val); dev_dbg(rk628->dev, "set CPLL to %d\n", val);