diff options
| author | Abhinav Kumar <abhinavk@codeaurora.org> | 2018-08-06 19:24:43 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2018-08-08 16:35:03 -0700 |
| commit | 03e2cf926fb46d296a69692d6793af2722936585 (patch) | |
| tree | 37f2cd7542390be4c3f92e51568c8fea7c9ee414 | |
| parent | 1d134898cd25003143efc3efdd097f5f872bd530 (diff) | |
drm/msm: Clear HDMI VSDB and VCDB info across hotplug
SDE connector stores the information related to the HDMI
VSDB and VCDB data blocks. This connector information is
retained till the connector is destroyed which does not
happen across hotplug.
Clear the HDMI VSDB and VCDB related data fields when
the bridge is disabled so that across a hotplug stale
information is not retained.
Change-Id: I4dabfda03a6446f38913ac45d9df2d2ae411a7f0
Signed-off-by: Abhinav Kumar <abhinavk@codeaurora.org>
| -rw-r--r-- | drivers/gpu/drm/msm/hdmi-staging/sde_hdmi_bridge.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi_bridge.c b/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi_bridge.c index 2d65fc924f07..37e76e994e38 100644 --- a/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi_bridge.c +++ b/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi_bridge.c @@ -125,6 +125,55 @@ static void sde_hdmi_clear_hdr_info(struct drm_bridge *bridge) connector->hdr_supported = false; } +static void sde_hdmi_clear_vsdb_info(struct drm_bridge *bridge) +{ + struct sde_hdmi_bridge *sde_hdmi_bridge = to_hdmi_bridge(bridge); + struct hdmi *hdmi = sde_hdmi_bridge->hdmi; + struct drm_connector *connector = hdmi->connector; + + connector->max_tmds_clock = 0; + connector->latency_present[0] = false; + connector->latency_present[1] = false; + connector->video_latency[0] = false; + connector->video_latency[1] = false; + connector->audio_latency[0] = false; + connector->audio_latency[1] = false; +} + +static void sde_hdmi_clear_hf_vsdb_info(struct drm_bridge *bridge) +{ + struct sde_hdmi_bridge *sde_hdmi_bridge = to_hdmi_bridge(bridge); + struct hdmi *hdmi = sde_hdmi_bridge->hdmi; + struct drm_connector *connector = hdmi->connector; + + connector->max_tmds_char = 0; + connector->scdc_present = false; + connector->rr_capable = false; + connector->supports_scramble = false; + connector->flags_3d = 0; +} + +static void sde_hdmi_clear_vcdb_info(struct drm_bridge *bridge) +{ + struct sde_hdmi_bridge *sde_hdmi_bridge = to_hdmi_bridge(bridge); + struct hdmi *hdmi = sde_hdmi_bridge->hdmi; + struct drm_connector *connector = hdmi->connector; + + connector->pt_scan_info = 0; + connector->it_scan_info = 0; + connector->ce_scan_info = 0; + connector->rgb_qs = false; + connector->yuv_qs = false; +} + +static void sde_hdmi_clear_vsdbs(struct drm_bridge *bridge) +{ + /* Clear fields of HDMI VSDB */ + sde_hdmi_clear_vsdb_info(bridge); + /* Clear fields of HDMI forum VSDB */ + sde_hdmi_clear_hf_vsdb_info(bridge); +} + static int _sde_hdmi_bridge_power_on(struct drm_bridge *bridge) { struct sde_hdmi_bridge *sde_hdmi_bridge = to_hdmi_bridge(bridge); @@ -606,6 +655,12 @@ static void _sde_hdmi_bridge_disable(struct drm_bridge *bridge) mutex_lock(&display->display_lock); + if (!bridge) { + SDE_ERROR("Invalid params\n"); + mutex_unlock(&display->display_lock); + return; + } + display->pll_update_enable = false; display->sink_hdcp_ver = SDE_HDMI_HDCP_NONE; display->sink_hdcp22_support = false; @@ -614,6 +669,11 @@ static void _sde_hdmi_bridge_disable(struct drm_bridge *bridge) sde_hdmi_hdcp_off(display); sde_hdmi_clear_hdr_info(bridge); + /* Clear HDMI VSDB blocks info */ + sde_hdmi_clear_vsdbs(bridge); + /* Clear HDMI VCDB block info */ + sde_hdmi_clear_vcdb_info(bridge); + mutex_unlock(&display->display_lock); } |
