if (ret)
                goto err_put_ddc;
 
+       /*
+        * We need to have the device powered up at this point to call
+        * our reset hook and for the CEC init.
+        */
+       ret = vc4_hdmi_runtime_resume(dev);
+       if (ret)
+               goto err_put_ddc;
+
+       pm_runtime_get_noresume(dev);
+       pm_runtime_set_active(dev);
+       pm_runtime_enable(dev);
+
        if (vc4_hdmi->variant->reset)
                vc4_hdmi->variant->reset(vc4_hdmi);
 
                clk_prepare_enable(vc4_hdmi->pixel_bvb_clock);
        }
 
-       pm_runtime_enable(dev);
-
        drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_TMDS);
        drm_encoder_helper_add(encoder, &vc4_hdmi_encoder_helper_funcs);
 
                             vc4_hdmi_debugfs_regs,
                             vc4_hdmi);
 
+       pm_runtime_put_sync(dev);
+
        return 0;
 
 err_free_cec:
        vc4_hdmi_connector_destroy(&vc4_hdmi->connector);
 err_destroy_encoder:
        drm_encoder_cleanup(encoder);
+       pm_runtime_put_sync(dev);
        pm_runtime_disable(dev);
 err_put_ddc:
        put_device(&vc4_hdmi->ddc->dev);