int reply_bytes;
        int ret;
 
+       ironlake_edp_panel_vdd_on(intel_dp);
        intel_dp_check_edp(intel_dp);
        /* Set up the command byte */
        if (mode & MODE_I2C_READ)
                                      reply, reply_bytes);
                if (ret < 0) {
                        DRM_DEBUG_KMS("aux_ch failed %d\n", ret);
-                       return ret;
+                       goto out;
                }
 
                switch (reply[0] & AUX_NATIVE_REPLY_MASK) {
                        break;
                case AUX_NATIVE_REPLY_NACK:
                        DRM_DEBUG_KMS("aux_ch native nack\n");
-                       return -EREMOTEIO;
+                       ret = -EREMOTEIO;
+                       goto out;
                case AUX_NATIVE_REPLY_DEFER:
                        /*
                         * For now, just give more slack to branch devices. We
                default:
                        DRM_ERROR("aux_ch invalid native reply 0x%02x\n",
                                  reply[0]);
-                       return -EREMOTEIO;
+                       ret = -EREMOTEIO;
+                       goto out;
                }
 
                switch (reply[0] & AUX_I2C_REPLY_MASK) {
                        if (mode == MODE_I2C_READ) {
                                *read_byte = reply[1];
                        }
-                       return reply_bytes - 1;
+                       ret = reply_bytes - 1;
+                       goto out;
                case AUX_I2C_REPLY_NACK:
                        DRM_DEBUG_KMS("aux_i2c nack\n");
-                       return -EREMOTEIO;
+                       ret = -EREMOTEIO;
+                       goto out;
                case AUX_I2C_REPLY_DEFER:
                        DRM_DEBUG_KMS("aux_i2c defer\n");
                        udelay(100);
                        break;
                default:
                        DRM_ERROR("aux_i2c invalid reply 0x%02x\n", reply[0]);
-                       return -EREMOTEIO;
+                       ret = -EREMOTEIO;
+                       goto out;
                }
        }
 
        DRM_ERROR("too many retries, giving up\n");
-       return -EREMOTEIO;
+       ret = -EREMOTEIO;
+
+out:
+       ironlake_edp_panel_vdd_off(intel_dp, false);
+       return ret;
 }
 
 static int
        intel_dp->adapter.algo_data = &intel_dp->algo;
        intel_dp->adapter.dev.parent = &intel_connector->base.kdev;
 
-       ironlake_edp_panel_vdd_on(intel_dp);
        ret = i2c_dp_aux_add_bus(&intel_dp->adapter);
-       ironlake_edp_panel_vdd_off(intel_dp, false);
        return ret;
 }
 
        intel_dp_init_panel_power_sequencer_registers(dev, intel_dp,
                                                      &power_seq);
 
-       ironlake_edp_panel_vdd_on(intel_dp);
        edid = drm_get_edid(connector, &intel_dp->adapter);
        if (edid) {
                if (drm_add_edid_modes(connector, edid)) {
                        fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;
        }
 
-       ironlake_edp_panel_vdd_off(intel_dp, false);
-
        intel_panel_init(&intel_connector->panel, fixed_mode);
        intel_panel_setup_backlight(connector);