Commit 243c46c5 authored by John Barberiz's avatar John Barberiz Committed by Alex Deucher

drm/amd/display: Add temporary delay on disconnect patch

Signed-off-by: default avatarJohn Barberiz <jbarberi@amd.com>
Reviewed-by: default avatarJun Lei <Jun.Lei@amd.com>
Acked-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 95570801
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
dm_logger_write(dc_ctx->logger, LOG_HW_HOTPLUG, \ dm_logger_write(dc_ctx->logger, LOG_HW_HOTPLUG, \
__VA_ARGS__) __VA_ARGS__)
#define DEFAULT_DELAY_DISCONNECT 100
/******************************************************************************* /*******************************************************************************
* Private structures * Private structures
******************************************************************************/ ******************************************************************************/
...@@ -117,7 +118,7 @@ struct gpio *get_hpd_gpio(struct dc_bios *dcb, ...@@ -117,7 +118,7 @@ struct gpio *get_hpd_gpio(struct dc_bios *dcb,
* true on success, false otherwise * true on success, false otherwise
*/ */
static bool program_hpd_filter( static bool program_hpd_filter(
const struct dc_link *link) const struct dc_link *link, int default_disconnect_delay)
{ {
bool result = false; bool result = false;
...@@ -133,7 +134,7 @@ static bool program_hpd_filter( ...@@ -133,7 +134,7 @@ static bool program_hpd_filter(
case SIGNAL_TYPE_HDMI_TYPE_A: case SIGNAL_TYPE_HDMI_TYPE_A:
/* Program hpd filter */ /* Program hpd filter */
delay_on_connect_in_ms = 500; delay_on_connect_in_ms = 500;
delay_on_disconnect_in_ms = 100; delay_on_disconnect_in_ms = default_disconnect_delay;
break; break;
case SIGNAL_TYPE_DISPLAY_PORT: case SIGNAL_TYPE_DISPLAY_PORT:
case SIGNAL_TYPE_DISPLAY_PORT_MST: case SIGNAL_TYPE_DISPLAY_PORT_MST:
...@@ -695,6 +696,11 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason) ...@@ -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); 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 */ /* HDMI-DVI Dongle */
if (sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A && if (sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A &&
!sink->edid_caps.edid_hdmi) !sink->edid_caps.edid_hdmi)
...@@ -1081,7 +1087,7 @@ static bool construct( ...@@ -1081,7 +1087,7 @@ static bool construct(
* If GPIO isn't programmed correctly HPD might not rise or drain * If GPIO isn't programmed correctly HPD might not rise or drain
* fast enough, leading to bounces. * fast enough, leading to bounces.
*/ */
program_hpd_filter(link); program_hpd_filter(link, DEFAULT_DELAY_DISCONNECT);
return true; return true;
device_tag_fail: device_tag_fail:
...@@ -2000,7 +2006,7 @@ const struct dc_link_status *dc_link_get_status(const struct dc_link *link) ...@@ -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) void core_link_resume(struct dc_link *link)
{ {
if (link->connector_signal != SIGNAL_TYPE_VIRTUAL) 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) static struct fixed31_32 get_pbn_per_slot(struct dc_stream_state *stream)
......
...@@ -193,6 +193,10 @@ union display_content_support { ...@@ -193,6 +193,10 @@ union display_content_support {
} bits; } bits;
}; };
struct dc_panel_patch {
unsigned int disconnect_delay;
};
struct dc_edid_caps { struct dc_edid_caps {
/* sink identification */ /* sink identification */
uint16_t manufacturer_id; uint16_t manufacturer_id;
...@@ -219,6 +223,8 @@ struct dc_edid_caps { ...@@ -219,6 +223,8 @@ struct dc_edid_caps {
bool edid_hdmi; bool edid_hdmi;
bool hdr_supported; bool hdr_supported;
struct dc_panel_patch panel_patch;
}; };
struct view { struct view {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment