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>
This commit is contained in:
parent
9557080196
commit
243c46c5ce
@ -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)
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user