summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
diff options
context:
space:
mode:
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.c49
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;