|
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 |
<9611->connector,
|
|
Jiri Slaby |
ef7db2 |
--
|
|
Jiri Slaby |
ef7db2 |
2.35.3
|
|
Jiri Slaby |
ef7db2 |
|