Prechádzať zdrojové kódy

disp: msm: dp: fix tpg configuration to handle widebus

Currently the timing configuration for test pattern generator in DP
controller assumes that the widebus is disabled. This change adds the
check for widebus and adjusts timing configuration accordingly.

Change-Id: Id86601c910e88705a1a6d0ff4a4b38df6a843409
Signed-off-by: Rajkumar Subbiah <[email protected]>
Rajkumar Subbiah 4 rokov pred
rodič
commit
2ea2d4e65d
2 zmenil súbory, kde vykonal 14 pridanie a 6 odobranie
  1. 8 4
      msm/dp/dp_catalog.c
  2. 6 2
      msm/dp/dp_panel.c

+ 8 - 4
msm/dp/dp_catalog.c

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
  */
 
 
@@ -1406,6 +1406,7 @@ static void dp_catalog_panel_tpg_cfg(struct dp_catalog_panel *panel,
 {
 	struct dp_catalog_private *catalog;
 	struct dp_io_data *io_data;
+	u32 reg;
 
 	if (!panel) {
 		DP_ERR("invalid input\n");
@@ -1427,12 +1428,13 @@ static void dp_catalog_panel_tpg_cfg(struct dp_catalog_panel *panel,
 	if (!enable) {
 		dp_write(MMSS_DP_TPG_MAIN_CONTROL, 0x0);
 		dp_write(MMSS_DP_BIST_ENABLE, 0x0);
-		dp_write(MMSS_DP_TIMING_ENGINE_EN, 0x0);
+		reg = dp_read(MMSS_DP_TIMING_ENGINE_EN);
+		reg &= ~0x1;
+		dp_write(MMSS_DP_TIMING_ENGINE_EN, reg);
 		wmb(); /* ensure Timing generator is turned off */
 		return;
 	}
 
-	dp_write(MMSS_DP_INTF_CONFIG, 0x0);
 	dp_write(MMSS_DP_INTF_HSYNC_CTL,
 			panel->hsync_ctl);
 	dp_write(MMSS_DP_INTF_VSYNC_PERIOD_F0,
@@ -1458,7 +1460,9 @@ static void dp_catalog_panel_tpg_cfg(struct dp_catalog_panel *panel,
 	dp_write(MMSS_DP_TPG_VIDEO_CONFIG, 0x5);
 	wmb(); /* ensure TPG config is programmed */
 	dp_write(MMSS_DP_BIST_ENABLE, 0x1);
-	dp_write(MMSS_DP_TIMING_ENGINE_EN, 0x1);
+	reg = dp_read(MMSS_DP_TIMING_ENGINE_EN);
+	reg |= 0x1;
+	dp_write(MMSS_DP_TIMING_ENGINE_EN, reg);
 	wmb(); /* ensure Timing generator is turned on */
 }
 

+ 6 - 2
msm/dp/dp_panel.c

@@ -1956,7 +1956,7 @@ static void dp_panel_handle_sink_request(struct dp_panel *dp_panel)
 
 static void dp_panel_tpg_config(struct dp_panel *dp_panel, bool enable)
 {
-	u32 hsync_start_x, hsync_end_x;
+	u32 hsync_start_x, hsync_end_x, hactive;
 	struct dp_catalog_panel *catalog;
 	struct dp_panel_private *panel;
 	struct dp_panel_info *pinfo;
@@ -1985,9 +1985,13 @@ static void dp_panel_tpg_config(struct dp_panel *dp_panel, bool enable)
 		return;
 	}
 
+	hactive = pinfo->h_active;
+	if (pinfo->widebus_en)
+		hactive >>= 1;
+
 	/* TPG config */
 	catalog->hsync_period = pinfo->h_sync_width + pinfo->h_back_porch +
-			pinfo->h_active + pinfo->h_front_porch;
+			hactive + pinfo->h_front_porch;
 	catalog->vsync_period = pinfo->v_sync_width + pinfo->v_back_porch +
 			pinfo->v_active + pinfo->v_front_porch;