diff options
Diffstat (limited to 'drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c')
| -rw-r--r-- | drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c index 87dbb8d7ed27..7f0766b5fa3d 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c @@ -117,6 +117,8 @@ static const struct link_encoder_funcs dce110_lnk_enc_funcs = { .destroy = dce110_link_encoder_destroy, .get_max_link_cap = dce110_link_encoder_get_max_link_cap, .get_dig_frontend = dce110_get_dig_frontend, + .get_hpd_state = dce110_get_hpd_state, + .program_hpd_filter = dce110_program_hpd_filter, }; static enum bp_result link_transmitter_control( @@ -850,7 +852,9 @@ void dce110_link_encoder_construct( enc110->base.funcs = &dce110_lnk_enc_funcs; enc110->base.ctx = init_data->ctx; enc110->base.id = init_data->encoder; + enc110->base.analog_id = init_data->analog_encoder; + enc110->base.hpd_gpio = init_data->hpd_gpio; enc110->base.hpd_source = init_data->hpd_source; enc110->base.connector = init_data->connector; @@ -1053,6 +1057,11 @@ void dce110_link_encoder_hw_init( void dce110_link_encoder_destroy(struct link_encoder **enc) { + if ((*enc)->hpd_gpio) { + dal_gpio_destroy_irq(&(*enc)->hpd_gpio); + (*enc)->hpd_gpio = NULL; + } + kfree(TO_DCE110_LINK_ENC(*enc)); *enc = NULL; } @@ -1751,6 +1760,40 @@ void dce110_link_encoder_get_max_link_cap(struct link_encoder *enc, *link_settings = max_link_cap; } +bool dce110_get_hpd_state(struct link_encoder *enc) +{ + uint32_t state = 0; + + if (!enc->hpd_gpio) + return false; + + dal_gpio_lock_pin(enc->hpd_gpio); + dal_gpio_get_value(enc->hpd_gpio, &state); + dal_gpio_unlock_pin(enc->hpd_gpio); + + return state; +} + +bool dce110_program_hpd_filter(struct link_encoder *enc, int delay_on_connect_in_ms, int delay_on_disconnect_in_ms) +{ + /* Setup HPD filtering */ + if (enc->hpd_gpio && dal_gpio_lock_pin(enc->hpd_gpio) == GPIO_RESULT_OK) { + struct gpio_hpd_config config; + + config.delay_on_connect = delay_on_connect_in_ms; + config.delay_on_disconnect = delay_on_disconnect_in_ms; + + dal_irq_setup_hpd_filter(enc->hpd_gpio, &config); + + dal_gpio_unlock_pin(enc->hpd_gpio); + + return true; + } else { + ASSERT(0); + return false; + } +} + #if defined(CONFIG_DRM_AMD_DC_SI) static const struct link_encoder_funcs dce60_lnk_enc_funcs = { .validate_output_with_stream = @@ -1775,7 +1818,9 @@ static const struct link_encoder_funcs dce60_lnk_enc_funcs = { .is_dig_enabled = dce110_is_dig_enabled, .destroy = dce110_link_encoder_destroy, .get_max_link_cap = dce110_link_encoder_get_max_link_cap, - .get_dig_frontend = dce110_get_dig_frontend + .get_dig_frontend = dce110_get_dig_frontend, + .get_hpd_state = dce110_get_hpd_state, + .program_hpd_filter = dce110_program_hpd_filter, }; void dce60_link_encoder_construct( @@ -1793,7 +1838,9 @@ void dce60_link_encoder_construct( enc110->base.funcs = &dce60_lnk_enc_funcs; enc110->base.ctx = init_data->ctx; enc110->base.id = init_data->encoder; + enc110->base.analog_id = init_data->analog_encoder; + enc110->base.hpd_gpio = init_data->hpd_gpio; enc110->base.hpd_source = init_data->hpd_source; enc110->base.connector = init_data->connector; |
