#define HANTRO_MPEG2_DECODER   BIT(16)
 #define HANTRO_DECODERS                0xffff0000
 
+/**
+ * struct hantro_irq - irq handler and name
+ *
+ * @name:                      irq name for device tree lookup
+ * @handler:                   interrupt handler
+ */
+struct hantro_irq {
+       const char *name;
+       irqreturn_t (*handler)(int irq, void *priv);
+};
+
 /**
  * struct hantro_variant - information about VPU hardware variant
  *
  * @codec_ops:                 Codec ops.
  * @init:                      Initialize hardware.
  * @runtime_resume:            reenable hardware after power gating
- * @vepu_irq:                  encoder interrupt handler
- * @vdpu_irq:                  decoder interrupt handler
+ * @irqs:                      array of irq names and interrupt handlers
+ * @num_irqs:                  number of irqs in the array
  * @clk_names:                 array of clock names
  * @num_clocks:                        number of clocks in the array
  */
        const struct hantro_codec_ops *codec_ops;
        int (*init)(struct hantro_dev *vpu);
        int (*runtime_resume)(struct hantro_dev *vpu);
-       irqreturn_t (*vepu_irq)(int irq, void *priv);
-       irqreturn_t (*vdpu_irq)(int irq, void *priv);
+       const struct hantro_irq *irqs;
+       int num_irqs;
        const char *clk_names[HANTRO_MAX_CLOCKS];
        int num_clocks;
 };
 
                return ret;
        }
 
-       if (vpu->variant->vdpu_irq) {
+       for (i = 0; i < vpu->variant->num_irqs; i++) {
+               const char *irq_name = vpu->variant->irqs[i].name;
                int irq;
 
-               irq = platform_get_irq_byname(vpu->pdev, "vdpu");
-               if (irq <= 0) {
-                       dev_err(vpu->dev, "Could not get vdpu IRQ.\n");
-                       return -ENXIO;
-               }
-
-               ret = devm_request_irq(vpu->dev, irq, vpu->variant->vdpu_irq,
-                                      0, dev_name(vpu->dev), vpu);
-               if (ret) {
-                       dev_err(vpu->dev, "Could not request vdpu IRQ.\n");
-                       return ret;
-               }
-       }
-
-       if (vpu->variant->vepu_irq) {
-               int irq;
+               if (!vpu->variant->irqs[i].handler)
+                       continue;
 
-               irq = platform_get_irq_byname(vpu->pdev, "vepu");
+               irq = platform_get_irq_byname(vpu->pdev, irq_name);
                if (irq <= 0) {
-                       dev_err(vpu->dev, "Could not get vepu IRQ.\n");
+                       dev_err(vpu->dev, "Could not get %s IRQ.\n", irq_name);
                        return -ENXIO;
                }
 
-               ret = devm_request_irq(vpu->dev, irq, vpu->variant->vepu_irq,
-                                      0, dev_name(vpu->dev), vpu);
+               ret = devm_request_irq(vpu->dev, irq,
+                                      vpu->variant->irqs[i].handler, 0,
+                                      dev_name(vpu->dev), vpu);
                if (ret) {
-                       dev_err(vpu->dev, "Could not request vepu IRQ.\n");
+                       dev_err(vpu->dev, "Could not request %s IRQ.\n",
+                               irq_name);
                        return ret;
                }
        }
 
  * VPU variant.
  */
 
+static const struct hantro_irq rk3288_irqs[] = {
+       { "vepu", rk3288_vepu_irq },
+       { "vdpu", rk3288_vdpu_irq },
+};
+
 const struct hantro_variant rk3288_vpu_variant = {
        .enc_offset = 0x0,
        .enc_fmts = rk3288_vpu_enc_fmts,
        .num_dec_fmts = ARRAY_SIZE(rk3288_vpu_dec_fmts),
        .codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER,
        .codec_ops = rk3288_vpu_codec_ops,
-       .vepu_irq = rk3288_vepu_irq,
-       .vdpu_irq = rk3288_vdpu_irq,
+       .irqs = rk3288_irqs,
+       .num_irqs = ARRAY_SIZE(rk3288_irqs),
        .init = rk3288_vpu_hw_init,
        .clk_names = {"aclk", "hclk"},
        .num_clocks = 2
 
  * VPU variant.
  */
 
+static const struct hantro_irq rk3399_irqs[] = {
+       { "vepu", rk3399_vepu_irq },
+       { "vdpu", rk3399_vdpu_irq },
+};
+
 const struct hantro_variant rk3399_vpu_variant = {
        .enc_offset = 0x0,
        .enc_fmts = rk3399_vpu_enc_fmts,
        .num_dec_fmts = ARRAY_SIZE(rk3399_vpu_dec_fmts),
        .codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER,
        .codec_ops = rk3399_vpu_codec_ops,
-       .vepu_irq = rk3399_vepu_irq,
-       .vdpu_irq = rk3399_vdpu_irq,
+       .irqs = rk3399_irqs,
+       .num_irqs = ARRAY_SIZE(rk3399_irqs),
        .init = rk3399_vpu_hw_init,
        .clk_names = {"aclk", "hclk"},
        .num_clocks = 2