summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Barberiz <jbarberi@amd.com>2018-01-12 14:51:21 -0500
committerAlex Deucher <alexander.deucher@amd.com>2018-02-19 14:18:42 -0500
commit243c46c5ce807685748b4dda17ff99fac33b16f4 (patch)
treebde78f8ec8e5a8146ec320dc5ecb811b4dc97ff2
parent9557080196d7c328aa514d2303a2fd7a985c5c2d (diff)
drm/amd/display: Add temporary delay on disconnect patch
Signed-off-by: John Barberiz <jbarberi@amd.com> Reviewed-by: Jun Lei <Jun.Lei@amd.com> Acked-by: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_link.c14
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc_types.h6
2 files changed, 16 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
index b09f77bd45c7..c7e159a6c284 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -50,6 +50,7 @@
dm_logger_write(dc_ctx->logger, LOG_HW_HOTPLUG, \
__VA_ARGS__)
+#define DEFAULT_DELAY_DISCONNECT 100
/*******************************************************************************
* Private structures
******************************************************************************/
@@ -117,7 +118,7 @@ struct gpio *get_hpd_gpio(struct dc_bios *dcb,
* true on success, false otherwise
*/
static bool program_hpd_filter(
- const struct dc_link *link)
+ const struct dc_link *link, int default_disconnect_delay)
{
bool result = false;
@@ -133,7 +134,7 @@ static bool program_hpd_filter(
case SIGNAL_TYPE_HDMI_TYPE_A:
/* Program hpd filter */
delay_on_connect_in_ms = 500;
- delay_on_disconnect_in_ms = 100;
+ delay_on_disconnect_in_ms = default_disconnect_delay;
break;
case SIGNAL_TYPE_DISPLAY_PORT:
case SIGNAL_TYPE_DISPLAY_PORT_MST:
@@ -695,6 +696,11 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
dp_hbr_verify_link_cap(link, &link->reported_link_cap);
}
+ /* Add delay for certain monitors */
+ if (sink->edid_caps.panel_patch.disconnect_delay > 0 &&
+ SIGNAL_TYPE_HDMI_TYPE_A)
+ program_hpd_filter(link, sink->edid_caps.panel_patch.disconnect_delay);
+
/* HDMI-DVI Dongle */
if (sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A &&
!sink->edid_caps.edid_hdmi)
@@ -1081,7 +1087,7 @@ static bool construct(
* If GPIO isn't programmed correctly HPD might not rise or drain
* fast enough, leading to bounces.
*/
- program_hpd_filter(link);
+ program_hpd_filter(link, DEFAULT_DELAY_DISCONNECT);
return true;
device_tag_fail:
@@ -2000,7 +2006,7 @@ const struct dc_link_status *dc_link_get_status(const struct dc_link *link)
void core_link_resume(struct dc_link *link)
{
if (link->connector_signal != SIGNAL_TYPE_VIRTUAL)
- program_hpd_filter(link);
+ program_hpd_filter(link, DEFAULT_DELAY_DISCONNECT);
}
static struct fixed31_32 get_pbn_per_slot(struct dc_stream_state *stream)
diff --git a/drivers/gpu/drm/amd/display/dc/dc_types.h b/drivers/gpu/drm/amd/display/dc/dc_types.h
index 9faddfae241d..fbbe92f7a33a 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_types.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_types.h
@@ -193,6 +193,10 @@ union display_content_support {
} bits;
};
+struct dc_panel_patch {
+ unsigned int disconnect_delay;
+};
+
struct dc_edid_caps {
/* sink identification */
uint16_t manufacturer_id;
@@ -219,6 +223,8 @@ struct dc_edid_caps {
bool edid_hdmi;
bool hdr_supported;
+
+ struct dc_panel_patch panel_patch;
};
struct view {