Jiri Slaby ef7db2
From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Jiri Slaby ef7db2
Date: Wed, 18 Jan 2023 10:16:50 +0200
Jiri Slaby ef7db2
Subject: [PATCH] drm/bridge: lt9611: fix clock calculation
Jiri Slaby ef7db2
References: bsc#1012628
Jiri Slaby ef7db2
Patch-mainline: 6.2.3
Jiri Slaby ef7db2
Git-commit: 2576eb26494eb0509dd9ceb0cd27771a7a5e3674
Jiri Slaby ef7db2
Jiri Slaby ef7db2
[ Upstream commit 2576eb26494eb0509dd9ceb0cd27771a7a5e3674 ]
Jiri Slaby ef7db2
Jiri Slaby ef7db2
Instead of having several fixed values for the pcr register, calculate
Jiri Slaby ef7db2
it before programming. This allows the bridge to support most of the
Jiri Slaby ef7db2
display modes.
Jiri Slaby ef7db2
Jiri Slaby ef7db2
Fixes: 23278bf54afe ("drm/bridge: Introduce LT9611 DSI to HDMI bridge")
Jiri Slaby ef7db2
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Jiri Slaby ef7db2
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Jiri Slaby ef7db2
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
Jiri Slaby ef7db2
Link: https://patchwork.freedesktop.org/patch/msgid/20230118081658.2198520-6-dmitry.baryshkov@linaro.org
Jiri Slaby ef7db2
Signed-off-by: Sasha Levin <sashal@kernel.org>
Jiri Slaby ef7db2
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Jiri Slaby ef7db2
---
Jiri Slaby ef7db2
 drivers/gpu/drm/bridge/lontium-lt9611.c | 32 +++++++++++--------------
Jiri Slaby ef7db2
 1 file changed, 14 insertions(+), 18 deletions(-)
Jiri Slaby ef7db2
Jiri Slaby ef7db2
diff --git a/drivers/gpu/drm/bridge/lontium-lt9611.c b/drivers/gpu/drm/bridge/lontium-lt9611.c
Jiri Slaby ef7db2
index f377052a..e2799a0d 100644
Jiri Slaby ef7db2
--- a/drivers/gpu/drm/bridge/lontium-lt9611.c
Jiri Slaby ef7db2
+++ b/drivers/gpu/drm/bridge/lontium-lt9611.c
Jiri Slaby ef7db2
@@ -192,8 +192,9 @@ static void lt9611_mipi_video_setup(struct lt9611 *lt9611,
Jiri Slaby ef7db2
 	regmap_write(lt9611->regmap, 0x831b, (u8)(hsync_porch % 256));
Jiri Slaby ef7db2
 }
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
-static void lt9611_pcr_setup(struct lt9611 *lt9611, const struct drm_display_mode *mode)
Jiri Slaby ef7db2
+static void lt9611_pcr_setup(struct lt9611 *lt9611, const struct drm_display_mode *mode, unsigned int postdiv)
Jiri Slaby ef7db2
 {
Jiri Slaby ef7db2
+	unsigned int pcr_m = mode->clock * 5 * postdiv / 27000;
Jiri Slaby ef7db2
 	const struct reg_sequence reg_cfg[] = {
Jiri Slaby ef7db2
 		{ 0x830b, 0x01 },
Jiri Slaby ef7db2
 		{ 0x830c, 0x10 },
Jiri Slaby ef7db2
@@ -236,24 +237,14 @@ static void lt9611_pcr_setup(struct lt9611 *lt9611, const struct drm_display_mod
Jiri Slaby ef7db2
 	else
Jiri Slaby ef7db2
 		regmap_multi_reg_write(lt9611->regmap, reg_cfg, ARRAY_SIZE(reg_cfg));
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
-	switch (mode->hdisplay) {
Jiri Slaby ef7db2
-	case 640:
Jiri Slaby ef7db2
-		regmap_write(lt9611->regmap, 0x8326, 0x14);
Jiri Slaby ef7db2
-		break;
Jiri Slaby ef7db2
-	case 1920:
Jiri Slaby ef7db2
-		regmap_write(lt9611->regmap, 0x8326, 0x37);
Jiri Slaby ef7db2
-		break;
Jiri Slaby ef7db2
-	case 3840:
Jiri Slaby ef7db2
-		regmap_write(lt9611->regmap, 0x8326, 0x37);
Jiri Slaby ef7db2
-		break;
Jiri Slaby ef7db2
-	}
Jiri Slaby ef7db2
+	regmap_write(lt9611->regmap, 0x8326, pcr_m);
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 	/* pcr rst */
Jiri Slaby ef7db2
 	regmap_write(lt9611->regmap, 0x8011, 0x5a);
Jiri Slaby ef7db2
 	regmap_write(lt9611->regmap, 0x8011, 0xfa);
Jiri Slaby ef7db2
 }
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
-static int lt9611_pll_setup(struct lt9611 *lt9611, const struct drm_display_mode *mode)
Jiri Slaby ef7db2
+static int lt9611_pll_setup(struct lt9611 *lt9611, const struct drm_display_mode *mode, unsigned int *postdiv)
Jiri Slaby ef7db2
 {
Jiri Slaby ef7db2
 	unsigned int pclk = mode->clock;
Jiri Slaby ef7db2
 	const struct reg_sequence reg_cfg[] = {
Jiri Slaby ef7db2
@@ -271,12 +262,16 @@ static int lt9611_pll_setup(struct lt9611 *lt9611, const struct drm_display_mode
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 	regmap_multi_reg_write(lt9611->regmap, reg_cfg, ARRAY_SIZE(reg_cfg));
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
-	if (pclk > 150000)
Jiri Slaby ef7db2
+	if (pclk > 150000) {
Jiri Slaby ef7db2
 		regmap_write(lt9611->regmap, 0x812d, 0x88);
Jiri Slaby ef7db2
-	else if (pclk > 70000)
Jiri Slaby ef7db2
+		*postdiv = 1;
Jiri Slaby ef7db2
+	} else if (pclk > 70000) {
Jiri Slaby ef7db2
 		regmap_write(lt9611->regmap, 0x812d, 0x99);
Jiri Slaby ef7db2
-	else
Jiri Slaby ef7db2
+		*postdiv = 2;
Jiri Slaby ef7db2
+	} else {
Jiri Slaby ef7db2
 		regmap_write(lt9611->regmap, 0x812d, 0xaa);
Jiri Slaby ef7db2
+		*postdiv = 4;
Jiri Slaby ef7db2
+	}
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 	/*
Jiri Slaby ef7db2
 	 * first divide pclk by 2 first
Jiri Slaby ef7db2
@@ -895,14 +890,15 @@ static void lt9611_bridge_mode_set(struct drm_bridge *bridge,
Jiri Slaby ef7db2
 {
Jiri Slaby ef7db2
 	struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
Jiri Slaby ef7db2
 	struct hdmi_avi_infoframe avi_frame;
Jiri Slaby ef7db2
+	unsigned int postdiv;
Jiri Slaby ef7db2
 	int ret;
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 	lt9611_bridge_pre_enable(bridge);
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 	lt9611_mipi_input_digital(lt9611, mode);
Jiri Slaby ef7db2
-	lt9611_pll_setup(lt9611, mode);
Jiri Slaby ef7db2
+	lt9611_pll_setup(lt9611, mode, &postdiv);
Jiri Slaby ef7db2
 	lt9611_mipi_video_setup(lt9611, mode);
Jiri Slaby ef7db2
-	lt9611_pcr_setup(lt9611, mode);
Jiri Slaby ef7db2
+	lt9611_pcr_setup(lt9611, mode, postdiv);
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 	ret = drm_hdmi_avi_infoframe_from_display_mode(&avi_frame,
Jiri Slaby ef7db2
 						       &lt9611->connector,
Jiri Slaby ef7db2
-- 
Jiri Slaby ef7db2
2.35.3
Jiri Slaby ef7db2