media: entity: Add iterator for entity data links
authorDaniel Scally <djrscally@gmail.com>
Thu, 7 Jul 2022 22:47:32 +0000 (23:47 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 15 Jul 2022 14:24:40 +0000 (15:24 +0100)
Iterating over the links for an entity is a somewhat common need
through the media subsystem, but generally the assumption is that
they will all be data links. To meet that assumption add a new macro
that iterates through an entity's links and skips non-data links.

Signed-off-by: Daniel Scally <djrscally@gmail.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/mc/mc-entity.c
include/media/media-entity.h

index 11f5207..a247d56 100644 (file)
@@ -9,6 +9,7 @@
  */
 
 #include <linux/bitmap.h>
+#include <linux/list.h>
 #include <linux/property.h>
 #include <linux/slab.h>
 #include <media/media-entity.h>
@@ -1051,3 +1052,18 @@ struct media_link *media_create_ancillary_link(struct media_entity *primary,
        return link;
 }
 EXPORT_SYMBOL_GPL(media_create_ancillary_link);
+
+struct media_link *__media_entity_next_link(struct media_entity *entity,
+                                           struct media_link *link,
+                                           unsigned long link_type)
+{
+       link = link ? list_next_entry(link, list)
+                   : list_first_entry(&entity->links, typeof(*link), list);
+
+       list_for_each_entry_from(link, &entity->links, list)
+               if ((link->flags & MEDIA_LNK_FL_LINK_TYPE) == link_type)
+                       return link;
+
+       return NULL;
+}
+EXPORT_SYMBOL_GPL(__media_entity_next_link);
index a9a1c0e..4efe2f8 100644 (file)
@@ -1140,4 +1140,34 @@ struct media_link *
 media_create_ancillary_link(struct media_entity *primary,
                            struct media_entity *ancillary);
 
+/**
+ * __media_entity_next_link() - Iterate through a &media_entity's links
+ *
+ * @entity:    pointer to the &media_entity
+ * @link:      pointer to a &media_link to hold the iterated values
+ * @link_type: one of the MEDIA_LNK_FL_LINK_TYPE flags
+ *
+ * Return the next link against an entity matching a specific link type. This
+ * allows iteration through an entity's links whilst guaranteeing all of the
+ * returned links are of the given type.
+ */
+struct media_link *__media_entity_next_link(struct media_entity *entity,
+                                           struct media_link *link,
+                                           unsigned long link_type);
+
+/**
+ * for_each_media_entity_data_link() - Iterate through an entity's data links
+ *
+ * @entity:    pointer to the &media_entity
+ * @link:      pointer to a &media_link to hold the iterated values
+ *
+ * Iterate over a &media_entity's data links
+ */
+#define for_each_media_entity_data_link(entity, link)                  \
+       for (link = __media_entity_next_link(entity, NULL,              \
+                                            MEDIA_LNK_FL_DATA_LINK);   \
+            link;                                                      \
+            link = __media_entity_next_link(entity, link,              \
+                                            MEDIA_LNK_FL_DATA_LINK))
+
 #endif