Skip to content

Commit

Permalink
drm: Add devm_drm_dev_init()
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Noralf Trønnes committed Mar 4, 2019
1 parent 56be650 commit 9b1f1b6
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 0 deletions.
3 changes: 3 additions & 0 deletions Documentation/driver-model/devres.txt
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,9 @@ DMA
dmam_pool_create()
dmam_pool_destroy()

DRM
devm_drm_dev_init()

GPIO
devm_gpiod_get()
devm_gpiod_get_index()
Expand Down
39 changes: 39 additions & 0 deletions drivers/gpu/drm/drm_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -601,6 +601,45 @@ int drm_dev_init(struct drm_device *dev,
}
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
Expand Down
3 changes: 3 additions & 0 deletions include/drm/drm_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 9b1f1b6

Please sign in to comment.