aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-01-13 14:46:37 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2016-01-13 14:46:37 -0500
commit77a76b04d2be1c45b8fd746b7ef754525029340c (patch)
treeef5db67c07d538a43d160847acefe80f3c049dba /include
parent50ae833e471fe1a1a906a0342bdaa690e69fcc19 (diff)
parentbe0270ec89e6b9b49de7e533dd1f3a89ad34d205 (diff)
Merge tag 'media/v4.5-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull second batch of media updates from Mauro Carvalho Chehab: "This is the second part of the media patches. It contains the media controller next generation patches, with is the result of one year of discussions and development. It also contains patches to enable media controller support at the DVB subsystem. The goal is to improve the media controller to allow proper support for other types of Video4Linux devices (radio and TV ones) and to extend the media controller functionality to allow it to be used by other subsystems like DVB, ALSA and IIO. In order to use the new functionality, a new ioctl is needed (MEDIA_IOC_G_TOPOLOGY). As we're still discussing how to pack the struct fields of this ioctl in order to avoid compat32 issues, I decided to add a patch at the end of this series commenting out the new ioctl, in order to postpone the addition of the new ioctl to the next Kernel version (4.6). With that, no userspace visible changes should happen at the media controller API, as the existing ioctls are untouched. Yet, it helps DVB, ALSA and IIO developers to develop and test the patches adding media controller support there, as the core will contain all required internal changes to allow adding support for devices that belong to those subsystems" * tag 'media/v4.5-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (177 commits) [media] Postpone the addition of MEDIA_IOC_G_TOPOLOGY [media] mxl111sf: Add a tuner entity [media] dvbdev: create links on devices with multiple frontends [media] media-entitiy: add a function to create multiple links [media] dvb-usb-v2: postpone removal of media_device [media] dvbdev: Add RF connector if needed [media] dvbdev: remove two dead functions if !CONFIG_MEDIA_CONTROLLER_DVB [media] call media_device_init() before registering the V4L2 device [media] uapi/media.h: Use u32 for the number of graph objects [media] media-entity: don't sleep at media_device_register_entity() [media] media-entity: increase max number of PADs [media] media-entity.h: document the remaining functions [media] media-device.h: use just one u32 counter for object ID [media] media-entity.h fix documentation for several parameters [media] DocBook: document media_entity_graph_walk_cleanup() [media] move documentation to the header files [media] media: Move MEDIA_ENTITY_MAX_PADS from media-entity.h to media-entity.c [media] media: Remove pre-allocated entity enumeration bitmap [media] staging: v4l: davinci_vpbe: Use the new media graph walk interface [media] staging: v4l: omap4iss: Use the new media graph walk interface ...
Diffstat (limited to 'include')
-rw-r--r--include/media/media-device.h469
-rw-r--r--include/media/media-devnode.h54
-rw-r--r--include/media/media-entity.h904
-rw-r--r--include/media/tuner.h8
-rw-r--r--include/media/v4l2-dev.h1
-rw-r--r--include/uapi/linux/media.h228
6 files changed, 1581 insertions, 83 deletions
diff --git a/include/media/media-device.h b/include/media/media-device.h
index 6e6db78f1ee2..d3855898c3fc 100644
--- a/include/media/media-device.h
+++ b/include/media/media-device.h
@@ -30,6 +30,238 @@
30#include <media/media-devnode.h> 30#include <media/media-devnode.h>
31#include <media/media-entity.h> 31#include <media/media-entity.h>
32 32
33/**
34 * DOC: Media Controller
35 *
36 * The media controller userspace API is documented in DocBook format in
37 * Documentation/DocBook/media/v4l/media-controller.xml. This document focus
38 * on the kernel-side implementation of the media framework.
39 *
40 * * Abstract media device model:
41 *
42 * Discovering a device internal topology, and configuring it at runtime, is one
43 * of the goals of the media framework. To achieve this, hardware devices are
44 * modelled as an oriented graph of building blocks called entities connected
45 * through pads.
46 *
47 * An entity is a basic media hardware building block. It can correspond to
48 * a large variety of logical blocks such as physical hardware devices
49 * (CMOS sensor for instance), logical hardware devices (a building block
50 * in a System-on-Chip image processing pipeline), DMA channels or physical
51 * connectors.
52 *
53 * A pad is a connection endpoint through which an entity can interact with
54 * other entities. Data (not restricted to video) produced by an entity
55 * flows from the entity's output to one or more entity inputs. Pads should
56 * not be confused with physical pins at chip boundaries.
57 *
58 * A link is a point-to-point oriented connection between two pads, either
59 * on the same entity or on different entities. Data flows from a source
60 * pad to a sink pad.
61 *
62 *
63 * * Media device:
64 *
65 * A media device is represented by a struct &media_device instance, defined in
66 * include/media/media-device.h. Allocation of the structure is handled by the
67 * media device driver, usually by embedding the &media_device instance in a
68 * larger driver-specific structure.
69 *
70 * Drivers register media device instances by calling
71 * __media_device_register() via the macro media_device_register()
72 * and unregistered by calling
73 * media_device_unregister().
74 *
75 * * Entities, pads and links:
76 *
77 * - Entities
78 *
79 * Entities are represented by a struct &media_entity instance, defined in
80 * include/media/media-entity.h. The structure is usually embedded into a
81 * higher-level structure, such as a v4l2_subdev or video_device instance,
82 * although drivers can allocate entities directly.
83 *
84 * Drivers initialize entity pads by calling
85 * media_entity_pads_init().
86 *
87 * Drivers register entities with a media device by calling
88 * media_device_register_entity()
89 * and unregistred by calling
90 * media_device_unregister_entity().
91 *
92 * - Interfaces
93 *
94 * Interfaces are represented by a struct &media_interface instance, defined in
95 * include/media/media-entity.h. Currently, only one type of interface is
96 * defined: a device node. Such interfaces are represented by a struct
97 * &media_intf_devnode.
98 *
99 * Drivers initialize and create device node interfaces by calling
100 * media_devnode_create()
101 * and remove them by calling:
102 * media_devnode_remove().
103 *
104 * - Pads
105 *
106 * Pads are represented by a struct &media_pad instance, defined in
107 * include/media/media-entity.h. Each entity stores its pads in a pads array
108 * managed by the entity driver. Drivers usually embed the array in a
109 * driver-specific structure.
110 *
111 * Pads are identified by their entity and their 0-based index in the pads
112 * array.
113 * Both information are stored in the &media_pad structure, making the
114 * &media_pad pointer the canonical way to store and pass link references.
115 *
116 * Pads have flags that describe the pad capabilities and state.
117 *
118 * %MEDIA_PAD_FL_SINK indicates that the pad supports sinking data.
119 * %MEDIA_PAD_FL_SOURCE indicates that the pad supports sourcing data.
120 *
121 * NOTE: One and only one of %MEDIA_PAD_FL_SINK and %MEDIA_PAD_FL_SOURCE must
122 * be set for each pad.
123 *
124 * - Links
125 *
126 * Links are represented by a struct &media_link instance, defined in
127 * include/media/media-entity.h. There are two types of links:
128 *
129 * 1. pad to pad links:
130 *
131 * Associate two entities via their PADs. Each entity has a list that points
132 * to all links originating at or targeting any of its pads.
133 * A given link is thus stored twice, once in the source entity and once in
134 * the target entity.
135 *
136 * Drivers create pad to pad links by calling:
137 * media_create_pad_link() and remove with media_entity_remove_links().
138 *
139 * 2. interface to entity links:
140 *
141 * Associate one interface to a Link.
142 *
143 * Drivers create interface to entity links by calling:
144 * media_create_intf_link() and remove with media_remove_intf_links().
145 *
146 * NOTE:
147 *
148 * Links can only be created after having both ends already created.
149 *
150 * Links have flags that describe the link capabilities and state. The
151 * valid values are described at media_create_pad_link() and
152 * media_create_intf_link().
153 *
154 * Graph traversal:
155 *
156 * The media framework provides APIs to iterate over entities in a graph.
157 *
158 * To iterate over all entities belonging to a media device, drivers can use
159 * the media_device_for_each_entity macro, defined in
160 * include/media/media-device.h.
161 *
162 * struct media_entity *entity;
163 *
164 * media_device_for_each_entity(entity, mdev) {
165 * // entity will point to each entity in turn
166 * ...
167 * }
168 *
169 * Drivers might also need to iterate over all entities in a graph that can be
170 * reached only through enabled links starting at a given entity. The media
171 * framework provides a depth-first graph traversal API for that purpose.
172 *
173 * Note that graphs with cycles (whether directed or undirected) are *NOT*
174 * supported by the graph traversal API. To prevent infinite loops, the graph
175 * traversal code limits the maximum depth to MEDIA_ENTITY_ENUM_MAX_DEPTH,
176 * currently defined as 16.
177 *
178 * Drivers initiate a graph traversal by calling
179 * media_entity_graph_walk_start()
180 *
181 * The graph structure, provided by the caller, is initialized to start graph
182 * traversal at the given entity.
183 *
184 * Drivers can then retrieve the next entity by calling
185 * media_entity_graph_walk_next()
186 *
187 * When the graph traversal is complete the function will return NULL.
188 *
189 * Graph traversal can be interrupted at any moment. No cleanup function call
190 * is required and the graph structure can be freed normally.
191 *
192 * Helper functions can be used to find a link between two given pads, or a pad
193 * connected to another pad through an enabled link
194 * media_entity_find_link() and media_entity_remote_pad()
195 *
196 * Use count and power handling:
197 *
198 * Due to the wide differences between drivers regarding power management
199 * needs, the media controller does not implement power management. However,
200 * the &media_entity structure includes a use_count field that media drivers
201 * can use to track the number of users of every entity for power management
202 * needs.
203 *
204 * The &media_entity.@use_count field is owned by media drivers and must not be
205 * touched by entity drivers. Access to the field must be protected by the
206 * &media_device.@graph_mutex lock.
207 *
208 * Links setup:
209 *
210 * Link properties can be modified at runtime by calling
211 * media_entity_setup_link()
212 *
213 * Pipelines and media streams:
214 *
215 * When starting streaming, drivers must notify all entities in the pipeline to
216 * prevent link states from being modified during streaming by calling
217 * media_entity_pipeline_start().
218 *
219 * The function will mark all entities connected to the given entity through
220 * enabled links, either directly or indirectly, as streaming.
221 *
222 * The &media_pipeline instance pointed to by the pipe argument will be stored
223 * in every entity in the pipeline. Drivers should embed the &media_pipeline
224 * structure in higher-level pipeline structures and can then access the
225 * pipeline through the &media_entity pipe field.
226 *
227 * Calls to media_entity_pipeline_start() can be nested. The pipeline pointer
228 * must be identical for all nested calls to the function.
229 *
230 * media_entity_pipeline_start() may return an error. In that case, it will
231 * clean up any of the changes it did by itself.
232 *
233 * When stopping the stream, drivers must notify the entities with
234 * media_entity_pipeline_stop().
235 *
236 * If multiple calls to media_entity_pipeline_start() have been made the same
237 * number of media_entity_pipeline_stop() calls are required to stop streaming.
238 * The &media_entity pipe field is reset to NULL on the last nested stop call.
239 *
240 * Link configuration will fail with -%EBUSY by default if either end of the
241 * link is a streaming entity. Links that can be modified while streaming must
242 * be marked with the %MEDIA_LNK_FL_DYNAMIC flag.
243 *
244 * If other operations need to be disallowed on streaming entities (such as
245 * changing entities configuration parameters) drivers can explicitly check the
246 * media_entity stream_count field to find out if an entity is streaming. This
247 * operation must be done with the media_device graph_mutex held.
248 *
249 * Link validation:
250 *
251 * Link validation is performed by media_entity_pipeline_start() for any
252 * entity which has sink pads in the pipeline. The
253 * &media_entity.@link_validate() callback is used for that purpose. In
254 * @link_validate() callback, entity driver should check that the properties of
255 * the source pad of the connected entity and its own sink pad match. It is up
256 * to the type of the entity (and in the end, the properties of the hardware)
257 * what matching actually means.
258 *
259 * Subsystems should facilitate link validation by providing subsystem specific
260 * helper functions to provide easy access for commonly needed information, and
261 * in the end provide a way to use driver-specific callbacks.
262 */
263
264struct ida;
33struct device; 265struct device;
34 266
35/** 267/**
@@ -41,8 +273,16 @@ struct device;
41 * @bus_info: Unique and stable device location identifier 273 * @bus_info: Unique and stable device location identifier
42 * @hw_revision: Hardware device revision 274 * @hw_revision: Hardware device revision
43 * @driver_version: Device driver version 275 * @driver_version: Device driver version
44 * @entity_id: ID of the next entity to be registered 276 * @topology_version: Monotonic counter for storing the version of the graph
277 * topology. Should be incremented each time the topology changes.
278 * @id: Unique ID used on the last registered graph object
279 * @entity_internal_idx: Unique internal entity ID used by the graph traversal
280 * algorithms
281 * @entity_internal_idx_max: Allocated internal entity indices
45 * @entities: List of registered entities 282 * @entities: List of registered entities
283 * @interfaces: List of registered interfaces
284 * @pads: List of registered pads
285 * @links: List of registered links
46 * @lock: Entities list lock 286 * @lock: Entities list lock
47 * @graph_mutex: Entities graph operation lock 287 * @graph_mutex: Entities graph operation lock
48 * @link_notify: Link state change notification callback 288 * @link_notify: Link state change notification callback
@@ -68,10 +308,18 @@ struct media_device {
68 u32 hw_revision; 308 u32 hw_revision;
69 u32 driver_version; 309 u32 driver_version;
70 310
71 u32 entity_id; 311 u32 topology_version;
312
313 u32 id;
314 struct ida entity_internal_idx;
315 int entity_internal_idx_max;
316
72 struct list_head entities; 317 struct list_head entities;
318 struct list_head interfaces;
319 struct list_head pads;
320 struct list_head links;
73 321
74 /* Protects the entities list */ 322 /* Protects the graph objects creation/removal */
75 spinlock_t lock; 323 spinlock_t lock;
76 /* Serializes graph operations. */ 324 /* Serializes graph operations. */
77 struct mutex graph_mutex; 325 struct mutex graph_mutex;
@@ -80,6 +328,8 @@ struct media_device {
80 unsigned int notification); 328 unsigned int notification);
81}; 329};
82 330
331#ifdef CONFIG_MEDIA_CONTROLLER
332
83/* Supported link_notify @notification values. */ 333/* Supported link_notify @notification values. */
84#define MEDIA_DEV_NOTIFY_PRE_LINK_CH 0 334#define MEDIA_DEV_NOTIFY_PRE_LINK_CH 0
85#define MEDIA_DEV_NOTIFY_POST_LINK_CH 1 335#define MEDIA_DEV_NOTIFY_POST_LINK_CH 1
@@ -87,17 +337,228 @@ struct media_device {
87/* media_devnode to media_device */ 337/* media_devnode to media_device */
88#define to_media_device(node) container_of(node, struct media_device, devnode) 338#define to_media_device(node) container_of(node, struct media_device, devnode)
89 339
340/**
341 * media_entity_enum_init - Initialise an entity enumeration
342 *
343 * @ent_enum: Entity enumeration to be initialised
344 * @mdev: The related media device
345 *
346 * Returns zero on success or a negative error code.
347 */
348static inline __must_check int media_entity_enum_init(
349 struct media_entity_enum *ent_enum, struct media_device *mdev)
350{
351 return __media_entity_enum_init(ent_enum,
352 mdev->entity_internal_idx_max + 1);
353}
354
355/**
356 * media_device_init() - Initializes a media device element
357 *
358 * @mdev: pointer to struct &media_device
359 *
360 * This function initializes the media device prior to its registration.
361 * The media device initialization and registration is split in two functions
362 * to avoid race conditions and make the media device available to user-space
363 * before the media graph has been completed.
364 *
365 * So drivers need to first initialize the media device, register any entity
366 * within the media device, create pad to pad links and then finally register
367 * the media device by calling media_device_register() as a final step.
368 */
369void media_device_init(struct media_device *mdev);
370
371/**
372 * media_device_cleanup() - Cleanups a media device element
373 *
374 * @mdev: pointer to struct &media_device
375 *
376 * This function that will destroy the graph_mutex that is
377 * initialized in media_device_init().
378 */
379void media_device_cleanup(struct media_device *mdev);
380
381/**
382 * __media_device_register() - Registers a media device element
383 *
384 * @mdev: pointer to struct &media_device
385 * @owner: should be filled with %THIS_MODULE
386 *
387 * Users, should, instead, call the media_device_register() macro.
388 *
389 * The caller is responsible for initializing the media_device structure before
390 * registration. The following fields must be set:
391 *
392 * - dev must point to the parent device (usually a &pci_dev, &usb_interface or
393 * &platform_device instance).
394 *
395 * - model must be filled with the device model name as a NUL-terminated UTF-8
396 * string. The device/model revision must not be stored in this field.
397 *
398 * The following fields are optional:
399 *
400 * - serial is a unique serial number stored as a NUL-terminated ASCII string.
401 * The field is big enough to store a GUID in text form. If the hardware
402 * doesn't provide a unique serial number this field must be left empty.
403 *
404 * - bus_info represents the location of the device in the system as a
405 * NUL-terminated ASCII string. For PCI/PCIe devices bus_info must be set to
406 * "PCI:" (or "PCIe:") followed by the value of pci_name(). For USB devices,
407 * the usb_make_path() function must be used. This field is used by
408 * applications to distinguish between otherwise identical devices that don't
409 * provide a serial number.
410 *
411 * - hw_revision is the hardware device revision in a driver-specific format.
412 * When possible the revision should be formatted with the KERNEL_VERSION
413 * macro.
414 *
415 * - driver_version is formatted with the KERNEL_VERSION macro. The version
416 * minor must be incremented when new features are added to the userspace API
417 * without breaking binary compatibility. The version major must be
418 * incremented when binary compatibility is broken.
419 *
420 * Notes:
421 *
422 * Upon successful registration a character device named media[0-9]+ is created.
423 * The device major and minor numbers are dynamic. The model name is exported as
424 * a sysfs attribute.
425 *
426 * Unregistering a media device that hasn't been registered is *NOT* safe.
427 *
428 * Return: returns zero on success or a negative error code.
429 */
90int __must_check __media_device_register(struct media_device *mdev, 430int __must_check __media_device_register(struct media_device *mdev,
91 struct module *owner); 431 struct module *owner);
92#define media_device_register(mdev) __media_device_register(mdev, THIS_MODULE) 432#define media_device_register(mdev) __media_device_register(mdev, THIS_MODULE)
433
434/**
435 * __media_device_unregister() - Unegisters a media device element
436 *
437 * @mdev: pointer to struct &media_device
438 *
439 *
440 * It is safe to call this function on an unregistered (but initialised)
441 * media device.
442 */
93void media_device_unregister(struct media_device *mdev); 443void media_device_unregister(struct media_device *mdev);
94 444
445/**
446 * media_device_register_entity() - registers a media entity inside a
447 * previously registered media device.
448 *
449 * @mdev: pointer to struct &media_device
450 * @entity: pointer to struct &media_entity to be registered
451 *
452 * Entities are identified by a unique positive integer ID. The media
453 * controller framework will such ID automatically. IDs are not guaranteed
454 * to be contiguous, and the ID number can change on newer Kernel versions.
455 * So, neither the driver nor userspace should hardcode ID numbers to refer
456 * to the entities, but, instead, use the framework to find the ID, when
457 * needed.
458 *
459 * The media_entity name, type and flags fields should be initialized before
460 * calling media_device_register_entity(). Entities embedded in higher-level
461 * standard structures can have some of those fields set by the higher-level
462 * framework.
463 *
464 * If the device has pads, media_entity_pads_init() should be called before
465 * this function. Otherwise, the &media_entity.@pad and &media_entity.@num_pads
466 * should be zeroed before calling this function.
467 *
468 * Entities have flags that describe the entity capabilities and state:
469 *
470 * %MEDIA_ENT_FL_DEFAULT indicates the default entity for a given type.
471 * This can be used to report the default audio and video devices or the
472 * default camera sensor.
473 *
474 * NOTE: Drivers should set the entity function before calling this function.
475 * Please notice that the values %MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN and
476 * %MEDIA_ENT_F_UNKNOWN should not be used by the drivers.
477 */
95int __must_check media_device_register_entity(struct media_device *mdev, 478int __must_check media_device_register_entity(struct media_device *mdev,
96 struct media_entity *entity); 479 struct media_entity *entity);
480
481/*
482 * media_device_unregister_entity() - unregisters a media entity.
483 *
484 * @entity: pointer to struct &media_entity to be unregistered
485 *
486 * All links associated with the entity and all PADs are automatically
487 * unregistered from the media_device when this function is called.
488 *
489 * Unregistering an entity will not change the IDs of the other entities and
490 * the previoully used ID will never be reused for a newly registered entities.
491 *
492 * When a media device is unregistered, all its entities are unregistered
493 * automatically. No manual entities unregistration is then required.
494 *
495 * Note: the media_entity instance itself must be freed explicitly by
496 * the driver if required.
497 */
97void media_device_unregister_entity(struct media_entity *entity); 498void media_device_unregister_entity(struct media_entity *entity);
98 499
500/**
501 * media_device_get_devres() - get media device as device resource
502 * creates if one doesn't exist
503 *
504 * @dev: pointer to struct &device.
505 *
506 * Sometimes, the media controller &media_device needs to be shared by more
507 * than one driver. This function adds support for that, by dynamically
508 * allocating the &media_device and allowing it to be obtained from the
509 * struct &device associated with the common device where all sub-device
510 * components belong. So, for example, on an USB device with multiple
511 * interfaces, each interface may be handled by a separate per-interface
512 * drivers. While each interface have its own &device, they all share a
513 * common &device associated with the hole USB device.
514 */
515struct media_device *media_device_get_devres(struct device *dev);
516
517/**
518 * media_device_find_devres() - find media device as device resource
519 *
520 * @dev: pointer to struct &device.
521 */
522struct media_device *media_device_find_devres(struct device *dev);
523
99/* Iterate over all entities. */ 524/* Iterate over all entities. */
100#define media_device_for_each_entity(entity, mdev) \ 525#define media_device_for_each_entity(entity, mdev) \
101 list_for_each_entry(entity, &(mdev)->entities, list) 526 list_for_each_entry(entity, &(mdev)->entities, graph_obj.list)
527
528/* Iterate over all interfaces. */
529#define media_device_for_each_intf(intf, mdev) \
530 list_for_each_entry(intf, &(mdev)->interfaces, graph_obj.list)
531
532/* Iterate over all pads. */
533#define media_device_for_each_pad(pad, mdev) \
534 list_for_each_entry(pad, &(mdev)->pads, graph_obj.list)
102 535
536/* Iterate over all links. */
537#define media_device_for_each_link(link, mdev) \
538 list_for_each_entry(link, &(mdev)->links, graph_obj.list)
539#else
540static inline int media_device_register(struct media_device *mdev)
541{
542 return 0;
543}
544static inline void media_device_unregister(struct media_device *mdev)
545{
546}
547static inline int media_device_register_entity(struct media_device *mdev,
548 struct media_entity *entity)
549{
550 return 0;
551}
552static inline void media_device_unregister_entity(struct media_entity *entity)
553{
554}
555static inline struct media_device *media_device_get_devres(struct device *dev)
556{
557 return NULL;
558}
559static inline struct media_device *media_device_find_devres(struct device *dev)
560{
561 return NULL;
562}
563#endif /* CONFIG_MEDIA_CONTROLLER */
103#endif 564#endif
diff --git a/include/media/media-devnode.h b/include/media/media-devnode.h
index 17ddae32060d..fe42f08e72bd 100644
--- a/include/media/media-devnode.h
+++ b/include/media/media-devnode.h
@@ -40,6 +40,20 @@
40 */ 40 */
41#define MEDIA_FLAG_REGISTERED 0 41#define MEDIA_FLAG_REGISTERED 0
42 42
43/**
44 * struct media_file_operations - Media device file operations
45 *
46 * @owner: should be filled with %THIS_MODULE
47 * @read: pointer to the function that implements read() syscall
48 * @write: pointer to the function that implements write() syscall
49 * @poll: pointer to the function that implements poll() syscall
50 * @ioctl: pointer to the function that implements ioctl() syscall
51 * @compat_ioctl: pointer to the function that will handle 32 bits userspace
52 * calls to the the ioctl() syscall on a Kernel compiled with 64 bits.
53 * @open: pointer to the function that implements open() syscall
54 * @release: pointer to the function that will release the resources allocated
55 * by the @open function.
56 */
43struct media_file_operations { 57struct media_file_operations {
44 struct module *owner; 58 struct module *owner;
45 ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); 59 ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
@@ -53,7 +67,7 @@ struct media_file_operations {
53 67
54/** 68/**
55 * struct media_devnode - Media device node 69 * struct media_devnode - Media device node
56 * @fops: pointer to struct media_file_operations with media device ops 70 * @fops: pointer to struct &media_file_operations with media device ops
57 * @dev: struct device pointer for the media controller device 71 * @dev: struct device pointer for the media controller device
58 * @cdev: struct cdev pointer character device 72 * @cdev: struct cdev pointer character device
59 * @parent: parent device 73 * @parent: parent device
@@ -86,15 +100,53 @@ struct media_devnode {
86/* dev to media_devnode */ 100/* dev to media_devnode */
87#define to_media_devnode(cd) container_of(cd, struct media_devnode, dev) 101#define to_media_devnode(cd) container_of(cd, struct media_devnode, dev)
88 102
103/**
104 * media_devnode_register - register a media device node
105 *
106 * @mdev: media device node structure we want to register
107 * @owner: should be filled with %THIS_MODULE
108 *
109 * The registration code assigns minor numbers and registers the new device node
110 * with the kernel. An error is returned if no free minor number can be found,
111 * or if the registration of the device node fails.
112 *
113 * Zero is returned on success.
114 *
115 * Note that if the media_devnode_register call fails, the release() callback of
116 * the media_devnode structure is *not* called, so the caller is responsible for
117 * freeing any data.
118 */
89int __must_check media_devnode_register(struct media_devnode *mdev, 119int __must_check media_devnode_register(struct media_devnode *mdev,
90 struct module *owner); 120 struct module *owner);
121
122/**
123 * media_devnode_unregister - unregister a media device node
124 * @mdev: the device node to unregister
125 *
126 * This unregisters the passed device. Future open calls will be met with
127 * errors.
128 *
129 * This function can safely be called if the device node has never been
130 * registered or has already been unregistered.
131 */
91void media_devnode_unregister(struct media_devnode *mdev); 132void media_devnode_unregister(struct media_devnode *mdev);
92 133
134/**
135 * media_devnode_data - returns a pointer to the &media_devnode
136 *
137 * @filp: pointer to struct &file
138 */
93static inline struct media_devnode *media_devnode_data(struct file *filp) 139static inline struct media_devnode *media_devnode_data(struct file *filp)
94{ 140{
95 return filp->private_data; 141 return filp->private_data;
96} 142}
97 143
144/**
145 * media_devnode_is_registered - returns true if &media_devnode is registered;
146 * false otherwise.
147 *
148 * @mdev: pointer to struct &media_devnode.
149 */
98static inline int media_devnode_is_registered(struct media_devnode *mdev) 150static inline int media_devnode_is_registered(struct media_devnode *mdev)
99{ 151{
100 return test_bit(MEDIA_FLAG_REGISTERED, &mdev->flags); 152 return test_bit(MEDIA_FLAG_REGISTERED, &mdev->flags);
diff --git a/include/media/media-entity.h b/include/media/media-entity.h
index 197f93799753..fe485d367985 100644
--- a/include/media/media-entity.h
+++ b/include/media/media-entity.h
@@ -23,25 +23,151 @@
23#ifndef _MEDIA_ENTITY_H 23#ifndef _MEDIA_ENTITY_H
24#define _MEDIA_ENTITY_H 24#define _MEDIA_ENTITY_H
25 25
26#include <linux/bitops.h> 26#include <linux/bitmap.h>
27#include <linux/kernel.h> 27#include <linux/kernel.h>
28#include <linux/list.h> 28#include <linux/list.h>
29#include <linux/media.h> 29#include <linux/media.h>
30 30
31/* Enums used internally at the media controller to represent graphs */
32
33/**
34 * enum media_gobj_type - type of a graph object
35 *
36 * @MEDIA_GRAPH_ENTITY: Identify a media entity
37 * @MEDIA_GRAPH_PAD: Identify a media pad
38 * @MEDIA_GRAPH_LINK: Identify a media link
39 * @MEDIA_GRAPH_INTF_DEVNODE: Identify a media Kernel API interface via
40 * a device node
41 */
42enum media_gobj_type {
43 MEDIA_GRAPH_ENTITY,
44 MEDIA_GRAPH_PAD,
45 MEDIA_GRAPH_LINK,
46 MEDIA_GRAPH_INTF_DEVNODE,
47};
48
49#define MEDIA_BITS_PER_TYPE 8
50#define MEDIA_BITS_PER_ID (32 - MEDIA_BITS_PER_TYPE)
51#define MEDIA_ID_MASK GENMASK_ULL(MEDIA_BITS_PER_ID - 1, 0)
52
53/* Structs to represent the objects that belong to a media graph */
54
55/**
56 * struct media_gobj - Define a graph object.
57 *
58 * @mdev: Pointer to the struct media_device that owns the object
59 * @id: Non-zero object ID identifier. The ID should be unique
60 * inside a media_device, as it is composed by
61 * %MEDIA_BITS_PER_TYPE to store the type plus
62 * %MEDIA_BITS_PER_ID to store the ID
63 * @list: List entry stored in one of the per-type mdev object lists
64 *
65 * All objects on the media graph should have this struct embedded
66 */
67struct media_gobj {
68 struct media_device *mdev;
69 u32 id;
70 struct list_head list;
71};
72
73#define MEDIA_ENTITY_ENUM_MAX_DEPTH 16
74
75/**
76 * struct media_entity_enum - An enumeration of media entities.
77 *
78 * @bmap: Bit map in which each bit represents one entity at struct
79 * media_entity->internal_idx.
80 * @idx_max: Number of bits in bmap
81 */
82struct media_entity_enum {
83 unsigned long *bmap;
84 int idx_max;
85};
86
87/**
88 * struct media_entity_graph - Media graph traversal state
89 *
90 * @stack: Graph traversal stack; the stack contains information
91 * on the path the media entities to be walked and the
92 * links through which they were reached.
93 * @ent_enum: Visited entities
94 * @top: The top of the stack
95 */
96struct media_entity_graph {
97 struct {
98 struct media_entity *entity;
99 struct list_head *link;
100 } stack[MEDIA_ENTITY_ENUM_MAX_DEPTH];
101
102 struct media_entity_enum ent_enum;
103 int top;
104};
105
106/*
107 * struct media_pipeline - Media pipeline related information
108 *
109 * @streaming_count: Streaming start count - streaming stop count
110 * @graph: Media graph walk during pipeline start / stop
111 */
31struct media_pipeline { 112struct media_pipeline {
113 int streaming_count;
114 struct media_entity_graph graph;
32}; 115};
33 116
117/**
118 * struct media_link - A link object part of a media graph.
119 *
120 * @graph_obj: Embedded structure containing the media object common data
121 * @list: Linked list associated with an entity or an interface that
122 * owns the link.
123 * @gobj0: Part of a union. Used to get the pointer for the first
124 * graph_object of the link.
125 * @source: Part of a union. Used only if the first object (gobj0) is
126 * a pad. In that case, it represents the source pad.
127 * @intf: Part of a union. Used only if the first object (gobj0) is
128 * an interface.
129 * @gobj1: Part of a union. Used to get the pointer for the second
130 * graph_object of the link.
131 * @source: Part of a union. Used only if the second object (gobj1) is
132 * a pad. In that case, it represents the sink pad.
133 * @entity: Part of a union. Used only if the second object (gobj1) is
134 * an entity.
135 * @reverse: Pointer to the link for the reverse direction of a pad to pad
136 * link.
137 * @flags: Link flags, as defined in uapi/media.h (MEDIA_LNK_FL_*)
138 * @is_backlink: Indicate if the link is a backlink.
139 */
34struct media_link { 140struct media_link {
35 struct media_pad *source; /* Source pad */ 141 struct media_gobj graph_obj;
36 struct media_pad *sink; /* Sink pad */ 142 struct list_head list;
37 struct media_link *reverse; /* Link in the reverse direction */ 143 union {
38 unsigned long flags; /* Link flags (MEDIA_LNK_FL_*) */ 144 struct media_gobj *gobj0;
145 struct media_pad *source;
146 struct media_interface *intf;
147 };
148 union {
149 struct media_gobj *gobj1;
150 struct media_pad *sink;
151 struct media_entity *entity;
152 };
153 struct media_link *reverse;
154 unsigned long flags;
155 bool is_backlink;
39}; 156};
40 157
158/**
159 * struct media_pad - A media pad graph object.
160 *
161 * @graph_obj: Embedded structure containing the media object common data
162 * @entity: Entity this pad belongs to
163 * @index: Pad index in the entity pads array, numbered from 0 to n
164 * @flags: Pad flags, as defined in uapi/media.h (MEDIA_PAD_FL_*)
165 */
41struct media_pad { 166struct media_pad {
42 struct media_entity *entity; /* Entity this pad belongs to */ 167 struct media_gobj graph_obj; /* must be first field in struct */
43 u16 index; /* Pad index in the entity pads array */ 168 struct media_entity *entity;
44 unsigned long flags; /* Pad flags (MEDIA_PAD_FL_*) */ 169 u16 index;
170 unsigned long flags;
45}; 171};
46 172
47/** 173/**
@@ -60,105 +186,763 @@ struct media_entity_operations {
60 int (*link_validate)(struct media_link *link); 186 int (*link_validate)(struct media_link *link);
61}; 187};
62 188
189/**
190 * struct media_entity - A media entity graph object.
191 *
192 * @graph_obj: Embedded structure containing the media object common data.
193 * @name: Entity name.
194 * @function: Entity main function, as defined in uapi/media.h
195 * (MEDIA_ENT_F_*)
196 * @flags: Entity flags, as defined in uapi/media.h (MEDIA_ENT_FL_*)
197 * @num_pads: Number of sink and source pads.
198 * @num_links: Total number of links, forward and back, enabled and disabled.
199 * @num_backlinks: Number of backlinks
200 * @internal_idx: An unique internal entity specific number. The numbers are
201 * re-used if entities are unregistered or registered again.
202 * @pads: Pads array with the size defined by @num_pads.
203 * @links: List of data links.
204 * @ops: Entity operations.
205 * @stream_count: Stream count for the entity.
206 * @use_count: Use count for the entity.
207 * @pipe: Pipeline this entity belongs to.
208 * @info: Union with devnode information. Kept just for backward
209 * compatibility.
210 * @major: Devnode major number (zero if not applicable). Kept just
211 * for backward compatibility.
212 * @minor: Devnode minor number (zero if not applicable). Kept just
213 * for backward compatibility.
214 *
215 * NOTE: @stream_count and @use_count reference counts must never be
216 * negative, but are signed integers on purpose: a simple WARN_ON(<0) check
217 * can be used to detect reference count bugs that would make them negative.
218 */
63struct media_entity { 219struct media_entity {
64 struct list_head list; 220 struct media_gobj graph_obj; /* must be first field in struct */
65 struct media_device *parent; /* Media device this entity belongs to*/ 221 const char *name;
66 u32 id; /* Entity ID, unique in the parent media 222 u32 function;
67 * device context */ 223 unsigned long flags;
68 const char *name; /* Entity name */ 224
69 u32 type; /* Entity type (MEDIA_ENT_T_*) */ 225 u16 num_pads;
70 u32 revision; /* Entity revision, driver specific */ 226 u16 num_links;
71 unsigned long flags; /* Entity flags (MEDIA_ENT_FL_*) */ 227 u16 num_backlinks;
72 u32 group_id; /* Entity group ID */ 228 int internal_idx;
73 229
74 u16 num_pads; /* Number of sink and source pads */ 230 struct media_pad *pads;
75 u16 num_links; /* Number of existing links, both 231 struct list_head links;
76 * enabled and disabled */ 232
77 u16 num_backlinks; /* Number of backlinks */ 233 const struct media_entity_operations *ops;
78 u16 max_links; /* Maximum number of links */
79
80 struct media_pad *pads; /* Pads array (num_pads elements) */
81 struct media_link *links; /* Links array (max_links elements)*/
82
83 const struct media_entity_operations *ops; /* Entity operations */
84 234
85 /* Reference counts must never be negative, but are signed integers on 235 /* Reference counts must never be negative, but are signed integers on
86 * purpose: a simple WARN_ON(<0) check can be used to detect reference 236 * purpose: a simple WARN_ON(<0) check can be used to detect reference
87 * count bugs that would make them negative. 237 * count bugs that would make them negative.
88 */ 238 */
89 int stream_count; /* Stream count for the entity. */ 239 int stream_count;
90 int use_count; /* Use count for the entity. */ 240 int use_count;
91 241
92 struct media_pipeline *pipe; /* Pipeline this entity belongs to. */ 242 struct media_pipeline *pipe;
93 243
94 union { 244 union {
95 /* Node specifications */
96 struct { 245 struct {
97 u32 major; 246 u32 major;
98 u32 minor; 247 u32 minor;
99 } dev; 248 } dev;
100
101 /* Sub-device specifications */
102 /* Nothing needed yet */
103 } info; 249 } info;
104}; 250};
105 251
106static inline u32 media_entity_type(struct media_entity *entity) 252/**
253 * struct media_interface - A media interface graph object.
254 *
255 * @graph_obj: embedded graph object
256 * @links: List of links pointing to graph entities
257 * @type: Type of the interface as defined in the
258 * uapi/media/media.h header, e. g.
259 * MEDIA_INTF_T_*
260 * @flags: Interface flags as defined in uapi/media/media.h
261 */
262struct media_interface {
263 struct media_gobj graph_obj;
264 struct list_head links;
265 u32 type;
266 u32 flags;
267};
268
269/**
270 * struct media_intf_devnode - A media interface via a device node.
271 *
272 * @intf: embedded interface object
273 * @major: Major number of a device node
274 * @minor: Minor number of a device node
275 */
276struct media_intf_devnode {
277 struct media_interface intf;
278
279 /* Should match the fields at media_v2_intf_devnode */
280 u32 major;
281 u32 minor;
282};
283
284/**
285 * media_entity_id() - return the media entity graph object id
286 *
287 * @entity: pointer to entity
288 */
289static inline u32 media_entity_id(struct media_entity *entity)
107{ 290{
108 return entity->type & MEDIA_ENT_TYPE_MASK; 291 return entity->graph_obj.id;
109} 292}
110 293
111static inline u32 media_entity_subtype(struct media_entity *entity) 294/**
295 * media_type() - return the media object type
296 *
297 * @gobj: pointer to the media graph object
298 */
299static inline enum media_gobj_type media_type(struct media_gobj *gobj)
112{ 300{
113 return entity->type & MEDIA_ENT_SUBTYPE_MASK; 301 return gobj->id >> MEDIA_BITS_PER_ID;
114} 302}
115 303
116#define MEDIA_ENTITY_ENUM_MAX_DEPTH 16 304/**
117#define MEDIA_ENTITY_ENUM_MAX_ID 64 305 * media_id() - return the media object ID
306 *
307 * @gobj: pointer to the media graph object
308 */
309static inline u32 media_id(struct media_gobj *gobj)
310{
311 return gobj->id & MEDIA_ID_MASK;
312}
118 313
119/* 314/**
120 * The number of pads can't be bigger than the number of entities, 315 * media_gobj_gen_id() - encapsulates type and ID on at the object ID
121 * as the worse-case scenario is to have one entity linked up to 316 *
122 * MEDIA_ENTITY_ENUM_MAX_ID - 1 entities. 317 * @type: object type as define at enum &media_gobj_type.
318 * @local_id: next ID, from struct &media_device.@id.
123 */ 319 */
124#define MEDIA_ENTITY_MAX_PADS (MEDIA_ENTITY_ENUM_MAX_ID - 1) 320static inline u32 media_gobj_gen_id(enum media_gobj_type type, u64 local_id)
321{
322 u32 id;
125 323
126struct media_entity_graph { 324 id = type << MEDIA_BITS_PER_ID;
127 struct { 325 id |= local_id & MEDIA_ID_MASK;
128 struct media_entity *entity;
129 int link;
130 } stack[MEDIA_ENTITY_ENUM_MAX_DEPTH];
131 326
132 DECLARE_BITMAP(entities, MEDIA_ENTITY_ENUM_MAX_ID); 327 return id;
133 int top; 328}
134}; 329
330/**
331 * is_media_entity_v4l2_io() - identify if the entity main function
332 * is a V4L2 I/O
333 *
334 * @entity: pointer to entity
335 *
336 * Return: true if the entity main function is one of the V4L2 I/O types
337 * (video, VBI or SDR radio); false otherwise.
338 */
339static inline bool is_media_entity_v4l2_io(struct media_entity *entity)
340{
341 if (!entity)
342 return false;
343
344 switch (entity->function) {
345 case MEDIA_ENT_F_IO_V4L:
346 case MEDIA_ENT_F_IO_VBI:
347 case MEDIA_ENT_F_IO_SWRADIO:
348 return true;
349 default:
350 return false;
351 }
352}
353
354/**
355 * is_media_entity_v4l2_subdev - return true if the entity main function is
356 * associated with the V4L2 API subdev usage
357 *
358 * @entity: pointer to entity
359 *
360 * This is an ancillary function used by subdev-based V4L2 drivers.
361 * It checks if the entity function is one of functions used by a V4L2 subdev,
362 * e. g. camera-relatef functions, analog TV decoder, TV tuner, V4L2 DSPs.
363 */
364static inline bool is_media_entity_v4l2_subdev(struct media_entity *entity)
365{
366 if (!entity)
367 return false;
368
369 switch (entity->function) {
370 case MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN:
371 case MEDIA_ENT_F_CAM_SENSOR:
372 case MEDIA_ENT_F_FLASH:
373 case MEDIA_ENT_F_LENS:
374 case MEDIA_ENT_F_ATV_DECODER:
375 case MEDIA_ENT_F_TUNER:
376 return true;
377
378 default:
379 return false;
380 }
381}
382
383/**
384 * __media_entity_enum_init - Initialise an entity enumeration
385 *
386 * @ent_enum: Entity enumeration to be initialised
387 * @idx_max: Maximum number of entities in the enumeration
388 *
389 * Return: Returns zero on success or a negative error code.
390 */
391__must_check int __media_entity_enum_init(struct media_entity_enum *ent_enum,
392 int idx_max);
393
394/**
395 * media_entity_enum_cleanup - Release resources of an entity enumeration
396 *
397 * @ent_enum: Entity enumeration to be released
398 */
399void media_entity_enum_cleanup(struct media_entity_enum *ent_enum);
400
401/**
402 * media_entity_enum_zero - Clear the entire enum
403 *
404 * @ent_enum: Entity enumeration to be cleared
405 */
406static inline void media_entity_enum_zero(struct media_entity_enum *ent_enum)
407{
408 bitmap_zero(ent_enum->bmap, ent_enum->idx_max);
409}
410
411/**
412 * media_entity_enum_set - Mark a single entity in the enum
413 *
414 * @ent_enum: Entity enumeration
415 * @entity: Entity to be marked
416 */
417static inline void media_entity_enum_set(struct media_entity_enum *ent_enum,
418 struct media_entity *entity)
419{
420 if (WARN_ON(entity->internal_idx >= ent_enum->idx_max))
421 return;
422
423 __set_bit(entity->internal_idx, ent_enum->bmap);
424}
425
426/**
427 * media_entity_enum_clear - Unmark a single entity in the enum
428 *
429 * @ent_enum: Entity enumeration
430 * @entity: Entity to be unmarked
431 */
432static inline void media_entity_enum_clear(struct media_entity_enum *ent_enum,
433 struct media_entity *entity)
434{
435 if (WARN_ON(entity->internal_idx >= ent_enum->idx_max))
436 return;
135 437
136int media_entity_init(struct media_entity *entity, u16 num_pads, 438 __clear_bit(entity->internal_idx, ent_enum->bmap);
137 struct media_pad *pads, u16 extra_links); 439}
138void media_entity_cleanup(struct media_entity *entity); 440
441/**
442 * media_entity_enum_test - Test whether the entity is marked
443 *
444 * @ent_enum: Entity enumeration
445 * @entity: Entity to be tested
446 *
447 * Returns true if the entity was marked.
448 */
449static inline bool media_entity_enum_test(struct media_entity_enum *ent_enum,
450 struct media_entity *entity)
451{
452 if (WARN_ON(entity->internal_idx >= ent_enum->idx_max))
453 return true;
454
455 return test_bit(entity->internal_idx, ent_enum->bmap);
456}
457
458/**
459 * media_entity_enum_test - Test whether the entity is marked, and mark it
460 *
461 * @ent_enum: Entity enumeration
462 * @entity: Entity to be tested
463 *
464 * Returns true if the entity was marked, and mark it before doing so.
465 */
466static inline bool
467media_entity_enum_test_and_set(struct media_entity_enum *ent_enum,
468 struct media_entity *entity)
469{
470 if (WARN_ON(entity->internal_idx >= ent_enum->idx_max))
471 return true;
472
473 return __test_and_set_bit(entity->internal_idx, ent_enum->bmap);
474}
475
476/**
477 * media_entity_enum_empty - Test whether the entire enum is empty
478 *
479 * @ent_enum: Entity enumeration
480 *
481 * Returns true if the entity was marked.
482 */
483static inline bool media_entity_enum_empty(struct media_entity_enum *ent_enum)
484{
485 return bitmap_empty(ent_enum->bmap, ent_enum->idx_max);
486}
487
488/**
489 * media_entity_enum_intersects - Test whether two enums intersect
490 *
491 * @ent_enum1: First entity enumeration
492 * @ent_enum2: Second entity enumeration
493 *
494 * Returns true if entity enumerations e and f intersect, otherwise false.
495 */
496static inline bool media_entity_enum_intersects(
497 struct media_entity_enum *ent_enum1,
498 struct media_entity_enum *ent_enum2)
499{
500 WARN_ON(ent_enum1->idx_max != ent_enum2->idx_max);
501
502 return bitmap_intersects(ent_enum1->bmap, ent_enum2->bmap,
503 min(ent_enum1->idx_max, ent_enum2->idx_max));
504}
505
506#define gobj_to_entity(gobj) \
507 container_of(gobj, struct media_entity, graph_obj)
508
509#define gobj_to_pad(gobj) \
510 container_of(gobj, struct media_pad, graph_obj)
511
512#define gobj_to_link(gobj) \
513 container_of(gobj, struct media_link, graph_obj)
514
515#define gobj_to_link(gobj) \
516 container_of(gobj, struct media_link, graph_obj)
517
518#define gobj_to_pad(gobj) \
519 container_of(gobj, struct media_pad, graph_obj)
520
521#define gobj_to_intf(gobj) \
522 container_of(gobj, struct media_interface, graph_obj)
523
524#define intf_to_devnode(intf) \
525 container_of(intf, struct media_intf_devnode, intf)
526
527/**
528 * media_gobj_create - Initialize a graph object
529 *
530 * @mdev: Pointer to the media_device that contains the object
531 * @type: Type of the object
532 * @gobj: Pointer to the graph object
533 *
534 * This routine initializes the embedded struct media_gobj inside a
535 * media graph object. It is called automatically if media_*_create()
536 * calls are used. However, if the object (entity, link, pad, interface)
537 * is embedded on some other object, this function should be called before
538 * registering the object at the media controller.
539 */
540void media_gobj_create(struct media_device *mdev,
541 enum media_gobj_type type,
542 struct media_gobj *gobj);
543
544/**
545 * media_gobj_destroy - Stop using a graph object on a media device
546 *
547 * @gobj: Pointer to the graph object
548 *
549 * This should be called by all routines like media_device_unregister()
550 * that remove/destroy media graph objects.
551 */
552void media_gobj_destroy(struct media_gobj *gobj);
553
554/**
555 * media_entity_pads_init() - Initialize the entity pads
556 *
557 * @entity: entity where the pads belong
558 * @num_pads: total number of sink and source pads
559 * @pads: Array of @num_pads pads.
560 *
561 * The pads array is managed by the entity driver and passed to
562 * media_entity_pads_init() where its pointer will be stored in the entity
563 * structure.
564 *
565 * If no pads are needed, drivers could either directly fill
566 * &media_entity->@num_pads with 0 and &media_entity->@pads with NULL or call
567 * this function that will do the same.
568 *
569 * As the number of pads is known in advance, the pads array is not allocated
570 * dynamically but is managed by the entity driver. Most drivers will embed the
571 * pads array in a driver-specific structure, avoiding dynamic allocation.
572 *
573 * Drivers must set the direction of every pad in the pads array before calling
574 * media_entity_pads_init(). The function will initialize the other pads fields.
575 */
576int media_entity_pads_init(struct media_entity *entity, u16 num_pads,
577 struct media_pad *pads);
578
579/**
580 * media_entity_cleanup() - free resources associated with an entity
581 *
582 * @entity: entity where the pads belong
583 *
584 * This function must be called during the cleanup phase after unregistering
585 * the entity (currently, it does nothing).
586 */
587static inline void media_entity_cleanup(struct media_entity *entity) {};
588
589/**
590 * media_create_pad_link() - creates a link between two entities.
591 *
592 * @source: pointer to &media_entity of the source pad.
593 * @source_pad: number of the source pad in the pads array
594 * @sink: pointer to &media_entity of the sink pad.
595 * @sink_pad: number of the sink pad in the pads array.
596 * @flags: Link flags, as defined in include/uapi/linux/media.h.
597 *
598 * Valid values for flags:
599 * A %MEDIA_LNK_FL_ENABLED flag indicates that the link is enabled and can be
600 * used to transfer media data. When two or more links target a sink pad,
601 * only one of them can be enabled at a time.
602 *
603 * A %MEDIA_LNK_FL_IMMUTABLE flag indicates that the link enabled state can't
604 * be modified at runtime. If %MEDIA_LNK_FL_IMMUTABLE is set, then
605 * %MEDIA_LNK_FL_ENABLED must also be set since an immutable link is
606 * always enabled.
607 *
608 * NOTE:
609 *
610 * Before calling this function, media_entity_pads_init() and
611 * media_device_register_entity() should be called previously for both ends.
612 */
613__must_check int media_create_pad_link(struct media_entity *source,
614 u16 source_pad, struct media_entity *sink,
615 u16 sink_pad, u32 flags);
616
617/**
618 * media_create_pad_links() - creates a link between two entities.
619 *
620 * @mdev: Pointer to the media_device that contains the object
621 * @source_function: Function of the source entities. Used only if @source is
622 * NULL.
623 * @source: pointer to &media_entity of the source pad. If NULL, it will use
624 * all entities that matches the @sink_function.
625 * @source_pad: number of the source pad in the pads array
626 * @sink_function: Function of the sink entities. Used only if @sink is NULL.
627 * @sink: pointer to &media_entity of the sink pad. If NULL, it will use
628 * all entities that matches the @sink_function.
629 * @sink_pad: number of the sink pad in the pads array.
630 * @flags: Link flags, as defined in include/uapi/linux/media.h.
631 * @allow_both_undefined: if true, then both @source and @sink can be NULL.
632 * In such case, it will create a crossbar between all entities that
633 * matches @source_function to all entities that matches @sink_function.
634 * If false, it will return 0 and won't create any link if both @source
635 * and @sink are NULL.
636 *
637 * Valid values for flags:
638 * A %MEDIA_LNK_FL_ENABLED flag indicates that the link is enabled and can be
639 * used to transfer media data. If multiple links are created and this
640 * flag is passed as an argument, only the first created link will have
641 * this flag.
642 *
643 * A %MEDIA_LNK_FL_IMMUTABLE flag indicates that the link enabled state can't
644 * be modified at runtime. If %MEDIA_LNK_FL_IMMUTABLE is set, then
645 * %MEDIA_LNK_FL_ENABLED must also be set since an immutable link is
646 * always enabled.
647 *
648 * It is common for some devices to have multiple source and/or sink entities
649 * of the same type that should be linked. While media_create_pad_link()
650 * creates link by link, this function is meant to allow 1:n, n:1 and even
651 * cross-bar (n:n) links.
652 *
653 * NOTE: Before calling this function, media_entity_pads_init() and
654 * media_device_register_entity() should be called previously for the entities
655 * to be linked.
656 */
657int media_create_pad_links(const struct media_device *mdev,
658 const u32 source_function,
659 struct media_entity *source,
660 const u16 source_pad,
661 const u32 sink_function,
662 struct media_entity *sink,
663 const u16 sink_pad,
664 u32 flags,
665 const bool allow_both_undefined);
139 666
140int media_entity_create_link(struct media_entity *source, u16 source_pad,
141 struct media_entity *sink, u16 sink_pad, u32 flags);
142void __media_entity_remove_links(struct media_entity *entity); 667void __media_entity_remove_links(struct media_entity *entity);
668
669/**
670 * media_entity_remove_links() - remove all links associated with an entity
671 *
672 * @entity: pointer to &media_entity
673 *
674 * Note: this is called automatically when an entity is unregistered via
675 * media_device_register_entity().
676 */
143void media_entity_remove_links(struct media_entity *entity); 677void media_entity_remove_links(struct media_entity *entity);
144 678
679/**
680 * __media_entity_setup_link - Configure a media link without locking
681 * @link: The link being configured
682 * @flags: Link configuration flags
683 *
684 * The bulk of link setup is handled by the two entities connected through the
685 * link. This function notifies both entities of the link configuration change.
686 *
687 * If the link is immutable or if the current and new configuration are
688 * identical, return immediately.
689 *
690 * The user is expected to hold link->source->parent->mutex. If not,
691 * media_entity_setup_link() should be used instead.
692 */
145int __media_entity_setup_link(struct media_link *link, u32 flags); 693int __media_entity_setup_link(struct media_link *link, u32 flags);
694
695/**
696 * media_entity_setup_link() - changes the link flags properties in runtime
697 *
698 * @link: pointer to &media_link
699 * @flags: the requested new link flags
700 *
701 * The only configurable property is the %MEDIA_LNK_FL_ENABLED link flag
702 * flag to enable/disable a link. Links marked with the
703 * %MEDIA_LNK_FL_IMMUTABLE link flag can not be enabled or disabled.
704 *
705 * When a link is enabled or disabled, the media framework calls the
706 * link_setup operation for the two entities at the source and sink of the
707 * link, in that order. If the second link_setup call fails, another
708 * link_setup call is made on the first entity to restore the original link
709 * flags.
710 *
711 * Media device drivers can be notified of link setup operations by setting the
712 * media_device::link_notify pointer to a callback function. If provided, the
713 * notification callback will be called before enabling and after disabling
714 * links.
715 *
716 * Entity drivers must implement the link_setup operation if any of their links
717 * is non-immutable. The operation must either configure the hardware or store
718 * the configuration information to be applied later.
719 *
720 * Link configuration must not have any side effect on other links. If an
721 * enabled link at a sink pad prevents another link at the same pad from
722 * being enabled, the link_setup operation must return -EBUSY and can't
723 * implicitly disable the first enabled link.
724 *
725 * NOTE: the valid values of the flags for the link is the same as described
726 * on media_create_pad_link(), for pad to pad links or the same as described
727 * on media_create_intf_link(), for interface to entity links.
728 */
146int media_entity_setup_link(struct media_link *link, u32 flags); 729int media_entity_setup_link(struct media_link *link, u32 flags);
730
731/**
732 * media_entity_find_link - Find a link between two pads
733 * @source: Source pad
734 * @sink: Sink pad
735 *
736 * Return a pointer to the link between the two entities. If no such link
737 * exists, return NULL.
738 */
147struct media_link *media_entity_find_link(struct media_pad *source, 739struct media_link *media_entity_find_link(struct media_pad *source,
148 struct media_pad *sink); 740 struct media_pad *sink);
741
742/**
743 * media_entity_remote_pad - Find the pad at the remote end of a link
744 * @pad: Pad at the local end of the link
745 *
746 * Search for a remote pad connected to the given pad by iterating over all
747 * links originating or terminating at that pad until an enabled link is found.
748 *
749 * Return a pointer to the pad at the remote end of the first found enabled
750 * link, or NULL if no enabled link has been found.
751 */
149struct media_pad *media_entity_remote_pad(struct media_pad *pad); 752struct media_pad *media_entity_remote_pad(struct media_pad *pad);
150 753
754/**
755 * media_entity_get - Get a reference to the parent module
756 *
757 * @entity: The entity
758 *
759 * Get a reference to the parent media device module.
760 *
761 * The function will return immediately if @entity is NULL.
762 *
763 * Return a pointer to the entity on success or NULL on failure.
764 */
151struct media_entity *media_entity_get(struct media_entity *entity); 765struct media_entity *media_entity_get(struct media_entity *entity);
766
767__must_check int media_entity_graph_walk_init(
768 struct media_entity_graph *graph, struct media_device *mdev);
769
770/**
771 * media_entity_graph_walk_cleanup - Release resources used by graph walk.
772 *
773 * @graph: Media graph structure that will be used to walk the graph
774 */
775void media_entity_graph_walk_cleanup(struct media_entity_graph *graph);
776
777/**
778 * media_entity_put - Release the reference to the parent module
779 *
780 * @entity: The entity
781 *
782 * Release the reference count acquired by media_entity_get().
783 *
784 * The function will return immediately if @entity is NULL.
785 */
152void media_entity_put(struct media_entity *entity); 786void media_entity_put(struct media_entity *entity);
153 787
788/**
789 * media_entity_graph_walk_start - Start walking the media graph at a given entity
790 * @graph: Media graph structure that will be used to walk the graph
791 * @entity: Starting entity
792 *
793 * Before using this function, media_entity_graph_walk_init() must be
794 * used to allocate resources used for walking the graph. This
795 * function initializes the graph traversal structure to walk the
796 * entities graph starting at the given entity. The traversal
797 * structure must not be modified by the caller during graph
798 * traversal. After the graph walk, the resources must be released
799 * using media_entity_graph_walk_cleanup().
800 */
154void media_entity_graph_walk_start(struct media_entity_graph *graph, 801void media_entity_graph_walk_start(struct media_entity_graph *graph,
155 struct media_entity *entity); 802 struct media_entity *entity);
803
804/**
805 * media_entity_graph_walk_next - Get the next entity in the graph
806 * @graph: Media graph structure
807 *
808 * Perform a depth-first traversal of the given media entities graph.
809 *
810 * The graph structure must have been previously initialized with a call to
811 * media_entity_graph_walk_start().
812 *
813 * Return the next entity in the graph or NULL if the whole graph have been
814 * traversed.
815 */
156struct media_entity * 816struct media_entity *
157media_entity_graph_walk_next(struct media_entity_graph *graph); 817media_entity_graph_walk_next(struct media_entity_graph *graph);
818
819/**
820 * media_entity_pipeline_start - Mark a pipeline as streaming
821 * @entity: Starting entity
822 * @pipe: Media pipeline to be assigned to all entities in the pipeline.
823 *
824 * Mark all entities connected to a given entity through enabled links, either
825 * directly or indirectly, as streaming. The given pipeline object is assigned to
826 * every entity in the pipeline and stored in the media_entity pipe field.
827 *
828 * Calls to this function can be nested, in which case the same number of
829 * media_entity_pipeline_stop() calls will be required to stop streaming. The
830 * pipeline pointer must be identical for all nested calls to
831 * media_entity_pipeline_start().
832 */
158__must_check int media_entity_pipeline_start(struct media_entity *entity, 833__must_check int media_entity_pipeline_start(struct media_entity *entity,
159 struct media_pipeline *pipe); 834 struct media_pipeline *pipe);
835
836/**
837 * media_entity_pipeline_stop - Mark a pipeline as not streaming
838 * @entity: Starting entity
839 *
840 * Mark all entities connected to a given entity through enabled links, either
841 * directly or indirectly, as not streaming. The media_entity pipe field is
842 * reset to NULL.
843 *
844 * If multiple calls to media_entity_pipeline_start() have been made, the same
845 * number of calls to this function are required to mark the pipeline as not
846 * streaming.
847 */
160void media_entity_pipeline_stop(struct media_entity *entity); 848void media_entity_pipeline_stop(struct media_entity *entity);
161 849
850/**
851 * media_devnode_create() - creates and initializes a device node interface
852 *
853 * @mdev: pointer to struct &media_device
854 * @type: type of the interface, as given by MEDIA_INTF_T_* macros
855 * as defined in the uapi/media/media.h header.
856 * @flags: Interface flags as defined in uapi/media/media.h.
857 * @major: Device node major number.
858 * @minor: Device node minor number.
859 *
860 * Return: if succeeded, returns a pointer to the newly allocated
861 * &media_intf_devnode pointer.
862 */
863struct media_intf_devnode *
864__must_check media_devnode_create(struct media_device *mdev,
865 u32 type, u32 flags,
866 u32 major, u32 minor);
867/**
868 * media_devnode_remove() - removes a device node interface
869 *
870 * @devnode: pointer to &media_intf_devnode to be freed.
871 *
872 * When a device node interface is removed, all links to it are automatically
873 * removed.
874 */
875void media_devnode_remove(struct media_intf_devnode *devnode);
876struct media_link *
877
878/**
879 * media_create_intf_link() - creates a link between an entity and an interface
880 *
881 * @entity: pointer to %media_entity
882 * @intf: pointer to %media_interface
883 * @flags: Link flags, as defined in include/uapi/linux/media.h.
884 *
885 *
886 * Valid values for flags:
887 * The %MEDIA_LNK_FL_ENABLED flag indicates that the interface is connected to
888 * the entity hardware. That's the default value for interfaces. An
889 * interface may be disabled if the hardware is busy due to the usage
890 * of some other interface that it is currently controlling the hardware.
891 * A typical example is an hybrid TV device that handle only one type of
892 * stream on a given time. So, when the digital TV is streaming,
893 * the V4L2 interfaces won't be enabled, as such device is not able to
894 * also stream analog TV or radio.
895 *
896 * Note:
897 *
898 * Before calling this function, media_devnode_create() should be called for
899 * the interface and media_device_register_entity() should be called for the
900 * interface that will be part of the link.
901 */
902__must_check media_create_intf_link(struct media_entity *entity,
903 struct media_interface *intf,
904 u32 flags);
905/**
906 * __media_remove_intf_link() - remove a single interface link
907 *
908 * @link: pointer to &media_link.
909 *
910 * Note: this is an unlocked version of media_remove_intf_link()
911 */
912void __media_remove_intf_link(struct media_link *link);
913
914/**
915 * media_remove_intf_link() - remove a single interface link
916 *
917 * @link: pointer to &media_link.
918 *
919 * Note: prefer to use this one, instead of __media_remove_intf_link()
920 */
921void media_remove_intf_link(struct media_link *link);
922
923/**
924 * __media_remove_intf_links() - remove all links associated with an interface
925 *
926 * @intf: pointer to &media_interface
927 *
928 * Note: this is an unlocked version of media_remove_intf_links().
929 */
930void __media_remove_intf_links(struct media_interface *intf);
931
932/**
933 * media_remove_intf_links() - remove all links associated with an interface
934 *
935 * @intf: pointer to &media_interface
936 *
937 * Notes:
938 *
939 * this is called automatically when an entity is unregistered via
940 * media_device_register_entity() and by media_devnode_remove().
941 *
942 * Prefer to use this one, instead of __media_remove_intf_links().
943 */
944void media_remove_intf_links(struct media_interface *intf);
945
162#define media_entity_call(entity, operation, args...) \ 946#define media_entity_call(entity, operation, args...) \
163 (((entity)->ops && (entity)->ops->operation) ? \ 947 (((entity)->ops && (entity)->ops->operation) ? \
164 (entity)->ops->operation((entity) , ##args) : -ENOIOCTLCMD) 948 (entity)->ops->operation((entity) , ##args) : -ENOIOCTLCMD)
diff --git a/include/media/tuner.h b/include/media/tuner.h
index 486b6a54363b..e5321fda5489 100644
--- a/include/media/tuner.h
+++ b/include/media/tuner.h
@@ -21,6 +21,14 @@
21 21
22#include <linux/videodev2.h> 22#include <linux/videodev2.h>
23 23
24/* Tuner PADs */
25/* FIXME: is this the right place for it? */
26enum tuner_pad_index {
27 TUNER_PAD_RF_INPUT,
28 TUNER_PAD_IF_OUTPUT,
29 TUNER_NUM_PADS
30};
31
24#define ADDR_UNSET (255) 32#define ADDR_UNSET (255)
25 33
26#define TUNER_TEMIC_PAL 0 /* 4002 FH5 (3X 7756, 9483) */ 34#define TUNER_TEMIC_PAL 0 /* 4002 FH5 (3X 7756, 9483) */
diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h
index acbcd2f5fe7f..eeabf20e87a6 100644
--- a/include/media/v4l2-dev.h
+++ b/include/media/v4l2-dev.h
@@ -86,6 +86,7 @@ struct video_device
86{ 86{
87#if defined(CONFIG_MEDIA_CONTROLLER) 87#if defined(CONFIG_MEDIA_CONTROLLER)
88 struct media_entity entity; 88 struct media_entity entity;
89 struct media_intf_devnode *intf_devnode;
89#endif 90#endif
90 /* device ops */ 91 /* device ops */
91 const struct v4l2_file_operations *fops; 92 const struct v4l2_file_operations *fops;
diff --git a/include/uapi/linux/media.h b/include/uapi/linux/media.h
index 4e816be3de39..1e3c8cb43bd7 100644
--- a/include/uapi/linux/media.h
+++ b/include/uapi/linux/media.h
@@ -23,6 +23,9 @@
23#ifndef __LINUX_MEDIA_H 23#ifndef __LINUX_MEDIA_H
24#define __LINUX_MEDIA_H 24#define __LINUX_MEDIA_H
25 25
26#ifndef __KERNEL__
27#include <stdint.h>
28#endif
26#include <linux/ioctl.h> 29#include <linux/ioctl.h>
27#include <linux/types.h> 30#include <linux/types.h>
28#include <linux/version.h> 31#include <linux/version.h>
@@ -42,33 +45,107 @@ struct media_device_info {
42 45
43#define MEDIA_ENT_ID_FLAG_NEXT (1 << 31) 46#define MEDIA_ENT_ID_FLAG_NEXT (1 << 31)
44 47
48/*
49 * Initial value to be used when a new entity is created
50 * Drivers should change it to something useful
51 */
52#define MEDIA_ENT_F_UNKNOWN 0x00000000
53
54/*
55 * Base number ranges for entity functions
56 *
57 * NOTE: those ranges and entity function number are phased just to
58 * make it easier to maintain this file. Userspace should not rely on
59 * the ranges to identify a group of function types, as newer
60 * functions can be added with any name within the full u32 range.
61 */
62#define MEDIA_ENT_F_BASE 0x00000000
63#define MEDIA_ENT_F_OLD_BASE 0x00010000
64#define MEDIA_ENT_F_OLD_SUBDEV_BASE 0x00020000
65
66/*
67 * DVB entities
68 */
69#define MEDIA_ENT_F_DTV_DEMOD (MEDIA_ENT_F_BASE + 1)
70#define MEDIA_ENT_F_TS_DEMUX (MEDIA_ENT_F_BASE + 2)
71#define MEDIA_ENT_F_DTV_CA (MEDIA_ENT_F_BASE + 3)
72#define MEDIA_ENT_F_DTV_NET_DECAP (MEDIA_ENT_F_BASE + 4)
73
74/*
75 * Connectors
76 */
77/* It is a responsibility of the entity drivers to add connectors and links */
78#define MEDIA_ENT_F_CONN_RF (MEDIA_ENT_F_BASE + 21)
79#define MEDIA_ENT_F_CONN_SVIDEO (MEDIA_ENT_F_BASE + 22)
80#define MEDIA_ENT_F_CONN_COMPOSITE (MEDIA_ENT_F_BASE + 23)
81/* For internal test signal generators and other debug connectors */
82#define MEDIA_ENT_F_CONN_TEST (MEDIA_ENT_F_BASE + 24)
83
84/*
85 * I/O entities
86 */
87#define MEDIA_ENT_F_IO_DTV (MEDIA_ENT_F_BASE + 31)
88#define MEDIA_ENT_F_IO_VBI (MEDIA_ENT_F_BASE + 32)
89#define MEDIA_ENT_F_IO_SWRADIO (MEDIA_ENT_F_BASE + 33)
90
91/*
92 * Don't touch on those. The ranges MEDIA_ENT_F_OLD_BASE and
93 * MEDIA_ENT_F_OLD_SUBDEV_BASE are kept to keep backward compatibility
94 * with the legacy v1 API.The number range is out of range by purpose:
95 * several previously reserved numbers got excluded from this range.
96 *
97 * Subdevs are initialized with MEDIA_ENT_T_V4L2_SUBDEV_UNKNOWN,
98 * in order to preserve backward compatibility.
99 * Drivers must change to the proper subdev type before
100 * registering the entity.
101 */
102
103#define MEDIA_ENT_F_IO_V4L (MEDIA_ENT_F_OLD_BASE + 1)
104
105#define MEDIA_ENT_F_CAM_SENSOR (MEDIA_ENT_F_OLD_SUBDEV_BASE + 1)
106#define MEDIA_ENT_F_FLASH (MEDIA_ENT_F_OLD_SUBDEV_BASE + 2)
107#define MEDIA_ENT_F_LENS (MEDIA_ENT_F_OLD_SUBDEV_BASE + 3)
108#define MEDIA_ENT_F_ATV_DECODER (MEDIA_ENT_F_OLD_SUBDEV_BASE + 4)
109/*
110 * It is a responsibility of the entity drivers to add connectors and links
111 * for the tuner entities.
112 */
113#define MEDIA_ENT_F_TUNER (MEDIA_ENT_F_OLD_SUBDEV_BASE + 5)
114
115#define MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN MEDIA_ENT_F_OLD_SUBDEV_BASE
116
117#ifndef __KERNEL__
118
119/*
120 * Legacy symbols used to avoid userspace compilation breakages
121 *
122 * Those symbols map the entity function into types and should be
123 * used only on legacy programs for legacy hardware. Don't rely
124 * on those for MEDIA_IOC_G_TOPOLOGY.
125 */
45#define MEDIA_ENT_TYPE_SHIFT 16 126#define MEDIA_ENT_TYPE_SHIFT 16
46#define MEDIA_ENT_TYPE_MASK 0x00ff0000 127#define MEDIA_ENT_TYPE_MASK 0x00ff0000
47#define MEDIA_ENT_SUBTYPE_MASK 0x0000ffff 128#define MEDIA_ENT_SUBTYPE_MASK 0x0000ffff
48 129
49#define MEDIA_ENT_T_DEVNODE (1 << MEDIA_ENT_TYPE_SHIFT) 130#define MEDIA_ENT_T_DEVNODE MEDIA_ENT_F_OLD_BASE
50#define MEDIA_ENT_T_DEVNODE_V4L (MEDIA_ENT_T_DEVNODE + 1) 131#define MEDIA_ENT_T_DEVNODE_V4L MEDIA_ENT_F_IO_V4L
51#define MEDIA_ENT_T_DEVNODE_FB (MEDIA_ENT_T_DEVNODE + 2) 132#define MEDIA_ENT_T_DEVNODE_FB (MEDIA_ENT_T_DEVNODE + 2)
52#define MEDIA_ENT_T_DEVNODE_ALSA (MEDIA_ENT_T_DEVNODE + 3) 133#define MEDIA_ENT_T_DEVNODE_ALSA (MEDIA_ENT_T_DEVNODE + 3)
53#define MEDIA_ENT_T_DEVNODE_DVB_FE (MEDIA_ENT_T_DEVNODE + 4) 134#define MEDIA_ENT_T_DEVNODE_DVB (MEDIA_ENT_T_DEVNODE + 4)
54#define MEDIA_ENT_T_DEVNODE_DVB_DEMUX (MEDIA_ENT_T_DEVNODE + 5)
55#define MEDIA_ENT_T_DEVNODE_DVB_DVR (MEDIA_ENT_T_DEVNODE + 6)
56#define MEDIA_ENT_T_DEVNODE_DVB_CA (MEDIA_ENT_T_DEVNODE + 7)
57#define MEDIA_ENT_T_DEVNODE_DVB_NET (MEDIA_ENT_T_DEVNODE + 8)
58
59/* Legacy symbol. Use it to avoid userspace compilation breakages */
60#define MEDIA_ENT_T_DEVNODE_DVB MEDIA_ENT_T_DEVNODE_DVB_FE
61
62#define MEDIA_ENT_T_V4L2_SUBDEV (2 << MEDIA_ENT_TYPE_SHIFT)
63#define MEDIA_ENT_T_V4L2_SUBDEV_SENSOR (MEDIA_ENT_T_V4L2_SUBDEV + 1)
64#define MEDIA_ENT_T_V4L2_SUBDEV_FLASH (MEDIA_ENT_T_V4L2_SUBDEV + 2)
65#define MEDIA_ENT_T_V4L2_SUBDEV_LENS (MEDIA_ENT_T_V4L2_SUBDEV + 3)
66/* A converter of analogue video to its digital representation. */
67#define MEDIA_ENT_T_V4L2_SUBDEV_DECODER (MEDIA_ENT_T_V4L2_SUBDEV + 4)
68 135
69#define MEDIA_ENT_T_V4L2_SUBDEV_TUNER (MEDIA_ENT_T_V4L2_SUBDEV + 5) 136#define MEDIA_ENT_T_UNKNOWN MEDIA_ENT_F_UNKNOWN
137#define MEDIA_ENT_T_V4L2_VIDEO MEDIA_ENT_F_IO_V4L
138#define MEDIA_ENT_T_V4L2_SUBDEV MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN
139#define MEDIA_ENT_T_V4L2_SUBDEV_SENSOR MEDIA_ENT_F_CAM_SENSOR
140#define MEDIA_ENT_T_V4L2_SUBDEV_FLASH MEDIA_ENT_F_FLASH
141#define MEDIA_ENT_T_V4L2_SUBDEV_LENS MEDIA_ENT_F_LENS
142#define MEDIA_ENT_T_V4L2_SUBDEV_DECODER MEDIA_ENT_F_ATV_DECODER
143#define MEDIA_ENT_T_V4L2_SUBDEV_TUNER MEDIA_ENT_F_TUNER
144#endif
70 145
146/* Entity flags */
71#define MEDIA_ENT_FL_DEFAULT (1 << 0) 147#define MEDIA_ENT_FL_DEFAULT (1 << 0)
148#define MEDIA_ENT_FL_CONNECTOR (1 << 1)
72 149
73struct media_entity_desc { 150struct media_entity_desc {
74 __u32 id; 151 __u32 id;
@@ -151,6 +228,10 @@ struct media_pad_desc {
151#define MEDIA_LNK_FL_IMMUTABLE (1 << 1) 228#define MEDIA_LNK_FL_IMMUTABLE (1 << 1)
152#define MEDIA_LNK_FL_DYNAMIC (1 << 2) 229#define MEDIA_LNK_FL_DYNAMIC (1 << 2)
153 230
231#define MEDIA_LNK_FL_LINK_TYPE (0xf << 28)
232# define MEDIA_LNK_FL_DATA_LINK (0 << 28)
233# define MEDIA_LNK_FL_INTERFACE_LINK (1 << 28)
234
154struct media_link_desc { 235struct media_link_desc {
155 struct media_pad_desc source; 236 struct media_pad_desc source;
156 struct media_pad_desc sink; 237 struct media_pad_desc sink;
@@ -167,9 +248,120 @@ struct media_links_enum {
167 __u32 reserved[4]; 248 __u32 reserved[4];
168}; 249};
169 250
251/* Interface type ranges */
252
253#define MEDIA_INTF_T_DVB_BASE 0x00000100
254#define MEDIA_INTF_T_V4L_BASE 0x00000200
255
256/* Interface types */
257
258#define MEDIA_INTF_T_DVB_FE (MEDIA_INTF_T_DVB_BASE)
259#define MEDIA_INTF_T_DVB_DEMUX (MEDIA_INTF_T_DVB_BASE + 1)
260#define MEDIA_INTF_T_DVB_DVR (MEDIA_INTF_T_DVB_BASE + 2)
261#define MEDIA_INTF_T_DVB_CA (MEDIA_INTF_T_DVB_BASE + 3)
262#define MEDIA_INTF_T_DVB_NET (MEDIA_INTF_T_DVB_BASE + 4)
263
264#define MEDIA_INTF_T_V4L_VIDEO (MEDIA_INTF_T_V4L_BASE)
265#define MEDIA_INTF_T_V4L_VBI (MEDIA_INTF_T_V4L_BASE + 1)
266#define MEDIA_INTF_T_V4L_RADIO (MEDIA_INTF_T_V4L_BASE + 2)
267#define MEDIA_INTF_T_V4L_SUBDEV (MEDIA_INTF_T_V4L_BASE + 3)
268#define MEDIA_INTF_T_V4L_SWRADIO (MEDIA_INTF_T_V4L_BASE + 4)
269
270/*
271 * MC next gen API definitions
272 *
273 * NOTE: The declarations below are close to the MC RFC for the Media
274 * Controller, the next generation. Yet, there are a few adjustments
275 * to do, as we want to be able to have a functional API before
276 * the MC properties change. Those will be properly marked below.
277 * Please also notice that I removed "num_pads", "num_links",
278 * from the proposal, as a proper userspace application will likely
279 * use lists for pads/links, just as we intend to do in Kernelspace.
280 * The API definition should be freed from fields that are bound to
281 * some specific data structure.
282 *
283 * FIXME: Currently, I opted to name the new types as "media_v2", as this
284 * won't cause any conflict with the Kernelspace namespace, nor with
285 * the previous kAPI media_*_desc namespace. This can be changed
286 * later, before the adding this API upstream.
287 */
288
289#if 0 /* Let's postpone it to Kernel 4.6 */
290struct media_v2_entity {
291 __u32 id;
292 char name[64]; /* FIXME: move to a property? (RFC says so) */
293 __u32 function; /* Main function of the entity */
294 __u16 reserved[12];
295};
296
297/* Should match the specific fields at media_intf_devnode */
298struct media_v2_intf_devnode {
299 __u32 major;
300 __u32 minor;
301};
302
303struct media_v2_interface {
304 __u32 id;
305 __u32 intf_type;
306 __u32 flags;
307 __u32 reserved[9];
308
309 union {
310 struct media_v2_intf_devnode devnode;
311 __u32 raw[16];
312 };
313};
314
315struct media_v2_pad {
316 __u32 id;
317 __u32 entity_id;
318 __u32 flags;
319 __u16 reserved[9];
320};
321
322struct media_v2_link {
323 __u32 id;
324 __u32 source_id;
325 __u32 sink_id;
326 __u32 flags;
327 __u32 reserved[5];
328};
329
330struct media_v2_topology {
331 __u64 topology_version;
332
333 __u32 num_entities;
334 __u32 reserved1;
335 __u64 ptr_entities;
336
337 __u32 num_interfaces;
338 __u32 reserved2;
339 __u64 ptr_interfaces;
340
341 __u32 num_pads;
342 __u32 reserved3;
343 __u64 ptr_pads;
344
345 __u32 num_links;
346 __u32 reserved4;
347 __u64 ptr_links;
348};
349
350static inline void __user *media_get_uptr(__u64 arg)
351{
352 return (void __user *)(uintptr_t)arg;
353}
354#endif
355
356/* ioctls */
357
170#define MEDIA_IOC_DEVICE_INFO _IOWR('|', 0x00, struct media_device_info) 358#define MEDIA_IOC_DEVICE_INFO _IOWR('|', 0x00, struct media_device_info)
171#define MEDIA_IOC_ENUM_ENTITIES _IOWR('|', 0x01, struct media_entity_desc) 359#define MEDIA_IOC_ENUM_ENTITIES _IOWR('|', 0x01, struct media_entity_desc)
172#define MEDIA_IOC_ENUM_LINKS _IOWR('|', 0x02, struct media_links_enum) 360#define MEDIA_IOC_ENUM_LINKS _IOWR('|', 0x02, struct media_links_enum)
173#define MEDIA_IOC_SETUP_LINK _IOWR('|', 0x03, struct media_link_desc) 361#define MEDIA_IOC_SETUP_LINK _IOWR('|', 0x03, struct media_link_desc)
174 362
363#if 0 /* Let's postpone it to Kernel 4.6 */
364#define MEDIA_IOC_G_TOPOLOGY _IOWR('|', 0x04, struct media_v2_topology)
365#endif
366
175#endif /* __LINUX_MEDIA_H */ 367#endif /* __LINUX_MEDIA_H */