1ff768f59SMauro Carvalho Chehab.. SPDX-License-Identifier: GPL-2.0
2ff768f59SMauro Carvalho Chehab
3ff768f59SMauro Carvalho ChehabMedia Controller devices
4ff768f59SMauro Carvalho Chehab------------------------
5ff768f59SMauro Carvalho Chehab
6ff768f59SMauro Carvalho ChehabMedia Controller
7ff768f59SMauro Carvalho Chehab~~~~~~~~~~~~~~~~
8ff768f59SMauro Carvalho Chehab
9ff768f59SMauro Carvalho ChehabThe media controller userspace API is documented in
10ff768f59SMauro Carvalho Chehab:ref:`the Media Controller uAPI book <media_controller>`. This document focus
11ff768f59SMauro Carvalho Chehabon the kernel-side implementation of the media framework.
12ff768f59SMauro Carvalho Chehab
13ff768f59SMauro Carvalho ChehabAbstract media device model
14ff768f59SMauro Carvalho Chehab^^^^^^^^^^^^^^^^^^^^^^^^^^^
15ff768f59SMauro Carvalho Chehab
16ff768f59SMauro Carvalho ChehabDiscovering a device internal topology, and configuring it at runtime, is one
17ff768f59SMauro Carvalho Chehabof the goals of the media framework. To achieve this, hardware devices are
18ff768f59SMauro Carvalho Chehabmodelled as an oriented graph of building blocks called entities connected
19ff768f59SMauro Carvalho Chehabthrough pads.
20ff768f59SMauro Carvalho Chehab
21ff768f59SMauro Carvalho ChehabAn entity is a basic media hardware building block. It can correspond to
22ff768f59SMauro Carvalho Chehaba large variety of logical blocks such as physical hardware devices
23ff768f59SMauro Carvalho Chehab(CMOS sensor for instance), logical hardware devices (a building block
24ff768f59SMauro Carvalho Chehabin a System-on-Chip image processing pipeline), DMA channels or physical
25ff768f59SMauro Carvalho Chehabconnectors.
26ff768f59SMauro Carvalho Chehab
27ff768f59SMauro Carvalho ChehabA pad is a connection endpoint through which an entity can interact with
28ff768f59SMauro Carvalho Chehabother entities. Data (not restricted to video) produced by an entity
29ff768f59SMauro Carvalho Chehabflows from the entity's output to one or more entity inputs. Pads should
30ff768f59SMauro Carvalho Chehabnot be confused with physical pins at chip boundaries.
31ff768f59SMauro Carvalho Chehab
32ff768f59SMauro Carvalho ChehabA link is a point-to-point oriented connection between two pads, either
33ff768f59SMauro Carvalho Chehabon the same entity or on different entities. Data flows from a source
34ff768f59SMauro Carvalho Chehabpad to a sink pad.
35ff768f59SMauro Carvalho Chehab
36ff768f59SMauro Carvalho ChehabMedia device
37ff768f59SMauro Carvalho Chehab^^^^^^^^^^^^
38ff768f59SMauro Carvalho Chehab
399303c9d5SMauro Carvalho ChehabA media device is represented by a struct media_device
40ff768f59SMauro Carvalho Chehabinstance, defined in ``include/media/media-device.h``.
41ff768f59SMauro Carvalho ChehabAllocation of the structure is handled by the media device driver, usually by
42ff768f59SMauro Carvalho Chehabembedding the :c:type:`media_device` instance in a larger driver-specific
43ff768f59SMauro Carvalho Chehabstructure.
44ff768f59SMauro Carvalho Chehab
451d1d8669SSakari AilusDrivers initialise media device instances by calling
461d1d8669SSakari Ailus:c:func:`media_device_init()`. After initialising a media device instance, it is
471d1d8669SSakari Ailusregistered by calling :c:func:`__media_device_register()` via the macro
481d1d8669SSakari Ailus``media_device_register()`` and unregistered by calling
491d1d8669SSakari Ailus:c:func:`media_device_unregister()`. An initialised media device must be
501d1d8669SSakari Ailuseventually cleaned up by calling :c:func:`media_device_cleanup()`.
511d1d8669SSakari Ailus
521d1d8669SSakari AilusNote that it is not allowed to unregister a media device instance that was not
531d1d8669SSakari Ailuspreviously registered, or clean up a media device instance that was not
541d1d8669SSakari Ailuspreviously initialised.
55ff768f59SMauro Carvalho Chehab
56ff768f59SMauro Carvalho ChehabEntities
57ff768f59SMauro Carvalho Chehab^^^^^^^^
58ff768f59SMauro Carvalho Chehab
599303c9d5SMauro Carvalho ChehabEntities are represented by a struct media_entity
60ff768f59SMauro Carvalho Chehabinstance, defined in ``include/media/media-entity.h``. The structure is usually
61ff768f59SMauro Carvalho Chehabembedded into a higher-level structure, such as
62ff768f59SMauro Carvalho Chehab:c:type:`v4l2_subdev` or :c:type:`video_device`
63ff768f59SMauro Carvalho Chehabinstances, although drivers can allocate entities directly.
64ff768f59SMauro Carvalho Chehab
65ff768f59SMauro Carvalho ChehabDrivers initialize entity pads by calling
66ff768f59SMauro Carvalho Chehab:c:func:`media_entity_pads_init()`.
67ff768f59SMauro Carvalho Chehab
68ff768f59SMauro Carvalho ChehabDrivers register entities with a media device by calling
69ff768f59SMauro Carvalho Chehab:c:func:`media_device_register_entity()`
70ff768f59SMauro Carvalho Chehaband unregistered by calling
71ff768f59SMauro Carvalho Chehab:c:func:`media_device_unregister_entity()`.
72ff768f59SMauro Carvalho Chehab
73ff768f59SMauro Carvalho ChehabInterfaces
74ff768f59SMauro Carvalho Chehab^^^^^^^^^^
75ff768f59SMauro Carvalho Chehab
76ff768f59SMauro Carvalho ChehabInterfaces are represented by a
779303c9d5SMauro Carvalho Chehabstruct media_interface instance, defined in
78ff768f59SMauro Carvalho Chehab``include/media/media-entity.h``. Currently, only one type of interface is
79ff768f59SMauro Carvalho Chehabdefined: a device node. Such interfaces are represented by a
809303c9d5SMauro Carvalho Chehabstruct media_intf_devnode.
81ff768f59SMauro Carvalho Chehab
82ff768f59SMauro Carvalho ChehabDrivers initialize and create device node interfaces by calling
83ff768f59SMauro Carvalho Chehab:c:func:`media_devnode_create()`
84ff768f59SMauro Carvalho Chehaband remove them by calling:
85ff768f59SMauro Carvalho Chehab:c:func:`media_devnode_remove()`.
86ff768f59SMauro Carvalho Chehab
87ff768f59SMauro Carvalho ChehabPads
88ff768f59SMauro Carvalho Chehab^^^^
899303c9d5SMauro Carvalho ChehabPads are represented by a struct media_pad instance,
90ff768f59SMauro Carvalho Chehabdefined in ``include/media/media-entity.h``. Each entity stores its pads in
91ff768f59SMauro Carvalho Chehaba pads array managed by the entity driver. Drivers usually embed the array in
92ff768f59SMauro Carvalho Chehaba driver-specific structure.
93ff768f59SMauro Carvalho Chehab
94ff768f59SMauro Carvalho ChehabPads are identified by their entity and their 0-based index in the pads
95ff768f59SMauro Carvalho Chehabarray.
96ff768f59SMauro Carvalho Chehab
979303c9d5SMauro Carvalho ChehabBoth information are stored in the struct media_pad,
989303c9d5SMauro Carvalho Chehabmaking the struct media_pad pointer the canonical way
99ff768f59SMauro Carvalho Chehabto store and pass link references.
100ff768f59SMauro Carvalho Chehab
101ff768f59SMauro Carvalho ChehabPads have flags that describe the pad capabilities and state.
102ff768f59SMauro Carvalho Chehab
103ff768f59SMauro Carvalho Chehab``MEDIA_PAD_FL_SINK`` indicates that the pad supports sinking data.
104ff768f59SMauro Carvalho Chehab``MEDIA_PAD_FL_SOURCE`` indicates that the pad supports sourcing data.
105ff768f59SMauro Carvalho Chehab
106ff768f59SMauro Carvalho Chehab.. note::
107ff768f59SMauro Carvalho Chehab
108ff768f59SMauro Carvalho Chehab  One and only one of ``MEDIA_PAD_FL_SINK`` or ``MEDIA_PAD_FL_SOURCE`` must
109ff768f59SMauro Carvalho Chehab  be set for each pad.
110ff768f59SMauro Carvalho Chehab
111ff768f59SMauro Carvalho ChehabLinks
112ff768f59SMauro Carvalho Chehab^^^^^
113ff768f59SMauro Carvalho Chehab
1149303c9d5SMauro Carvalho ChehabLinks are represented by a struct media_link instance,
115ff768f59SMauro Carvalho Chehabdefined in ``include/media/media-entity.h``. There are two types of links:
116ff768f59SMauro Carvalho Chehab
117ff768f59SMauro Carvalho Chehab**1. pad to pad links**:
118ff768f59SMauro Carvalho Chehab
119ff768f59SMauro Carvalho ChehabAssociate two entities via their PADs. Each entity has a list that points
120ff768f59SMauro Carvalho Chehabto all links originating at or targeting any of its pads.
121ff768f59SMauro Carvalho ChehabA given link is thus stored twice, once in the source entity and once in
122ff768f59SMauro Carvalho Chehabthe target entity.
123ff768f59SMauro Carvalho Chehab
124ff768f59SMauro Carvalho ChehabDrivers create pad to pad links by calling:
125ff768f59SMauro Carvalho Chehab:c:func:`media_create_pad_link()` and remove with
126ff768f59SMauro Carvalho Chehab:c:func:`media_entity_remove_links()`.
127ff768f59SMauro Carvalho Chehab
128ff768f59SMauro Carvalho Chehab**2. interface to entity links**:
129ff768f59SMauro Carvalho Chehab
130ff768f59SMauro Carvalho ChehabAssociate one interface to a Link.
131ff768f59SMauro Carvalho Chehab
132ff768f59SMauro Carvalho ChehabDrivers create interface to entity links by calling:
133ff768f59SMauro Carvalho Chehab:c:func:`media_create_intf_link()` and remove with
134ff768f59SMauro Carvalho Chehab:c:func:`media_remove_intf_links()`.
135ff768f59SMauro Carvalho Chehab
136ff768f59SMauro Carvalho Chehab.. note::
137ff768f59SMauro Carvalho Chehab
138ff768f59SMauro Carvalho Chehab   Links can only be created after having both ends already created.
139ff768f59SMauro Carvalho Chehab
140ff768f59SMauro Carvalho ChehabLinks have flags that describe the link capabilities and state. The
141ff768f59SMauro Carvalho Chehabvalid values are described at :c:func:`media_create_pad_link()` and
142ff768f59SMauro Carvalho Chehab:c:func:`media_create_intf_link()`.
143ff768f59SMauro Carvalho Chehab
144ff768f59SMauro Carvalho ChehabGraph traversal
145ff768f59SMauro Carvalho Chehab^^^^^^^^^^^^^^^
146ff768f59SMauro Carvalho Chehab
147ff768f59SMauro Carvalho ChehabThe media framework provides APIs to iterate over entities in a graph.
148ff768f59SMauro Carvalho Chehab
149ff768f59SMauro Carvalho ChehabTo iterate over all entities belonging to a media device, drivers can use
150ff768f59SMauro Carvalho Chehabthe media_device_for_each_entity macro, defined in
151ff768f59SMauro Carvalho Chehab``include/media/media-device.h``.
152ff768f59SMauro Carvalho Chehab
153ff768f59SMauro Carvalho Chehab..  code-block:: c
154ff768f59SMauro Carvalho Chehab
155ff768f59SMauro Carvalho Chehab    struct media_entity *entity;
156ff768f59SMauro Carvalho Chehab
157ff768f59SMauro Carvalho Chehab    media_device_for_each_entity(entity, mdev) {
158ff768f59SMauro Carvalho Chehab    // entity will point to each entity in turn
159ff768f59SMauro Carvalho Chehab    ...
160ff768f59SMauro Carvalho Chehab    }
161ff768f59SMauro Carvalho Chehab
162ff768f59SMauro Carvalho ChehabDrivers might also need to iterate over all entities in a graph that can be
163ff768f59SMauro Carvalho Chehabreached only through enabled links starting at a given entity. The media
164ff768f59SMauro Carvalho Chehabframework provides a depth-first graph traversal API for that purpose.
165ff768f59SMauro Carvalho Chehab
166ff768f59SMauro Carvalho Chehab.. note::
167ff768f59SMauro Carvalho Chehab
168ff768f59SMauro Carvalho Chehab   Graphs with cycles (whether directed or undirected) are **NOT**
169ff768f59SMauro Carvalho Chehab   supported by the graph traversal API. To prevent infinite loops, the graph
170ff768f59SMauro Carvalho Chehab   traversal code limits the maximum depth to ``MEDIA_ENTITY_ENUM_MAX_DEPTH``,
171ff768f59SMauro Carvalho Chehab   currently defined as 16.
172ff768f59SMauro Carvalho Chehab
173ff768f59SMauro Carvalho ChehabDrivers initiate a graph traversal by calling
174ff768f59SMauro Carvalho Chehab:c:func:`media_graph_walk_start()`
175ff768f59SMauro Carvalho Chehab
176ff768f59SMauro Carvalho ChehabThe graph structure, provided by the caller, is initialized to start graph
177ff768f59SMauro Carvalho Chehabtraversal at the given entity.
178ff768f59SMauro Carvalho Chehab
179ff768f59SMauro Carvalho ChehabDrivers can then retrieve the next entity by calling
180ff768f59SMauro Carvalho Chehab:c:func:`media_graph_walk_next()`
181ff768f59SMauro Carvalho Chehab
182ff768f59SMauro Carvalho ChehabWhen the graph traversal is complete the function will return ``NULL``.
183ff768f59SMauro Carvalho Chehab
184ff768f59SMauro Carvalho ChehabGraph traversal can be interrupted at any moment. No cleanup function call
185ff768f59SMauro Carvalho Chehabis required and the graph structure can be freed normally.
186ff768f59SMauro Carvalho Chehab
187ff768f59SMauro Carvalho ChehabHelper functions can be used to find a link between two given pads, or a pad
188ff768f59SMauro Carvalho Chehabconnected to another pad through an enabled link
189bb85604bSLaurent Pinchart(:c:func:`media_entity_find_link()`, :c:func:`media_pad_remote_pad_first()`,
19003b28286SLaurent Pinchart:c:func:`media_entity_remote_source_pad_unique()` and
19103b28286SLaurent Pinchart:c:func:`media_pad_remote_pad_unique()`).
192ff768f59SMauro Carvalho Chehab
193ff768f59SMauro Carvalho ChehabUse count and power handling
194ff768f59SMauro Carvalho Chehab^^^^^^^^^^^^^^^^^^^^^^^^^^^^
195ff768f59SMauro Carvalho Chehab
196ff768f59SMauro Carvalho ChehabDue to the wide differences between drivers regarding power management
197ff768f59SMauro Carvalho Chehabneeds, the media controller does not implement power management. However,
1989303c9d5SMauro Carvalho Chehabthe struct media_entity includes a ``use_count``
199ff768f59SMauro Carvalho Chehabfield that media drivers
200ff768f59SMauro Carvalho Chehabcan use to track the number of users of every entity for power management
201ff768f59SMauro Carvalho Chehabneeds.
202ff768f59SMauro Carvalho Chehab
203ff768f59SMauro Carvalho ChehabThe :c:type:`media_entity<media_entity>`.\ ``use_count`` field is owned by
204ff768f59SMauro Carvalho Chehabmedia drivers and must not be
205ff768f59SMauro Carvalho Chehabtouched by entity drivers. Access to the field must be protected by the
206ff768f59SMauro Carvalho Chehab:c:type:`media_device`.\ ``graph_mutex`` lock.
207ff768f59SMauro Carvalho Chehab
208ff768f59SMauro Carvalho ChehabLinks setup
209ff768f59SMauro Carvalho Chehab^^^^^^^^^^^
210ff768f59SMauro Carvalho Chehab
211ff768f59SMauro Carvalho ChehabLink properties can be modified at runtime by calling
212ff768f59SMauro Carvalho Chehab:c:func:`media_entity_setup_link()`.
213ff768f59SMauro Carvalho Chehab
214ff768f59SMauro Carvalho ChehabPipelines and media streams
215ff768f59SMauro Carvalho Chehab^^^^^^^^^^^^^^^^^^^^^^^^^^^
216ff768f59SMauro Carvalho Chehab
217b558ce56STomi ValkeinenA media stream is a stream of pixels or metadata originating from one or more
218b558ce56STomi Valkeinensource devices (such as a sensors) and flowing through media entity pads
219b558ce56STomi Valkeinentowards the final sinks. The stream can be modified on the route by the
220b558ce56STomi Valkeinendevices (e.g. scaling or pixel format conversions), or it can be split into
221b558ce56STomi Valkeinenmultiple branches, or multiple branches can be merged.
222b558ce56STomi Valkeinen
223b558ce56STomi ValkeinenA media pipeline is a set of media streams which are interdependent. This
224b558ce56STomi Valkeineninterdependency can be caused by the hardware (e.g. configuration of a second
225b558ce56STomi Valkeinenstream cannot be changed if the first stream has been enabled) or by the driver
226b558ce56STomi Valkeinendue to the software design. Most commonly a media pipeline consists of a single
227b558ce56STomi Valkeinenstream which does not branch.
228b558ce56STomi Valkeinen
229ff768f59SMauro Carvalho ChehabWhen starting streaming, drivers must notify all entities in the pipeline to
230ff768f59SMauro Carvalho Chehabprevent link states from being modified during streaming by calling
231ff768f59SMauro Carvalho Chehab:c:func:`media_pipeline_start()`.
232ff768f59SMauro Carvalho Chehab
233ae219872SLaurent PinchartThe function will mark all the pads which are part of the pipeline as streaming.
234ff768f59SMauro Carvalho Chehab
235*b5163545SLaurent PinchartThe struct media_pipeline instance pointed to by the pipe argument will be
236*b5163545SLaurent Pinchartstored in every pad in the pipeline. Drivers should embed the struct
237*b5163545SLaurent Pinchartmedia_pipeline in higher-level pipeline structures and can then access the
238*b5163545SLaurent Pinchartpipeline through the struct media_pad pipe field.
239ff768f59SMauro Carvalho Chehab
240ff768f59SMauro Carvalho ChehabCalls to :c:func:`media_pipeline_start()` can be nested.
241ff768f59SMauro Carvalho ChehabThe pipeline pointer must be identical for all nested calls to the function.
242ff768f59SMauro Carvalho Chehab
243ff768f59SMauro Carvalho Chehab:c:func:`media_pipeline_start()` may return an error. In that case,
244ff768f59SMauro Carvalho Chehabit will clean up any of the changes it did by itself.
245ff768f59SMauro Carvalho Chehab
246ff768f59SMauro Carvalho ChehabWhen stopping the stream, drivers must notify the entities with
247ff768f59SMauro Carvalho Chehab:c:func:`media_pipeline_stop()`.
248ff768f59SMauro Carvalho Chehab
249ff768f59SMauro Carvalho ChehabIf multiple calls to :c:func:`media_pipeline_start()` have been
250ff768f59SMauro Carvalho Chehabmade the same number of :c:func:`media_pipeline_stop()` calls
251ff768f59SMauro Carvalho Chehabare required to stop streaming.
252ff768f59SMauro Carvalho ChehabThe :c:type:`media_entity`.\ ``pipe`` field is reset to ``NULL`` on the last
253ff768f59SMauro Carvalho Chehabnested stop call.
254ff768f59SMauro Carvalho Chehab
255ff768f59SMauro Carvalho ChehabLink configuration will fail with ``-EBUSY`` by default if either end of the
256ff768f59SMauro Carvalho Chehablink is a streaming entity. Links that can be modified while streaming must
257ff768f59SMauro Carvalho Chehabbe marked with the ``MEDIA_LNK_FL_DYNAMIC`` flag.
258ff768f59SMauro Carvalho Chehab
259ff768f59SMauro Carvalho ChehabIf other operations need to be disallowed on streaming entities (such as
260ff768f59SMauro Carvalho Chehabchanging entities configuration parameters) drivers can explicitly check the
261ff768f59SMauro Carvalho Chehabmedia_entity stream_count field to find out if an entity is streaming. This
262ff768f59SMauro Carvalho Chehaboperation must be done with the media_device graph_mutex held.
263ff768f59SMauro Carvalho Chehab
264ff768f59SMauro Carvalho ChehabLink validation
265ff768f59SMauro Carvalho Chehab^^^^^^^^^^^^^^^
266ff768f59SMauro Carvalho Chehab
267ff768f59SMauro Carvalho ChehabLink validation is performed by :c:func:`media_pipeline_start()`
268ff768f59SMauro Carvalho Chehabfor any entity which has sink pads in the pipeline. The
269ff768f59SMauro Carvalho Chehab:c:type:`media_entity`.\ ``link_validate()`` callback is used for that
270ff768f59SMauro Carvalho Chehabpurpose. In ``link_validate()`` callback, entity driver should check
271ff768f59SMauro Carvalho Chehabthat the properties of the source pad of the connected entity and its own
272ff768f59SMauro Carvalho Chehabsink pad match. It is up to the type of the entity (and in the end, the
273ff768f59SMauro Carvalho Chehabproperties of the hardware) what matching actually means.
274ff768f59SMauro Carvalho Chehab
275ff768f59SMauro Carvalho ChehabSubsystems should facilitate link validation by providing subsystem specific
276ff768f59SMauro Carvalho Chehabhelper functions to provide easy access for commonly needed information, and
277ff768f59SMauro Carvalho Chehabin the end provide a way to use driver-specific callbacks.
278ff768f59SMauro Carvalho Chehab
279ff768f59SMauro Carvalho ChehabMedia Controller Device Allocator API
280ff768f59SMauro Carvalho Chehab^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
281ff768f59SMauro Carvalho Chehab
282ff768f59SMauro Carvalho ChehabWhen the media device belongs to more than one driver, the shared media
283ff768f59SMauro Carvalho Chehabdevice is allocated with the shared struct device as the key for look ups.
284ff768f59SMauro Carvalho Chehab
285ff768f59SMauro Carvalho ChehabThe shared media device should stay in registered state until the last
286ff768f59SMauro Carvalho Chehabdriver unregisters it. In addition, the media device should be released when
287ff768f59SMauro Carvalho Chehaball the references are released. Each driver gets a reference to the media
288ff768f59SMauro Carvalho Chehabdevice during probe, when it allocates the media device. If media device is
289ff768f59SMauro Carvalho Chehabalready allocated, the allocate API bumps up the refcount and returns the
290ff768f59SMauro Carvalho Chehabexisting media device. The driver puts the reference back in its disconnect
291ff768f59SMauro Carvalho Chehabroutine when it calls :c:func:`media_device_delete()`.
292ff768f59SMauro Carvalho Chehab
293ff768f59SMauro Carvalho ChehabThe media device is unregistered and cleaned up from the kref put handler to
294ff768f59SMauro Carvalho Chehabensure that the media device stays in registered state until the last driver
295ff768f59SMauro Carvalho Chehabunregisters the media device.
296ff768f59SMauro Carvalho Chehab
297ff768f59SMauro Carvalho Chehab**Driver Usage**
298ff768f59SMauro Carvalho Chehab
299ff768f59SMauro Carvalho ChehabDrivers should use the appropriate media-core routines to manage the shared
300ff768f59SMauro Carvalho Chehabmedia device life-time handling the two states:
301ff768f59SMauro Carvalho Chehab1. allocate -> register -> delete
302ff768f59SMauro Carvalho Chehab2. get reference to already registered device -> delete
303ff768f59SMauro Carvalho Chehab
304ff768f59SMauro Carvalho Chehabcall :c:func:`media_device_delete()` routine to make sure the shared media
305ff768f59SMauro Carvalho Chehabdevice delete is handled correctly.
306ff768f59SMauro Carvalho Chehab
307ff768f59SMauro Carvalho Chehab**driver probe:**
308ff768f59SMauro Carvalho ChehabCall :c:func:`media_device_usb_allocate()` to allocate or get a reference
309ff768f59SMauro Carvalho ChehabCall :c:func:`media_device_register()`, if media devnode isn't registered
310ff768f59SMauro Carvalho Chehab
311ff768f59SMauro Carvalho Chehab**driver disconnect:**
312ff768f59SMauro Carvalho ChehabCall :c:func:`media_device_delete()` to free the media_device. Freeing is
313ff768f59SMauro Carvalho Chehabhandled by the kref put handler.
314ff768f59SMauro Carvalho Chehab
315ff768f59SMauro Carvalho ChehabAPI Definitions
316ff768f59SMauro Carvalho Chehab^^^^^^^^^^^^^^^
317ff768f59SMauro Carvalho Chehab
318ff768f59SMauro Carvalho Chehab.. kernel-doc:: include/media/media-device.h
319ff768f59SMauro Carvalho Chehab
320ff768f59SMauro Carvalho Chehab.. kernel-doc:: include/media/media-devnode.h
321ff768f59SMauro Carvalho Chehab
322ff768f59SMauro Carvalho Chehab.. kernel-doc:: include/media/media-entity.h
323ff768f59SMauro Carvalho Chehab
324ff768f59SMauro Carvalho Chehab.. kernel-doc:: include/media/media-request.h
325ff768f59SMauro Carvalho Chehab
326ff768f59SMauro Carvalho Chehab.. kernel-doc:: include/media/media-dev-allocator.h
327