2010-05-27 13:40:25 -06:00
/*
* Derived from drm_pci . c
*
* Copyright 2003 José Fonseca .
* Copyright 2003 Leif Delgass .
* Copyright ( c ) 2009 , Code Aurora Forum .
* All Rights Reserved .
*
* Permission is hereby granted , free of charge , to any person obtaining a
* copy of this software and associated documentation files ( the " Software " ) ,
* to deal in the Software without restriction , including without limitation
* the rights to use , copy , modify , merge , publish , distribute , sublicense ,
* and / or sell copies of the Software , and to permit persons to whom the
* Software is furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice ( including the next
* paragraph ) shall be included in all copies or substantial portions of the
* Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER LIABILITY , WHETHER IN AN
* ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM , OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE .
*/
2011-08-30 18:16:33 -04:00
# include <linux/export.h>
2012-10-02 18:01:07 +01:00
# include <drm/drmP.h>
2010-05-27 13:40:25 -06:00
2013-08-20 00:53:10 +01:00
/*
2010-05-27 13:40:25 -06:00
* Register .
*
* \ param platdev - Platform device struture
* \ return zero on success or a negative number on failure .
*
* Attempt to gets inter module " drm " information . If we are first
* then register the character device and inter module information .
* Try and register , if we fail to register , backout previous work .
*/
2013-08-20 00:53:10 +01:00
static int drm_get_platform_dev ( struct platform_device * platdev ,
struct drm_driver * driver )
2010-05-27 13:40:25 -06:00
{
struct drm_device * dev ;
int ret ;
DRM_DEBUG ( " \n " ) ;
2013-10-02 11:23:34 +02:00
dev = drm_dev_alloc ( driver , & platdev - > dev ) ;
2016-09-21 16:59:19 +02:00
if ( IS_ERR ( dev ) )
return PTR_ERR ( dev ) ;
2010-05-27 13:40:25 -06:00
dev - > platformdev = platdev ;
2013-10-02 11:23:35 +02:00
ret = drm_dev_register ( dev , 0 ) ;
2010-05-27 13:40:25 -06:00
if ( ret )
2013-10-02 11:23:35 +02:00
goto err_free ;
2010-09-14 20:14:38 +10:00
2010-05-27 13:40:25 -06:00
return 0 ;
2013-10-02 11:23:35 +02:00
err_free :
drm: provide device-refcount
Lets not trick ourselves into thinking "drm_device" objects are not
ref-counted. That's just utterly stupid. We manage "drm_minor" objects on
each drm-device and each minor can have an unlimited number of open
handles. Each of these handles has the drm_minor (and thus the drm_device)
as private-data in the file-handle. Therefore, we may not destroy
"drm_device" until all these handles are closed.
It is *not* possible to reset all these pointers atomically and restrict
access to them, and this is *not* how this is done! Instead, we use
ref-counts to make sure the object is valid and not freed.
Note that we currently use "dev->open_count" for that, which is *exactly*
the same as a reference-count, just open coded. So this patch doesn't
change any semantics on DRM devices (well, this patch just introduces the
ref-count, anyway. Follow-up patches will replace open_count by it).
Also note that generic VFS revoke support could allow us to drop this
ref-count again. We could then just synchronously disable any fops->xy()
calls. However, this is not the case, yet, and no such patches are
in sight (and I seriously question the idea of dropping the ref-cnt
again).
Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
2014-01-29 10:21:36 +01:00
drm_dev_unref ( dev ) ;
2010-05-27 13:40:25 -06:00
return ret ;
}
/**
2014-05-19 13:39:07 +02:00
* drm_platform_init - Register a platform device with the DRM subsystem
* @ driver : DRM device driver
* @ platform_device : platform device to register
2010-05-27 13:40:25 -06:00
*
2014-05-19 13:39:07 +02:00
* Registers the specified DRM device driver and platform device with the DRM
* subsystem , initializing a drm_device structure and calling the driver ' s
* . load ( ) function .
2010-05-27 13:40:25 -06:00
*
2015-09-28 21:46:35 +02:00
* NOTE : This function is deprecated , please use drm_dev_alloc ( ) and
2017-01-25 07:26:47 +01:00
* drm_dev_register ( ) instead and remove your & drm_driver . load callback .
2015-09-28 21:46:35 +02:00
*
2014-05-19 13:39:07 +02:00
* Return : 0 on success or a negative error code on failure .
2010-05-27 13:40:25 -06:00
*/
2010-12-15 03:16:38 +10:00
int drm_platform_init ( struct drm_driver * driver , struct platform_device * platform_device )
2010-05-27 13:40:25 -06:00
{
2010-12-15 03:16:38 +10:00
DRM_DEBUG ( " \n " ) ;
return drm_get_platform_dev ( platform_device , driver ) ;
}
EXPORT_SYMBOL ( drm_platform_init ) ;