#include <drm/drm_fb_helper.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
-#include <drm/drm_irq.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/drm_vblank.h>
 
        return IRQ_HANDLED;
 }
 
+static void atmel_hlcdc_dc_irq_postinstall(struct drm_device *dev)
+{
+       struct atmel_hlcdc_dc *dc = dev->dev_private;
+       unsigned int cfg = 0;
+       int i;
+
+       /* Enable interrupts on activated layers */
+       for (i = 0; i < ATMEL_HLCDC_MAX_LAYERS; i++) {
+               if (dc->layers[i])
+                       cfg |= ATMEL_HLCDC_LAYER_STATUS(i);
+       }
+
+       regmap_write(dc->hlcdc->regmap, ATMEL_HLCDC_IER, cfg);
+}
+
+static void atmel_hlcdc_dc_irq_disable(struct drm_device *dev)
+{
+       struct atmel_hlcdc_dc *dc = dev->dev_private;
+       unsigned int isr;
+
+       regmap_write(dc->hlcdc->regmap, ATMEL_HLCDC_IDR, 0xffffffff);
+       regmap_read(dc->hlcdc->regmap, ATMEL_HLCDC_ISR, &isr);
+}
+
+static int atmel_hlcdc_dc_irq_install(struct drm_device *dev, unsigned int irq)
+{
+       int ret;
+
+       atmel_hlcdc_dc_irq_disable(dev);
+
+       ret = devm_request_irq(dev->dev, irq, atmel_hlcdc_dc_irq_handler, 0,
+                              dev->driver->name, dev);
+       if (ret)
+               return ret;
+
+       atmel_hlcdc_dc_irq_postinstall(dev);
+
+       return 0;
+}
+
+static void atmel_hlcdc_dc_irq_uninstall(struct drm_device *dev)
+{
+       atmel_hlcdc_dc_irq_disable(dev);
+}
+
 static const struct drm_mode_config_funcs mode_config_funcs = {
        .fb_create = drm_gem_fb_create,
        .atomic_check = drm_atomic_helper_check,
        drm_mode_config_reset(dev);
 
        pm_runtime_get_sync(dev->dev);
-       ret = drm_irq_install(dev, dc->hlcdc->irq);
+       ret = atmel_hlcdc_dc_irq_install(dev, dc->hlcdc->irq);
        pm_runtime_put_sync(dev->dev);
        if (ret < 0) {
                dev_err(dev->dev, "failed to install IRQ handler\n");
        drm_mode_config_cleanup(dev);
 
        pm_runtime_get_sync(dev->dev);
-       drm_irq_uninstall(dev);
+       atmel_hlcdc_dc_irq_uninstall(dev);
        pm_runtime_put_sync(dev->dev);
 
        dev->dev_private = NULL;
        clk_disable_unprepare(dc->hlcdc->periph_clk);
 }
 
-static int atmel_hlcdc_dc_irq_postinstall(struct drm_device *dev)
-{
-       struct atmel_hlcdc_dc *dc = dev->dev_private;
-       unsigned int cfg = 0;
-       int i;
-
-       /* Enable interrupts on activated layers */
-       for (i = 0; i < ATMEL_HLCDC_MAX_LAYERS; i++) {
-               if (dc->layers[i])
-                       cfg |= ATMEL_HLCDC_LAYER_STATUS(i);
-       }
-
-       regmap_write(dc->hlcdc->regmap, ATMEL_HLCDC_IER, cfg);
-
-       return 0;
-}
-
-static void atmel_hlcdc_dc_irq_uninstall(struct drm_device *dev)
-{
-       struct atmel_hlcdc_dc *dc = dev->dev_private;
-       unsigned int isr;
-
-       regmap_write(dc->hlcdc->regmap, ATMEL_HLCDC_IDR, 0xffffffff);
-       regmap_read(dc->hlcdc->regmap, ATMEL_HLCDC_ISR, &isr);
-}
-
 DEFINE_DRM_GEM_CMA_FOPS(fops);
 
 static const struct drm_driver atmel_hlcdc_dc_driver = {
        .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
-       .irq_handler = atmel_hlcdc_dc_irq_handler,
-       .irq_preinstall = atmel_hlcdc_dc_irq_uninstall,
-       .irq_postinstall = atmel_hlcdc_dc_irq_postinstall,
-       .irq_uninstall = atmel_hlcdc_dc_irq_uninstall,
        DRM_GEM_CMA_DRIVER_OPS,
        .fops = &fops,
        .name = "atmel-hlcdc",