]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/media/platform/exynos4-is/media-dev.c
[media] exynos4-is: Media graph/video device locking rework
[karo-tx-linux.git] / drivers / media / platform / exynos4-is / media-dev.c
index 15ef8f28239b797df583fa910720847cd4e14947..1b4bb25d0a55a024dbd15f1625f7b50f7b6552ec 100644 (file)
@@ -62,7 +62,7 @@ static void fimc_pipeline_prepare(struct fimc_pipeline *p,
                        struct media_pad *spad = &me->pads[i];
                        if (!(spad->flags & MEDIA_PAD_FL_SINK))
                                continue;
-                       pad = media_entity_remote_source(spad);
+                       pad = media_entity_remote_pad(spad);
                        if (pad)
                                break;
                }
@@ -929,7 +929,7 @@ static int __fimc_md_create_flite_source_links(struct fimc_md *fmd)
                        continue;
 
                source = &fimc->subdev.entity;
-               sink = &fimc->vfd.entity;
+               sink = &fimc->ve.vdev.entity;
                /* FIMC-LITE's subdev and video node */
                ret = media_entity_create_link(source, FLITE_SD_PAD_SOURCE_DMA,
                                               sink, 0, 0);
@@ -1066,7 +1066,7 @@ static int fimc_md_create_links(struct fimc_md *fmd)
                        continue;
 
                source = &fmd->fimc[i]->vid_cap.subdev.entity;
-               sink = &fmd->fimc[i]->vid_cap.vfd.entity;
+               sink = &fmd->fimc[i]->vid_cap.ve.vdev.entity;
 
                ret = media_entity_create_link(source, FIMC_SD_PAD_SOURCE,
                                              sink, 0, flags);
@@ -1238,9 +1238,7 @@ static int fimc_md_link_notify(struct media_pad *source,
        struct fimc_dev *fimc = NULL;
        struct fimc_pipeline *pipeline;
        struct v4l2_subdev *sd;
-       struct mutex *lock;
        int i, ret = 0;
-       int ref_count;
 
        if (media_entity_type(sink->entity) != MEDIA_ENT_T_V4L2_SUBDEV)
                return 0;
@@ -1253,31 +1251,24 @@ static int fimc_md_link_notify(struct media_pad *source,
                if (WARN_ON(fimc_lite == NULL))
                        return 0;
                pipeline = &fimc_lite->pipeline;
-               lock = &fimc_lite->lock;
                break;
        case GRP_ID_FIMC:
                fimc = v4l2_get_subdevdata(sd);
                if (WARN_ON(fimc == NULL))
                        return 0;
                pipeline = &fimc->pipeline;
-               lock = &fimc->lock;
                break;
        default:
                return 0;
        }
 
-       mutex_lock(lock);
-       ref_count = fimc ? fimc->vid_cap.refcnt : fimc_lite->ref_count;
-
        if (!(flags & MEDIA_LNK_FL_ENABLED)) {
-               if (ref_count > 0) {
+               if (sink->entity->use_count > 0) {
                        ret = __fimc_pipeline_close(pipeline);
-                       if (!ret && fimc)
-                               fimc_ctrls_delete(fimc->vid_cap.ctx);
                }
                for (i = 0; i < IDX_MAX; i++)
                        pipeline->subdevs[i] = NULL;
-       } else if (ref_count > 0) {
+       } else if (sink->entity->use_count > 0) {
                /*
                 * Link activation. Enable power of pipeline elements only if
                 * the pipeline is already in use, i.e. its video node is open.
@@ -1285,11 +1276,8 @@ static int fimc_md_link_notify(struct media_pad *source,
                 */
                ret = __fimc_pipeline_open(pipeline,
                                           source->entity, true);
-               if (!ret && fimc)
-                       ret = fimc_capture_ctrls_create(fimc);
        }
 
-       mutex_unlock(lock);
        return ret ? -EPIPE : ret;
 }