return ret;
 }
 
+/**
+ * sdw_cdns_config_update() - Update configurations
+ * @cdns: Cadence instance
+ */
+void sdw_cdns_config_update(struct sdw_cdns *cdns)
+{
+       /* commit changes */
+       cdns_writel(cdns, CDNS_MCP_CONFIG_UPDATE, CDNS_MCP_CONFIG_UPDATE_BIT);
+}
+EXPORT_SYMBOL(sdw_cdns_config_update);
+
+/**
+ * sdw_cdns_config_update_set_wait() - wait until configuration update bit is self-cleared
+ * @cdns: Cadence instance
+ */
+int sdw_cdns_config_update_set_wait(struct sdw_cdns *cdns)
+{
+       /* the hardware recommendation is to wait at least 300us */
+       return cdns_set_wait(cdns, CDNS_MCP_CONFIG_UPDATE,
+                            CDNS_MCP_CONFIG_UPDATE_BIT, 0);
+}
+EXPORT_SYMBOL(sdw_cdns_config_update_set_wait);
+
 /*
  * debugfs
  */
                     CDNS_MCP_CONTROL_HW_RST);
 
        /* commit changes */
-       cdns_updatel(cdns, CDNS_MCP_CONFIG_UPDATE,
-                    CDNS_MCP_CONFIG_UPDATE_BIT,
-                    CDNS_MCP_CONFIG_UPDATE_BIT);
-
-       /* don't wait here */
-       return 0;
-
+       return cdns_config_update(cdns);
 }
 EXPORT_SYMBOL(sdw_cdns_exit_reset);
 
 
 void sdw_cdns_check_self_clearing_bits(struct sdw_cdns *cdns, const char *string,
                                       bool initial_delay, int reset_iterations);
 
+void sdw_cdns_config_update(struct sdw_cdns *cdns);
+int sdw_cdns_config_update_set_wait(struct sdw_cdns *cdns);
+
 #endif /* __SDW_CADENCE_H */
 
                return ret;
        }
 
-       ret = sdw_cdns_exit_reset(cdns);
-       if (ret < 0) {
-               dev_err(dev, "%s: unable to exit bus reset sequence: %d\n", __func__, ret);
-               return ret;
-       }
+       sdw_cdns_config_update(cdns);
 
        if (bus->multi_link) {
                ret = sdw_intel_sync_go(sdw);
                }
        }
 
+       ret = sdw_cdns_config_update_set_wait(cdns);
+       if (ret < 0) {
+               dev_err(dev, "%s: CONFIG_UPDATE BIT still set\n", __func__);
+               return ret;
+       }
+
+       ret = sdw_cdns_exit_reset(cdns);
+       if (ret < 0) {
+               dev_err(dev, "%s: unable to exit bus reset sequence: %d\n", __func__, ret);
+               return ret;
+       }
+
        ret = sdw_cdns_enable_interrupt(cdns, true);
        if (ret < 0) {
                dev_err(dev, "%s: cannot enable interrupts: %d\n", __func__, ret);
        }
 
        if (!clock_stop0) {
-               ret = sdw_cdns_exit_reset(cdns);
-               if (ret < 0) {
-                       dev_err(dev, "unable to exit bus reset sequence during resume\n");
-                       return ret;
-               }
+               sdw_cdns_config_update(cdns);
 
                if (bus->multi_link) {
                        ret = sdw_intel_sync_go(sdw);
                        }
                }
 
+               ret = sdw_cdns_config_update_set_wait(cdns);
+               if (ret < 0) {
+                       dev_err(dev, "%s: CONFIG_UPDATE BIT still set\n", __func__);
+                       return ret;
+               }
+
+               ret = sdw_cdns_exit_reset(cdns);
+               if (ret < 0) {
+                       dev_err(dev, "unable to exit bus reset sequence during resume\n");
+                       return ret;
+               }
+
                ret = sdw_cdns_enable_interrupt(cdns, true);
                if (ret < 0) {
                        dev_err(dev, "cannot enable interrupts during resume\n");