return ret;
        }
 
-       if (wol->wolopts) {
-               device_set_wakeup_enable(priv->device, 1);
-               /* Avoid unbalanced enable_irq_wake calls */
-               if (priv->wol_irq_disabled)
-                       enable_irq_wake(priv->wol_irq);
-               priv->wol_irq_disabled = false;
-       } else {
-               device_set_wakeup_enable(priv->device, 0);
-               /* Avoid unbalanced disable_irq_wake calls */
-               if (!priv->wol_irq_disabled)
-                       disable_irq_wake(priv->wol_irq);
-               priv->wol_irq_disabled = true;
-       }
+       device_set_wakeup_enable(priv->device, !!wol->wolopts);
 
        mutex_lock(&priv->lock);
        priv->wolopts = wol->wolopts;
 
 #include <linux/dma-mapping.h>
 #include <linux/slab.h>
 #include <linux/pm_runtime.h>
+#include <linux/pm_wakeirq.h>
 #include <linux/prefetch.h>
 #include <linux/pinctrl/consumer.h>
 #ifdef CONFIG_DEBUG_FS
        /* Request the Wake IRQ in case of another line
         * is used for WoL
         */
-       priv->wol_irq_disabled = true;
        if (priv->wol_irq > 0 && priv->wol_irq != dev->irq) {
                int_name = priv->int_name_wol;
                sprintf(int_name, "%s:%s", dev->name, "wol");
        /* Request the Wake IRQ in case of another line
         * is used for WoL
         */
-       priv->wol_irq_disabled = true;
        if (priv->wol_irq > 0 && priv->wol_irq != dev->irq) {
                ret = request_irq(priv->wol_irq, stmmac_interrupt,
                                  IRQF_SHARED, dev->name, dev);
        if (priv->plat->pmt) {
                dev_info(priv->device, "Wake-Up On Lan supported\n");
                device_set_wakeup_capable(priv->device, 1);
+               devm_pm_set_wake_irq(priv->device, priv->wol_irq);
        }
 
        if (priv->dma_cap.tsoen)