diff mbox series

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

Message ID 20240313072516.241106-21-sakari.ailus@linux.intel.com (mailing list archive)
State New, archived
Headers show
Series Generic line based metadata support, internal pads | expand

Commit Message

Sakari Ailus March 13, 2024, 7:24 a.m. UTC
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(-)

Comments

Julien Massot March 15, 2024, 3:56 p.m. UTC | #1
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@linux.intel.com>
Reviewed-by: Julien Massot <julien.massot@collabora.com>
> ---
>   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;
Laurent Pinchart March 21, 2024, 4:36 p.m. UTC | #2
Hi Sakari,

Thank you for the patch.

On Wed, Mar 13, 2024 at 09:24:58AM +0200, 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@linux.intel.com>

Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>

> ---
>  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;
diff mbox series

Patch

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;