2010-05-27 23:40:25 +04: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-31 02:16:33 +04:00
# include <linux/export.h>
2012-10-02 21:01:07 +04:00
# include <drm/drmP.h>
2010-05-27 23:40:25 +04:00
2013-08-20 03:53:10 +04:00
/*
2010-05-27 23:40:25 +04: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 03:53:10 +04:00
static int drm_get_platform_dev ( struct platform_device * platdev ,
struct drm_driver * driver )
2010-05-27 23:40:25 +04:00
{
struct drm_device * dev ;
int ret ;
DRM_DEBUG ( " \n " ) ;
2013-10-02 13:23:34 +04:00
dev = drm_dev_alloc ( driver , & platdev - > dev ) ;
2010-05-27 23:40:25 +04:00
if ( ! dev )
return - ENOMEM ;
dev - > platformdev = platdev ;
2013-10-02 13:23:35 +04:00
ret = drm_dev_register ( dev , 0 ) ;
2010-05-27 23:40:25 +04:00
if ( ret )
2013-10-02 13:23:35 +04:00
goto err_free ;
2010-09-14 14:14:38 +04:00
2010-05-27 23:40:25 +04:00
DRM_INFO ( " Initialized %s %d.%d.%d %s on minor %d \n " ,
driver - > name , driver - > major , driver - > minor , driver - > patchlevel ,
driver - > date , dev - > primary - > index ) ;
return 0 ;
2013-10-02 13:23:35 +04:00
err_free :
2013-10-02 13:23:37 +04:00
drm_dev_free ( dev ) ;
2010-05-27 23:40:25 +04:00
return ret ;
}
2010-12-14 20:16:38 +03:00
static int drm_platform_get_irq ( struct drm_device * dev )
{
return platform_get_irq ( dev - > platformdev , 0 ) ;
}
static const char * drm_platform_get_name ( struct drm_device * dev )
{
return dev - > platformdev - > name ;
}
static int drm_platform_set_busid ( struct drm_device * dev , struct drm_master * master )
{
2012-03-06 20:20:36 +04:00
int len , ret , id ;
2010-12-14 20:16:38 +03:00
2011-07-14 07:12:43 +04:00
master - > unique_len = 13 + strlen ( dev - > platformdev - > name ) ;
master - > unique_size = master - > unique_len ;
2010-12-14 20:16:38 +03:00
master - > unique = kmalloc ( master - > unique_len + 1 , GFP_KERNEL ) ;
if ( master - > unique = = NULL )
return - ENOMEM ;
2012-03-06 20:20:36 +04:00
id = dev - > platformdev - > id ;
/* if only a single instance of the platform device, id will be
* set to - 1. . use 0 instead to avoid a funny looking bus - id :
*/
if ( id = = - 1 )
id = 0 ;
2010-12-14 20:16:38 +03:00
len = snprintf ( master - > unique , master - > unique_len ,
2012-03-06 20:20:36 +04:00
" platform:%s:%02d " , dev - > platformdev - > name , id ) ;
2010-12-14 20:16:38 +03:00
if ( len > master - > unique_len ) {
DRM_ERROR ( " Unique buffer overflowed \n " ) ;
ret = - EINVAL ;
goto err ;
}
dev - > devname =
kmalloc ( strlen ( dev - > platformdev - > name ) +
master - > unique_len + 2 , GFP_KERNEL ) ;
if ( dev - > devname = = NULL ) {
ret = - ENOMEM ;
goto err ;
}
sprintf ( dev - > devname , " %s@%s " , dev - > platformdev - > name ,
master - > unique ) ;
return 0 ;
err :
return ret ;
}
static struct drm_bus drm_platform_bus = {
. bus_type = DRIVER_BUS_PLATFORM ,
. get_irq = drm_platform_get_irq ,
. get_name = drm_platform_get_name ,
. set_busid = drm_platform_set_busid ,
} ;
2010-05-27 23:40:25 +04:00
/**
2010-12-14 20:16:38 +03:00
* Platform device initialization . Called direct from modules .
2010-05-27 23:40:25 +04:00
*
* \ return zero on success or a negative number on failure .
*
* Initializes a drm_device structures , registering the
* stubs
*
* Expands the \ c DRIVER_PREINIT and \ c DRIVER_POST_INIT macros before and
* after the initialization for driver customization .
*/
2010-12-14 20:16:38 +03:00
int drm_platform_init ( struct drm_driver * driver , struct platform_device * platform_device )
2010-05-27 23:40:25 +04:00
{
2010-12-14 20:16:38 +03:00
DRM_DEBUG ( " \n " ) ;
driver - > kdriver . platform_device = platform_device ;
driver - > bus = & drm_platform_bus ;
INIT_LIST_HEAD ( & driver - > device_list ) ;
return drm_get_platform_dev ( platform_device , driver ) ;
}
EXPORT_SYMBOL ( drm_platform_init ) ;
void drm_platform_exit ( struct drm_driver * driver , struct platform_device * platform_device )
{
struct drm_device * dev , * tmp ;
DRM_DEBUG ( " \n " ) ;
list_for_each_entry_safe ( dev , tmp , & driver - > device_list , driver_item )
drm_put_dev ( dev ) ;
DRM_INFO ( " Module unloaded \n " ) ;
2010-05-27 23:40:25 +04:00
}
2010-12-14 20:16:38 +03:00
EXPORT_SYMBOL ( drm_platform_exit ) ;