From 5b6ccb5f2c5fc71bc30e85fffcdbc1b73d0a3fa6 Mon Sep 17 00:00:00 2001 From: "congyang.huang" Date: Tue, 29 Oct 2024 16:54:20 +0800 Subject: [PATCH] drm: use mode hskew to indicate whether it's qms mode or vic mode [1/1] PD#SWPL-190877 Problem: need add flag to indicate whether it's qms mode or vic mode Solution: use mode hskew to indicate Verify: s7 qms Test: DRM-OSD-45 Change-Id: Ib675650b02d687438aa6a9eae3d846e6fac46c10 Signed-off-by: congyang.huang --- drivers/drm/meson_hdmi.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/drivers/drm/meson_hdmi.c b/drivers/drm/meson_hdmi.c index e556c6262..e1323a89d 100644 --- a/drivers/drm/meson_hdmi.c +++ b/drivers/drm/meson_hdmi.c @@ -332,7 +332,8 @@ static int meson_hdmitx_decide_color_attr return 0; } -static int meson_hdmitx_mode_probed_add(int count, int *vics, struct drm_connector *connector) +static int meson_hdmitx_mode_probed_add(int count, int *vics, + struct drm_connector *connector, bool edid_vic) { struct drm_display_mode *mode, *pref_mode = NULL; struct drm_hdmitx_timing_para para; @@ -389,7 +390,12 @@ static int meson_hdmitx_mode_probed_add(int count, int *vics, struct drm_connect mode->clock >>= 1; } - mode->hskew = 0; + /*use hskew to distinguish whether it's qms mode or edid mode*/ + if (edid_vic) + mode->hskew = 1; + else + mode->hskew = 0; + mode->flags |= para.h_pol ? DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC; @@ -437,7 +443,7 @@ static int meson_hdmitx_mode_probed_add(int count, int *vics, struct drm_connect drm_mode_probed_add(connector, mode); - DRM_DEBUG("add mode [%s]\n", mode->name); + DRM_DEBUG("add mode [%s] [%d]\n", mode->name, mode->hskew); } if (pref_mode) @@ -451,7 +457,7 @@ int meson_hdmitx_get_modes(struct drm_connector *connector) u32 vrr_cap = 0; struct edid *edid; int *vics; - int count = 0, count1 = 0, i = 0, j = 0; + int count = 0, count_qms = 0, i = 0, j = 0; struct drm_display_mode *mode; struct am_hdmi_tx *am_hdmitx = connector_to_am_hdmi(connector); struct hdmitx_common *tx_comm = am_hdmi_info.hdmitx_dev->hdmitx_common; @@ -502,16 +508,16 @@ int meson_hdmitx_get_modes(struct drm_connector *connector) for (i = 0; i < num_group; i++) { group = &groups[i]; for (j = 0; j < ARRAY_SIZE(group->qms_vic_lists); j++) { - tmp[count1] = group->qms_vic_lists[j]; + tmp[count_qms] = group->qms_vic_lists[j]; DRM_DEBUG("%s__%d__%d__%zd\n", __func__, - __LINE__, tmp[count1], + __LINE__, tmp[count_qms], ARRAY_SIZE(group->qms_vic_lists)); - count1++; + count_qms++; } } /*remove duplicate vics array variables*/ - while (src < count1) { + while (src < count_qms) { bool exist = false; for (i = 0; i < count; i++) { @@ -526,16 +532,16 @@ int meson_hdmitx_get_modes(struct drm_connector *connector) vrr_list[dst++] = tmp[src++]; } - count1 = dst; + count_qms = dst; } if (count) { - meson_hdmitx_mode_probed_add(count, vics, connector); + meson_hdmitx_mode_probed_add(count, vics, connector, true); kfree(vics); } - if (count1) - meson_hdmitx_mode_probed_add(count1, vrr_list, connector); + if (count_qms) + meson_hdmitx_mode_probed_add(count_qms, vrr_list, connector, false); /*TODO:add dummy mode temp.*/ if (am_hdmitx->base.drm_priv->dummyl_from_hdmitx) { @@ -557,7 +563,7 @@ end: kfree(tmp); kfree(groups); - return count + count1; + return count + count_qms; } /* drm_display_mode : hdmi_format_para