Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/vc4: hdmi: Remove drm_encoder->crtc usage

The drm_encoder crtc pointer isn't really fit for an atomic driver,
let's rely on the connector state instead.

Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20210707141930.1811128-1-maxime@cerno.tech

+27 -13
+27 -13
drivers/gpu/drm/vc4/vc4_hdmi.c
··· 432 432 struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder); 433 433 struct drm_connector *connector = &vc4_hdmi->connector; 434 434 struct drm_connector_state *cstate = connector->state; 435 - struct drm_crtc *crtc = encoder->crtc; 435 + struct drm_crtc *crtc = cstate->crtc; 436 436 const struct drm_display_mode *mode = &crtc->state->adjusted_mode; 437 437 union hdmi_infoframe frame; 438 438 int ret; ··· 537 537 538 538 static void vc4_hdmi_enable_scrambling(struct drm_encoder *encoder) 539 539 { 540 - struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode; 541 540 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); 541 + struct drm_connector *connector = &vc4_hdmi->connector; 542 + struct drm_connector_state *cstate = connector->state; 543 + struct drm_crtc *crtc = cstate->crtc; 544 + struct drm_display_mode *mode = &crtc->state->adjusted_mode; 542 545 543 546 if (!vc4_hdmi_supports_scrambling(encoder, mode)) 544 547 return; ··· 562 559 static void vc4_hdmi_disable_scrambling(struct drm_encoder *encoder) 563 560 { 564 561 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); 565 - struct drm_crtc *crtc = encoder->crtc; 562 + struct drm_connector *connector = &vc4_hdmi->connector; 563 + struct drm_connector_state *cstate = connector->state; 566 564 567 565 /* 568 - * At boot, encoder->crtc will be NULL. Since we don't know the 566 + * At boot, connector->state will be NULL. Since we don't know the 569 567 * state of the scrambler and in order to avoid any 570 568 * inconsistency, let's disable it all the time. 571 569 */ 572 - if (crtc && !vc4_hdmi_supports_scrambling(encoder, &crtc->mode)) 570 + if (cstate && !vc4_hdmi_supports_scrambling(encoder, &cstate->crtc->mode)) 573 571 return; 574 572 575 - if (crtc && !vc4_hdmi_mode_needs_scrambling(&crtc->mode)) 573 + if (cstate && !vc4_hdmi_mode_needs_scrambling(&cstate->crtc->mode)) 576 574 return; 577 575 578 576 if (delayed_work_pending(&vc4_hdmi->scrambling_work)) ··· 895 891 vc4_hdmi_encoder_get_connector_state(encoder, state); 896 892 struct vc4_hdmi_connector_state *vc4_conn_state = 897 893 conn_state_to_vc4_hdmi_conn_state(conn_state); 898 - struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode; 894 + struct drm_crtc_state *crtc_state = 895 + drm_atomic_get_new_crtc_state(state, conn_state->crtc); 896 + struct drm_display_mode *mode = &crtc_state->adjusted_mode; 899 897 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); 900 898 unsigned long bvb_rate, pixel_rate, hsm_rate; 901 899 int ret; ··· 991 985 static void vc4_hdmi_encoder_pre_crtc_enable(struct drm_encoder *encoder, 992 986 struct drm_atomic_state *state) 993 987 { 994 - struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode; 988 + struct drm_connector_state *conn_state = 989 + vc4_hdmi_encoder_get_connector_state(encoder, state); 990 + struct drm_crtc_state *crtc_state = 991 + drm_atomic_get_new_crtc_state(state, conn_state->crtc); 992 + struct drm_display_mode *mode = &crtc_state->adjusted_mode; 995 993 struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder); 996 994 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); 997 995 ··· 1018 1008 static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder, 1019 1009 struct drm_atomic_state *state) 1020 1010 { 1021 - struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode; 1011 + struct drm_connector_state *conn_state = 1012 + vc4_hdmi_encoder_get_connector_state(encoder, state); 1013 + struct drm_crtc_state *crtc_state = 1014 + drm_atomic_get_new_crtc_state(state, conn_state->crtc); 1015 + struct drm_display_mode *mode = &crtc_state->adjusted_mode; 1022 1016 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); 1023 1017 struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder); 1024 1018 bool hsync_pos = mode->flags & DRM_MODE_FLAG_PHSYNC; ··· 1209 1195 1210 1196 static void vc4_hdmi_set_n_cts(struct vc4_hdmi *vc4_hdmi) 1211 1197 { 1212 - struct drm_encoder *encoder = &vc4_hdmi->encoder.base.base; 1213 - struct drm_crtc *crtc = encoder->crtc; 1198 + struct drm_connector *connector = &vc4_hdmi->connector; 1199 + struct drm_crtc *crtc = connector->state->crtc; 1214 1200 const struct drm_display_mode *mode = &crtc->state->adjusted_mode; 1215 1201 u32 samplerate = vc4_hdmi->audio.samplerate; 1216 1202 u32 n, cts; ··· 1244 1230 static int vc4_hdmi_audio_startup(struct device *dev, void *data) 1245 1231 { 1246 1232 struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); 1247 - struct drm_encoder *encoder = &vc4_hdmi->encoder.base.base; 1233 + struct drm_connector *connector = &vc4_hdmi->connector; 1248 1234 1249 1235 /* 1250 1236 * If the HDMI encoder hasn't probed, or the encoder is 1251 1237 * currently in DVI mode, treat the codec dai as missing. 1252 1238 */ 1253 - if (!encoder->crtc || !(HDMI_READ(HDMI_RAM_PACKET_CONFIG) & 1239 + if (!connector->state || !(HDMI_READ(HDMI_RAM_PACKET_CONFIG) & 1254 1240 VC4_HDMI_RAM_PACKET_ENABLE)) 1255 1241 return -ENODEV; 1256 1242