The tidss driver doesn't really care implement anything with encoders, it just relies on simple encoders, bridges and drm_bridge_connector.
In order to figure out the CRTC -> connector association from the hardware state, we do need encoder support though, through the get_current_crtc callback. Since the tidss encoders are always connected to a single CRTC, we don't really need to read the hardware state though, we can simply return the one we know we are always connected to. Signed-off-by: Maxime Ripard <mrip...@kernel.org> --- drivers/gpu/drm/tidss/tidss_encoder.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/tidss/tidss_encoder.c b/drivers/gpu/drm/tidss/tidss_encoder.c index 81a04f7677701b0b1bee204ac9fc5835ac373950..2cb12ab48a48cec453defcb261915e4663806289 100644 --- a/drivers/gpu/drm/tidss/tidss_encoder.c +++ b/drivers/gpu/drm/tidss/tidss_encoder.c @@ -79,10 +79,29 @@ static const struct drm_bridge_funcs tidss_bridge_funcs = { .atomic_reset = drm_atomic_helper_bridge_reset, .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, }; +static struct drm_crtc *tidss_encoder_get_current_crtc(struct drm_encoder *encoder) +{ + struct drm_crtc *crtc; + + WARN_ON(hweight32(encoder->possible_crtcs) > 1); + + drm_for_each_crtc(crtc, encoder->dev) { + if (encoder->possible_crtcs == (1 << drm_crtc_index(crtc))) + return crtc; + } + + return NULL; +} + +static const struct drm_encoder_funcs tidss_encoder_funcs = { + .get_current_crtc = tidss_encoder_get_current_crtc, + .destroy = drm_encoder_cleanup, +}; + int tidss_encoder_create(struct tidss_device *tidss, struct drm_bridge *next_bridge, u32 encoder_type, u32 possible_crtcs) { struct tidss_encoder *t_enc; @@ -93,12 +112,13 @@ int tidss_encoder_create(struct tidss_device *tidss, t_enc = devm_drm_bridge_alloc(tidss->dev, struct tidss_encoder, bridge, &tidss_bridge_funcs); if (IS_ERR(t_enc)) return PTR_ERR(t_enc); - ret = drm_simple_encoder_init(&tidss->ddev, &t_enc->encoder, - encoder_type); + ret = drm_encoder_init(&tidss->ddev, &t_enc->encoder, + &tidss_encoder_funcs, + encoder_type, NULL); if (ret) return ret; t_enc->tidss = tidss; t_enc->next_bridge = next_bridge; -- 2.50.1