From 2ea2d4e65d500d3cabb8cbf1ed18bbd632727228 Mon Sep 17 00:00:00 2001 From: Rajkumar Subbiah Date: Fri, 26 Feb 2021 14:12:15 -0500 Subject: [PATCH] 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 --- msm/dp/dp_catalog.c | 12 ++++++++---- msm/dp/dp_panel.c | 8 ++++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/msm/dp/dp_catalog.c b/msm/dp/dp_catalog.c index 37b68a7e..ffdd62ff 100644 --- a/msm/dp/dp_catalog.c +++ b/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 */ } diff --git a/msm/dp/dp_panel.c b/msm/dp/dp_panel.c index 1097a268..d505dd2c 100644 --- a/msm/dp/dp_panel.c +++ b/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;