rt5682->sdw_regmap = regmap;
        rt5682->is_sdw = true;
 
+       mutex_init(&rt5682->disable_irq_lock);
+
        rt5682->regmap = devm_regmap_init(dev, NULL, dev,
                                          &rt5682_sdw_indirect_regmap);
        if (IS_ERR(rt5682->regmap)) {
        int ret = 0, loop = 10;
        unsigned int val;
 
+       rt5682->disable_irq = false;
+
        if (rt5682->hw_init)
                return 0;
 
        dev_dbg(&slave->dev,
                "%s control_port_stat=%x", __func__, status->control_port);
 
-       if (status->control_port & 0x4) {
+       mutex_lock(&rt5682->disable_irq_lock);
+       if (status->control_port & 0x4 && !rt5682->disable_irq) {
                mod_delayed_work(system_power_efficient_wq,
                        &rt5682->jack_detect_work, msecs_to_jiffies(rt5682->irq_work_delay_time));
        }
+       mutex_unlock(&rt5682->disable_irq_lock);
 
        return 0;
 }
        return 0;
 }
 
+static int __maybe_unused rt5682_dev_system_suspend(struct device *dev)
+{
+       struct rt5682_priv *rt5682 = dev_get_drvdata(dev);
+       struct sdw_slave *slave = dev_to_sdw_dev(dev);
+       int ret;
+
+       if (!rt5682->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(&rt5682->disable_irq_lock);
+       rt5682->disable_irq = true;
+       ret = sdw_update_no_pm(slave, SDW_SCP_INTMASK1,
+                              SDW_SCP_INT1_IMPL_DEF, 0);
+       mutex_unlock(&rt5682->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 rt5682_dev_suspend(dev);
+}
+
 static int __maybe_unused rt5682_dev_resume(struct device *dev)
 {
        struct sdw_slave *slave = dev_to_sdw_dev(dev);
 }
 
 static const struct dev_pm_ops rt5682_pm = {
-       SET_SYSTEM_SLEEP_PM_OPS(rt5682_dev_suspend, rt5682_dev_resume)
+       SET_SYSTEM_SLEEP_PM_OPS(rt5682_dev_system_suspend, rt5682_dev_resume)
        SET_RUNTIME_PM_OPS(rt5682_dev_suspend, rt5682_dev_resume, NULL)
 };