Commit e2271704 authored by Daniel Vetter's avatar Daniel Vetter

drm: Consolidate and document sysfs support

- remove docs for internal func, doesn't add value
- add short overview snippet instead explaining that drivers don't
  have to bother themselves with reg/unreg concerns
- drop the ttm comment about drmP.h, drmP.h is disappearing ...
Reviewed-by: default avatarNeil Armstrong <narmstrong@baylibre.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20170404095304.17599-2-daniel.vetter@ffwll.ch
parent 085c6c09
...@@ -219,6 +219,16 @@ Debugfs Support ...@@ -219,6 +219,16 @@ Debugfs Support
.. kernel-doc:: drivers/gpu/drm/drm_debugfs.c .. kernel-doc:: drivers/gpu/drm/drm_debugfs.c
:export: :export:
Sysfs Support
=============
.. kernel-doc:: drivers/gpu/drm/drm_sysfs.c
:doc: overview
.. kernel-doc:: drivers/gpu/drm/drm_sysfs.c
:export:
VBlank event handling VBlank event handling
===================== =====================
......
...@@ -25,6 +25,20 @@ ...@@ -25,6 +25,20 @@
#define to_drm_minor(d) dev_get_drvdata(d) #define to_drm_minor(d) dev_get_drvdata(d)
#define to_drm_connector(d) dev_get_drvdata(d) #define to_drm_connector(d) dev_get_drvdata(d)
/**
* DOC: overview
*
* DRM provides very little additional support to drivers for sysfs
* interactions, beyond just all the standard stuff. Drivers who want to expose
* additional sysfs properties and property groups can attach them at either
* &drm_device.dev or &drm_connector.kdev.
*
* Registration is automatically handled when calling drm_dev_register(), or
* drm_connector_register() in case of hot-plugged connectors. Unregistration is
* also automatically handled by drm_dev_unregister() and
* drm_connector_unregister().
*/
static struct device_type drm_sysfs_device_minor = { static struct device_type drm_sysfs_device_minor = {
.name = "drm_minor" .name = "drm_minor"
}; };
...@@ -250,15 +264,6 @@ static const struct attribute_group *connector_dev_groups[] = { ...@@ -250,15 +264,6 @@ static const struct attribute_group *connector_dev_groups[] = {
NULL NULL
}; };
/**
* drm_sysfs_connector_add - add a connector to sysfs
* @connector: connector to add
*
* Create a connector device in sysfs, along with its associated connector
* properties (so far, connection status, dpms, mode list and edid) and
* generate a hotplug event so userspace knows there's a new connector
* available.
*/
int drm_sysfs_connector_add(struct drm_connector *connector) int drm_sysfs_connector_add(struct drm_connector *connector)
{ {
struct drm_device *dev = connector->dev; struct drm_device *dev = connector->dev;
...@@ -285,19 +290,6 @@ int drm_sysfs_connector_add(struct drm_connector *connector) ...@@ -285,19 +290,6 @@ int drm_sysfs_connector_add(struct drm_connector *connector)
return 0; return 0;
} }
/**
* drm_sysfs_connector_remove - remove an connector device from sysfs
* @connector: connector to remove
*
* Remove @connector and its associated attributes from sysfs. Note that
* the device model core will take care of sending the "remove" uevent
* at this time, so we don't need to do it.
*
* Note:
* This routine should only be called if the connector was previously
* successfully registered. If @connector hasn't been registered yet,
* you'll likely see a panic somewhere deep in sysfs code when called.
*/
void drm_sysfs_connector_remove(struct drm_connector *connector) void drm_sysfs_connector_remove(struct drm_connector *connector)
{ {
if (!connector->kdev) if (!connector->kdev)
...@@ -333,20 +325,6 @@ static void drm_sysfs_release(struct device *dev) ...@@ -333,20 +325,6 @@ static void drm_sysfs_release(struct device *dev)
kfree(dev); kfree(dev);
} }
/**
* drm_sysfs_minor_alloc() - Allocate sysfs device for given minor
* @minor: minor to allocate sysfs device for
*
* This allocates a new sysfs device for @minor and returns it. The device is
* not registered nor linked. The caller has to use device_add() and
* device_del() to register and unregister it.
*
* Note that dev_get_drvdata() on the new device will return the minor.
* However, the device does not hold a ref-count to the minor nor to the
* underlying drm_device. This is unproblematic as long as you access the
* private data only in sysfs callbacks. device_del() disables those
* synchronously, so they cannot be called after you cleanup a minor.
*/
struct device *drm_sysfs_minor_alloc(struct drm_minor *minor) struct device *drm_sysfs_minor_alloc(struct drm_minor *minor)
{ {
const char *minor_str; const char *minor_str;
...@@ -384,15 +362,13 @@ struct device *drm_sysfs_minor_alloc(struct drm_minor *minor) ...@@ -384,15 +362,13 @@ struct device *drm_sysfs_minor_alloc(struct drm_minor *minor)
} }
/** /**
* drm_class_device_register - Register a struct device in the drm class. * drm_class_device_register - register new device with the DRM sysfs class
* @dev: device to register
* *
* @dev: pointer to struct device to register. * Registers a new &struct device within the DRM sysfs class. Essentially only
* * used by ttm to have a place for its global settings. Drivers should never use
* @dev should have all relevant members pre-filled with the exception * this.
* of the class member. In particular, the device_type member must
* be set.
*/ */
int drm_class_device_register(struct device *dev) int drm_class_device_register(struct device *dev)
{ {
if (!drm_class || IS_ERR(drm_class)) if (!drm_class || IS_ERR(drm_class))
...@@ -403,6 +379,14 @@ int drm_class_device_register(struct device *dev) ...@@ -403,6 +379,14 @@ int drm_class_device_register(struct device *dev)
} }
EXPORT_SYMBOL_GPL(drm_class_device_register); EXPORT_SYMBOL_GPL(drm_class_device_register);
/**
* drm_class_device_unregister - unregister device with the DRM sysfs class
* @dev: device to unregister
*
* Unregisters a &struct device from the DRM sysfs class. Essentially only used
* by ttm to have a place for its global settings. Drivers should never use
* this.
*/
void drm_class_device_unregister(struct device *dev) void drm_class_device_unregister(struct device *dev)
{ {
return device_unregister(dev); return device_unregister(dev);
......
...@@ -80,6 +80,7 @@ ...@@ -80,6 +80,7 @@
#include <drm/drm_file.h> #include <drm/drm_file.h>
#include <drm/drm_debugfs.h> #include <drm/drm_debugfs.h>
#include <drm/drm_ioctl.h> #include <drm/drm_ioctl.h>
#include <drm/drm_sysfs.h>
struct module; struct module;
...@@ -512,10 +513,6 @@ static inline int drm_device_is_unplugged(struct drm_device *dev) ...@@ -512,10 +513,6 @@ static inline int drm_device_is_unplugged(struct drm_device *dev)
* DMA quiscent + idle. DMA quiescent usually requires the hardware lock. * DMA quiscent + idle. DMA quiescent usually requires the hardware lock.
*/ */
/* sysfs support (drm_sysfs.c) */
extern void drm_sysfs_hotplug_event(struct drm_device *dev);
/*@}*/ /*@}*/
/* returns true if currently okay to sleep */ /* returns true if currently okay to sleep */
......
#ifndef _DRM_SYSFS_H_ #ifndef _DRM_SYSFS_H_
#define _DRM_SYSFS_H_ #define _DRM_SYSFS_H_
/** struct drm_device;
* This minimalistic include file is intended for users (read TTM) that struct device;
* don't want to include the full drmP.h file.
*/
int drm_class_device_register(struct device *dev); int drm_class_device_register(struct device *dev);
void drm_class_device_unregister(struct device *dev); void drm_class_device_unregister(struct device *dev);
void drm_sysfs_hotplug_event(struct drm_device *dev);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment