|
@@ -1160,14 +1160,18 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,
|
|
|
{
|
|
|
struct drm_crtc_state *crtc_state;
|
|
|
|
|
|
- if (crtc)
|
|
|
- drm_connector_reference(conn_state->connector);
|
|
|
- if (conn_state->crtc && conn_state->crtc != crtc) {
|
|
|
+ if (conn_state->crtc == crtc)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if (conn_state->crtc) {
|
|
|
crtc_state = drm_atomic_get_existing_crtc_state(conn_state->state,
|
|
|
conn_state->crtc);
|
|
|
|
|
|
crtc_state->connector_mask &=
|
|
|
~(1 << drm_connector_index(conn_state->connector));
|
|
|
+
|
|
|
+ drm_connector_unreference(conn_state->connector);
|
|
|
+ conn_state->crtc = NULL;
|
|
|
}
|
|
|
|
|
|
if (crtc) {
|
|
@@ -1177,18 +1181,16 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,
|
|
|
|
|
|
crtc_state->connector_mask |=
|
|
|
1 << drm_connector_index(conn_state->connector);
|
|
|
- }
|
|
|
|
|
|
- if (conn_state->crtc)
|
|
|
- drm_connector_unreference(conn_state->connector);
|
|
|
- conn_state->crtc = crtc;
|
|
|
+ drm_connector_reference(conn_state->connector);
|
|
|
+ conn_state->crtc = crtc;
|
|
|
|
|
|
- if (crtc)
|
|
|
DRM_DEBUG_ATOMIC("Link connector state %p to [CRTC:%d:%s]\n",
|
|
|
conn_state, crtc->base.id, crtc->name);
|
|
|
- else
|
|
|
+ } else {
|
|
|
DRM_DEBUG_ATOMIC("Link connector state %p to [NOCRTC]\n",
|
|
|
conn_state);
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|