Merge tag 'mmc-v4.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc
[cascardo/linux.git] / drivers / media / platform / vsp1 / vsp1_entity.c
index 4cf6cc7..da67349 100644 (file)
@@ -51,6 +51,9 @@ void vsp1_entity_route_setup(struct vsp1_entity *source,
  * @cfg: the TRY pad configuration
  * @which: configuration selector (ACTIVE or TRY)
  *
+ * When called with which set to V4L2_SUBDEV_FORMAT_ACTIVE the caller must hold
+ * the entity lock to access the returned configuration.
+ *
  * Return the pad configuration requested by the which argument. The TRY
  * configuration is passed explicitly to the function through the cfg argument
  * and simply returned when requested. The ACTIVE configuration comes from the
@@ -160,7 +163,9 @@ int vsp1_subdev_get_pad_format(struct v4l2_subdev *subdev,
        if (!config)
                return -EINVAL;
 
+       mutex_lock(&entity->lock);
        fmt->format = *vsp1_entity_get_pad_format(entity, config, fmt->pad);
+       mutex_unlock(&entity->lock);
 
        return 0;
 }
@@ -204,8 +209,10 @@ int vsp1_subdev_enum_mbus_code(struct v4l2_subdev *subdev,
                if (!config)
                        return -EINVAL;
 
+               mutex_lock(&entity->lock);
                format = vsp1_entity_get_pad_format(entity, config, 0);
                code->code = format->code;
+               mutex_unlock(&entity->lock);
        }
 
        return 0;
@@ -235,6 +242,7 @@ int vsp1_subdev_enum_frame_size(struct v4l2_subdev *subdev,
        struct vsp1_entity *entity = to_vsp1_entity(subdev);
        struct v4l2_subdev_pad_config *config;
        struct v4l2_mbus_framefmt *format;
+       int ret = 0;
 
        config = vsp1_entity_get_pad_config(entity, cfg, fse->which);
        if (!config)
@@ -242,8 +250,12 @@ int vsp1_subdev_enum_frame_size(struct v4l2_subdev *subdev,
 
        format = vsp1_entity_get_pad_format(entity, config, fse->pad);
 
-       if (fse->index || fse->code != format->code)
-               return -EINVAL;
+       mutex_lock(&entity->lock);
+
+       if (fse->index || fse->code != format->code) {
+               ret = -EINVAL;
+               goto done;
+       }
 
        if (fse->pad == 0) {
                fse->min_width = min_width;
@@ -260,7 +272,9 @@ int vsp1_subdev_enum_frame_size(struct v4l2_subdev *subdev,
                fse->max_height = format->height;
        }
 
-       return 0;
+done:
+       mutex_unlock(&entity->lock);
+       return ret;
 }
 
 /* -----------------------------------------------------------------------------
@@ -358,6 +372,8 @@ int vsp1_entity_init(struct vsp1_device *vsp1, struct vsp1_entity *entity,
        if (i == ARRAY_SIZE(vsp1_routes))
                return -EINVAL;
 
+       mutex_init(&entity->lock);
+
        entity->vsp1 = vsp1;
        entity->source_pad = num_pads - 1;