#include <drm/drm_atomic_uapi.h>
 #include <drm/drm_fb_dma_helper.h>
 #include <drm/drm_framebuffer.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/drm_vblank.h>
 static void vc4_crtc_pixelvalve_reset(struct drm_crtc *crtc)
 {
        struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
+       struct drm_device *dev = crtc->dev;
+       int idx;
+
+       if (!drm_dev_enter(dev, &idx))
+               return;
 
        /* The PV needs to be disabled before it can be flushed */
        CRTC_WRITE(PV_CONTROL, CRTC_READ(PV_CONTROL) & ~PV_CONTROL_EN);
        CRTC_WRITE(PV_CONTROL, CRTC_READ(PV_CONTROL) | PV_CONTROL_FIFO_CLR);
+
+       drm_dev_exit(idx);
 }
 
 static void vc4_crtc_config_pv(struct drm_crtc *crtc, struct drm_encoder *encoder,
        u32 format = is_dsi1 ? PV_CONTROL_FORMAT_DSIV_24 : PV_CONTROL_FORMAT_24;
        u8 ppc = pv_data->pixels_per_clock;
        bool debug_dump_regs = false;
+       int idx;
+
+       if (!drm_dev_enter(dev, &idx))
+               return;
 
        if (debug_dump_regs) {
                struct drm_printer p = drm_info_printer(&vc4_crtc->pdev->dev);
                         drm_crtc_index(crtc));
                drm_print_regset32(&p, &vc4_crtc->regset);
        }
+
+       drm_dev_exit(idx);
 }
 
 static void require_hvs_enabled(struct drm_device *dev)
        struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
        struct drm_device *dev = crtc->dev;
        struct vc4_dev *vc4 = to_vc4_dev(dev);
-       int ret;
+       int idx, ret;
+
+       if (!drm_dev_enter(dev, &idx))
+               return -ENODEV;
 
        CRTC_WRITE(PV_V_CONTROL,
                   CRTC_READ(PV_V_CONTROL) & ~PV_VCONTROL_VIDEN);
        if (vc4_encoder && vc4_encoder->post_crtc_powerdown)
                vc4_encoder->post_crtc_powerdown(encoder, state);
 
+       drm_dev_exit(idx);
+
        return 0;
 }
 
        struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
        struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc, new_state);
        struct vc4_encoder *vc4_encoder = to_vc4_encoder(encoder);
+       int idx;
 
        drm_dbg(dev, "Enabling CRTC %s (%u) connected to Encoder %s (%u)",
                crtc->name, crtc->base.id, encoder->name, encoder->base.id);
 
+       if (!drm_dev_enter(dev, &idx))
+               return;
+
        require_hvs_enabled(dev);
 
        /* Enable vblank irq handling before crtc is started otherwise
 
        if (vc4_encoder->post_crtc_enable)
                vc4_encoder->post_crtc_enable(encoder, state);
+
+       drm_dev_exit(idx);
 }
 
 static enum drm_mode_status vc4_crtc_mode_valid(struct drm_crtc *crtc,
 static int vc4_enable_vblank(struct drm_crtc *crtc)
 {
        struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
+       struct drm_device *dev = crtc->dev;
+       int idx;
+
+       if (!drm_dev_enter(dev, &idx))
+               return -ENODEV;
 
        CRTC_WRITE(PV_INTEN, PV_INT_VFP_START);
 
+       drm_dev_exit(idx);
+
        return 0;
 }
 
 static void vc4_disable_vblank(struct drm_crtc *crtc)
 {
        struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
+       struct drm_device *dev = crtc->dev;
+       int idx;
+
+       if (!drm_dev_enter(dev, &idx))
+               return;
 
        CRTC_WRITE(PV_INTEN, 0);
+
+       drm_dev_exit(idx);
 }
 
 static void vc4_crtc_handle_page_flip(struct vc4_crtc *vc4_crtc)