Re: [PATCH] media: Split v4l2_pipeline_pm_use into v4l2_pipeline_pm_{get, put}

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

 



Hi Hans,

On Tue, 2019-11-26 at 06:47 +0900, Ezequiel Garcia wrote:
> Currently, v4l2_pipeline_pm_use() prototype is:
> 
>   int v4l2_pipeline_pm_use(struct media_entity *entity, int use)
> 
> Where the 'use' argument shall only be set to '1' for enable/power-on,
> or to '0' for disable/power-off. The integer return is specified
> as only meaningful when 'use' is set to '1'.
> 
> Let's enforce this semantic by splitting the function in two:
> v4l2_pipeline_pm_get and v4l2_pipeline_pm_put. This is done
> for several reasons.
> 
> It makes the API easier to use (or harder to misuse).
> It removes the constraint on the values the 'use' argument
> shall take. Also, it removes the need to constraint
> the return value, by making v4l2_pipeline_pm_put void return.
> 
> And last, it's more consistent with other kernel APIs, such
> as the runtime pm APIs, which makes the code more symmetric.
> 
> Signed-off-by: Ezequiel Garcia <ezequiel@xxxxxxxxxxxxx>

Any feedback on this? No hurries, just pinging in case
it fell thru the cracks.

Thanks,
Ezequiel

> ---
>  Documentation/media/kapi/csi2.rst             |  2 +-
>  drivers/media/platform/omap3isp/ispvideo.c    |  4 +-
>  .../media/platform/qcom/camss/camss-video.c   |  4 +-
>  drivers/media/platform/rcar-vin/rcar-v4l2.c   |  6 +--
>  .../platform/sunxi/sun4i-csi/sun4i_v4l2.c     |  6 +--
>  .../platform/sunxi/sun6i-csi/sun6i_video.c    |  4 +-
>  drivers/media/v4l2-core/v4l2-mc.c             | 18 +++++++--
>  drivers/staging/media/imx/imx-media-capture.c |  4 +-
>  drivers/staging/media/omap4iss/iss_video.c    |  4 +-
>  include/media/v4l2-mc.h                       | 40 ++++++++++++-------
>  10 files changed, 57 insertions(+), 35 deletions(-)
> 
> diff --git a/Documentation/media/kapi/csi2.rst b/Documentation/media/kapi/csi2.rst
> index 030a5c41ec75..e111ff7bfd3d 100644
> --- a/Documentation/media/kapi/csi2.rst
> +++ b/Documentation/media/kapi/csi2.rst
> @@ -74,7 +74,7 @@ Before the receiver driver may enable the CSI-2 transmitter by using
>  the :c:type:`v4l2_subdev_video_ops`->s_stream(), it must have powered
>  the transmitter up by using the
>  :c:type:`v4l2_subdev_core_ops`->s_power() callback. This may take
> -place either indirectly by using :c:func:`v4l2_pipeline_pm_use` or
> +place either indirectly by using :c:func:`v4l2_pipeline_pm_get` or
>  directly.
>  
>  Formats
> diff --git a/drivers/media/platform/omap3isp/ispvideo.c b/drivers/media/platform/omap3isp/ispvideo.c
> index ee183c35ff3b..16efd18f1e88 100644
> --- a/drivers/media/platform/omap3isp/ispvideo.c
> +++ b/drivers/media/platform/omap3isp/ispvideo.c
> @@ -1311,7 +1311,7 @@ static int isp_video_open(struct file *file)
>  		goto done;
>  	}
>  
> -	ret = v4l2_pipeline_pm_use(&video->video.entity, 1);
> +	ret = v4l2_pipeline_pm_get(&video->video.entity);
>  	if (ret < 0) {
>  		omap3isp_put(video->isp);
>  		goto done;
> @@ -1363,7 +1363,7 @@ static int isp_video_release(struct file *file)
>  	vb2_queue_release(&handle->queue);
>  	mutex_unlock(&video->queue_lock);
>  
> -	v4l2_pipeline_pm_use(&video->video.entity, 0);
> +	v4l2_pipeline_pm_put(&video->video.entity);
>  
>  	/* Release the file handle. */
>  	v4l2_fh_del(vfh);
> diff --git a/drivers/media/platform/qcom/camss/camss-video.c b/drivers/media/platform/qcom/camss/camss-video.c
> index 1d50dfbbb762..a019dbab5e04 100644
> --- a/drivers/media/platform/qcom/camss/camss-video.c
> +++ b/drivers/media/platform/qcom/camss/camss-video.c
> @@ -745,7 +745,7 @@ static int video_open(struct file *file)
>  
>  	file->private_data = vfh;
>  
> -	ret = v4l2_pipeline_pm_use(&vdev->entity, 1);
> +	ret = v4l2_pipeline_pm_get(&vdev->entity);
>  	if (ret < 0) {
>  		dev_err(video->camss->dev, "Failed to power up pipeline: %d\n",
>  			ret);
> @@ -771,7 +771,7 @@ static int video_release(struct file *file)
>  
>  	vb2_fop_release(file);
>  
> -	v4l2_pipeline_pm_use(&vdev->entity, 0);
> +	v4l2_pipeline_pm_put(&vdev->entity);
>  
>  	file->private_data = NULL;
>  
> diff --git a/drivers/media/platform/rcar-vin/rcar-v4l2.c b/drivers/media/platform/rcar-vin/rcar-v4l2.c
> index 9e2e63ffcc47..2a5be6334f72 100644
> --- a/drivers/media/platform/rcar-vin/rcar-v4l2.c
> +++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c
> @@ -826,7 +826,7 @@ static int rvin_open(struct file *file)
>  		goto err_unlock;
>  
>  	if (vin->info->use_mc)
> -		ret = v4l2_pipeline_pm_use(&vin->vdev.entity, 1);
> +		ret = v4l2_pipeline_pm_get(&vin->vdev.entity);
>  	else if (v4l2_fh_is_singular_file(file))
>  		ret = rvin_power_parallel(vin, true);
>  
> @@ -842,7 +842,7 @@ static int rvin_open(struct file *file)
>  	return 0;
>  err_power:
>  	if (vin->info->use_mc)
> -		v4l2_pipeline_pm_use(&vin->vdev.entity, 0);
> +		v4l2_pipeline_pm_put(&vin->vdev.entity);
>  	else if (v4l2_fh_is_singular_file(file))
>  		rvin_power_parallel(vin, false);
>  err_open:
> @@ -870,7 +870,7 @@ static int rvin_release(struct file *file)
>  	ret = _vb2_fop_release(file, NULL);
>  
>  	if (vin->info->use_mc) {
> -		v4l2_pipeline_pm_use(&vin->vdev.entity, 0);
> +		v4l2_pipeline_pm_put(&vin->vdev.entity);
>  	} else {
>  		if (fh_singular)
>  			rvin_power_parallel(vin, false);
> diff --git a/drivers/media/platform/sunxi/sun4i-csi/sun4i_v4l2.c b/drivers/media/platform/sunxi/sun4i-csi/sun4i_v4l2.c
> index 83a3a0257c7b..8dfc2877d4c6 100644
> --- a/drivers/media/platform/sunxi/sun4i-csi/sun4i_v4l2.c
> +++ b/drivers/media/platform/sunxi/sun4i-csi/sun4i_v4l2.c
> @@ -214,7 +214,7 @@ static int sun4i_csi_open(struct file *file)
>  	if (ret < 0)
>  		goto err_pm_put;
>  
> -	ret = v4l2_pipeline_pm_use(&csi->vdev.entity, 1);
> +	ret = v4l2_pipeline_pm_get(&csi->vdev.entity);
>  	if (ret)
>  		goto err_pm_put;
>  
> @@ -227,7 +227,7 @@ static int sun4i_csi_open(struct file *file)
>  	return 0;
>  
>  err_pipeline_pm_put:
> -	v4l2_pipeline_pm_use(&csi->vdev.entity, 0);
> +	v4l2_pipeline_pm_put(&csi->vdev.entity);
>  
>  err_pm_put:
>  	pm_runtime_put(csi->dev);
> @@ -243,7 +243,7 @@ static int sun4i_csi_release(struct file *file)
>  	mutex_lock(&csi->lock);
>  
>  	v4l2_fh_release(file);
> -	v4l2_pipeline_pm_use(&csi->vdev.entity, 0);
> +	v4l2_pipeline_pm_put(&csi->vdev.entity);
>  	pm_runtime_put(csi->dev);
>  
>  	mutex_unlock(&csi->lock);
> diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c
> index f0dfe68486d1..3d619ad08c9f 100644
> --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c
> +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c
> @@ -474,7 +474,7 @@ static int sun6i_video_open(struct file *file)
>  	if (ret < 0)
>  		goto unlock;
>  
> -	ret = v4l2_pipeline_pm_use(&video->vdev.entity, 1);
> +	ret = v4l2_pipeline_pm_get(&video->vdev.entity);
>  	if (ret < 0)
>  		goto fh_release;
>  
> @@ -507,7 +507,7 @@ static int sun6i_video_close(struct file *file)
>  
>  	_vb2_fop_release(file, NULL);
>  
> -	v4l2_pipeline_pm_use(&video->vdev.entity, 0);
> +	v4l2_pipeline_pm_put(&video->vdev.entity);
>  
>  	if (last_fh)
>  		sun6i_csi_set_power(video->csi, false);
> diff --git a/drivers/media/v4l2-core/v4l2-mc.c b/drivers/media/v4l2-core/v4l2-mc.c
> index 014a2a97cadd..0fffdd3ce6a4 100644
> --- a/drivers/media/v4l2-core/v4l2-mc.c
> +++ b/drivers/media/v4l2-core/v4l2-mc.c
> @@ -321,7 +321,7 @@ EXPORT_SYMBOL_GPL(v4l_vb2q_enable_media_source);
>   * use_count field stores the total number of users of all video device nodes
>   * in the pipeline.
>   *
> - * The v4l2_pipeline_pm_use() function must be called in the open() and
> + * The v4l2_pipeline_pm_{get, put}() functions must be called in the open() and
>   * close() handlers of video device nodes. It increments or decrements the use
>   * count of all subdev entities in the pipeline.
>   *
> @@ -423,7 +423,7 @@ static int pipeline_pm_power(struct media_entity *entity, int change,
>  	return ret;
>  }
>  
> -int v4l2_pipeline_pm_use(struct media_entity *entity, int use)
> +static int v4l2_pipeline_pm_use(struct media_entity *entity, unsigned int use)
>  {
>  	struct media_device *mdev = entity->graph_obj.mdev;
>  	int change = use ? 1 : -1;
> @@ -444,7 +444,19 @@ int v4l2_pipeline_pm_use(struct media_entity *entity, int use)
>  
>  	return ret;
>  }
> -EXPORT_SYMBOL_GPL(v4l2_pipeline_pm_use);
> +
> +int v4l2_pipeline_pm_get(struct media_entity *entity)
> +{
> +	return v4l2_pipeline_pm_use(entity, 1);
> +}
> +EXPORT_SYMBOL_GPL(v4l2_pipeline_pm_get);
> +
> +void v4l2_pipeline_pm_put(struct media_entity *entity)
> +{
> +	/* Powering off entities shouldn't fail. */
> +	WARN_ON(v4l2_pipeline_pm_use(entity, 0));
> +}
> +EXPORT_SYMBOL_GPL(v4l2_pipeline_pm_put);
>  
>  int v4l2_pipeline_link_notify(struct media_link *link, u32 flags,
>  			      unsigned int notification)
> diff --git a/drivers/staging/media/imx/imx-media-capture.c b/drivers/staging/media/imx/imx-media-capture.c
> index 7712e7be8625..8aac4a3df7ca 100644
> --- a/drivers/staging/media/imx/imx-media-capture.c
> +++ b/drivers/staging/media/imx/imx-media-capture.c
> @@ -643,7 +643,7 @@ static int capture_open(struct file *file)
>  	if (ret)
>  		v4l2_err(priv->src_sd, "v4l2_fh_open failed\n");
>  
> -	ret = v4l2_pipeline_pm_use(&vfd->entity, 1);
> +	ret = v4l2_pipeline_pm_get(&vfd->entity);
>  	if (ret)
>  		v4l2_fh_release(file);
>  
> @@ -664,7 +664,7 @@ static int capture_release(struct file *file)
>  		vq->owner = NULL;
>  	}
>  
> -	v4l2_pipeline_pm_use(&vfd->entity, 0);
> +	v4l2_pipeline_pm_put(&vfd->entity);
>  
>  	v4l2_fh_release(file);
>  	mutex_unlock(&priv->mutex);
> diff --git a/drivers/staging/media/omap4iss/iss_video.c b/drivers/staging/media/omap4iss/iss_video.c
> index 673aa3a5f2bd..9578b8d22f25 100644
> --- a/drivers/staging/media/omap4iss/iss_video.c
> +++ b/drivers/staging/media/omap4iss/iss_video.c
> @@ -1111,7 +1111,7 @@ static int iss_video_open(struct file *file)
>  		goto done;
>  	}
>  
> -	ret = v4l2_pipeline_pm_use(&video->video.entity, 1);
> +	ret = v4l2_pipeline_pm_get(&video->video.entity);
>  	if (ret < 0) {
>  		omap4iss_put(video->iss);
>  		goto done;
> @@ -1160,7 +1160,7 @@ static int iss_video_release(struct file *file)
>  	/* Disable streaming and free the buffers queue resources. */
>  	iss_video_streamoff(file, vfh, video->type);
>  
> -	v4l2_pipeline_pm_use(&video->video.entity, 0);
> +	v4l2_pipeline_pm_put(&video->video.entity);
>  
>  	/* Release the videobuf2 queue */
>  	vb2_queue_release(&handle->queue);
> diff --git a/include/media/v4l2-mc.h b/include/media/v4l2-mc.h
> index 384960249f01..5e73eb8e28f6 100644
> --- a/include/media/v4l2-mc.h
> +++ b/include/media/v4l2-mc.h
> @@ -86,23 +86,30 @@ int v4l_vb2q_enable_media_source(struct vb2_queue *q);
>  
>  
>  /**
> - * v4l2_pipeline_pm_use - Update the use count of an entity
> - * @entity: The entity
> - * @use: Use (1) or stop using (0) the entity
> + * v4l2_pipeline_pm_get - Increase the use count of a pipeline
> + * @entity: The root entity of a pipeline
>   *
> - * Update the use count of all entities in the pipeline and power entities on or
> - * off accordingly.
> + * Update the use count of all entities in the pipeline and power entities on.
>   *
> - * This function is intended to be called in video node open (use ==
> - * 1) and release (use == 0). It uses struct media_entity.use_count to
> - * track the power status. The use of this function should be paired
> - * with v4l2_pipeline_link_notify().
> + * This function is intended to be called in video node open. It uses
> + * struct media_entity.use_count to track the power status. The use
> + * of this function should be paired with v4l2_pipeline_link_notify().
>   *
> - * Return 0 on success or a negative error code on failure. Powering entities
> - * off is assumed to never fail. No failure can occur when the use parameter is
> - * set to 0.
> + * Return 0 on success or a negative error code on failure.
>   */
> -int v4l2_pipeline_pm_use(struct media_entity *entity, int use);
> +int v4l2_pipeline_pm_get(struct media_entity *entity);
> +
> +/**
> + * v4l2_pipeline_pm_put - Decrease the use count of a pipeline
> + * @entity: The root entity of a pipeline
> + *
> + * Update the use count of all entities in the pipeline and power entities off.
> + *
> + * This function is intended to be called in video node release. It uses
> + * struct media_entity.use_count to track the power status. The use
> + * of this function should be paired with v4l2_pipeline_link_notify().
> + */
> +void v4l2_pipeline_pm_put(struct media_entity *entity);
>  
>  
>  /**
> @@ -114,7 +121,7 @@ int v4l2_pipeline_pm_use(struct media_entity *entity, int use);
>   * React to link management on powered pipelines by updating the use count of
>   * all entities in the source and sink sides of the link. Entities are powered
>   * on or off accordingly. The use of this function should be paired
> - * with v4l2_pipeline_pm_use().
> + * with v4l2_pipeline_pm_{get,put}().
>   *
>   * Return 0 on success or a negative error code on failure. Powering entities
>   * off is assumed to never fail. This function will not fail for disconnection
> @@ -144,11 +151,14 @@ static inline int v4l_vb2q_enable_media_source(struct vb2_queue *q)
>  	return 0;
>  }
>  
> -static inline int v4l2_pipeline_pm_use(struct media_entity *entity, int use)
> +static inline int v4l2_pipeline_pm_get(struct media_entity *entity)
>  {
>  	return 0;
>  }
>  
> +static inline void v4l2_pipeline_pm_put(struct media_entity *entity)
> +{}
> +
>  static inline int v4l2_pipeline_link_notify(struct media_link *link, u32 flags,
>  					    unsigned int notification)
>  {
> -- 
> 2.22.0
> 
> 





[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