struct ade_crtc {
        struct drm_crtc base;
        struct ade_hw_ctx *ctx;
+       struct work_struct display_reset_wq;
        bool enable;
        u32 out_format;
 };
         */
        ade_update_bits(base + ADE_CTRL, FRM_END_START_OFST,
                        FRM_END_START_MASK, REG_EFFECTIVE_IN_ADEEN_FRMEND);
+       ade_update_bits(base + LDI_INT_EN, UNDERFLOW_INT_EN_OFST, MASK(1), 1);
 }
 
 static bool ade_crtc_mode_fixup(struct drm_crtc *crtc,
                        MASK(1), 0);
 }
 
+static void drm_underflow_wq(struct work_struct *work)
+{
+       struct ade_crtc *acrtc = container_of(work, struct ade_crtc,
+                                             display_reset_wq);
+       struct drm_device *drm_dev = (&acrtc->base)->dev;
+       struct drm_atomic_state *state;
+
+       state = drm_atomic_helper_suspend(drm_dev);
+       drm_atomic_helper_resume(drm_dev, state);
+}
+
 static irqreturn_t ade_irq_handler(int irq, void *data)
 {
        struct ade_crtc *acrtc = data;
                                MASK(1), 1);
                drm_crtc_handle_vblank(crtc);
        }
+       if (status & BIT(UNDERFLOW_INT_EN_OFST)) {
+               ade_update_bits(base + LDI_INT_CLR, UNDERFLOW_INT_EN_OFST,
+                               MASK(1), 1);
+               DRM_ERROR("LDI underflow!");
+               schedule_work(&acrtc->display_reset_wq);
+       }
 
        return IRQ_HANDLED;
 }
        /* vblank irq init */
        ret = devm_request_irq(dev->dev, ctx->irq, ade_irq_handler,
                               IRQF_SHARED, dev->driver->name, acrtc);
+
+       INIT_WORK(&acrtc->display_reset_wq, drm_underflow_wq);
+
        if (ret)
                return ret;