[media] s5p-fimc: Add media entity initialization
authorSylwester Nawrocki <s.nawrocki@samsung.com>
Tue, 26 Jul 2011 21:08:21 +0000 (18:08 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 6 Sep 2011 18:17:36 +0000 (15:17 -0300)
Add intialization of the media entities for video capture
and mem-to-mem video nodes. The mem-to-mem entity has no pads
whereas the capture entity has single sink pad.
Also clean up the video node naming for consistency.

Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/s5p-fimc/fimc-capture.c
drivers/media/video/s5p-fimc/fimc-core.c
drivers/media/video/s5p-fimc/fimc-core.h

index a2f7da9c7f6070730f4ae21d9ce99d1043b2c8d4..19d398b155fae35865aca59a98994b3d08251d07 100644 (file)
@@ -853,9 +853,8 @@ int fimc_register_capture_device(struct fimc_dev *fimc)
        fr->width = fr->f_width = fr->o_width = 640;
        fr->height = fr->f_height = fr->o_height = 480;
 
-       if (!v4l2_dev->name[0])
-               snprintf(v4l2_dev->name, sizeof(v4l2_dev->name),
-                        "%s.capture", dev_name(&fimc->pdev->dev));
+       snprintf(v4l2_dev->name, sizeof(v4l2_dev->name),
+                "%s.capture", dev_name(&fimc->pdev->dev));
 
        ret = v4l2_device_register(NULL, v4l2_dev);
        if (ret)
@@ -867,11 +866,11 @@ int fimc_register_capture_device(struct fimc_dev *fimc)
                goto err_v4l2_reg;
        }
 
-       snprintf(vfd->name, sizeof(vfd->name), "%s:cap",
-                dev_name(&fimc->pdev->dev));
+       strlcpy(vfd->name, v4l2_dev->name, sizeof(vfd->name));
 
        vfd->fops       = &fimc_capture_fops;
        vfd->ioctl_ops  = &fimc_capture_ioctl_ops;
+       vfd->v4l2_dev   = v4l2_dev;
        vfd->minor      = -1;
        vfd->release    = video_device_release;
        vfd->lock       = &fimc->lock;
@@ -901,6 +900,11 @@ int fimc_register_capture_device(struct fimc_dev *fimc)
 
        vb2_queue_init(q);
 
+       fimc->vid_cap.vd_pad.flags = MEDIA_PAD_FL_SINK;
+       ret = media_entity_init(&vfd->entity, 1, &fimc->vid_cap.vd_pad, 0);
+       if (ret)
+               goto err_ent;
+
        ret = video_register_device(vfd, VFL_TYPE_GRABBER, -1);
        if (ret) {
                v4l2_err(v4l2_dev, "Failed to register video device\n");
@@ -910,10 +914,11 @@ int fimc_register_capture_device(struct fimc_dev *fimc)
        v4l2_info(v4l2_dev,
                  "FIMC capture driver registered as /dev/video%d\n",
                  vfd->num);
-
        return 0;
 
 err_vd_reg:
+       media_entity_cleanup(&vfd->entity);
+err_ent:
        video_device_release(vfd);
 err_v4l2_reg:
        v4l2_device_unregister(v4l2_dev);
@@ -925,10 +930,11 @@ err_info:
 
 void fimc_unregister_capture_device(struct fimc_dev *fimc)
 {
-       struct fimc_vid_cap *capture = &fimc->vid_cap;
+       struct video_device *vfd = fimc->vid_cap.vfd;
 
-       if (capture->vfd)
-               video_unregister_device(capture->vfd);
-
-       kfree(capture->ctx);
+       if (vfd) {
+               media_entity_cleanup(&vfd->entity);
+               video_unregister_device(vfd);
+       }
+       kfree(fimc->vid_cap.ctx);
 }
index a9f321b1e7c13c13869b0043b49f0de475c362ad..1ae2206b63314b43da66ff07954001c7dbd8fc82 100644 (file)
@@ -1507,10 +1507,8 @@ static int fimc_register_m2m_device(struct fimc_dev *fimc)
        pdev = fimc->pdev;
        v4l2_dev = &fimc->m2m.v4l2_dev;
 
-       /* set name if it is empty */
-       if (!v4l2_dev->name[0])
-               snprintf(v4l2_dev->name, sizeof(v4l2_dev->name),
-                        "%s.m2m", dev_name(&pdev->dev));
+       snprintf(v4l2_dev->name, sizeof(v4l2_dev->name),
+                "%s.m2m", dev_name(&pdev->dev));
 
        ret = v4l2_device_register(&pdev->dev, v4l2_dev);
        if (ret)
@@ -1524,6 +1522,7 @@ static int fimc_register_m2m_device(struct fimc_dev *fimc)
 
        vfd->fops       = &fimc_m2m_fops;
        vfd->ioctl_ops  = &fimc_m2m_ioctl_ops;
+       vfd->v4l2_dev   = v4l2_dev;
        vfd->minor      = -1;
        vfd->release    = video_device_release;
        vfd->lock       = &fimc->lock;
@@ -1541,17 +1540,22 @@ static int fimc_register_m2m_device(struct fimc_dev *fimc)
                goto err_m2m_r2;
        }
 
+       ret = media_entity_init(&vfd->entity, 0, NULL, 0);
+       if (ret)
+               goto err_m2m_r3;
+
        ret = video_register_device(vfd, VFL_TYPE_GRABBER, -1);
        if (ret) {
                v4l2_err(v4l2_dev,
                         "%s(): failed to register video device\n", __func__);
-               goto err_m2m_r3;
+               goto err_m2m_r4;
        }
        v4l2_info(v4l2_dev,
                  "FIMC m2m driver registered as /dev/video%d\n", vfd->num);
 
        return 0;
-
+err_m2m_r4:
+       media_entity_cleanup(&vfd->entity);
 err_m2m_r3:
        v4l2_m2m_release(fimc->m2m.m2m_dev);
 err_m2m_r2:
@@ -1564,12 +1568,13 @@ err_m2m_r1:
 
 static void fimc_unregister_m2m_device(struct fimc_dev *fimc)
 {
-       if (fimc) {
-               v4l2_m2m_release(fimc->m2m.m2m_dev);
-               video_unregister_device(fimc->m2m.vfd);
+       if (fimc == NULL)
+               return;
 
-               v4l2_device_unregister(&fimc->m2m.v4l2_dev);
-       }
+       v4l2_m2m_release(fimc->m2m.m2m_dev);
+       v4l2_device_unregister(&fimc->m2m.v4l2_dev);
+       media_entity_cleanup(&fimc->m2m.vfd->entity);
+       video_unregister_device(fimc->m2m.vfd);
 }
 
 static void fimc_clk_put(struct fimc_dev *fimc)
index e34cf3bf27907f38bd07ce8cb752839ad06b991e..fc99824fe4123da0644db3a9c11f5da5e04f347d 100644 (file)
@@ -16,6 +16,8 @@
 #include <linux/types.h>
 #include <linux/videodev2.h>
 #include <linux/io.h>
+
+#include <media/media-entity.h>
 #include <media/videobuf2-core.h>
 #include <media/v4l2-device.h>
 #include <media/v4l2-mem2mem.h>
@@ -298,6 +300,7 @@ struct fimc_m2m_device {
  * @vfd: video device node for camera capture mode
  * @v4l2_dev: v4l2_device struct to manage subdevs
  * @sd: pointer to camera sensor subdevice currently in use
+ * @vd_pad: fimc video capture node pad
  * @fmt: Media Bus format configured at selected image sensor
  * @pending_buf_q: the pending buffer queue head
  * @active_buf_q: the queue head of buffers scheduled in hardware
@@ -315,6 +318,7 @@ struct fimc_vid_cap {
        struct video_device             *vfd;
        struct v4l2_device              v4l2_dev;
        struct v4l2_subdev              *sd;;
+       struct media_pad                vd_pad;
        struct v4l2_mbus_framefmt       fmt;
        struct list_head                pending_buf_q;
        struct list_head                active_buf_q;