void __iomem            *nand_base;
        void __iomem            *nand_fc; /* flash cache */
        void __iomem            *flash_dma_base;
-       unsigned int            irq;
+       int                     irq;
        unsigned int            dma_irq;
        int                     nand_version;
 
        bool err = false;
        int sts;
 
-       if (mtd->oops_panic_write) {
+       if (mtd->oops_panic_write || ctrl->irq < 0) {
                /* switch to interrupt polling and PIO mode */
                disable_ctrl_irqs(ctrl);
                sts = bcmnand_ctrl_poll_status(ctrl, NAND_CTRL_RDY,
        }
 
        /* IRQ */
-       ctrl->irq = platform_get_irq(pdev, 0);
-       if ((int)ctrl->irq < 0) {
-               dev_err(dev, "no IRQ defined\n");
-               ret = -ENODEV;
-               goto err;
-       }
-
-       /*
-        * Some SoCs integrate this controller (e.g., its interrupt bits) in
-        * interesting ways
-        */
-       if (soc) {
-               ret = devm_request_irq(dev, ctrl->irq, brcmnand_irq, 0,
-                                      DRV_NAME, ctrl);
+       ctrl->irq = platform_get_irq_optional(pdev, 0);
+       if (ctrl->irq > 0) {
+               /*
+                * Some SoCs integrate this controller (e.g., its interrupt bits) in
+                * interesting ways
+                */
+               if (soc) {
+                       ret = devm_request_irq(dev, ctrl->irq, brcmnand_irq, 0,
+                                              DRV_NAME, ctrl);
 
-               /* Enable interrupt */
-               ctrl->soc->ctlrdy_ack(ctrl->soc);
-               ctrl->soc->ctlrdy_set_enabled(ctrl->soc, true);
-       } else {
-               /* Use standard interrupt infrastructure */
-               ret = devm_request_irq(dev, ctrl->irq, brcmnand_ctlrdy_irq, 0,
-                                      DRV_NAME, ctrl);
-       }
-       if (ret < 0) {
-               dev_err(dev, "can't allocate IRQ %d: error %d\n",
-                       ctrl->irq, ret);
-               goto err;
+                       /* Enable interrupt */
+                       ctrl->soc->ctlrdy_ack(ctrl->soc);
+                       ctrl->soc->ctlrdy_set_enabled(ctrl->soc, true);
+               } else {
+                       /* Use standard interrupt infrastructure */
+                       ret = devm_request_irq(dev, ctrl->irq, brcmnand_ctlrdy_irq, 0,
+                                              DRV_NAME, ctrl);
+               }
+               if (ret < 0) {
+                       dev_err(dev, "can't allocate IRQ %d: error %d\n",
+                               ctrl->irq, ret);
+                       goto err;
+               }
        }
 
        for_each_available_child_of_node(dn, child) {