#include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_fourcc.h>
 static void vc4_txp_connector_atomic_commit(struct drm_connector *conn,
                                        struct drm_atomic_state *state)
 {
+       struct drm_device *drm = conn->dev;
        struct drm_connector_state *conn_state = drm_atomic_get_new_connector_state(state,
                                                                                    conn);
        struct vc4_txp *txp = connector_to_vc4_txp(conn);
        struct drm_display_mode *mode;
        struct drm_framebuffer *fb;
        u32 ctrl;
+       int idx;
        int i;
 
        if (WARN_ON(!conn_state->writeback_job))
                 */
                ctrl |= TXP_ALPHA_INVERT;
 
+       if (!drm_dev_enter(drm, &idx))
+               return;
+
        gem = drm_fb_cma_get_gem_obj(fb, 0);
        TXP_WRITE(TXP_DST_PTR, gem->paddr + fb->offsets[0]);
        TXP_WRITE(TXP_DST_PITCH, fb->pitches[0]);
        TXP_WRITE(TXP_DST_CTRL, ctrl);
 
        drm_writeback_queue_job(&txp->connector, conn_state);
+
+       drm_dev_exit(idx);
 }
 
 static const struct drm_connector_helper_funcs vc4_txp_connector_helper_funcs = {
 
 static void vc4_txp_encoder_disable(struct drm_encoder *encoder)
 {
+       struct drm_device *drm = encoder->dev;
        struct vc4_txp *txp = encoder_to_vc4_txp(encoder);
+       int idx;
+
+       if (!drm_dev_enter(drm, &idx))
+               return;
 
        if (TXP_READ(TXP_DST_CTRL) & TXP_BUSY) {
                unsigned long timeout = jiffies + msecs_to_jiffies(1000);
        }
 
        TXP_WRITE(TXP_DST_CTRL, TXP_POWERDOWN);
+
+       drm_dev_exit(idx);
 }
 
 static const struct drm_encoder_helper_funcs vc4_txp_encoder_helper_funcs = {
        struct vc4_txp *txp = data;
        struct vc4_crtc *vc4_crtc = &txp->base;
 
+       /*
+        * We don't need to protect the register access using
+        * drm_dev_enter() there because the interrupt handler lifetime
+        * is tied to the device itself, and not to the DRM device.
+        *
+        * So when the device will be gone, one of the first thing we
+        * will be doing will be to unregister the interrupt handler,
+        * and then unregister the DRM device. drm_dev_enter() would
+        * thus always succeed if we are here.
+        */
        TXP_WRITE(TXP_DST_CTRL, TXP_READ(TXP_DST_CTRL) & ~TXP_EI);
        vc4_crtc_handle_vblank(vc4_crtc);
        drm_writeback_signal_completion(&txp->connector, 0);