diff --git a/drivers/gpu/drm/nouveau/include/nvkm/core/device.h b/drivers/gpu/drm/nouveau/include/nvkm/core/device.h
index d48e5006e14e0e249c26818988093f3169ff3c98..d44e66f34bd73ef5a1af7ca013e8b2d041511b50 100644
--- a/drivers/gpu/drm/nouveau/include/nvkm/core/device.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/core/device.h
@@ -210,12 +210,10 @@ enum nv_bus_type {
 	NVKM_BUS_PLATFORM,
 };
 
-#define nvkm_device_create(p,t,n,s,c,d,u)                                   \
-	nvkm_device_create_((void *)(p), (t), (n), (s), (c), (d),           \
-			       sizeof(**u), (void **)u)
-int  nvkm_device_create_(void *, enum nv_bus_type type, u64 name,
-			    const char *sname, const char *cfg, const char *dbg,
-			    int, void **);
+int  nvkm_device_new(void *, enum nv_bus_type type, u64 name,
+		     const char *sname, const char *cfg, const char *dbg,
+		     struct nvkm_device **);
+void nvkm_device_del(struct nvkm_device **);
 
 /* device logging */
 #define nvdev_printk_(d,l,p,f,a...) do {                                       \
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
index 6180c3d302877e46774eaa65516a3fe3edce17d0..16c5da7db9a921e56975f2b24ab579636ca15a56 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
@@ -325,9 +325,9 @@ static int nouveau_drm_probe(struct pci_dev *pdev,
 		remove_conflicting_framebuffers(aper, "nouveaufb", boot);
 	kfree(aper);
 
-	ret = nvkm_device_create(pdev, NVKM_BUS_PCI,
-				 nouveau_pci_name(pdev), pci_name(pdev),
-				 nouveau_config, nouveau_debug, &device);
+	ret = nvkm_device_new(pdev, NVKM_BUS_PCI, nouveau_pci_name(pdev),
+			      pci_name(pdev), nouveau_config, nouveau_debug,
+			      &device);
 	if (ret)
 		return ret;
 
@@ -335,7 +335,7 @@ static int nouveau_drm_probe(struct pci_dev *pdev,
 
 	ret = drm_get_pci_dev(pdev, pent, &driver_pci);
 	if (ret) {
-		nvkm_object_ref(NULL, (struct nvkm_object **)&device);
+		nvkm_device_del(&device);
 		return ret;
 	}
 
@@ -537,7 +537,7 @@ nouveau_drm_device_remove(struct drm_device *dev)
 	device = client->device;
 	drm_put_dev(dev);
 
-	nvkm_object_ref(NULL, (struct nvkm_object **)&device);
+	nvkm_device_del(&device);
 }
 
 static void
@@ -1062,12 +1062,12 @@ nouveau_platform_device_create(struct platform_device *pdev,
 	struct drm_device *drm;
 	int err;
 
-	err = nvkm_device_create(pdev, NVKM_BUS_PLATFORM,
-				 nouveau_platform_name(pdev),
-				 dev_name(&pdev->dev), nouveau_config,
-				 nouveau_debug, pdevice);
+	err = nvkm_device_new(pdev, NVKM_BUS_PLATFORM,
+			      nouveau_platform_name(pdev),
+			      dev_name(&pdev->dev), nouveau_config,
+			      nouveau_debug, pdevice);
 	if (err)
-		return ERR_PTR(err);
+		goto err_free;
 
 	drm = drm_dev_alloc(&driver_platform, &pdev->dev);
 	if (!drm) {
@@ -1085,7 +1085,7 @@ nouveau_platform_device_create(struct platform_device *pdev,
 	return drm;
 
 err_free:
-	nvkm_object_ref(NULL, (struct nvkm_object **)pdevice);
+	nvkm_device_del(pdevice);
 
 	return ERR_PTR(err);
 }
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
index e08418436e0cd51b9eb2e18030ef9c1c78ed42d5..c943a2ad26c7cc1610ff5179cd40c47393a8a1ca 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
@@ -666,23 +666,6 @@ nvkm_device_init(struct nvkm_object *object)
 	return ret;
 }
 
-static void
-nvkm_device_dtor(struct nvkm_object *object)
-{
-	struct nvkm_device *device = (void *)object;
-
-	nvkm_event_fini(&device->event);
-
-	mutex_lock(&nv_devices_mutex);
-	list_del(&device->head);
-	mutex_unlock(&nv_devices_mutex);
-
-	if (device->pri)
-		iounmap(device->pri);
-
-	nvkm_engine_destroy(&device->engine);
-}
-
 resource_size_t
 nv_device_resource_start(struct nvkm_device *device, unsigned int bar)
 {
@@ -728,16 +711,34 @@ static struct nvkm_oclass
 nvkm_device_oclass = {
 	.handle = NV_ENGINE(DEVICE, 0x00),
 	.ofuncs = &(struct nvkm_ofuncs) {
-		.dtor = nvkm_device_dtor,
 		.init = nvkm_device_init,
 		.fini = nvkm_device_fini,
 	},
 };
 
+void
+nvkm_device_del(struct nvkm_device **pdevice)
+{
+	struct nvkm_device *device = *pdevice;
+	if (device) {
+		nvkm_event_fini(&device->event);
+
+		mutex_lock(&nv_devices_mutex);
+		list_del(&device->head);
+		mutex_unlock(&nv_devices_mutex);
+
+		if (device->pri)
+			iounmap(device->pri);
+
+		nvkm_engine_destroy(&device->engine);
+		*pdevice = NULL;
+	}
+}
+
 int
-nvkm_device_create_(void *dev, enum nv_bus_type type, u64 name,
-		    const char *sname, const char *cfg, const char *dbg,
-		    int length, void **pobject)
+nvkm_device_new(void *dev, enum nv_bus_type type, u64 name,
+		const char *sname, const char *cfg, const char *dbg,
+		struct nvkm_device **pdevice)
 {
 	struct nvkm_device *device;
 	int ret = -EEXIST;
@@ -748,9 +749,9 @@ nvkm_device_create_(void *dev, enum nv_bus_type type, u64 name,
 			goto done;
 	}
 
-	ret = nvkm_engine_create_(NULL, NULL, &nvkm_device_oclass, true,
-				  "DEVICE", "device", length, pobject);
-	device = *pobject;
+	ret = nvkm_engine_create(NULL, NULL, &nvkm_device_oclass, true,
+				 "DEVICE", "device", &device);
+	*pdevice = device;
 	if (ret)
 		goto done;