Index: uspace/drv/audio/sb16/dma.h
===================================================================
--- uspace/drv/audio/sb16/dma.h	(revision aa5ae788d2d3f4f0d6655478226f4fcdb817764f)
+++ uspace/drv/audio/sb16/dma.h	(revision e0f99508cbdef2d4ee63522c0c0a59b396a38a32)
@@ -60,8 +60,8 @@
 }
 /*----------------------------------------------------------------------------*/
-/** Physical mallocator simulator
+/** DMA mallocator simulator
  *
  * @param[in] size Size of the required memory space
- * @return Address of the alligned and big enough memory place, NULL on failure.
+ * @return Address of the aligned and big enough memory place, NULL on failure.
  */
 static inline void * malloc24(size_t size)
@@ -79,7 +79,7 @@
 }
 /*----------------------------------------------------------------------------*/
-/** Physical mallocator simulator
+/** DMA mallocator simulator
  *
- * @param[in] addr Address of the place allocated by malloc32
+ * @param[in] addr Address of the place allocated by malloc24
  */
 static inline void free24(void *addr)
Index: uspace/drv/audio/sb16/dma_controller.c
===================================================================
--- uspace/drv/audio/sb16/dma_controller.c	(revision aa5ae788d2d3f4f0d6655478226f4fcdb817764f)
+++ uspace/drv/audio/sb16/dma_controller.c	(revision e0f99508cbdef2d4ee63522c0c0a59b396a38a32)
@@ -157,5 +157,5 @@
 } dma_controller_t;
 
-dma_controller_t controller_8237 = {
+static const dma_controller_t controller_8237 = {
 	.channel = {
 	    { (uint8_t*)0x00, (uint8_t*)0x01, (uint8_t*)0x87 },
@@ -172,5 +172,5 @@
 };
 
-static inline dma_controller_t *dma_controller_init()
+static inline const dma_controller_t *dma_controller_init()
 {
 	int ret = pio_enable(DMA_CONTROLLER_PAGE_BASE, sizeof(dma_page_regs_t),
@@ -193,5 +193,5 @@
 }
 /*----------------------------------------------------------------------------*/
-static int dma_setup_channel_8bit(dma_controller_t *controller,
+static int dma_setup_channel_8bit(const dma_controller_t *controller,
     unsigned channel, uint32_t pa, uint16_t size)
 {
@@ -237,5 +237,5 @@
 }
 /*----------------------------------------------------------------------------*/
-static int dma_setup_channel_16bit(dma_controller_t *controller,
+static int dma_setup_channel_16bit(const dma_controller_t *controller,
     unsigned channel, uintptr_t pa, size_t size)
 {
@@ -283,5 +283,5 @@
 int dma_setup_channel(unsigned channel, uintptr_t pa, size_t size)
 {
-	static dma_controller_t *controller = NULL;
+	static const dma_controller_t *controller = NULL;
 	if (!controller)
 		controller = dma_controller_init();
Index: uspace/drv/audio/sb16/main.c
===================================================================
--- uspace/drv/audio/sb16/main.c	(revision aa5ae788d2d3f4f0d6655478226f4fcdb817764f)
+++ uspace/drv/audio/sb16/main.c	(revision e0f99508cbdef2d4ee63522c0c0a59b396a38a32)
@@ -51,4 +51,5 @@
 static int sb_get_res(const ddf_dev_t *device, uintptr_t *sb_regs,
     size_t *sb_regs_size, uintptr_t *mpu_regs, size_t *mpu_regs_size, int *irq);
+static int sb_enable_interrupts(ddf_dev_t *device);
 /*----------------------------------------------------------------------------*/
 static driver_ops_t sb_driver_ops = {
@@ -89,7 +90,6 @@
 static int sb_add_device(ddf_dev_t *device)
 {
-#define CHECK_RET_FREE_RETURN(ret, msg...) \
+#define CHECK_RET_RETURN(ret, msg...) \
 if (ret != EOK) { \
-	free(soft_state); \
 	ddf_log_error(msg); \
 	return ret; \
@@ -98,7 +98,7 @@
 	assert(device);
 
-	sb16_drv_t *soft_state = malloc(sizeof(sb16_drv_t));
+	sb16_drv_t *soft_state = ddf_dev_data_alloc(device, sizeof(sb16_drv_t));
 	int ret = soft_state ? EOK : ENOMEM;
-	CHECK_RET_FREE_RETURN(ret, "Failed to allocate sb16 structure.\n");
+	CHECK_RET_RETURN(ret, "Failed to allocate sb16 structure.\n");
 
 	uintptr_t sb_regs = 0, mpu_regs = 0;
@@ -108,11 +108,12 @@
 	ret = sb_get_res(device, &sb_regs, &sb_regs_size, &mpu_regs,
 	    &mpu_regs_size, &irq);
-	CHECK_RET_FREE_RETURN(ret,
+	CHECK_RET_RETURN(ret,
 	    "Failed to get resources: %s.\n", str_error(ret));
 
 	irq_code_t *irq_code = sb16_irq_code();
 	ret = register_interrupt_handler(device, irq, irq_handler, irq_code);
-	CHECK_RET_FREE_RETURN(ret,
+	CHECK_RET_RETURN(ret,
 	    "Failed to register irq handler: %s.\n", str_error(ret));
+
 
 	ddf_fun_t *dsp_fun = NULL, *mixer_fun = NULL;
@@ -124,8 +125,12 @@
 	if (mixer_fun) \
 		ddf_fun_destroy(mixer_fun); \
-	free(soft_state); \
 	unregister_interrupt_handler(device, irq); \
 	return ret; \
 } else (void)0
+
+	ret = sb_enable_interrupts(device);
+	CHECK_RET_UNREG_DEST_RETURN(ret, "Failed to enable interrupts: %s.\n",
+	    str_error(ret));
+
 	dsp_fun = ddf_fun_create(device, fun_exposed, "dsp");
 	ret = dsp_fun ? EOK : ENOMEM;
@@ -144,11 +149,12 @@
 	CHECK_RET_UNREG_DEST_RETURN(ret,
 	    "Failed to bind dsp function: %s.\n", str_error(ret));
-	dsp_fun->driver_data = soft_state;
 
 	ret = ddf_fun_bind(mixer_fun);
 	CHECK_RET_UNREG_DEST_RETURN(ret,
 	    "Failed to bind mixer function: %s.\n", str_error(ret));
+
+	/* Everything's OK assign driver_data. */
 	mixer_fun->driver_data = soft_state;
-
+	dsp_fun->driver_data = soft_state;
 
 	ret = sb16_init_mpu(soft_state, (void*)mpu_regs, mpu_regs_size);
@@ -224,6 +230,19 @@
 	return EOK;
 }
+/*----------------------------------------------------------------------------*/
+int sb_enable_interrupts(ddf_dev_t *device)
+{
+	async_sess_t *parent_sess =
+	    devman_parent_device_connect(EXCHANGE_SERIALIZE, device->handle,
+	    IPC_FLAG_BLOCKING);
+	if (!parent_sess)
+		return ENOMEM;
+
+	bool enabled = hw_res_enable_interrupt(parent_sess);
+	async_hangup(parent_sess);
+
+	return enabled ? EOK : EIO;
+}
 /**
  * @}
  */
-
