Codec devices have two m2m devices in the media topology: one
for decoding, one for encoding. Since the entity names were the
same for both, this was invalid. Also the major/minor numbers
were not set for the I/O entities.

Signed-off-by: Hans Verkuil <hans.verk...@cisco.com>
---

Ezequiel, just fold this in your own patch. With this change in place everything
looks good to me.

PS: don't forget to remove the MEM2MEM_ENT_TYPE_MAX in the enum.

Regards,

        Hans

---
 drivers/media/v4l2-core/v4l2-mem2mem.c | 27 +++++++++++++++++++++-----
 1 file changed, 22 insertions(+), 5 deletions(-)

diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c 
b/drivers/media/v4l2-core/v4l2-mem2mem.c
index 40d4d645e6a6..e8564c39f7d4 100644
--- a/drivers/media/v4l2-core/v4l2-mem2mem.c
+++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
@@ -647,15 +647,20 @@ void v4l2_m2m_unregister_media_controller(struct 
v4l2_m2m_dev *m2m_dev)
        media_device_unregister_entity(m2m_dev->source);
        media_device_unregister_entity(&m2m_dev->sink);
        media_device_unregister_entity(&m2m_dev->proc);
+       kfree(m2m_dev->source->name);
+       kfree(m2m_dev->sink.name);
+       kfree(m2m_dev->proc.name);
 }
 EXPORT_SYMBOL_GPL(v4l2_m2m_unregister_media_controller);

 static int v4l2_m2m_register_entity(struct media_device *mdev,
        struct v4l2_m2m_dev *m2m_dev, enum v4l2_m2m_entity_type type,
-       int function)
+       struct video_device *vdev, int function)
 {
        struct media_entity *entity;
        struct media_pad *pads;
+       char *name;
+       unsigned int len;
        int num_pads;
        int ret;

@@ -671,6 +676,8 @@ static int v4l2_m2m_register_entity(struct media_device 
*mdev,
                pads = &m2m_dev->sink_pad;
                pads[0].flags = MEDIA_PAD_FL_SINK;
                num_pads = 1;
+               entity->info.dev.major = m2m_dev->source->info.dev.major;
+               entity->info.dev.minor = m2m_dev->source->info.dev.minor;
                break;
        case MEM2MEM_ENT_TYPE_PROC:
                entity = &m2m_dev->proc;
@@ -684,7 +691,14 @@ static int v4l2_m2m_register_entity(struct media_device 
*mdev,
        }

        entity->obj_type = MEDIA_ENTITY_TYPE_BASE;
-       entity->name = m2m_entity_name[type];
+       entity->info.dev.major = VIDEO_MAJOR;
+       entity->info.dev.minor = vdev->minor;
+       len = strlen(vdev->name) + 2 + strlen(m2m_entity_name[type]);
+       name = kmalloc(len, GFP_KERNEL);
+       if (!name)
+               return -ENOMEM;
+       snprintf(name, len, "%s-%s", vdev->name, m2m_entity_name[type]);
+       entity->name = name;
        entity->function = function;

        ret = media_entity_pads_init(entity, num_pads, pads);
@@ -715,15 +729,15 @@ int v4l2_m2m_register_media_controller(struct 
v4l2_m2m_dev *m2m_dev,
        /* Create the three entities with their pads */
        m2m_dev->source = &vdev->entity;
        ret = v4l2_m2m_register_entity(mdev, m2m_dev,
-                       MEM2MEM_ENT_TYPE_SOURCE, MEDIA_ENT_F_IO_V4L);
+                       MEM2MEM_ENT_TYPE_SOURCE, vdev, MEDIA_ENT_F_IO_V4L);
        if (ret)
                return ret;
        ret = v4l2_m2m_register_entity(mdev, m2m_dev,
-                       MEM2MEM_ENT_TYPE_PROC, function);
+                       MEM2MEM_ENT_TYPE_PROC, vdev, function);
        if (ret)
                goto err_rel_entity0;
        ret = v4l2_m2m_register_entity(mdev, m2m_dev,
-                       MEM2MEM_ENT_TYPE_SINK, MEDIA_ENT_F_IO_V4L);
+                       MEM2MEM_ENT_TYPE_SINK, vdev, MEDIA_ENT_F_IO_V4L);
        if (ret)
                goto err_rel_entity1;

@@ -774,10 +788,13 @@ int v4l2_m2m_register_media_controller(struct 
v4l2_m2m_dev *m2m_dev,
        media_entity_remove_links(m2m_dev->source);
 err_rel_entity2:
        media_device_unregister_entity(&m2m_dev->proc);
+       kfree(m2m_dev->proc.name);
 err_rel_entity1:
        media_device_unregister_entity(&m2m_dev->sink);
+       kfree(m2m_dev->sink.name);
 err_rel_entity0:
        media_device_unregister_entity(m2m_dev->source);
+       kfree(m2m_dev->source->name);
        return ret;
        return 0;
 }
-- 
2.17.0

Reply via email to