Index: uspace/drv/audio/hdaudio/hdactl.c
===================================================================
--- uspace/drv/audio/hdaudio/hdactl.c	(revision 9dfb034217589be7992cb9cfcfb4fd044520541d)
+++ uspace/drv/audio/hdaudio/hdactl.c	(revision df2b4ce7dfd9a9460beae9c79d6b15ab4f89a620)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -628,4 +628,14 @@
 }
 
+void hda_ctl_quiesce(hda_ctl_t *ctl)
+{
+	uint32_t gctl;
+
+	ddf_msg(LVL_DEBUG, "hda_ctl_quiesce(): Resetting controller.");
+	gctl = hda_reg32_read(&ctl->hda->regs->gctl);
+	hda_reg32_write(&ctl->hda->regs->gctl,
+	    gctl & ~BIT_V(uint32_t, gctl_crst));
+}
+
 errno_t hda_cmd(hda_t *hda, uint32_t verb, uint32_t *resp)
 {
Index: uspace/drv/audio/hdaudio/hdactl.h
===================================================================
--- uspace/drv/audio/hdaudio/hdactl.h	(revision 9dfb034217589be7992cb9cfcfb4fd044520541d)
+++ uspace/drv/audio/hdaudio/hdactl.h	(revision df2b4ce7dfd9a9460beae9c79d6b15ab4f89a620)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2014 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -77,4 +77,5 @@
 extern hda_ctl_t *hda_ctl_init(hda_t *);
 extern void hda_ctl_fini(hda_ctl_t *);
+extern void hda_ctl_quiesce(hda_ctl_t *);
 extern void hda_ctl_interrupt(hda_ctl_t *);
 extern errno_t hda_cmd(hda_t *, uint32_t, uint32_t *);
Index: uspace/drv/audio/hdaudio/hdaudio.c
===================================================================
--- uspace/drv/audio/hdaudio/hdaudio.c	(revision 9dfb034217589be7992cb9cfcfb4fd044520541d)
+++ uspace/drv/audio/hdaudio/hdaudio.c	(revision df2b4ce7dfd9a9460beae9c79d6b15ab4f89a620)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -55,4 +55,5 @@
 static errno_t hda_dev_remove(ddf_dev_t *dev);
 static errno_t hda_dev_gone(ddf_dev_t *dev);
+static errno_t hda_dev_quiesce(ddf_dev_t *dev);
 static errno_t hda_fun_online(ddf_fun_t *fun);
 static errno_t hda_fun_offline(ddf_fun_t *fun);
@@ -61,9 +62,10 @@
 
 static driver_ops_t driver_ops = {
-	.dev_add = &hda_dev_add,
-	.dev_remove = &hda_dev_remove,
-	.dev_gone = &hda_dev_gone,
-	.fun_online = &hda_fun_online,
-	.fun_offline = &hda_fun_offline
+	.dev_add = hda_dev_add,
+	.dev_remove = hda_dev_remove,
+	.dev_gone = hda_dev_gone,
+	.dev_quiesce = hda_dev_quiesce,
+	.fun_online = hda_fun_online,
+	.fun_offline = hda_fun_offline
 };
 
@@ -362,4 +364,14 @@
 	}
 
+	return EOK;
+}
+
+static errno_t hda_dev_quiesce(ddf_dev_t *dev)
+{
+	hda_t *hda = (hda_t *)ddf_dev_data_get(dev);
+
+	ddf_msg(LVL_DEBUG, "hda_dev_quiesce(%p)", dev);
+
+	hda_ctl_quiesce(hda->ctl);
 	return EOK;
 }
Index: uspace/drv/audio/sb16/dsp.c
===================================================================
--- uspace/drv/audio/sb16/dsp.c	(revision 9dfb034217589be7992cb9cfcfb4fd044520541d)
+++ uspace/drv/audio/sb16/dsp.c	(revision df2b4ce7dfd9a9460beae9c79d6b15ab4f89a620)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * All rights reserved.
@@ -74,4 +75,5 @@
 		[DSP_READY] = "READY",
 		[DSP_NO_BUFFER] = "NO BUFFER",
+		[DSP_QUIESCED] = "QUIESCED"
 	};
 	if ((size_t)state < ARRAY_SIZE(state_names))
@@ -83,4 +85,7 @@
 {
 	assert(dsp);
+	if (dsp->state == DSP_QUIESCED)
+		return;
+
 	ddf_log_verbose("Changing state from %s to %s",
 	    dsp_state_to_str(dsp->state), dsp_state_to_str(state));
@@ -230,4 +235,10 @@
 
 	return ret;
+}
+
+void sb_dsp_quiesce(sb_dsp_t *dsp)
+{
+	dsp->state = DSP_QUIESCED;
+	dsp_reset(dsp);
 }
 
Index: uspace/drv/audio/sb16/dsp.h
===================================================================
--- uspace/drv/audio/sb16/dsp.h	(revision 9dfb034217589be7992cb9cfcfb4fd044520541d)
+++ uspace/drv/audio/sb16/dsp.h	(revision df2b4ce7dfd9a9460beae9c79d6b15ab4f89a620)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * All rights reserved.
@@ -51,4 +52,5 @@
 	DSP_READY,
 	DSP_NO_BUFFER,
+	DSP_QUIESCED
 } dsp_state_t;
 
@@ -78,4 +80,5 @@
 errno_t sb_dsp_init(sb_dsp_t *dsp, sb16_regs_t *regs, ddf_dev_t *dev,
     int dma8, int dma16);
+void sb_dsp_quiesce(sb_dsp_t *dsp);
 void sb_dsp_interrupt(sb_dsp_t *dsp);
 unsigned sb_dsp_query_cap(sb_dsp_t *dsp, audio_cap_t cap);
Index: uspace/drv/audio/sb16/main.c
===================================================================
--- uspace/drv/audio/sb16/main.c	(revision 9dfb034217589be7992cb9cfcfb4fd044520541d)
+++ uspace/drv/audio/sb16/main.c	(revision df2b4ce7dfd9a9460beae9c79d6b15ab4f89a620)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * Copyright (c) 2011 Vojtech Horky
@@ -48,4 +49,5 @@
 
 static errno_t sb_add_device(ddf_dev_t *device);
+static errno_t sb_dev_quiesce(ddf_dev_t *device);
 static errno_t sb_get_res(ddf_dev_t *device, addr_range_t **pp_sb_regs,
     addr_range_t **pp_mpu_regs, int *irq, int *dma8, int *dma16);
@@ -54,4 +56,5 @@
 static driver_ops_t sb_driver_ops = {
 	.dev_add = sb_add_device,
+	.dev_quiesce = sb_dev_quiesce
 };
 
@@ -178,4 +181,16 @@
 }
 
+/** Initialize new SB16 driver instance.
+ *
+ * @param[in] device DDF instance of the device to initialize.
+ * @return Error code.
+ */
+static errno_t sb_dev_quiesce(ddf_dev_t *device)
+{
+	sb16_t *soft_state = (sb16_t *)ddf_dev_data_get(device);
+
+	return sb16_quiesce(soft_state);
+}
+
 static errno_t sb_get_res(ddf_dev_t *device, addr_range_t **pp_sb_regs,
     addr_range_t **pp_mpu_regs, int *irq, int *dma8, int *dma16)
Index: uspace/drv/audio/sb16/sb16.c
===================================================================
--- uspace/drv/audio/sb16/sb16.c	(revision 9dfb034217589be7992cb9cfcfb4fd044520541d)
+++ uspace/drv/audio/sb16/sb16.c	(revision df2b4ce7dfd9a9460beae9c79d6b15ab4f89a620)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * All rights reserved.
@@ -191,4 +192,10 @@
 }
 
+errno_t sb16_quiesce(sb16_t *sb)
+{
+	sb_dsp_quiesce(&sb->dsp);
+	return EOK;
+}
+
 void sb16_interrupt(sb16_t *sb)
 {
Index: uspace/drv/audio/sb16/sb16.h
===================================================================
--- uspace/drv/audio/sb16/sb16.h	(revision 9dfb034217589be7992cb9cfcfb4fd044520541d)
+++ uspace/drv/audio/sb16/sb16.h	(revision df2b4ce7dfd9a9460beae9c79d6b15ab4f89a620)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * All rights reserved.
@@ -55,4 +56,5 @@
 errno_t sb16_init_sb16(sb16_t *sb, addr_range_t *regs, ddf_dev_t *dev, int dma8, int dma16);
 errno_t sb16_init_mpu(sb16_t *sb, addr_range_t *regs);
+errno_t sb16_quiesce(sb16_t *sb);
 void sb16_interrupt(sb16_t *sb);
 
