@@ -1754,6 +1754,11 @@ static int ccs_enable_streams(struct v4l2_subdev *subdev,
if (pad != CCS_PAD_SRC)
return -EINVAL;
+ if (sensor->streaming) {
+ sensor->streaming |= streams_mask;
+ return 0;
+ }
+
rval = ccs_pm_get_init(sensor);
if (rval)
return rval;
@@ -1875,7 +1880,7 @@ static int ccs_enable_streams(struct v4l2_subdev *subdev,
rval = ccs_write(sensor, MODE_SELECT, CCS_MODE_SELECT_STREAMING);
- sensor->streaming = true;
+ sensor->streaming |= streams_mask;
return 0;
@@ -1897,6 +1902,10 @@ static int ccs_disable_streams(struct v4l2_subdev *subdev,
if (pad != CCS_PAD_SRC)
return -EINVAL;
+ sensor->streaming &= ~streams_mask;
+ if (sensor->streaming)
+ return 0;
+
rval = ccs_write(sensor, MODE_SELECT, CCS_MODE_SELECT_SOFTWARE_STANDBY);
if (rval)
return rval;
@@ -1905,7 +1914,6 @@ static int ccs_disable_streams(struct v4l2_subdev *subdev,
if (rval)
dev_err(&client->dev, "post_streamoff quirks failed\n");
- sensor->streaming = false;
pm_runtime_mark_last_busy(&client->dev);
pm_runtime_put_autosuspend(&client->dev);
@@ -3500,7 +3508,6 @@ static int ccs_probe(struct i2c_client *client)
goto out_cleanup;
}
- sensor->streaming = false;
sensor->dev_init_done = true;
rval = ccs_write_msr_regs(sensor);
@@ -234,7 +234,7 @@ struct ccs_sensor {
u16 image_start; /* image data start line */
u16 visible_pixel_start; /* start pixel of the visible image */
- bool streaming;
+ u8 streaming;
bool dev_init_done;
u8 compressed_min_bpp;
With enable_streams and disable_streams, the driver for a device where streams are not independently started and stopped needs to maintain state information on streams that have been requested to be started. Do that now. In the future, a helper function in the framework is a desirable way to do this instead. Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> --- drivers/media/i2c/ccs/ccs-core.c | 13 ++++++++++--- drivers/media/i2c/ccs/ccs.h | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-)