return ret;
        }
 
+       /* Notify clients not managed by pm framework about core resume */
+       sof_resume_clients(sdev);
+
        /* notify DSP of system resume */
        ret = sof_send_pm_ctx_ipc(sdev, SOF_IPC_PM_CTX_RESTORE);
        if (ret < 0)
 static int sof_suspend(struct device *dev, bool runtime_suspend)
 {
        struct snd_sof_dev *sdev = dev_get_drvdata(dev);
+       pm_message_t pm_state;
        u32 target_state = 0;
        int ret;
 
        }
 
        target_state = snd_sof_dsp_power_target(sdev);
+       pm_state.event = target_state;
 
        /* Skip to platform-specific suspend if DSP is entering D0 */
-       if (target_state == SOF_DSP_PM_D0)
+       if (target_state == SOF_DSP_PM_D0) {
+               /* Notify clients not managed by pm framework about core suspend */
+               sof_suspend_clients(sdev, pm_state);
                goto suspend;
+       }
 
        sof_tear_down_pipelines(sdev, false);
 
        /* release trace */
        snd_sof_release_trace(sdev);
 
+       /* Notify clients not managed by pm framework about core suspend */
+       sof_suspend_clients(sdev, pm_state);
+
 #if IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_ENABLE_DEBUGFS_CACHE)
        /* cache debugfs contents during runtime suspend */
        if (runtime_suspend)
 
 }
 EXPORT_SYMBOL_NS_GPL(sof_client_ipc_tx_message, SND_SOC_SOF_CLIENT);
 
+int sof_suspend_clients(struct snd_sof_dev *sdev, pm_message_t state)
+{
+       struct auxiliary_driver *adrv;
+       struct sof_client_dev *cdev;
+
+       mutex_lock(&sdev->ipc_client_mutex);
+
+       list_for_each_entry(cdev, &sdev->ipc_client_list, list) {
+               /* Skip devices without loaded driver */
+               if (!cdev->auxdev.dev.driver)
+                       continue;
+
+               adrv = to_auxiliary_drv(cdev->auxdev.dev.driver);
+               if (adrv->suspend)
+                       adrv->suspend(&cdev->auxdev, state);
+       }
+
+       mutex_unlock(&sdev->ipc_client_mutex);
+
+       return 0;
+}
+EXPORT_SYMBOL_NS_GPL(sof_suspend_clients, SND_SOC_SOF_CLIENT);
+
+int sof_resume_clients(struct snd_sof_dev *sdev)
+{
+       struct auxiliary_driver *adrv;
+       struct sof_client_dev *cdev;
+
+       mutex_lock(&sdev->ipc_client_mutex);
+
+       list_for_each_entry(cdev, &sdev->ipc_client_list, list) {
+               /* Skip devices without loaded driver */
+               if (!cdev->auxdev.dev.driver)
+                       continue;
+
+               adrv = to_auxiliary_drv(cdev->auxdev.dev.driver);
+               if (adrv->resume)
+                       adrv->resume(&cdev->auxdev);
+       }
+
+       mutex_unlock(&sdev->ipc_client_mutex);
+
+       return 0;
+}
+EXPORT_SYMBOL_NS_GPL(sof_resume_clients, SND_SOC_SOF_CLIENT);
+
 struct dentry *sof_client_get_debugfs_root(struct sof_client_dev *cdev)
 {
        return cdev->sdev->debugfs_root;
 
 void sof_unregister_clients(struct snd_sof_dev *sdev);
 void sof_client_ipc_rx_dispatcher(struct snd_sof_dev *sdev, void *msg_buf);
 void sof_client_fw_state_dispatcher(struct snd_sof_dev *sdev);
+int sof_suspend_clients(struct snd_sof_dev *sdev, pm_message_t state);
+int sof_resume_clients(struct snd_sof_dev *sdev);
 #else /* CONFIG_SND_SOC_SOF_CLIENT */
 static inline int sof_client_dev_register(struct snd_sof_dev *sdev, const char *name,
                                          u32 id, const void *data, size_t size)
 static inline void sof_client_fw_state_dispatcher(struct snd_sof_dev *sdev)
 {
 }
+
+static inline int sof_suspend_clients(struct snd_sof_dev *sdev, pm_message_t state)
+{
+       return 0;
+}
+
+static inline int sof_resume_clients(struct snd_sof_dev *sdev)
+{
+       return 0;
+}
 #endif /* CONFIG_SND_SOC_SOF_CLIENT */
 
 #endif