}
 }
 
+static void
+nouveau_connector_set_edid(struct nouveau_connector *nv_connector,
+                          struct edid *edid)
+{
+       struct edid *old_edid = nv_connector->edid;
+
+       drm_connector_update_edid_property(&nv_connector->base, edid);
+       kfree(old_edid);
+       nv_connector->edid = edid;
+}
+
 static enum drm_connector_status
 nouveau_connector_detect(struct drm_connector *connector, bool force)
 {
        int ret;
        enum drm_connector_status conn_status = connector_status_disconnected;
 
-       /* Cleanup the previous EDID block. */
-       if (nv_connector->edid) {
-               drm_connector_update_edid_property(connector, NULL);
-               kfree(nv_connector->edid);
-               nv_connector->edid = NULL;
-       }
-
        /* Outputs are only polled while runtime active, so resuming the
         * device here is unnecessary (and would deadlock upon runtime suspend
         * because it waits for polling to finish). We do however, want to
                ret = pm_runtime_get_sync(dev->dev);
                if (ret < 0 && ret != -EACCES) {
                        pm_runtime_put_autosuspend(dev->dev);
+                       nouveau_connector_set_edid(nv_connector, NULL);
                        return conn_status;
                }
        }
 
        nv_encoder = nouveau_connector_ddc_detect(connector);
        if (nv_encoder && (i2c = nv_encoder->i2c) != NULL) {
+               struct edid *new_edid;
+
                if ((vga_switcheroo_handler_flags() &
                     VGA_SWITCHEROO_CAN_SWITCH_DDC) &&
                    nv_connector->type == DCB_CONNECTOR_LVDS)
-                       nv_connector->edid = drm_get_edid_switcheroo(connector,
-                                                                    i2c);
+                       new_edid = drm_get_edid_switcheroo(connector, i2c);
                else
-                       nv_connector->edid = drm_get_edid(connector, i2c);
+                       new_edid = drm_get_edid(connector, i2c);
 
-               drm_connector_update_edid_property(connector,
-                                                       nv_connector->edid);
+               nouveau_connector_set_edid(nv_connector, new_edid);
                if (!nv_connector->edid) {
                        NV_ERROR(drm, "DDC responded, but no EDID for %s\n",
                                 connector->name);
                conn_status = connector_status_connected;
                drm_dp_cec_set_edid(&nv_connector->aux, nv_connector->edid);
                goto out;
+       } else {
+               nouveau_connector_set_edid(nv_connector, NULL);
        }
 
        nv_encoder = nouveau_connector_of_detect(connector);
        struct nouveau_drm *drm = nouveau_drm(dev);
        struct nouveau_connector *nv_connector = nouveau_connector(connector);
        struct nouveau_encoder *nv_encoder = NULL;
+       struct edid *edid = NULL;
        enum drm_connector_status status = connector_status_disconnected;
 
-       /* Cleanup the previous EDID block. */
-       if (nv_connector->edid) {
-               drm_connector_update_edid_property(connector, NULL);
-               kfree(nv_connector->edid);
-               nv_connector->edid = NULL;
-       }
-
        nv_encoder = find_encoder(connector, DCB_OUTPUT_LVDS);
        if (!nv_encoder)
-               return connector_status_disconnected;
+               goto out;
 
        /* Try retrieving EDID via DDC */
        if (!drm->vbios.fp_no_ddc) {
         * valid - it's not (rh#613284)
         */
        if (nv_encoder->dcb->lvdsconf.use_acpi_for_edid) {
-               if ((nv_connector->edid = nouveau_acpi_edid(dev, connector))) {
+               edid = nouveau_acpi_edid(dev, connector);
+               if (edid) {
                        status = connector_status_connected;
                        goto out;
                }
         * stored for the panel stored in them.
         */
        if (!drm->vbios.fp_no_ddc) {
-               struct edid *edid =
-                       (struct edid *)nouveau_bios_embedded_edid(dev);
+               edid = (struct edid *)nouveau_bios_embedded_edid(dev);
                if (edid) {
-                       nv_connector->edid =
-                                       kmemdup(edid, EDID_LENGTH, GFP_KERNEL);
-                       if (nv_connector->edid)
+                       edid = kmemdup(edid, EDID_LENGTH, GFP_KERNEL);
+                       if (edid)
                                status = connector_status_connected;
                }
        }
                status = connector_status_unknown;
 #endif
 
-       drm_connector_update_edid_property(connector, nv_connector->edid);
+       nouveau_connector_set_edid(nv_connector, edid);
        nouveau_connector_set_encoder(connector, nv_encoder);
        return status;
 }