]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
media: ov5647: Rework s_stream() operation
authorJacopo Mondi <jacopo@jmondi.org>
Thu, 19 Nov 2020 16:35:46 +0000 (17:35 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 12 Jan 2021 16:00:44 +0000 (17:00 +0100)
Rework the s_stream() operation to turn the sensor on and
off at stream enable/disable time using the pm_runtime infrastructure.

Protect the stream on/off from being called multiple times in
sequence with a 'streaming' flag.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/i2c/ov5647.c

index 777c7b30bafd73832e9157f10ba444c711b4a6c8..1ac1538a3951f24a23e2e8818f2a6e9a7b2931ab 100644 (file)
@@ -114,6 +114,7 @@ struct ov5647 {
        struct v4l2_ctrl                *hblank;
        struct v4l2_ctrl                *vblank;
        struct v4l2_ctrl                *exposure;
+       bool                            streaming;
 };
 
 static inline struct ov5647 *to_sensor(struct v4l2_subdev *sd)
@@ -1001,14 +1002,42 @@ __ov5647_get_pad_crop(struct ov5647 *ov5647, struct v4l2_subdev_pad_config *cfg,
 
 static int ov5647_s_stream(struct v4l2_subdev *sd, int enable)
 {
+       struct i2c_client *client = v4l2_get_subdevdata(sd);
        struct ov5647 *sensor = to_sensor(sd);
        int ret;
 
        mutex_lock(&sensor->lock);
-       if (enable)
+       if (sensor->streaming == enable) {
+               mutex_unlock(&sensor->lock);
+               return 0;
+       }
+
+       if (enable) {
+               ret = pm_runtime_get_sync(&client->dev);
+               if (ret < 0)
+                       goto error_unlock;
+
                ret = ov5647_stream_on(sd);
-       else
+               if (ret < 0) {
+                       dev_err(&client->dev, "stream start failed: %d\n", ret);
+                       goto error_unlock;
+               }
+       } else {
                ret = ov5647_stream_off(sd);
+               if (ret < 0) {
+                       dev_err(&client->dev, "stream stop failed: %d\n", ret);
+                       goto error_unlock;
+               }
+               pm_runtime_put(&client->dev);
+       }
+
+       sensor->streaming = enable;
+       mutex_unlock(&sensor->lock);
+
+       return 0;
+
+error_unlock:
+       pm_runtime_put(&client->dev);
        mutex_unlock(&sensor->lock);
 
        return ret;