Re: [PATCH v8 20/38] media: ccs: Track streaming state

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 3/13/24 08:24, Sakari Ailus wrote:
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@xxxxxxxxxxxxxxx>
Reviewed-by: Julien Massot <julien.massot@xxxxxxxxxxxxx>
---
  drivers/media/i2c/ccs/ccs-core.c | 13 ++++++++++---
  drivers/media/i2c/ccs/ccs.h      |  2 +-
  2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/media/i2c/ccs/ccs-core.c b/drivers/media/i2c/ccs/ccs-core.c
index 9e70946653e9..0cd8ee957655 100644
--- a/drivers/media/i2c/ccs/ccs-core.c
+++ b/drivers/media/i2c/ccs/ccs-core.c
@@ -1766,6 +1766,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;
@@ -1887,7 +1892,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; @@ -1909,6 +1914,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;
@@ -1917,7 +1926,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);
@@ -3525,7 +3533,6 @@ static int ccs_probe(struct i2c_client *client)
  		goto out_cleanup;
  	}
- sensor->streaming = false;
  	sensor->dev_init_done = true;
  	sensor->handler_setup_needed = true;
diff --git a/drivers/media/i2c/ccs/ccs.h b/drivers/media/i2c/ccs/ccs.h
index 096573845a10..4725e6eca8d0 100644
--- a/drivers/media/i2c/ccs/ccs.h
+++ b/drivers/media/i2c/ccs/ccs.h
@@ -236,7 +236,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;
  	bool handler_setup_needed;
  	u8 compressed_min_bpp;

--
Julien Massot
Senior Software Engineer
Collabora Ltd.
Platinum Building, St John's Innovation Park, Cambridge CB4 0DS, UK
Registered in England & Wales, no. 5513718




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux