drm/nouveau/device: tidy ctor/dtor interfaces
authorBen Skeggs <bskeggs@redhat.com>
Thu, 20 Aug 2015 04:54:15 +0000 (14:54 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 28 Aug 2015 02:40:30 +0000 (12:40 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/include/nvkm/core/device.h
drivers/gpu/drm/nouveau/nouveau_drm.c
drivers/gpu/drm/nouveau/nvkm/engine/device/base.c

index d48e500..d44e66f 100644 (file)
@@ -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 {                                       \
index 6180c3d..16c5da7 100644 (file)
@@ -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);
 }
index e084184..c943a2a 100644 (file)
@@ -666,23 +666,6 @@ fail:
        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;