docs: driver-model: Remove obsolete device class documentation
None of this is valid since v2.5.69. Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> Link: https://lore.kernel.org/r/20210225091124.686078-1-geert+renesas@glider.be Signed-off-by: Jonathan Corbet <corbet@lwn.net>
This commit is contained in:
parent
a746fe32cd
commit
1364c67875
|
@ -1,149 +0,0 @@
|
||||||
==============
|
|
||||||
Device Classes
|
|
||||||
==============
|
|
||||||
|
|
||||||
Introduction
|
|
||||||
~~~~~~~~~~~~
|
|
||||||
A device class describes a type of device, like an audio or network
|
|
||||||
device. The following device classes have been identified:
|
|
||||||
|
|
||||||
<Insert List of Device Classes Here>
|
|
||||||
|
|
||||||
|
|
||||||
Each device class defines a set of semantics and a programming interface
|
|
||||||
that devices of that class adhere to. Device drivers are the
|
|
||||||
implementation of that programming interface for a particular device on
|
|
||||||
a particular bus.
|
|
||||||
|
|
||||||
Device classes are agnostic with respect to what bus a device resides
|
|
||||||
on.
|
|
||||||
|
|
||||||
|
|
||||||
Programming Interface
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
The device class structure looks like::
|
|
||||||
|
|
||||||
|
|
||||||
typedef int (*devclass_add)(struct device *);
|
|
||||||
typedef void (*devclass_remove)(struct device *);
|
|
||||||
|
|
||||||
See the kerneldoc for the struct class.
|
|
||||||
|
|
||||||
A typical device class definition would look like::
|
|
||||||
|
|
||||||
struct device_class input_devclass = {
|
|
||||||
.name = "input",
|
|
||||||
.add_device = input_add_device,
|
|
||||||
.remove_device = input_remove_device,
|
|
||||||
};
|
|
||||||
|
|
||||||
Each device class structure should be exported in a header file so it
|
|
||||||
can be used by drivers, extensions and interfaces.
|
|
||||||
|
|
||||||
Device classes are registered and unregistered with the core using::
|
|
||||||
|
|
||||||
int devclass_register(struct device_class * cls);
|
|
||||||
void devclass_unregister(struct device_class * cls);
|
|
||||||
|
|
||||||
|
|
||||||
Devices
|
|
||||||
~~~~~~~
|
|
||||||
As devices are bound to drivers, they are added to the device class
|
|
||||||
that the driver belongs to. Before the driver model core, this would
|
|
||||||
typically happen during the driver's probe() callback, once the device
|
|
||||||
has been initialized. It now happens after the probe() callback
|
|
||||||
finishes from the core.
|
|
||||||
|
|
||||||
The device is enumerated in the class. Each time a device is added to
|
|
||||||
the class, the class's devnum field is incremented and assigned to the
|
|
||||||
device. The field is never decremented, so if the device is removed
|
|
||||||
from the class and re-added, it will receive a different enumerated
|
|
||||||
value.
|
|
||||||
|
|
||||||
The class is allowed to create a class-specific structure for the
|
|
||||||
device and store it in the device's class_data pointer.
|
|
||||||
|
|
||||||
There is no list of devices in the device class. Each driver has a
|
|
||||||
list of devices that it supports. The device class has a list of
|
|
||||||
drivers of that particular class. To access all of the devices in the
|
|
||||||
class, iterate over the device lists of each driver in the class.
|
|
||||||
|
|
||||||
|
|
||||||
Device Drivers
|
|
||||||
~~~~~~~~~~~~~~
|
|
||||||
Device drivers are added to device classes when they are registered
|
|
||||||
with the core. A driver specifies the class it belongs to by setting
|
|
||||||
the struct device_driver::devclass field.
|
|
||||||
|
|
||||||
|
|
||||||
sysfs directory structure
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
There is a top-level sysfs directory named 'class'.
|
|
||||||
|
|
||||||
Each class gets a directory in the class directory, along with two
|
|
||||||
default subdirectories::
|
|
||||||
|
|
||||||
class/
|
|
||||||
`-- input
|
|
||||||
|-- devices
|
|
||||||
`-- drivers
|
|
||||||
|
|
||||||
|
|
||||||
Drivers registered with the class get a symlink in the drivers/ directory
|
|
||||||
that points to the driver's directory (under its bus directory)::
|
|
||||||
|
|
||||||
class/
|
|
||||||
`-- input
|
|
||||||
|-- devices
|
|
||||||
`-- drivers
|
|
||||||
`-- usb:usb_mouse -> ../../../bus/drivers/usb_mouse/
|
|
||||||
|
|
||||||
|
|
||||||
Each device gets a symlink in the devices/ directory that points to the
|
|
||||||
device's directory in the physical hierarchy::
|
|
||||||
|
|
||||||
class/
|
|
||||||
`-- input
|
|
||||||
|-- devices
|
|
||||||
| `-- 1 -> ../../../root/pci0/00:1f.0/usb_bus/00:1f.2-1:0/
|
|
||||||
`-- drivers
|
|
||||||
|
|
||||||
|
|
||||||
Exporting Attributes
|
|
||||||
~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
struct devclass_attribute {
|
|
||||||
struct attribute attr;
|
|
||||||
ssize_t (*show)(struct device_class *, char * buf, size_t count, loff_t off);
|
|
||||||
ssize_t (*store)(struct device_class *, const char * buf, size_t count, loff_t off);
|
|
||||||
};
|
|
||||||
|
|
||||||
Class drivers can export attributes using the DEVCLASS_ATTR macro that works
|
|
||||||
similarly to the DEVICE_ATTR macro for devices. For example, a definition
|
|
||||||
like this::
|
|
||||||
|
|
||||||
static DEVCLASS_ATTR(debug,0644,show_debug,store_debug);
|
|
||||||
|
|
||||||
is equivalent to declaring::
|
|
||||||
|
|
||||||
static devclass_attribute devclass_attr_debug;
|
|
||||||
|
|
||||||
The bus driver can add and remove the attribute from the class's
|
|
||||||
sysfs directory using::
|
|
||||||
|
|
||||||
int devclass_create_file(struct device_class *, struct devclass_attribute *);
|
|
||||||
void devclass_remove_file(struct device_class *, struct devclass_attribute *);
|
|
||||||
|
|
||||||
In the example above, the file will be named 'debug' in placed in the
|
|
||||||
class's directory in sysfs.
|
|
||||||
|
|
||||||
|
|
||||||
Interfaces
|
|
||||||
~~~~~~~~~~
|
|
||||||
There may exist multiple mechanisms for accessing the same device of a
|
|
||||||
particular class type. Device interfaces describe these mechanisms.
|
|
||||||
|
|
||||||
When a device is added to a device class, the core attempts to add it
|
|
||||||
to every interface that is registered with the device class.
|
|
|
@ -7,7 +7,6 @@ Driver Model
|
||||||
|
|
||||||
binding
|
binding
|
||||||
bus
|
bus
|
||||||
class
|
|
||||||
design-patterns
|
design-patterns
|
||||||
device
|
device
|
||||||
devres
|
devres
|
||||||
|
|
Loading…
Reference in New Issue