drm/debugfs: rework debugfs directory creation v5
[linux-2.6-microblaze.git] / drivers / gpu / drm / drm_debugfs.c
index 8a4c90f..5ec28c0 100644 (file)
@@ -266,8 +266,46 @@ void drm_debugfs_create_files(const struct drm_info_list *files, int count,
 }
 EXPORT_SYMBOL(drm_debugfs_create_files);
 
-int drm_debugfs_init(struct drm_minor *minor, int minor_id,
-                    struct dentry *root)
+/**
+ * drm_debugfs_dev_init - create debugfs directory for the device
+ * @dev: the device which we want to create the directory for
+ * @root: the parent directory depending on the device type
+ *
+ * Creates the debugfs directory for the device under the given root directory.
+ */
+void drm_debugfs_dev_init(struct drm_device *dev, struct dentry *root)
+{
+       dev->debugfs_root = debugfs_create_dir(dev->unique, root);
+}
+
+/**
+ * drm_debugfs_dev_fini - cleanup debugfs directory
+ * @dev: the device to cleanup the debugfs stuff
+ *
+ * Remove the debugfs directory, might be called multiple times.
+ */
+void drm_debugfs_dev_fini(struct drm_device *dev)
+{
+       debugfs_remove_recursive(dev->debugfs_root);
+       dev->debugfs_root = NULL;
+}
+
+void drm_debugfs_dev_register(struct drm_device *dev)
+{
+       drm_debugfs_add_files(dev, drm_debugfs_list, DRM_DEBUGFS_ENTRIES);
+
+       if (drm_core_check_feature(dev, DRIVER_MODESET)) {
+               drm_framebuffer_debugfs_init(dev);
+               drm_client_debugfs_init(dev);
+       }
+       if (drm_drv_uses_atomic_modeset(dev)) {
+               drm_atomic_debugfs_init(dev);
+               drm_bridge_debugfs_init(dev);
+       }
+}
+
+int drm_debugfs_register(struct drm_minor *minor, int minor_id,
+                        struct dentry *root)
 {
        struct drm_device *dev = minor->dev;
        struct drm_debugfs_entry *entry, *tmp;
@@ -276,20 +314,11 @@ int drm_debugfs_init(struct drm_minor *minor, int minor_id,
        INIT_LIST_HEAD(&minor->debugfs_list);
        mutex_init(&minor->debugfs_lock);
        sprintf(name, "%d", minor_id);
-       minor->debugfs_root = debugfs_create_dir(name, root);
-
-       drm_debugfs_add_files(minor->dev, drm_debugfs_list, DRM_DEBUGFS_ENTRIES);
+       minor->debugfs_symlink = debugfs_create_symlink(name, root,
+                                                       dev->unique);
 
-       if (drm_drv_uses_atomic_modeset(dev)) {
-               drm_atomic_debugfs_init(minor);
-               drm_bridge_debugfs_init(minor);
-       }
-
-       if (drm_core_check_feature(dev, DRIVER_MODESET)) {
-               drm_framebuffer_debugfs_init(minor);
-
-               drm_client_debugfs_init(minor);
-       }
+       /* TODO: Only for compatibility with drivers */
+       minor->debugfs_root = dev->debugfs_root;
 
        if (dev->driver->debugfs_init && dev->render != minor)
                dev->driver->debugfs_init(minor);
@@ -356,13 +385,12 @@ static void drm_debugfs_remove_all_files(struct drm_minor *minor)
 
 void drm_debugfs_cleanup(struct drm_minor *minor)
 {
-       if (!minor->debugfs_root)
+       if (!minor->debugfs_symlink)
                return;
 
        drm_debugfs_remove_all_files(minor);
-
-       debugfs_remove_recursive(minor->debugfs_root);
-       minor->debugfs_root = NULL;
+       debugfs_remove(minor->debugfs_symlink);
+       minor->debugfs_symlink = NULL;
 }
 
 /**
@@ -547,13 +575,13 @@ static const struct file_operations drm_connector_fops = {
 
 void drm_debugfs_connector_add(struct drm_connector *connector)
 {
-       struct drm_minor *minor = connector->dev->primary;
+       struct drm_device *dev = connector->dev;
        struct dentry *root;
 
-       if (!minor->debugfs_root)
+       if (!dev->debugfs_root)
                return;
 
-       root = debugfs_create_dir(connector->name, minor->debugfs_root);
+       root = debugfs_create_dir(connector->name, dev->debugfs_root);
        connector->debugfs_entry = root;
 
        /* force */
@@ -588,7 +616,7 @@ void drm_debugfs_connector_remove(struct drm_connector *connector)
 
 void drm_debugfs_crtc_add(struct drm_crtc *crtc)
 {
-       struct drm_minor *minor = crtc->dev->primary;
+       struct drm_device *dev = crtc->dev;
        struct dentry *root;
        char *name;
 
@@ -596,7 +624,7 @@ void drm_debugfs_crtc_add(struct drm_crtc *crtc)
        if (!name)
                return;
 
-       root = debugfs_create_dir(name, minor->debugfs_root);
+       root = debugfs_create_dir(name, dev->debugfs_root);
        kfree(name);
 
        crtc->debugfs_entry = root;