Commit 68735902 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

docs: sound: writing-an-alsa-driver.rst: get rid of :c:type

the :c:type shouldn't be used with structs with Sphinx 3,
as the C domain there uses .. c:struct for structs.

As we have the automarkup extension, let's just get rid of
all :c:type as a whole, as those will be automagically
marked as such.

This solves a bunch of warnings with Sphinx 3, like those:

	.../Documentation/sound/kernel-api/writing-an-alsa-driver.rst:490: WARNING: Unparseable C cross-reference: 'calling snd_card_free'
	Invalid C declaration: Expected end of definition. [error at 8]
	  calling snd_card_free
	  --------^
	.../Documentation/sound/kernel-api/writing-an-alsa-driver.rst:3328: WARNING: Unparseable C cross-reference: 'snd_rawmidi_transmit*'
	Invalid C declaration: Expected end of definition. [error at 20]
	  snd_rawmidi_transmit*
	  --------------------^
	.../Documentation/sound/kernel-api/writing-an-alsa-driver.rst:3928: WARNING: Unparseable C cross-reference: 'copy_from/to_user'
	Invalid C declaration: Expected end of definition. [error at 9]
	  copy_from/to_user
	  ---------^
Reviewed-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 6624d64d
......@@ -194,7 +194,7 @@ The minimum flow for PCI soundcards is as follows:
- create ``remove`` callback.
- create a :c:type:`struct pci_driver <pci_driver>` structure
- create a struct pci_driver structure
containing the three pointers above.
- create an ``init`` function just calling the
......@@ -487,7 +487,7 @@ The destructor, remove callback, simply releases the card instance. Then
the ALSA middle layer will release all the attached components
automatically.
It would be typically just :c:func:`calling snd_card_free()`:
It would be typically just calling :c:func:`snd_card_free()`:
::
......@@ -560,16 +560,15 @@ return the card instance. The extra_size argument is used to allocate
card->private_data for the chip-specific data. Note that these data are
allocated by :c:func:`snd_card_new()`.
The first argument, the pointer of struct :c:type:`struct device
<device>`, specifies the parent device. For PCI devices, typically
``&pci->`` is passed there.
The first argument, the pointer of struct device, specifies the parent
device. For PCI devices, typically ``&pci->`` is passed there.
Components
----------
After the card is created, you can attach the components (devices) to
the card instance. In an ALSA driver, a component is represented as a
:c:type:`struct snd_device <snd_device>` object. A component
struct snd_device object. A component
can be a PCM instance, a control interface, a raw MIDI interface, etc.
Each such instance has one component entry.
......@@ -628,7 +627,7 @@ argument of :c:func:`snd_card_new()`, i.e.
err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
sizeof(struct mychip), &card);
:c:type:`struct mychip <mychip>` is the type of the chip record.
struct mychip is the type of the chip record.
In return, the allocated record can be accessed as
......@@ -890,7 +889,7 @@ functions. These resources must be released in the destructor
function (see below).
Now assume that the PCI device has an I/O port with 8 bytes and an
interrupt. Then :c:type:`struct mychip <mychip>` will have the
interrupt. Then struct mychip will have the
following fields:
::
......@@ -1094,7 +1093,7 @@ PCI Entries
-----------
So far, so good. Let's finish the missing PCI stuff. At first, we need a
:c:type:`struct pci_device_id <pci_device_id>` table for
struct pci_device_id table for
this chipset. It's a table of PCI vendor/device ID number, and some
masks.
......@@ -1110,19 +1109,17 @@ For example,
};
MODULE_DEVICE_TABLE(pci, snd_mychip_ids);
The first and second fields of the :c:type:`struct pci_device_id
<pci_device_id>` structure are the vendor and device IDs. If you
have no reason to filter the matching devices, you can leave the
remaining fields as above. The last field of the :c:type:`struct
pci_device_id <pci_device_id>` struct contains private data
for this entry. You can specify any value here, for example, to define
specific operations for supported device IDs. Such an example is found
in the intel8x0 driver.
The first and second fields of the struct pci_device_id are the vendor
and device IDs. If you have no reason to filter the matching devices, you can
leave the remaining fields as above. The last field of the
struct pci_device_id contains private data for this entry. You can specify
any value here, for example, to define specific operations for supported
device IDs. Such an example is found in the intel8x0 driver.
The last entry of this list is the terminator. You must specify this
all-zero entry.
Then, prepare the :c:type:`struct pci_driver <pci_driver>`
Then, prepare the struct pci_driver
record:
::
......@@ -1439,8 +1436,8 @@ corresponding argument.
If a chip supports multiple playbacks or captures, you can specify more
numbers, but they must be handled properly in open/close, etc.
callbacks. When you need to know which substream you are referring to,
then it can be obtained from :c:type:`struct snd_pcm_substream
<snd_pcm_substream>` data passed to each callback as follows:
then it can be obtained from struct snd_pcm_substream data passed to each
callback as follows:
::
......@@ -1639,10 +1636,9 @@ In the sections below, important records are explained.
Hardware Description
~~~~~~~~~~~~~~~~~~~~
The hardware descriptor (:c:type:`struct snd_pcm_hardware
<snd_pcm_hardware>`) contains the definitions of the fundamental
hardware configuration. Above all, you'll need to define this in the
`PCM open callback`_. Note that the runtime instance holds the copy of
The hardware descriptor (struct snd_pcm_hardware) contains the definitions of
the fundamental hardware configuration. Above all, you'll need to define this
in the `PCM open callback`_. Note that the runtime instance holds the copy of
the descriptor, not the pointer to the existing descriptor. That is,
in the open callback, you can modify the copied descriptor
(``runtime->hw``) as you need. For example, if the maximum number of
......@@ -1800,14 +1796,13 @@ Running Status
~~~~~~~~~~~~~~
The running status can be referred via ``runtime->status``. This is
the pointer to the :c:type:`struct snd_pcm_mmap_status
<snd_pcm_mmap_status>` record. For example, you can get the current
the pointer to the struct snd_pcm_mmap_status record.
For example, you can get the current
DMA hardware pointer via ``runtime->status->hw_ptr``.
The DMA application pointer can be referred via ``runtime->control``,
which points to the :c:type:`struct snd_pcm_mmap_control
<snd_pcm_mmap_control>` record. However, accessing directly to
this value is not recommended.
which points to the struct snd_pcm_mmap_control record.
However, accessing directly to this value is not recommended.
Private Data
~~~~~~~~~~~~
......@@ -1843,8 +1838,8 @@ error number such as ``-EINVAL``. To choose an appropriate error
number, it is advised to check what value other parts of the kernel
return when the same kind of request fails.
The callback function takes at least the argument with :c:type:`struct
snd_pcm_substream <snd_pcm_substream>` pointer. To retrieve the chip
The callback function takes at least the argument with
struct snd_pcm_substream pointer. To retrieve the chip
record from the given substream instance, you can use the following
macro.
......@@ -2313,10 +2308,10 @@ non-atomic contexts. For example, the function
:c:func:`snd_pcm_period_elapsed()` is called typically from the
interrupt handler. But, if you set up the driver to use a threaded
interrupt handler, this call can be in non-atomic context, too. In such
a case, you can set ``nonatomic`` filed of :c:type:`struct snd_pcm
<snd_pcm>` object after creating it. When this flag is set, mutex
and rwsem are used internally in the PCM core instead of spin and
rwlocks, so that you can call all PCM functions safely in a non-atomic
a case, you can set ``nonatomic`` filed of struct snd_pcm object
after creating it. When this flag is set, mutex and rwsem are used internally
in the PCM core instead of spin and rwlocks, so that you can call all PCM
functions safely in a non-atomic
context.
Constraints
......@@ -2357,8 +2352,7 @@ There are many different constraints. Look at ``sound/pcm.h`` for a
complete list. You can even define your own constraint rules. For
example, let's suppose my_chip can manage a substream of 1 channel if
and only if the format is ``S16_LE``, otherwise it supports any format
specified in the :c:type:`struct snd_pcm_hardware
<snd_pcm_hardware>` structure (or in any other
specified in struct snd_pcm_hardware> (or in any other
constraint_list). You can build a rule like this:
::
......@@ -2467,7 +2461,7 @@ Definition of Controls
To create a new control, you need to define the following three
callbacks: ``info``, ``get`` and ``put``. Then, define a
:c:type:`struct snd_kcontrol_new <snd_kcontrol_new>` record, such as:
struct snd_kcontrol_new record, such as:
::
......@@ -2602,8 +2596,8 @@ info callback
~~~~~~~~~~~~~
The ``info`` callback is used to get detailed information on this
control. This must store the values of the given :c:type:`struct
snd_ctl_elem_info <snd_ctl_elem_info>` object. For example,
control. This must store the values of the given
struct snd_ctl_elem_info object. For example,
for a boolean control with a single element:
::
......@@ -2774,13 +2768,11 @@ In the simplest way, you can do like this:
if (err < 0)
return err;
where ``my_control`` is the :c:type:`struct snd_kcontrol_new
<snd_kcontrol_new>` object defined above, and chip is the object
pointer to be passed to kcontrol->private_data which can be referred
to in callbacks.
where ``my_control`` is the struct snd_kcontrol_new object defined above,
and chip is the object pointer to be passed to kcontrol->private_data which
can be referred to in callbacks.
:c:func:`snd_ctl_new1()` allocates a new :c:type:`struct
snd_kcontrol <snd_kcontrol>` instance, and
:c:func:`snd_ctl_new1()` allocates a new struct snd_kcontrol instance, and
:c:func:`snd_ctl_add()` assigns the given control component to the
card.
......@@ -2797,10 +2789,9 @@ can call :c:func:`snd_ctl_notify()`. For example,
This function takes the card pointer, the event-mask, and the control id
pointer for the notification. The event-mask specifies the types of
notification, for example, in the above example, the change of control
values is notified. The id pointer is the pointer of :c:type:`struct
snd_ctl_elem_id <snd_ctl_elem_id>` to be notified. You can
find some examples in ``es1938.c`` or ``es1968.c`` for hardware volume
interrupts.
values is notified. The id pointer is the pointer of struct snd_ctl_elem_id
to be notified. You can find some examples in ``es1938.c`` or ``es1968.c``
for hardware volume interrupts.
Metadata
--------
......@@ -2915,9 +2906,8 @@ with an ``ac97_bus_ops_t`` record with callback functions.
The bus record is shared among all belonging ac97 instances.
And then call :c:func:`snd_ac97_mixer()` with an :c:type:`struct
snd_ac97_template <snd_ac97_template>` record together with
the bus pointer created above.
And then call :c:func:`snd_ac97_mixer()` with an struct snd_ac97_template
record together with the bus pointer created above.
::
......@@ -3118,11 +3108,10 @@ devices on the card, set ``MPU401_INFO_IRQ_HOOK`` (see
Usually, the port address corresponds to the command port and port + 1
corresponds to the data port. If not, you may change the ``cport``
field of :c:type:`struct snd_mpu401 <snd_mpu401>` manually afterward.
However, :c:type:`struct snd_mpu401 <snd_mpu401>` pointer is
field of struct snd_mpu401 manually afterward.
However, struct snd_mpu401 pointer is
not returned explicitly by :c:func:`snd_mpu401_uart_new()`. You
need to cast ``rmidi->private_data`` to :c:type:`struct snd_mpu401
<snd_mpu401>` explicitly,
need to cast ``rmidi->private_data`` to struct snd_mpu401 explicitly,
::
......@@ -3772,7 +3761,7 @@ For creating the SG-buffer handler, call
:c:func:`snd_pcm_set_managed_buffer_all()` with
``SNDRV_DMA_TYPE_DEV_SG`` in the PCM constructor like other PCI
pre-allocator. You need to pass ``&pci->dev``, where pci is
the :c:type:`struct pci_dev <pci_dev>` pointer of the chip as
the struct pci_dev pointer of the chip as
well.
::
......
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