@ -22,8 +22,8 @@
# include <drm/drm_core.h>
# include <drm/drmP.h>
# define to_drm_minor(d) container_of(d, struct drm_minor, kdev )
# define to_drm_connector(d) container_of(d, struct drm_connector, kdev )
# define to_drm_minor(d) dev_get_drvdata(d )
# define to_drm_connector(d) dev_get_drvdata(d )
static struct device_type drm_sysfs_device_minor = {
. name = " drm_minor "
@ -162,20 +162,6 @@ void drm_sysfs_destroy(void)
drm_class = NULL ;
}
/**
* drm_sysfs_device_release - do nothing
* @ dev : Linux device
*
* Normally , this would free the DRM device associated with @ dev , along
* with cleaning up any other stuff . But we do that in the DRM core , so
* this function can just return and hope that the core does its job .
*/
static void drm_sysfs_device_release ( struct device * dev )
{
memset ( dev , 0 , sizeof ( struct device ) ) ;
return ;
}
/*
* Connector properties
*/
@ -394,29 +380,26 @@ int drm_sysfs_connector_add(struct drm_connector *connector)
int i ;
int ret ;
/* We shouldn't get called more than once for the same connector */
BUG_ON ( device_is_registered ( & connector - > kdev ) ) ;
connector - > kdev . parent = & dev - > primary - > kdev ;
connector - > kdev . class = drm_class ;
connector - > kdev . release = drm_sysfs_device_release ;
if ( connector - > kdev )
return 0 ;
/* We shouldn't get called more than once for the same connector */
connector - > kdev = device_create ( drm_class , dev - > primary - > kdev ,
0 , connector , " card%d-%s " ,
dev - > primary - > index , drm_get_connector_name ( connector ) ) ;
DRM_DEBUG ( " adding \" %s \" to sysfs \n " ,
drm_get_connector_name ( connector ) ) ;
dev_set_name ( & connector - > kdev , " card%d-%s " ,
dev - > primary - > index , drm_get_connector_name ( connector ) ) ;
ret = device_register ( & connector - > kdev ) ;
if ( ret ) {
DRM_ERROR ( " failed to register connector device: %d \n " , ret ) ;
if ( IS_ERR ( connector - > kdev ) ) {
DRM_ERROR ( " failed to register connector device: %ld \n " , PTR_ERR ( connector - > kdev ) ) ;
ret = PTR_ERR ( connector - > kdev ) ;
goto out ;
}
/* Standard attributes */
for ( attr_cnt = 0 ; attr_cnt < ARRAY_SIZE ( connector_attrs ) ; attr_cnt + + ) {
ret = device_create_file ( & connector - > kdev , & connector_attrs [ attr_cnt ] ) ;
ret = device_create_file ( connector - > kdev , & connector_attrs [ attr_cnt ] ) ;
if ( ret )
goto err_out_files ;
}
@ -433,7 +416,7 @@ int drm_sysfs_connector_add(struct drm_connector *connector)
case DRM_MODE_CONNECTOR_Component :
case DRM_MODE_CONNECTOR_TV :
for ( opt_cnt = 0 ; opt_cnt < ARRAY_SIZE ( connector_attrs_opt1 ) ; opt_cnt + + ) {
ret = device_create_file ( & connector - > kdev , & connector_attrs_opt1 [ opt_cnt ] ) ;
ret = device_create_file ( connector - > kdev , & connector_attrs_opt1 [ opt_cnt ] ) ;
if ( ret )
goto err_out_files ;
}
@ -442,7 +425,7 @@ int drm_sysfs_connector_add(struct drm_connector *connector)
break ;
}
ret = sysfs_create_bin_file ( & connector - > kdev . kobj , & edid_attr ) ;
ret = sysfs_create_bin_file ( & connector - > kdev - > kobj , & edid_attr ) ;
if ( ret )
goto err_out_files ;
@ -453,10 +436,11 @@ int drm_sysfs_connector_add(struct drm_connector *connector)
err_out_files :
for ( i = 0 ; i < opt_cnt ; i + + )
device_remove_file ( & connector - > kdev , & connector_attrs_opt1 [ i ] ) ;
device_remove_file ( connector - > kdev , & connector_attrs_opt1 [ i ] ) ;
for ( i = 0 ; i < attr_cnt ; i + + )
device_remove_file ( & connector - > kdev , & connector_attrs [ i ] ) ;
device_unregister ( & connector - > kdev ) ;
device_remove_file ( connector - > kdev , & connector_attrs [ i ] ) ;
put_device ( connector - > kdev ) ;
device_unregister ( connector - > kdev ) ;
out :
return ret ;
@ -480,16 +464,17 @@ void drm_sysfs_connector_remove(struct drm_connector *connector)
{
int i ;
if ( ! connector - > kdev . parent )
if ( ! connector - > kdev )
return ;
DRM_DEBUG ( " removing \" %s \" from sysfs \n " ,
drm_get_connector_name ( connector ) ) ;
for ( i = 0 ; i < ARRAY_SIZE ( connector_attrs ) ; i + + )
device_remove_file ( & connector - > kdev , & connector_attrs [ i ] ) ;
sysfs_remove_bin_file ( & connector - > kdev . kobj , & edid_attr ) ;
device_unregister ( & connector - > kdev ) ;
connector - > kdev . parent = NULL ;
device_remove_file ( connector - > kdev , & connector_attrs [ i ] ) ;
sysfs_remove_bin_file ( & connector - > kdev - > kobj , & edid_attr ) ;
put_device ( connector - > kdev ) ;
device_unregister ( connector - > kdev ) ;
connector - > kdev = NULL ;
}
EXPORT_SYMBOL ( drm_sysfs_connector_remove ) ;
@ -508,7 +493,7 @@ void drm_sysfs_hotplug_event(struct drm_device *dev)
DRM_DEBUG ( " generating hotplug event \n " ) ;
kobject_uevent_env ( & dev - > primary - > kdev . kobj , KOBJ_CHANGE , envp ) ;
kobject_uevent_env ( & dev - > primary - > kdev - > kobj , KOBJ_CHANGE , envp ) ;
}
EXPORT_SYMBOL ( drm_sysfs_hotplug_event ) ;
@ -523,15 +508,8 @@ EXPORT_SYMBOL(drm_sysfs_hotplug_event);
*/
int drm_sysfs_device_add ( struct drm_minor * minor )
{
int err ;
char * minor_str ;
minor - > kdev . parent = minor - > dev - > dev ;
minor - > kdev . class = drm_class ;
minor - > kdev . release = drm_sysfs_device_release ;
minor - > kdev . devt = minor - > device ;
minor - > kdev . type = & drm_sysfs_device_minor ;
if ( minor - > type = = DRM_MINOR_CONTROL )
minor_str = " controlD%d " ;
else if ( minor - > type = = DRM_MINOR_RENDER )
@ -539,18 +517,14 @@ int drm_sysfs_device_add(struct drm_minor *minor)
else
minor_str = " card%d " ;
dev_set_name ( & minor - > kdev , minor_str , minor - > index ) ;
err = device_register ( & minor - > kdev ) ;
if ( err ) {
DRM_ERROR ( " device add failed: % d \n " , err ) ;
goto err_out ;
minor - > kdev = device_create ( drm_class , minor - > dev - > dev ,
MKDEV ( DRM_MAJOR , minor - > index ) ,
minor , minor_str , minor - > index ) ;
if ( IS_ERR ( minor - > kdev ) ) {
DRM_ERROR ( " device create failed %l d \n " , PTR_ERR ( minor - > kdev ) ) ;
return PTR_ERR ( minor - > kdev ) ;
}
return 0 ;
err_out :
return err ;
}
/**
@ -562,9 +536,9 @@ err_out:
*/
void drm_sysfs_device_remove ( struct drm_minor * minor )
{
if ( minor - > kdev . parent )
device_unregister ( & minor - > kdev ) ;
minor - > kdev . parent = NULL ;
if ( minor - > kdev )
device_destroy ( drm_class , MKDEV ( DRM_MAJOR , minor - > index ) ) ;
minor - > kdev = NULL ;
}