drm: Add devm_drm_dev_init()
authorNoralf Trønnes <noralf@tronnes.org>
Mon, 25 Feb 2019 14:42:27 +0000 (15:42 +0100)
committerNoralf Trønnes <noralf@tronnes.org>
Mon, 4 Mar 2019 14:23:05 +0000 (15:23 +0100)
This adds a resource managed (devres) version of drm_dev_init().

v2: Remove devm_drm_dev_register() since we can't touch hw in devm
    release functions and drivers want to disable hw on driver module
    unload (Daniel Vetter, Greg KH)

Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Greg KH <gregkh@linuxfoundation.org>
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190225144232.20761-3-noralf@tronnes.org
Documentation/driver-model/devres.txt
drivers/gpu/drm/drm_drv.c
include/drm/drm_drv.h

index b277cafce71eb25effa455c90f3c24d14430856d..351b7ac65a1e18b8e068eb9852104a720905bff7 100644 (file)
@@ -254,6 +254,9 @@ DMA
   dmam_pool_create()
   dmam_pool_destroy()
 
+DRM
+  devm_drm_dev_init()
+
 GPIO
   devm_gpiod_get()
   devm_gpiod_get_index()
index ce65f12db0fe7d1e97575937a7b928513019378a..934780a4c0338793c3bc36b409ac769d2c5452e5 100644 (file)
@@ -601,6 +601,45 @@ err_free:
 }
 EXPORT_SYMBOL(drm_dev_init);
 
+static void devm_drm_dev_init_release(void *data)
+{
+       drm_dev_put(data);
+}
+
+/**
+ * devm_drm_dev_init - Resource managed drm_dev_init()
+ * @parent: Parent device object
+ * @dev: DRM device
+ * @driver: DRM driver
+ *
+ * Managed drm_dev_init(). The DRM device initialized with this function is
+ * automatically put on driver detach using drm_dev_put(). You must supply a
+ * &drm_driver.release callback to control the finalization explicitly.
+ *
+ * RETURNS:
+ * 0 on success, or error code on failure.
+ */
+int devm_drm_dev_init(struct device *parent,
+                     struct drm_device *dev,
+                     struct drm_driver *driver)
+{
+       int ret;
+
+       if (WARN_ON(!parent || !driver->release))
+               return -EINVAL;
+
+       ret = drm_dev_init(dev, driver, parent);
+       if (ret)
+               return ret;
+
+       ret = devm_add_action(parent, devm_drm_dev_init_release, dev);
+       if (ret)
+               devm_drm_dev_init_release(dev);
+
+       return ret;
+}
+EXPORT_SYMBOL(devm_drm_dev_init);
+
 /**
  * drm_dev_fini - Finalize a dead DRM device
  * @dev: DRM device
index ca46a45a9cce2ae7f4638ed5c5794a71baf6d104..e81bce2698e37cdb94ea4eba7e1d89da054ade4e 100644 (file)
@@ -718,6 +718,9 @@ extern unsigned int drm_debug;
 int drm_dev_init(struct drm_device *dev,
                 struct drm_driver *driver,
                 struct device *parent);
+int devm_drm_dev_init(struct device *parent,
+                     struct drm_device *dev,
+                     struct drm_driver *driver);
 void drm_dev_fini(struct drm_device *dev);
 
 struct drm_device *drm_dev_alloc(struct drm_driver *driver,