1
0
Fork 0

docs: driver-model: convert docs to ReST and rename to *.rst

Convert the various documents at the driver-model, preparing
them to be part of the driver-api book.

The conversion is actually:
  - add blank lines and identation in order to identify paragraphs;
  - fix tables markups;
  - add some lists markups;
  - mark literal blocks;
  - adjust title markups.

At its new index.rst, let's add a :orphan: while this is not linked to
the main index.rst file, in order to avoid build warnings.

Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Acked-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> # ice
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
alistair/sunxi64-5.4-dsi
Mauro Carvalho Chehab 2019-06-18 17:53:27 -03:00 committed by Greg Kroah-Hartman
parent 58cb346c71
commit 4489f161b7
18 changed files with 489 additions and 441 deletions

View File

@ -399,7 +399,7 @@ symbol:
will pass the struct gpio_chip* for the chip to all IRQ callbacks, so the
callbacks need to embed the gpio_chip in its state container and obtain a
pointer to the container using container_of().
(See Documentation/driver-model/design-patterns.txt)
(See Documentation/driver-model/design-patterns.rst)
- gpiochip_irqchip_add_nested(): adds a nested cascaded irqchip to a gpiochip,
as discussed above regarding different types of cascaded irqchips. The

View File

@ -1,5 +1,6 @@
==============
Driver Binding
==============
Driver binding is the process of associating a device with a device
driver that can control it. Bus drivers have typically handled this
@ -95,4 +96,3 @@ of the driver is decremented. All symlinks between the two are removed.
When a driver is removed, the list of devices that it supports is
iterated over, and the driver's remove callback is called for each
one. The device is removed from that list and the symlinks removed.

View File

@ -1,5 +1,6 @@
=========
Bus Types
=========
Definition
~~~~~~~~~~
@ -13,7 +14,7 @@ Declaration
Each bus type in the kernel (PCI, USB, etc) should declare one static
object of this type. They must initialize the name field, and may
optionally initialize the match callback.
optionally initialize the match callback::
struct bus_type pci_bus_type = {
.name = "pci",
@ -66,9 +67,10 @@ struct device_drivers, respectively. Bus drivers are free to use the
lists as they please, but conversion to the bus-specific type may be
necessary.
The LDM core provides helper functions for iterating over each list.
The LDM core provides helper functions for iterating over each list::
int bus_for_each_dev(struct bus_type * bus, struct device * start, void * data,
int bus_for_each_dev(struct bus_type * bus, struct device * start,
void * data,
int (*fn)(struct device *, void *));
int bus_for_each_drv(struct bus_type * bus, struct device_driver * start,
@ -87,14 +89,14 @@ sysfs
There is a top-level directory named 'bus'.
Each bus gets a directory in the bus directory, along with two default
directories:
directories::
/sys/bus/pci/
|-- devices
`-- drivers
Drivers registered with the bus get a directory in the bus's drivers
directory:
directory::
/sys/bus/pci/
|-- devices
@ -106,7 +108,7 @@ directory:
Each device that is discovered on a bus of that type gets a symlink in
the bus's devices directory to the device's directory in the physical
hierarchy:
hierarchy::
/sys/bus/pci/
|-- devices
@ -118,6 +120,9 @@ hierarchy:
Exporting Attributes
~~~~~~~~~~~~~~~~~~~~
::
struct bus_attribute {
struct attribute attr;
ssize_t (*show)(struct bus_type *, char * buf);
@ -126,18 +131,16 @@ struct bus_attribute {
Bus drivers can export attributes using the BUS_ATTR_RW macro that works
similarly to the DEVICE_ATTR_RW macro for devices. For example, a
definition like this:
definition like this::
static BUS_ATTR_RW(debug);
is equivalent to declaring:
is equivalent to declaring::
static bus_attribute bus_attr_debug;
This can then be used to add and remove the attribute from the bus's
sysfs directory using:
sysfs directory using::
int bus_create_file(struct bus_type *, struct bus_attribute *);
void bus_remove_file(struct bus_type *, struct bus_attribute *);

View File

@ -1,6 +1,6 @@
==============
Device Classes
==============
Introduction
~~~~~~~~~~~~
@ -21,7 +21,7 @@ on.
Programming Interface
~~~~~~~~~~~~~~~~~~~~~
The device class structure looks like:
The device class structure looks like::
typedef int (*devclass_add)(struct device *);
@ -29,7 +29,7 @@ typedef void (*devclass_remove)(struct device *);
See the kerneldoc for the struct class.
A typical device class definition would look like:
A typical device class definition would look like::
struct device_class input_devclass = {
.name = "input",
@ -40,7 +40,7 @@ struct device_class input_devclass = {
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:
Device classes are registered and unregistered with the core using::
int devclass_register(struct device_class * cls);
void devclass_unregister(struct device_class * cls);
@ -81,7 +81,7 @@ 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:
default subdirectories::
class/
`-- input
@ -90,7 +90,7 @@ default subdirectories:
Drivers registered with the class get a symlink in the drivers/ directory
that points to the driver's directory (under its bus directory):
that points to the driver's directory (under its bus directory)::
class/
`-- input
@ -100,7 +100,7 @@ that points to the driver's directory (under its bus directory):
Each device gets a symlink in the devices/ directory that points to the
device's directory in the physical hierarchy:
device's directory in the physical hierarchy::
class/
`-- input
@ -111,6 +111,9 @@ device's directory in the physical hierarchy:
Exporting Attributes
~~~~~~~~~~~~~~~~~~~~
::
struct devclass_attribute {
struct attribute attr;
ssize_t (*show)(struct device_class *, char * buf, size_t count, loff_t off);
@ -119,16 +122,16 @@ struct devclass_attribute {
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:
like this::
static DEVCLASS_ATTR(debug,0644,show_debug,store_debug);
is equivalent to declaring:
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:
sysfs directory using::
int devclass_create_file(struct device_class *, struct devclass_attribute *);
void devclass_remove_file(struct device_class *, struct devclass_attribute *);
@ -144,4 +147,3 @@ 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.

View File

@ -1,6 +1,6 @@
=============================
Device Driver Design Patterns
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
=============================
This document describes a few common design patterns found in device drivers.
It is likely that subsystem maintainers will ask driver developers to
@ -19,7 +19,7 @@ that the device the driver binds to will appear in several instances. This
means that the probe() function and all callbacks need to be reentrant.
The most common way to achieve this is to use the state container design
pattern. It usually has this form:
pattern. It usually has this form::
struct foo {
spinlock_t lock; /* Example member */
@ -43,7 +43,7 @@ Of course it is then necessary to always pass this instance of the
state around to all functions that need access to the state and its members.
For example, if the driver is registering an interrupt handler, you would
pass around a pointer to struct foo like this:
pass around a pointer to struct foo like this::
static irqreturn_t foo_handler(int irq, void *arg)
{
@ -66,7 +66,7 @@ your interrupt handler.
2. container_of()
~~~~~~~~~~~~~~~~~
Continuing on the above example we add an offloaded work:
Continuing on the above example we add an offloaded work::
struct foo {
spinlock_t lock;

View File

@ -1,6 +1,6 @@
==========================
The Basic Device Structure
~~~~~~~~~~~~~~~~~~~~~~~~~~
==========================
See the kerneldoc for the struct device.
@ -8,7 +8,7 @@ See the kerneldoc for the struct device.
Programming Interface
~~~~~~~~~~~~~~~~~~~~~
The bus driver that discovers the device uses this to register the
device with the core:
device with the core::
int device_register(struct device * dev);
@ -20,7 +20,7 @@ The bus should initialize the following fields:
- bus
A device is removed from the core when its reference count goes to
0. The reference count can be adjusted using:
0. The reference count can be adjusted using::
struct device * get_device(struct device * dev);
void put_device(struct device * dev);
@ -29,7 +29,7 @@ get_device() will return a pointer to the struct device passed to it
if the reference is not already 0 (if it's in the process of being
removed already).
A driver can access the lock in the device structure using:
A driver can access the lock in the device structure using::
void lock_device(struct device * dev);
void unlock_device(struct device * dev);
@ -37,6 +37,9 @@ void unlock_device(struct device * dev);
Attributes
~~~~~~~~~~
::
struct device_attribute {
struct attribute attr;
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
@ -54,18 +57,18 @@ As explained in Documentation/kobject.txt, device attributes must be
created before the KOBJ_ADD uevent is generated. The only way to realize
that is by defining an attribute group.
Attributes are declared using a macro called DEVICE_ATTR:
Attributes are declared using a macro called DEVICE_ATTR::
#define DEVICE_ATTR(name,mode,show,store)
Example:
Example:::
static DEVICE_ATTR(type, 0444, show_type, NULL);
static DEVICE_ATTR(power, 0644, show_power, store_power);
This declares two structures of type struct device_attribute with respective
names 'dev_attr_type' and 'dev_attr_power'. These two attributes can be
organized as follows into a group:
organized as follows into a group::
static struct attribute *dev_attrs[] = {
&dev_attr_type.attr,
@ -83,7 +86,7 @@ static const struct attribute_group *dev_attr_groups[] = {
};
This array of groups can then be associated with a device by setting the
group pointer in struct device before device_register() is invoked:
group pointer in struct device before device_register() is invoked::
dev->groups = dev_attr_groups;
device_register(dev);

View File

@ -1,3 +1,4 @@
================================
Devres - Managed Device Resource
================================
@ -5,6 +6,7 @@ Tejun Heo <teheo@suse.de>
First draft 10 January 2007
.. contents
1. Intro : Huh? Devres?
2. Devres : Devres in a nutshell
@ -58,7 +60,7 @@ using dma_alloc_coherent(). The managed version is called
dmam_alloc_coherent(). It is identical to dma_alloc_coherent() except
for the DMA memory allocated using it is managed and will be
automatically released on driver detach. Implementation looks like
the following.
the following::
struct dma_devres {
size_t size;
@ -98,7 +100,7 @@ If a driver uses dmam_alloc_coherent(), the area is guaranteed to be
freed whether initialization fails half-way or the device gets
detached. If most resources are acquired using managed interface, a
driver can have much simpler init and exit code. Init path basically
looks like the following.
looks like the following::
my_init_one()
{
@ -119,7 +121,7 @@ looks like the following.
return register_to_upper_layer(d);
}
And exit path,
And exit path::
my_remove_one()
{
@ -146,7 +148,7 @@ necessary before moving to the managed devm_* calls.
Devres entries can be grouped using devres group. When a group is
released, all contained normal devres entries and properly nested
groups are released. One usage is to rollback series of acquired
resources on failure. For example,
resources on failure. For example::
if (!devres_open_group(dev, NULL, GFP_KERNEL))
return -ENOMEM;
@ -172,7 +174,7 @@ like above are usually useful in midlayer driver (e.g. libata core
layer) where interface function shouldn't have side effect on failure.
For LLDs, just returning error code suffices in most cases.
Each group is identified by void *id. It can either be explicitly
Each group is identified by `void *id`. It can either be explicitly
specified by @id argument to devres_open_group() or automatically
created by passing NULL as @id as in the above example. In both
cases, devres_open_group() returns the group's id. The returned id
@ -180,7 +182,7 @@ can be passed to other devres functions to select the target group.
If NULL is given to those functions, the latest open group is
selected.
For example, you can do something like the following.
For example, you can do something like the following::
int my_midlayer_create_something()
{

View File

@ -1,5 +1,6 @@
==============
Device Drivers
==============
See the kerneldoc for the struct device_driver.
@ -26,7 +27,7 @@ Declaration
As stated above, struct device_driver objects are statically
allocated. Below is an example declaration of the eepro100
driver. This declaration is hypothetical only; it relies on the driver
being converted completely to the new model.
being converted completely to the new model::
static struct device_driver eepro100_driver = {
.name = "eepro100",
@ -49,7 +50,7 @@ completely bus-specific. Defining them as bus-specific entities would
sacrifice type-safety, so we keep bus-specific structures around.
Bus-specific drivers should include a generic struct device_driver in
the definition of the bus-specific driver. Like this:
the definition of the bus-specific driver. Like this::
struct pci_driver {
const struct pci_device_id *id_table;
@ -57,7 +58,7 @@ struct pci_driver {
};
A definition that included bus-specific fields would look like
(using the eepro100 driver again):
(using the eepro100 driver again)::
static struct pci_driver eepro100_driver = {
.id_table = eepro100_pci_tbl,
@ -77,6 +78,8 @@ even a bit ugly. So far, it's the best way we've found to do what we want...
Registration
~~~~~~~~~~~~
::
int driver_register(struct device_driver *drv);
The driver registers the structure on startup. For drivers that have
@ -113,7 +116,7 @@ Access
~~~~~~
Once the object has been registered, it may access the common fields of
the object, like the lock and the list of devices.
the object, like the lock and the list of devices::
int driver_for_each_dev(struct device_driver *drv, void *data,
int (*callback)(struct device *dev, void *data));
@ -142,6 +145,8 @@ supports.
Callbacks
~~~~~~~~~
::
int (*probe) (struct device *dev);
The probe() entry is called in task context, with the bus's rwsem locked
@ -162,7 +167,7 @@ the driver to that device.
A driver's probe() may return a negative errno value to indicate that
the driver did not bind to this device, in which case it should have
released all resources it allocated.
released all resources it allocated::
int (*remove) (struct device *dev);
@ -176,11 +181,11 @@ not. It should free any resources allocated specifically for the
device; i.e. anything in the device's driver_data field.
If the device is still present, it should quiesce the device and place
it into a supported low-power state.
it into a supported low-power state::
int (*suspend) (struct device *dev, pm_message_t state);
suspend is called to put the device in a low power state.
suspend is called to put the device in a low power state::
int (*resume) (struct device *dev);
@ -189,6 +194,9 @@ Resume is used to bring a device back from a low power state.
Attributes
~~~~~~~~~~
::
struct driver_attribute {
struct attribute attr;
ssize_t (*show)(struct device_driver *driver, char *buf);
@ -200,16 +208,16 @@ Drivers can declare attributes using a DRIVER_ATTR_RW and DRIVER_ATTR_RO
macro that works identically to the DEVICE_ATTR_RW and DEVICE_ATTR_RO
macros.
Example:
Example::
DRIVER_ATTR_RW(debug);
This is equivalent to declaring:
This is equivalent to declaring::
struct driver_attribute driver_attr_debug;
This can then be used to add and remove the attribute from the
driver's directory using:
driver's directory using::
int driver_create_file(struct device_driver *, const struct driver_attribute *);
void driver_remove_file(struct device_driver *, const struct driver_attribute *);

View File

@ -0,0 +1,26 @@
:orphan:
============
Driver Model
============
.. toctree::
:maxdepth: 1
binding
bus
class
design-patterns
device
devres
driver
overview
platform
porting
.. only:: subproject and html
Indices
=======
* :ref:`genindex`

View File

@ -1,4 +1,6 @@
=============================
The Linux Kernel Device Model
=============================
Patrick Mochel <mochel@digitalimplant.org>
@ -41,7 +43,7 @@ data structure. These fields must still be accessed by the bus layers,
and sometimes by the device-specific drivers.
Other bus layers are encouraged to do what has been done for the PCI layer.
struct pci_dev now looks like this:
struct pci_dev now looks like this::
struct pci_dev {
...
@ -80,7 +82,7 @@ easy. This has been accomplished by implementing a special purpose virtual
file system named sysfs.
Almost all mainstream Linux distros mount this filesystem automatically; you
can see some variation of the following in the output of the "mount" command:
can see some variation of the following in the output of the "mount" command::
$ mount
...
@ -89,15 +91,15 @@ none on /sys type sysfs (rw,noexec,nosuid,nodev)
$
The auto-mounting of sysfs is typically accomplished by an entry similar to
the following in the /etc/fstab file:
the following in the /etc/fstab file::
none /sys sysfs defaults 0 0
or something similar in the /lib/init/fstab file on Debian-based systems:
or something similar in the /lib/init/fstab file on Debian-based systems::
none /sys sysfs nodev,noexec,nosuid 0 0
If sysfs is not automatically mounted, you can always do it manually with:
If sysfs is not automatically mounted, you can always do it manually with::
# mount -t sysfs sysfs /sys
@ -120,4 +122,3 @@ device-specific data or tunable interfaces.
More information about the sysfs directory layout can be found in
the other documents in this directory and in the file
Documentation/filesystems/sysfs.txt.

View File

@ -1,5 +1,7 @@
============================
Platform Devices and Drivers
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
============================
See <linux/platform_device.h> for the driver model interface to the
platform bus: platform_device, and platform_driver. This pseudo-bus
is used to connect devices on busses with minimal infrastructure,
@ -19,7 +21,7 @@ be connected through a segment of some other kind of bus; but its
registers will still be directly addressable.
Platform devices are given a name, used in driver binding, and a
list of resources such as addresses and IRQs.
list of resources such as addresses and IRQs::
struct platform_device {
const char *name;
@ -35,7 +37,7 @@ Platform drivers
Platform drivers follow the standard driver model convention, where
discovery/enumeration is handled outside the drivers, and drivers
provide probe() and remove() methods. They support power management
and shutdown notifications using the standard conventions.
and shutdown notifications using the standard conventions::
struct platform_driver {
int (*probe)(struct platform_device *);
@ -52,19 +54,19 @@ Note that probe() should in general verify that the specified device hardware
actually exists; sometimes platform setup code can't be sure. The probing
can use device resources, including clocks, and device platform_data.
Platform drivers register themselves the normal way:
Platform drivers register themselves the normal way::
int platform_driver_register(struct platform_driver *drv);
Or, in common situations where the device is known not to be hot-pluggable,
the probe() routine can live in an init section to reduce the driver's
runtime memory footprint:
runtime memory footprint::
int platform_driver_probe(struct platform_driver *drv,
int (*probe)(struct platform_device *))
Kernel modules can be composed of several platform drivers. The platform core
provides helpers to register and unregister an array of drivers:
provides helpers to register and unregister an array of drivers::
int __platform_register_drivers(struct platform_driver * const *drivers,
unsigned int count, struct module *owner);
@ -73,7 +75,7 @@ provides helpers to register and unregister an array of drivers:
If one of the drivers fails to register, all drivers registered up to that
point will be unregistered in reverse order. Note that there is a convenience
macro that passes THIS_MODULE as owner parameter:
macro that passes THIS_MODULE as owner parameter::
#define platform_register_drivers(drivers, count)
@ -81,7 +83,7 @@ macro that passes THIS_MODULE as owner parameter:
Device Enumeration
~~~~~~~~~~~~~~~~~~
As a rule, platform specific (and often board-specific) setup code will
register platform devices:
register platform devices::
int platform_device_register(struct platform_device *pdev);
@ -133,14 +135,14 @@ tend to already have "normal" modes, such as ones using device nodes that
were created by PNP or by platform device setup.
None the less, there are some APIs to support such legacy drivers. Avoid
using these calls except with such hotplug-deficient drivers.
using these calls except with such hotplug-deficient drivers::
struct platform_device *platform_device_alloc(
const char *name, int id);
You can use platform_device_alloc() to dynamically allocate a device, which
you will then initialize with resources and platform_device_register().
A better solution is usually:
A better solution is usually::
struct platform_device *platform_device_register_simple(
const char *name, int id,

View File

@ -1,5 +1,6 @@
=======================================
Porting Drivers to the New Driver Model
=======================================
Patrick Mochel
@ -8,7 +9,7 @@ Patrick Mochel
Overview
Please refer to Documentation/driver-model/*.txt for definitions of
Please refer to `Documentation/driver-model/*.rst` for definitions of
various driver types and concepts.
Most of the work of porting devices drivers to the new model happens
@ -22,7 +23,7 @@ objects can replace fields in the bus-specific objects.
The generic objects must be registered with the driver model core. By
doing so, they will exported via the sysfs filesystem. sysfs can be
mounted by doing
mounted by doing::
# mount -t sysfs sysfs /sys
@ -35,7 +36,7 @@ Step 0: Read include/linux/device.h for object and function definitions.
Step 1: Registering the bus driver.
- Define a struct bus_type for the bus driver.
- Define a struct bus_type for the bus driver::
struct bus_type pci_bus_type = {
.name = "pci",
@ -43,8 +44,9 @@ struct bus_type pci_bus_type = {
- Register the bus type.
This should be done in the initialization function for the bus type,
which is usually the module_init(), or equivalent, function.
which is usually the module_init(), or equivalent, function::
static int __init pci_driver_init(void)
{
@ -55,7 +57,7 @@ subsys_initcall(pci_driver_init);
The bus type may be unregistered (if the bus driver may be compiled
as a module) by doing:
as a module) by doing::
bus_unregister(&pci_bus_type);
@ -65,19 +67,19 @@ subsys_initcall(pci_driver_init);
Other code may wish to reference the bus type, so declare it in a
shared header file and export the symbol.
From include/linux/pci.h:
From include/linux/pci.h::
extern struct bus_type pci_bus_type;
From file the above code appears in:
From file the above code appears in::
EXPORT_SYMBOL(pci_bus_type);
- This will cause the bus to show up in /sys/bus/pci/ with two
subdirectories: 'devices' and 'drivers'.
subdirectories: 'devices' and 'drivers'::
# tree -d /sys/bus/pci/
/sys/bus/pci/
@ -92,7 +94,7 @@ struct device represents a single device. It mainly contains metadata
describing the relationship the device has to other entities.
- Embed a struct device in the bus-specific device type.
- Embed a struct device in the bus-specific device type::
struct pci_dev {
@ -104,7 +106,7 @@ struct pci_dev {
It is recommended that the generic device not be the first item in
the struct to discourage programmers from doing mindless casts
between the object types. Instead macros, or inline functions,
should be created to convert from the generic object type.
should be created to convert from the generic object type::
#define to_pci_dev(n) container_of(n, struct pci_dev, dev)
@ -163,11 +165,11 @@ static inline struct pci_dev * to_pci_dev(struct kobject * kobj)
- Register the device.
Once the generic device has been initialized, it can be registered
with the driver model core by doing:
with the driver model core by doing::
device_register(&dev->dev);
It can later be unregistered by doing:
It can later be unregistered by doing::
device_unregister(&dev->dev);
@ -181,7 +183,7 @@ static inline struct pci_dev * to_pci_dev(struct kobject * kobj)
When the device is registered, a directory in sysfs is created.
The PCI tree in sysfs looks like:
The PCI tree in sysfs looks like::
/sys/devices/pci0/
|-- 00:00.0
@ -204,7 +206,7 @@ static inline struct pci_dev * to_pci_dev(struct kobject * kobj)
`-- 00:1f.5
Also, symlinks are created in the bus's 'devices' directory
that point to the device's directory in the physical hierarchy.
that point to the device's directory in the physical hierarchy::
/sys/bus/pci/devices/
|-- 00:00.0 -> ../../../devices/pci0/00:00.0
@ -231,7 +233,7 @@ of operations that the driver model core may call.
- Embed a struct device_driver in the bus-specific driver.
Just like with devices, do something like:
Just like with devices, do something like::
struct pci_driver {
...
@ -248,14 +250,14 @@ struct pci_driver {
- Register the driver.
After the generic driver has been initialized, call
After the generic driver has been initialized, call::
driver_register(&drv->driver);
to register the driver with the core.
When the driver is unregistered from the bus, unregister it from the
core by doing:
core by doing::
driver_unregister(&drv->driver);
@ -266,7 +268,7 @@ struct pci_driver {
- Sysfs representation.
Drivers are exported via sysfs in their bus's 'driver's directory.
For example:
For example::
/sys/bus/pci/drivers/
|-- 3c59x
@ -286,7 +288,7 @@ parameters.
It would be difficult and tedious to force every driver on a bus to
simultaneously convert their drivers to generic format. Instead, the
bus driver should define single instances of the generic methods that
forward call to the bus-specific drivers. For instance:
forward call to the bus-specific drivers. For instance::
static int pci_device_remove(struct device * dev)
@ -304,7 +306,7 @@ static int pci_device_remove(struct device * dev)
The generic driver should be initialized with these methods before it
is registered.
is registered::
/* initialize common driver fields */
drv->driver.name = drv->name;
@ -336,7 +338,7 @@ The format of the device IDs, and the semantics for comparing them are
bus-specific, so the generic model does attempt to generalize them.
Instead, a bus may supply a method in struct bus_type that does the
comparison:
comparison::
int (*match)(struct device * dev, struct device_driver * drv);
@ -355,7 +357,7 @@ claimed by a driver.
When a device is successfully bound to a driver, device->driver is
set, the device is added to a per-driver list of devices, and a
symlink is created in the driver's sysfs directory that points to the
device's physical directory:
device's physical directory::
/sys/bus/pci/drivers/
|-- 3c59x
@ -387,7 +389,7 @@ environment variables, including
A bus driver may also supply additional parameters for userspace to
consume. To do this, a bus must implement the 'hotplug' method in
struct bus_type:
struct bus_type::
int (*hotplug) (struct device *dev, char **envp,
int num_envp, char *buffer, int buffer_size);
@ -407,7 +409,7 @@ type. This includes all devices on all instances of that bus type.
An internal list that the bus uses may be removed, in favor of using
this one.
The core provides an iterator to access these devices.
The core provides an iterator to access these devices::
int bus_for_each_dev(struct bus_type * bus, struct device * start,
void * data, int (*fn)(struct device *, void *));
@ -419,7 +421,7 @@ struct bus_type also contains a list of all drivers registered with
it. An internal list of drivers that the bus driver maintains may
be removed in favor of using the generic one.
The drivers may be iterated over, like devices:
The drivers may be iterated over, like devices::
int bus_for_each_drv(struct bus_type * bus, struct device_driver * start,
void * data, int (*fn)(struct device_driver *, void *));
@ -444,4 +446,3 @@ to remove the bus-specific ones and favor the generic ones. Note
though, that this will likely mean fixing up all the drivers that
reference the bus-specific fields (though those should all be 1-line
changes).

View File

@ -103,7 +103,7 @@ id_table an array of NULL terminated EISA id strings,
(driver_data).
driver a generic driver, such as described in
Documentation/driver-model/driver.txt. Only .name,
Documentation/driver-model/driver.rst. Only .name,
.probe and .remove members are mandatory.
=============== ====================================================
@ -152,7 +152,7 @@ state set of flags indicating the state of the device. Current
flags are EISA_CONFIG_ENABLED and EISA_CONFIG_FORCED.
res set of four 256 bytes I/O regions allocated to this device
dma_mask DMA mask set from the parent device.
dev generic device (see Documentation/driver-model/device.txt)
dev generic device (see Documentation/driver-model/device.rst)
======== ============================================================
You can get the 'struct eisa_device' from 'struct device' using the

View File

@ -89,7 +89,7 @@ increase the chances of your change being accepted.
console. Excessive logging can seriously affect system performance.
* Use devres functions whenever possible to allocate resources. For rationale
and supported functions, please see Documentation/driver-model/devres.txt.
and supported functions, please see Documentation/driver-model/devres.rst.
If a function is not supported by devres, consider using devm_add_action().
* If the driver has a detect function, make sure it is silent. Debug messages

View File

@ -5,7 +5,7 @@
* Copyright (c) 2002-3 Patrick Mochel
* Copyright (c) 2002-3 Open Source Development Labs
*
* Please see Documentation/driver-model/platform.txt for more
* Please see Documentation/driver-model/platform.rst for more
* information.
*/

View File

@ -41,7 +41,7 @@ MODULE_PARM_DESC(mask, "GPIO channel mask.");
/*
* FIXME: convert this singleton driver to use the state container
* design pattern, see Documentation/driver-model/design-patterns.txt
* design pattern, see Documentation/driver-model/design-patterns.rst
*/
static struct cs5535_gpio_chip {
struct gpio_chip chip;

View File

@ -2237,7 +2237,7 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent)
struct ice_hw *hw;
int err;
/* this driver uses devres, see Documentation/driver-model/devres.txt */
/* this driver uses devres, see Documentation/driver-model/devres.rst */
err = pcim_enable_device(pdev);
if (err)
return err;

View File

@ -2,7 +2,7 @@
/// functions. Values allocated using the devm_functions are freed when
/// the device is detached, and thus the use of the standard freeing
/// function would cause a double free.
/// See Documentation/driver-model/devres.txt for more information.
/// See Documentation/driver-model/devres.rst for more information.
///
/// A difficulty of detecting this problem is that the standard freeing
/// function might be called from a different function than the one