Re: [PATCH v2 09/14] media: pxa-camera: Use v4l2_async_notifier_add_*_subdev

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

 




On 1/17/21 10:52 PM, Ezequiel Garcia wrote:
> The use of v4l2_async_notifier_add_subdev will be discouraged.
> Drivers are instead encouraged to use a helper such as
> v4l2_async_notifier_add_fwnode_remote_subdev.
> 
> This fixes a misuse of the API, as v4l2_async_notifier_add_subdev
> should get a kmalloc'ed struct v4l2_async_subdev.
> 
> Use the appropriate helper: v4l2_async_notifier_add_i2c_subdev
> or v4l2_async_notifier_add_fwnode_remote_subdev, which handles
> the needed setup, instead of open-coding it.
> 
> Signed-off-by: Ezequiel Garcia <ezequiel@xxxxxxxxxxxxx>

Reviewed-by: Helen Koike <helen.koike@xxxxxxxxxxxxx>


> ---
>  drivers/media/platform/pxa_camera.c | 53 ++++++++++++-----------------
>  1 file changed, 21 insertions(+), 32 deletions(-)
> 
> diff --git a/drivers/media/platform/pxa_camera.c b/drivers/media/platform/pxa_camera.c
> index 8cfa39108162..6d39a0aca99c 100644
> --- a/drivers/media/platform/pxa_camera.c
> +++ b/drivers/media/platform/pxa_camera.c
> @@ -655,8 +655,6 @@ struct pxa_camera_dev {
>  	const struct pxa_camera_format_xlate *current_fmt;
>  	struct v4l2_pix_format	current_pix;
>  
> -	struct v4l2_async_subdev asd;
> -
>  	/*
>  	 * PXA27x is only supposed to handle one camera on its Quick Capture
>  	 * interface. If anyone ever builds hardware to enable more than
> @@ -2189,11 +2187,11 @@ static int pxa_camera_resume(struct device *dev)
>  }
>  
>  static int pxa_camera_pdata_from_dt(struct device *dev,
> -				    struct pxa_camera_dev *pcdev,
> -				    struct v4l2_async_subdev *asd)
> +				    struct pxa_camera_dev *pcdev)
>  {
>  	u32 mclk_rate;
> -	struct device_node *remote, *np = dev->of_node;
> +	struct v4l2_async_subdev *asd;
> +	struct device_node *np = dev->of_node;
>  	struct v4l2_fwnode_endpoint ep = { .bus_type = 0 };
>  	int err = of_property_read_u32(np, "clock-frequency",
>  				       &mclk_rate);
> @@ -2245,13 +2243,12 @@ static int pxa_camera_pdata_from_dt(struct device *dev,
>  	if (ep.bus.parallel.flags & V4L2_MBUS_PCLK_SAMPLE_FALLING)
>  		pcdev->platform_flags |= PXA_CAMERA_PCLK_EN;
>  
> -	asd->match_type = V4L2_ASYNC_MATCH_FWNODE;
> -	remote = of_graph_get_remote_port_parent(np);
> -	if (remote)
> -		asd->match.fwnode = of_fwnode_handle(remote);
> -	else
> -		dev_notice(dev, "no remote for %pOF\n", np);
> -
> +	asd = v4l2_async_notifier_add_fwnode_remote_subdev(
> +				&pcdev->notifier,
> +				of_fwnode_handle(np),
> +				sizeof(*asd));
> +	if (IS_ERR(asd))
> +		err = PTR_ERR(asd);
>  out:
>  	of_node_put(np);
>  
> @@ -2286,18 +2283,23 @@ static int pxa_camera_probe(struct platform_device *pdev)
>  	if (IS_ERR(pcdev->clk))
>  		return PTR_ERR(pcdev->clk);
>  
> +	v4l2_async_notifier_init(&pcdev->notifier);
>  	pcdev->res = res;
> -
>  	pcdev->pdata = pdev->dev.platform_data;
>  	if (pcdev->pdata) {
> +		struct v4l2_async_subdev *asd;
> +
>  		pcdev->platform_flags = pcdev->pdata->flags;
>  		pcdev->mclk = pcdev->pdata->mclk_10khz * 10000;
> -		pcdev->asd.match_type = V4L2_ASYNC_MATCH_I2C;
> -		pcdev->asd.match.i2c.adapter_id =
> -			pcdev->pdata->sensor_i2c_adapter_id;
> -		pcdev->asd.match.i2c.address = pcdev->pdata->sensor_i2c_address;
> +		asd = v4l2_async_notifier_add_i2c_subdev(
> +				&pcdev->notifier,
> +				pcdev->pdata->sensor_i2c_adapter_id,
> +				pcdev->pdata->sensor_i2c_address,
> +				sizeof(*asd));
> +		if (IS_ERR(asd))
> +			err = PTR_ERR(asd);
>  	} else if (pdev->dev.of_node) {
> -		err = pxa_camera_pdata_from_dt(&pdev->dev, pcdev, &pcdev->asd);
> +		err = pxa_camera_pdata_from_dt(&pdev->dev, pcdev);
>  	} else {
>  		return -ENODEV;
>  	}
> @@ -2389,23 +2391,11 @@ static int pxa_camera_probe(struct platform_device *pdev)
>  	if (err)
>  		goto exit_deactivate;
>  
> -	v4l2_async_notifier_init(&pcdev->notifier);
> -
> -	err = v4l2_async_notifier_add_subdev(&pcdev->notifier, &pcdev->asd);
> -	if (err) {
> -		fwnode_handle_put(pcdev->asd.match.fwnode);
> -		goto exit_free_v4l2dev;
> -	}
> -
> -	pcdev->notifier.ops = &pxa_camera_sensor_ops;
> -
> -	if (!of_have_populated_dt())
> -		pcdev->asd.match_type = V4L2_ASYNC_MATCH_I2C;
> -
>  	err = pxa_camera_init_videobuf2(pcdev);
>  	if (err)
>  		goto exit_notifier_cleanup;
>  
> +	pcdev->notifier.ops = &pxa_camera_sensor_ops;
>  	err = v4l2_async_notifier_register(&pcdev->v4l2_dev, &pcdev->notifier);
>  	if (err)
>  		goto exit_notifier_cleanup;
> @@ -2413,7 +2403,6 @@ static int pxa_camera_probe(struct platform_device *pdev)
>  	return 0;
>  exit_notifier_cleanup:
>  	v4l2_async_notifier_cleanup(&pcdev->notifier);
> -exit_free_v4l2dev:
>  	v4l2_device_unregister(&pcdev->v4l2_dev);
>  exit_deactivate:
>  	pxa_camera_deactivate(pcdev);
> 



[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