#include <linux/err.h>
 #include <linux/init.h>
 #include <linux/io.h>
+#include <linux/irq.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
+#include <linux/of.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/spinlock.h>
 
 static int vpif_probe(struct platform_device *pdev)
 {
-       static struct resource *res_irq;
+       static struct resource res_irq;
        struct platform_device *pdev_capture, *pdev_display;
        struct device_node *endpoint = NULL;
        struct vpif_data *data;
        int ret;
+       int irq;
 
        vpif_base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(vpif_base))
         * For DT platforms, manually create platform_devices for
         * capture/display drivers.
         */
-       res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
-       if (!res_irq) {
-               dev_warn(&pdev->dev, "Missing IRQ resource.\n");
-               ret = -EINVAL;
+       irq = platform_get_irq(pdev, 0);
+       if (irq < 0) {
+               ret = irq;
                goto err_put_rpm;
        }
+       res_irq = (struct resource)DEFINE_RES_IRQ_NAMED(irq, of_node_full_name(pdev->dev.of_node));
+       res_irq.flags |= irq_get_trigger_type(irq);
 
        pdev_capture = kzalloc(sizeof(*pdev_capture), GFP_KERNEL);
        if (!pdev_capture) {
 
        pdev_capture->name = "vpif_capture";
        pdev_capture->id = -1;
-       pdev_capture->resource = res_irq;
+       pdev_capture->resource = &res_irq;
        pdev_capture->num_resources = 1;
        pdev_capture->dev.dma_mask = pdev->dev.dma_mask;
        pdev_capture->dev.coherent_dma_mask = pdev->dev.coherent_dma_mask;
 
        pdev_display->name = "vpif_display";
        pdev_display->id = -1;
-       pdev_display->resource = res_irq;
+       pdev_display->resource = &res_irq;
        pdev_display->num_resources = 1;
        pdev_display->dev.dma_mask = pdev->dev.dma_mask;
        pdev_display->dev.coherent_dma_mask = pdev->dev.coherent_dma_mask;
 
 {
        struct vpif_subdev_info *subdevdata;
        struct i2c_adapter *i2c_adap;
-       struct resource *res;
        int subdev_count;
        int res_idx = 0;
        int i, err;
                goto vpif_free;
        }
 
-       while ((res = platform_get_resource(pdev, IORESOURCE_IRQ, res_idx))) {
-               err = devm_request_irq(&pdev->dev, res->start, vpif_channel_isr,
-                                       IRQF_SHARED, VPIF_DRIVER_NAME,
-                                       (void *)(&vpif_obj.dev[res_idx]->
-                                       channel_id));
-               if (err) {
-                       err = -EINVAL;
+       do {
+               int irq;
+
+               err = platform_get_irq_optional(pdev, res_idx);
+               if (err < 0 && err != -ENXIO)
                        goto vpif_unregister;
-               }
-               res_idx++;
-       }
+               if (err > 0)
+                       irq = err;
+               else
+                       break;
+
+               err = devm_request_irq(&pdev->dev, irq, vpif_channel_isr,
+                                      IRQF_SHARED, VPIF_DRIVER_NAME,
+                                      (void *)(&vpif_obj.dev[res_idx]->channel_id));
+               if (err)
+                       goto vpif_unregister;
+       } while (++res_idx);
 
        vpif_obj.config = pdev->dev.platform_data;
 
 
 {
        struct vpif_subdev_info *subdevdata;
        struct i2c_adapter *i2c_adap;
-       struct resource *res;
        int subdev_count;
        int res_idx = 0;
        int i, err;
                goto vpif_free;
        }
 
-       while ((res = platform_get_resource(pdev, IORESOURCE_IRQ, res_idx))) {
-               err = devm_request_irq(&pdev->dev, res->start, vpif_channel_isr,
-                                       IRQF_SHARED, VPIF_DRIVER_NAME,
-                                       (void *)(&vpif_obj.dev[res_idx]->
-                                       channel_id));
+       do {
+               int irq;
+
+               err = platform_get_irq_optional(pdev, res_idx);
+               if (err < 0 && err != -ENXIO)
+                       goto vpif_unregister;
+               if (err > 0)
+                       irq = err;
+               else
+                       break;
+
+               err = devm_request_irq(&pdev->dev, irq, vpif_channel_isr,
+                                      IRQF_SHARED, VPIF_DRIVER_NAME,
+                                      (void *)(&vpif_obj.dev[res_idx]->channel_id));
                if (err) {
-                       err = -EINVAL;
                        vpif_err("VPIF IRQ request failed\n");
                        goto vpif_unregister;
                }
-               res_idx++;
-       }
+       } while (++res_idx);
 
        vpif_obj.config = pdev->dev.platform_data;
        subdev_count = vpif_obj.config->subdev_count;