Add an iterator helper to easily cycle through all pads in an entity and
use it in media-entity and media-device code where appropriate.

Signed-off-by: Jacopo Mondi <[email protected]>
---
 drivers/media/media-device.c | 13 ++++++-------
 drivers/media/media-entity.c | 11 ++++++-----
 include/media/media-entity.h | 12 ++++++++++++
 3 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/drivers/media/media-device.c b/drivers/media/media-device.c
index b8ec88612df7..cddf5a0857b9 100644
--- a/drivers/media/media-device.c
+++ b/drivers/media/media-device.c
@@ -584,7 +584,7 @@ int __must_check media_device_register_entity(struct 
media_device *mdev,
                                              struct media_entity *entity)
 {
        struct media_entity_notify *notify, *next;
-       unsigned int i;
+       struct media_pad *iter;
        int ret;
 
        if (entity->function == MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN ||
@@ -613,9 +613,8 @@ int __must_check media_device_register_entity(struct 
media_device *mdev,
        media_gobj_create(mdev, MEDIA_GRAPH_ENTITY, &entity->graph_obj);
 
        /* Initialize objects at the pads */
-       for (i = 0; i < entity->num_pads; i++)
-               media_gobj_create(mdev, MEDIA_GRAPH_PAD,
-                              &entity->pads[i].graph_obj);
+       media_entity_for_each_pad(entity, iter)
+               media_gobj_create(mdev, MEDIA_GRAPH_PAD, &iter->graph_obj);
 
        /* invoke entity_notify callbacks */
        list_for_each_entry_safe(notify, next, &mdev->entity_notify, list)
@@ -649,7 +648,7 @@ static void __media_device_unregister_entity(struct 
media_entity *entity)
        struct media_device *mdev = entity->graph_obj.mdev;
        struct media_link *link, *tmp;
        struct media_interface *intf;
-       unsigned int i;
+       struct media_pad *iter;
 
        ida_free(&mdev->entity_internal_idx, entity->internal_idx);
 
@@ -665,8 +664,8 @@ static void __media_device_unregister_entity(struct 
media_entity *entity)
        __media_entity_remove_links(entity);
 
        /* Remove all pads that belong to this entity */
-       for (i = 0; i < entity->num_pads; i++)
-               media_gobj_destroy(&entity->pads[i].graph_obj);
+       media_entity_for_each_pad(entity, iter)
+               media_gobj_destroy(&iter->graph_obj);
 
        /* Remove the entity */
        media_gobj_destroy(&entity->graph_obj);
diff --git a/drivers/media/media-entity.c b/drivers/media/media-entity.c
index 04e987681ab5..5ac7ea2ae15a 100644
--- a/drivers/media/media-entity.c
+++ b/drivers/media/media-entity.c
@@ -207,7 +207,8 @@ int media_entity_pads_init(struct media_entity *entity, u16 
num_pads,
                           struct media_pad *pads)
 {
        struct media_device *mdev = entity->graph_obj.mdev;
-       unsigned int i;
+       struct media_pad *iter;
+       unsigned int i = 0;
 
        if (num_pads >= MEDIA_ENTITY_MAX_PADS)
                return -E2BIG;
@@ -218,12 +219,12 @@ int media_entity_pads_init(struct media_entity *entity, 
u16 num_pads,
        if (mdev)
                mutex_lock(&mdev->graph_mutex);
 
-       for (i = 0; i < num_pads; i++) {
-               pads[i].entity = entity;
-               pads[i].index = i;
+       media_entity_for_each_pad(entity, iter) {
+               iter->entity = entity;
+               iter->index = i++;
                if (mdev)
                        media_gobj_create(mdev, MEDIA_GRAPH_PAD,
-                                       &entity->pads[i].graph_obj);
+                                       &iter->graph_obj);
        }
 
        if (mdev)
diff --git a/include/media/media-entity.h b/include/media/media-entity.h
index 662ebc105093..16505a249c59 100644
--- a/include/media/media-entity.h
+++ b/include/media/media-entity.h
@@ -1133,3 +1133,15 @@ void media_remove_intf_links(struct media_interface 
*intf);
         (entity)->ops->operation((entity) , ##args) : -ENOIOCTLCMD)
 
 #endif
+
+/**
+ * media_entity_for_each_pad - Iterate on all pads in an entity
+ * @entity: The entity the pads belong to
+ * @iter: The iterator pad
+ *
+ * Iterate on all pads in a media entity.
+ */
+#define media_entity_for_each_pad(entity, iter)                        \
+       for (iter = (entity)->pads;                             \
+            iter < &(entity)->pads[(entity)->num_pads];        \
+            ++iter)
-- 
2.20.1

Reply via email to