!irq_data_get_irq_chip(data) || !cpumask_test_cpu(cpu, affinity))
                return;
 
-       if (irqd_is_managed_and_shutdown(data)) {
-               irq_startup(desc, IRQ_RESEND, IRQ_START_COND);
+       /*
+        * Don't restore suspended interrupts here when a system comes back
+        * from S3. They are reenabled via resume_device_irqs().
+        */
+       if (desc->istate & IRQS_SUSPENDED)
                return;
-       }
+
+       if (irqd_is_managed_and_shutdown(data))
+               irq_startup(desc, IRQ_RESEND, IRQ_START_COND);
 
        /*
         * If the interrupt can only be directed to a single target
 
                irq_settings_set_noprobe(desc);
                /*
                 * Call irq_startup() not irq_enable() here because the
-                * interrupt might be marked NOAUTOEN. So irq_startup()
-                * needs to be invoked when it gets enabled the first
-                * time. If it was already started up, then irq_startup()
-                * will invoke irq_enable() under the hood.
+                * interrupt might be marked NOAUTOEN so irq_startup()
+                * needs to be invoked when it gets enabled the first time.
+                * This is also required when __enable_irq() is invoked for
+                * a managed and shutdown interrupt from the S3 resume
+                * path.
+                *
+                * If it was already started up, then irq_startup() will
+                * invoke irq_enable() under the hood.
                 */
                irq_startup(desc, IRQ_RESEND, IRQ_START_FORCE);
                break;