Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 74fe6935 authored by Abhinav Kumar's avatar Abhinav Kumar
Browse files

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: default avatarAbhinav Kumar <abhinavk@codeaurora.org>
parent 3bed5c69
Loading
Loading
Loading
Loading
+61 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
 * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
 * Copyright (C) 2013 Red Hat
 * Author: Rob Clark <robdclark@gmail.com>
 *
@@ -124,6 +124,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 void _sde_hdmi_bridge_power_on(struct drm_bridge *bridge)
{
	struct sde_hdmi_bridge *sde_hdmi_bridge = to_hdmi_bridge(bridge);
@@ -574,6 +623,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;
@@ -582,6 +637,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);
}