[media] media-device: add pads and links to media_device
authorMauro Carvalho Chehab <mchehab@osg.samsung.com>
Sun, 23 Aug 2015 11:00:33 +0000 (08:00 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Mon, 11 Jan 2016 14:18:53 +0000 (12:18 -0200)
The MC next gen API sends objects to userspace grouped by
their types.

In the case of pads and links, in order to improve performance
and have a simpler code, the best is to store them also on
separate linked lists at MC.

If we don't do that, we would need this kind of interaction
to send data to userspace (code is in structured english):

for each entity:
for each pad:
store pads

for each entity:
for each link:
store link

for each interface:
for each link:
store link

With would require one nested loop for pads and two nested
loops for links. By using  separate linked lists for them,
just one loop would be enough.

Acked-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/media-device.c
drivers/media/media-entity.c
include/media/media-device.h

index ec98595b8a7ad5528d0e979580fb546bd5f44eb1..5b2c9f7fcd4590443a0405eab34037831746f00f 100644 (file)
@@ -382,6 +382,8 @@ int __must_check __media_device_register(struct media_device *mdev,
 
        INIT_LIST_HEAD(&mdev->entities);
        INIT_LIST_HEAD(&mdev->interfaces);
+       INIT_LIST_HEAD(&mdev->pads);
+       INIT_LIST_HEAD(&mdev->links);
        spin_lock_init(&mdev->lock);
        mutex_init(&mdev->graph_mutex);
 
index b3875b0185c1eebe7276a8e7a0f182611509d373..2f3d3aae20a7248fd52293602ca67aadc3e79a82 100644 (file)
@@ -162,13 +162,15 @@ void media_gobj_init(struct media_device *mdev,
                break;
        case MEDIA_GRAPH_PAD:
                gobj->id = media_gobj_gen_id(type, ++mdev->pad_id);
+               list_add_tail(&gobj->list, &mdev->pads);
                break;
        case MEDIA_GRAPH_LINK:
                gobj->id = media_gobj_gen_id(type, ++mdev->link_id);
+               list_add_tail(&gobj->list, &mdev->links);
                break;
        case MEDIA_GRAPH_INTF_DEVNODE:
-               list_add_tail(&gobj->list, &mdev->interfaces);
                gobj->id = media_gobj_gen_id(type, ++mdev->intf_devnode_id);
+               list_add_tail(&gobj->list, &mdev->interfaces);
                break;
        }
        dev_dbg_obj(__func__, gobj);
@@ -183,17 +185,10 @@ void media_gobj_init(struct media_device *mdev,
  */
 void media_gobj_remove(struct media_gobj *gobj)
 {
-       /* Remove the object from mdev list */
-       switch (media_type(gobj)) {
-       case MEDIA_GRAPH_ENTITY:
-       case MEDIA_GRAPH_INTF_DEVNODE:
-               list_del(&gobj->list);
-               break;
-       default:
-               break;
-       }
-
        dev_dbg_obj(__func__, gobj);
+
+       /* Remove the object from mdev list */
+       list_del(&gobj->list);
 }
 
 /**
index 85fa302047bd420046902595042f7f1034109c17..0d1b9c68745446a818bcac15f76b29c13a3843ef 100644 (file)
@@ -47,6 +47,8 @@ struct device;
  * @intf_devnode_id: Unique ID used on the last interface devnode registered
  * @entities:  List of registered entities
  * @interfaces:        List of registered interfaces
+ * @pads:      List of registered pads
+ * @links:     List of registered links
  * @lock:      Entities list lock
  * @graph_mutex: Entities graph operation lock
  * @link_notify: Link state change notification callback
@@ -79,6 +81,8 @@ struct media_device {
 
        struct list_head entities;
        struct list_head interfaces;
+       struct list_head pads;
+       struct list_head links;
 
        /* Protects the entities list */
        spinlock_t lock;
@@ -117,6 +121,14 @@ struct media_device *media_device_find_devres(struct device *dev);
 #define media_device_for_each_intf(intf, mdev)                 \
        list_for_each_entry(intf, &(mdev)->interfaces, graph_obj.list)
 
+/* Iterate over all pads. */
+#define media_device_for_each_pad(pad, mdev)                   \
+       list_for_each_entry(pad, &(mdev)->pads, graph_obj.list)
+
+/* Iterate over all links. */
+#define media_device_for_each_link(link, mdev)                 \
+       list_for_each_entry(link, &(mdev)->links, graph_obj.list)
+
 
 #else
 static inline int media_device_register(struct media_device *mdev)