dev_dbg(&slave->dev,
                "%s control_port_stat=%x", __func__, status->control_port);
 
-       if (status->control_port & 0x4) {
+       mutex_lock(&rt711->disable_irq_lock);
+       if (status->control_port & 0x4 && !rt711->disable_irq) {
                mod_delayed_work(system_power_efficient_wq,
                        &rt711->jack_detect_work, msecs_to_jiffies(250));
        }
+       mutex_unlock(&rt711->disable_irq_lock);
 
        return 0;
 }
        return 0;
 }
 
+static int __maybe_unused rt711_dev_system_suspend(struct device *dev)
+{
+       struct rt711_priv *rt711 = dev_get_drvdata(dev);
+       struct sdw_slave *slave = dev_to_sdw_dev(dev);
+       int ret;
+
+       if (!rt711->hw_init)
+               return 0;
+
+       /*
+        * prevent new interrupts from being handled after the
+        * deferred work completes and before the parent disables
+        * interrupts on the link
+        */
+       mutex_lock(&rt711->disable_irq_lock);
+       rt711->disable_irq = true;
+       ret = sdw_update_no_pm(slave, SDW_SCP_INTMASK1,
+                              SDW_SCP_INT1_IMPL_DEF, 0);
+       mutex_unlock(&rt711->disable_irq_lock);
+
+       if (ret < 0) {
+               /* log but don't prevent suspend from happening */
+               dev_dbg(&slave->dev, "%s: could not disable imp-def interrupts\n:", __func__);
+       }
+
+       return rt711_dev_suspend(dev);
+}
+
 #define RT711_PROBE_TIMEOUT 5000
 
 static int __maybe_unused rt711_dev_resume(struct device *dev)
 }
 
 static const struct dev_pm_ops rt711_pm = {
-       SET_SYSTEM_SLEEP_PM_OPS(rt711_dev_suspend, rt711_dev_resume)
+       SET_SYSTEM_SLEEP_PM_OPS(rt711_dev_system_suspend, rt711_dev_resume)
        SET_RUNTIME_PM_OPS(rt711_dev_suspend, rt711_dev_resume, NULL)
 };