media: ov5647: Rework s_stream() operation

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>
This commit is contained in:
Jacopo Mondi 2020-11-19 17:35:46 +01:00 committed by Mauro Carvalho Chehab
parent 089b7c70f0
commit 2f038c97fd
1 changed files with 31 additions and 2 deletions

View 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;