Index: uspace/drv/test/test1/test1.c
===================================================================
--- uspace/drv/test/test1/test1.c	(revision bfe7867b8b6d864abc1f0ba5490a1a568432d127)
+++ uspace/drv/test/test1/test1.c	(revision c5be39b48e3de00d342394cb29ba1f563fc45dbd)
@@ -148,7 +148,7 @@
 	    dev->name, (int) dev->handle);
 
-	test1 = calloc(1, sizeof(test1_t));
+	test1 = ddf_dev_data_alloc(dev, sizeof(test1_t));
 	if (test1 == NULL) {
-		ddf_msg(LVL_ERROR, "Failed allocating softstate.\n");
+		ddf_msg(LVL_ERROR, "Failed allocating soft state.\n");
 		return ENOMEM;
 	}
@@ -159,4 +159,6 @@
 		return ENOMEM;
 	}
+
+	test1->fun_a = fun_a;
 
 	rc = ddf_fun_bind(fun_a);
@@ -187,6 +189,4 @@
 	ddf_msg(LVL_DEBUG, "Device `%s' accepted.", dev->name);
 
-	test1->fun_a = fun_a;
-	dev->driver_data = test1;
 	return EOK;
 }
Index: uspace/lib/drv/generic/driver.c
===================================================================
--- uspace/lib/drv/generic/driver.c	(revision bfe7867b8b6d864abc1f0ba5490a1a568432d127)
+++ uspace/lib/drv/generic/driver.c	(revision c5be39b48e3de00d342394cb29ba1f563fc45dbd)
@@ -699,4 +699,19 @@
 }
 
+/** Allocate driver-specific device data. */
+extern void *ddf_dev_data_alloc(ddf_dev_t *dev, size_t size)
+{
+	void *data;
+
+	assert(dev->driver_data == NULL);
+
+	data = calloc(1, size);
+	if (data == NULL)
+		return NULL;
+
+	dev->driver_data = data;
+	return data;
+}
+
 /** Create a DDF function node.
  *
@@ -744,4 +759,20 @@
 
 	return fun;
+}
+
+/** Allocate driver-specific function data. */
+extern void *ddf_fun_data_alloc(ddf_fun_t *fun, size_t size)
+{
+	void *data;
+
+	assert(fun->bound == false);
+	assert(fun->driver_data == NULL);
+
+	data = calloc(1, size);
+	if (data == NULL)
+		return NULL;
+
+	fun->driver_data = data;
+	return data;
 }
 
Index: uspace/lib/drv/include/ddf/driver.h
===================================================================
--- uspace/lib/drv/include/ddf/driver.h	(revision bfe7867b8b6d864abc1f0ba5490a1a568432d127)
+++ uspace/lib/drv/include/ddf/driver.h	(revision c5be39b48e3de00d342394cb29ba1f563fc45dbd)
@@ -155,6 +155,8 @@
 extern int ddf_driver_main(driver_t *);
 
+extern void *ddf_dev_data_alloc(ddf_dev_t *, size_t);
 extern ddf_fun_t *ddf_fun_create(ddf_dev_t *, fun_type_t, const char *);
 extern void ddf_fun_destroy(ddf_fun_t *);
+extern void *ddf_fun_data_alloc(ddf_fun_t *, size_t);
 extern int ddf_fun_bind(ddf_fun_t *);
 extern int ddf_fun_unbind(ddf_fun_t *);
