Index: uspace/drv/audio/sb16/main.c
===================================================================
--- uspace/drv/audio/sb16/main.c	(revision b956810160375f2742785a7b127050ed86ba4ea9)
+++ uspace/drv/audio/sb16/main.c	(revision 9dd79bc772aec18ce4a7944d47ff90f38da9e6bb)
@@ -132,4 +132,13 @@
 	CHECK_RET_UNREG_DEST_RETURN(ret, "Failed to create dsp function.");
 
+
+	mixer_fun = ddf_fun_create(device, fun_exposed, "mixer");
+	ret = dsp_fun ? EOK : ENOMEM;
+	CHECK_RET_UNREG_DEST_RETURN(ret, "Failed to create mixer function.");
+
+	ret = sb16_init_sb16(soft_state, (void*)sb_regs, sb_regs_size);
+	CHECK_RET_UNREG_DEST_RETURN(ret,
+	    "Failed to init sb16 driver: %s.\n", str_error(ret));
+
 	ret = ddf_fun_bind(dsp_fun);
 	CHECK_RET_UNREG_DEST_RETURN(ret,
@@ -137,8 +146,4 @@
 	dsp_fun->driver_data = soft_state;
 
-	mixer_fun = ddf_fun_create(device, fun_exposed, "mixer");
-	ret = dsp_fun ? EOK : ENOMEM;
-	CHECK_RET_UNREG_DEST_RETURN(ret, "Failed to create mixer function.");
-
 	ret = ddf_fun_bind(mixer_fun);
 	CHECK_RET_UNREG_DEST_RETURN(ret,
@@ -146,7 +151,4 @@
 	mixer_fun->driver_data = soft_state;
 
-	ret = sb16_init_sb16(soft_state, (void*)sb_regs, sb_regs_size);
-	CHECK_RET_UNREG_DEST_RETURN(ret,
-	    "Failed to init sb16 driver: %s.\n", str_error(ret));
 
 	ret = sb16_init_mpu(soft_state, (void*)mpu_regs, mpu_regs_size);
Index: uspace/drv/audio/sb16/registers.h
===================================================================
--- uspace/drv/audio/sb16/registers.h	(revision b956810160375f2742785a7b127050ed86ba4ea9)
+++ uspace/drv/audio/sb16/registers.h	(revision 9dd79bc772aec18ce4a7944d47ff90f38da9e6bb)
@@ -46,7 +46,9 @@
 	ioport8_t fm_address_status2;
 	ioport8_t fm_data2;
-	const ioport8_t dsp_data_read;
+	ioport8_t dsp_data_read;
 	ioport8_t dsp_write; /* Both command and data, bit 7 is write status */
-	const ioport8_t dsp_read_status; /* Bit 7 */
+#define DSP_WRITE_READY (1 << 7)
+	ioport8_t dsp_read_status; /* Bit 7 */
+#define DSP_READ_READY (1 << 7)
 	ioport8_t reserved;
 	ioport8_t cd_command_data;
Index: uspace/drv/audio/sb16/sb16.c
===================================================================
--- uspace/drv/audio/sb16/sb16.c	(revision b956810160375f2742785a7b127050ed86ba4ea9)
+++ uspace/drv/audio/sb16/sb16.c	(revision 9dd79bc772aec18ce4a7944d47ff90f38da9e6bb)
@@ -28,6 +28,32 @@
 
 #include <errno.h>
+#include <libarch/ddi.h>
 
+#include "ddf_log.h"
+#include "dsp_commands.h"
 #include "sb16.h"
+
+
+static inline void sb16_dsp_command(sb16_drv_t *drv, dsp_command_t command)
+{
+	assert(drv);
+	uint8_t status;
+	do {
+		status = pio_read_8(&drv->regs->dsp_write);
+	} while ((status & DSP_WRITE_READY) == 0);
+
+	pio_write_8(&drv->regs->dsp_write, command);
+}
+
+static inline uint8_t sb16_dsp_read(sb16_drv_t *drv)
+{
+	assert(drv);
+	uint8_t status;
+	do {
+		status = pio_read_8(&drv->regs->dsp_read_status);
+	} while ((status & DSP_READ_READY) == 0);
+	return pio_read_8(&drv->regs->dsp_data_read);
+}
+
 
 /* ISA interrupts should be edge-triggered so there should be no need for
@@ -45,7 +71,45 @@
 int sb16_init_sb16(sb16_drv_t *drv, void *regs, size_t size)
 {
-	// TODO Setup registers
-	// TODO Initialize dsp: get version number
-	// TODO Initialize dsp: reset DSP
+	assert(drv);
+	/* Setup registers */
+	int ret = pio_enable(regs, size, (void**)&drv->regs);
+	if (ret != EOK)
+		return ret;
+	ddf_log_debug("PIO registers at %p accessible.\n", drv->regs);
+
+	/* Reset DSP, see Chapter 2 of Sound Blaster HW programming guide */
+	pio_write_16(&drv->regs->dsp_reset, 1);
+	udelay(3);
+	pio_write_16(&drv->regs->dsp_reset, 0);
+	udelay(100);
+
+	unsigned attempts = 100;
+	uint8_t status;
+	do {
+		status = pio_read_8(&drv->regs->dsp_read_status);
+		udelay(10);
+	} while (--attempts && ((status & DSP_READ_READY) == 0));
+
+	if (status & DSP_READ_READY) {
+		const uint8_t response = sb16_dsp_read(drv);
+		if (response != 0xaa) {
+			ddf_log_error("Invalid DSP reset response: %x.\n",
+			    response);
+			return EIO;
+		}
+	} else {
+		ddf_log_error("Failed to reset Sound Blaster DSP.\n");
+		return EIO;
+	}
+	ddf_log_note("Sound blaster reset!\n");
+
+
+	/* Get DSP version number */
+	sb16_dsp_command(drv, DSP_VERSION);
+	const uint8_t major = sb16_dsp_read(drv);
+	const uint8_t minor = sb16_dsp_read(drv);
+	ddf_log_note("Sound blaster DSP version: %x.%x.\n", major, minor);
+
+
 	// TODO Initialize mixer
 	return EOK;
Index: uspace/drv/audio/sb16/sb16.h
===================================================================
--- uspace/drv/audio/sb16/sb16.h	(revision b956810160375f2742785a7b127050ed86ba4ea9)
+++ uspace/drv/audio/sb16/sb16.h	(revision 9dd79bc772aec18ce4a7944d47ff90f38da9e6bb)
@@ -53,3 +53,2 @@
  * @}
  */
-
