Re: [RESEND PATCH v3 31/32] media: v4l: async: Set v4l2_device in async notifier init

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

 



Hi Sakari,

Thank you for the patch.

On Thu, May 25, 2023 at 12:16:14PM +0300, Sakari Ailus wrote:
> Set the v4l2_device already in async notifier init, so struct device
> related to it will be available before the notifier is registered.
> 
> This is done in order to make struct device available earlier, during
> construction of the async connections, for sensible debug prints.

I'm worried that the tighter dependency between the notifier and the
v4l2_device will cause issues later. If it's just to get a struct device
pointer, wouldn't it be better to pass the struct device to
v4l2_async_nf_init() ?

> This patch has been mostly generated using the following two commands:
> 
> git grep -l v4l2_async_nf_init -- drivers/media/ drivers/staging/media/ |
> 	while read i; do perl -e '
> 	@a=<>; unlink("'$i'"); open(F, "> '$i'");
> 	for $f ({i=>"v4l2_async_nf_init", r=>"v4l2_async_nf_register"},
> 		{i=>"v4l2_async_subdev_nf_init",
> 		 r=>"v4l2_async_subdev_nf_register"} ) {
> 	my $b; @a = map { $b = "$1, $2" if
> 	s/$f->{r}\(([^,]*),\s*([^\)]*)\)/v4l2_async_nf_register\($2\)/;
> 	$_; } @a; @a = map { if (defined $b) {
> 	s/v4l2_async_nf_init\([^\)]*\)/$f->{i}\($b\)/;
> 	s/$f->{r}\(\K[^,]*,\s*//; }; $_; } @a; }; print F @a; close F;'
> 	< $i; done
> 
> git grep -lP 'v4l2_async_(subdev_|)nf_init' | xargs perl -i -pe \
> 	's/v4l2_async_(subdev_|)nf_init\(\K([^,]*),\s*([^,]*)\)/$3, $2\)/'

It may be nice to play with perl code, but I'd like more focus on the
human-readable part of the commit message, please. The above isn't
useful to anyone but you, while an English text that explains how the
v4l2_async_nf_init() function has now been split into
v4l2_async_nf_init() and v4l2_async_subdev_nf_init() is missing.

> Signed-off-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx>
> ---
>  drivers/media/i2c/max9286.c                   |  4 +-
>  drivers/media/i2c/st-mipid02.c                |  4 +-
>  drivers/media/i2c/tc358746.c                  |  4 +-
>  drivers/media/pci/intel/ipu3/ipu3-cio2-main.c |  4 +-
>  drivers/media/platform/atmel/atmel-isi.c      |  4 +-
>  drivers/media/platform/cadence/cdns-csi2rx.c  |  4 +-
>  drivers/media/platform/intel/pxa_camera.c     |  4 +-
>  drivers/media/platform/marvell/cafe-driver.c  |  2 +-
>  drivers/media/platform/marvell/mcam-core.c    |  2 +-
>  drivers/media/platform/marvell/mmp-driver.c   |  2 +-
>  .../platform/microchip/microchip-csi2dc.c     |  5 +--
>  .../microchip/microchip-sama5d2-isc.c         |  5 +--
>  .../microchip/microchip-sama7g5-isc.c         |  5 +--
>  drivers/media/platform/nxp/imx-mipi-csis.c    |  4 +-
>  drivers/media/platform/nxp/imx7-media-csi.c   |  4 +-
>  .../platform/nxp/imx8-isi/imx8-isi-core.c     |  4 +-
>  drivers/media/platform/qcom/camss/camss.c     |  5 +--
>  drivers/media/platform/renesas/rcar-isp.c     |  4 +-
>  .../platform/renesas/rcar-vin/rcar-core.c     |  8 ++--
>  .../platform/renesas/rcar-vin/rcar-csi2.c     |  4 +-
>  drivers/media/platform/renesas/rcar_drif.c    |  4 +-
>  drivers/media/platform/renesas/renesas-ceu.c  |  4 +-
>  .../platform/renesas/rzg2l-cru/rzg2l-core.c   |  4 +-
>  .../platform/renesas/rzg2l-cru/rzg2l-csi2.c   |  4 +-
>  .../platform/rockchip/rkisp1/rkisp1-dev.c     |  4 +-
>  .../platform/samsung/exynos4-is/media-dev.c   |  5 +--
>  drivers/media/platform/st/stm32/stm32-dcmi.c  |  4 +-
>  .../platform/sunxi/sun4i-csi/sun4i_csi.c      |  4 +-
>  .../sunxi/sun6i-csi/sun6i_csi_bridge.c        |  6 +--
>  .../sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c   |  4 +-
>  .../sun8i_a83t_mipi_csi2.c                    |  4 +-
>  .../media/platform/ti/am437x/am437x-vpfe.c    |  4 +-
>  drivers/media/platform/ti/cal/cal.c           |  4 +-
>  .../media/platform/ti/davinci/vpif_capture.c  | 11 ++---
>  drivers/media/platform/ti/omap3isp/isp.c      |  4 +-
>  drivers/media/platform/video-mux.c            |  4 +-
>  drivers/media/platform/xilinx/xilinx-vipp.c   |  4 +-
>  drivers/media/v4l2-core/v4l2-async.c          | 44 +++++++------------
>  drivers/media/v4l2-core/v4l2-fwnode.c         |  4 +-
>  .../deprecated/atmel/atmel-sama5d2-isc.c      |  5 +--
>  .../deprecated/atmel/atmel-sama7g5-isc.c      |  5 +--
>  drivers/staging/media/imx/imx-media-csi.c     |  4 +-
>  .../staging/media/imx/imx-media-dev-common.c  |  4 +-
>  drivers/staging/media/imx/imx6-mipi-csi2.c    |  4 +-
>  drivers/staging/media/imx/imx8mq-mipi-csi2.c  |  4 +-
>  .../media/sunxi/sun6i-isp/sun6i_isp_proc.c    |  4 +-
>  drivers/staging/media/tegra-video/vi.c        |  4 +-
>  include/media/v4l2-async.h                    | 33 ++++++++------
>  48 files changed, 132 insertions(+), 143 deletions(-)
> 
> diff --git a/drivers/media/i2c/max9286.c b/drivers/media/i2c/max9286.c
> index 44def5e3ba5d1..5f13d75f591ad 100644
> --- a/drivers/media/i2c/max9286.c
> +++ b/drivers/media/i2c/max9286.c
> @@ -746,7 +746,7 @@ static int max9286_v4l2_notifier_register(struct max9286_priv *priv)
>  	if (!priv->nsources)
>  		return 0;
>  
> -	v4l2_async_nf_init(&priv->notifier);
> +	v4l2_async_subdev_nf_init(&priv->notifier, &priv->sd);
>  
>  	for_each_source(priv, source) {
>  		unsigned int i = to_index(priv, source);
> @@ -766,7 +766,7 @@ static int max9286_v4l2_notifier_register(struct max9286_priv *priv)
>  
>  	priv->notifier.ops = &max9286_notify_ops;
>  
> -	ret = v4l2_async_subdev_nf_register(&priv->sd, &priv->notifier);
> +	ret = v4l2_async_nf_register(&priv->notifier);
>  	if (ret) {
>  		dev_err(dev, "Failed to register subdev_notifier");
>  		v4l2_async_nf_cleanup(&priv->notifier);
> diff --git a/drivers/media/i2c/st-mipid02.c b/drivers/media/i2c/st-mipid02.c
> index daea4cb29ec83..d3810e137ba52 100644
> --- a/drivers/media/i2c/st-mipid02.c
> +++ b/drivers/media/i2c/st-mipid02.c
> @@ -902,7 +902,7 @@ static int mipid02_parse_rx_ep(struct mipid02_dev *bridge)
>  	bridge->rx = ep;
>  
>  	/* register async notifier so we get noticed when sensor is connected */
> -	v4l2_async_nf_init(&bridge->notifier);
> +	v4l2_async_subdev_nf_init(&bridge->notifier, &bridge->sd);
>  	asd = v4l2_async_nf_add_fwnode_remote(&bridge->notifier,
>  					      of_fwnode_handle(ep_node),
>  					      struct v4l2_async_connection);
> @@ -915,7 +915,7 @@ static int mipid02_parse_rx_ep(struct mipid02_dev *bridge)
>  	}
>  	bridge->notifier.ops = &mipid02_notifier_ops;
>  
> -	ret = v4l2_async_subdev_nf_register(&bridge->sd, &bridge->notifier);
> +	ret = v4l2_async_nf_register(&bridge->notifier);
>  	if (ret)
>  		v4l2_async_nf_cleanup(&bridge->notifier);
>  
> diff --git a/drivers/media/i2c/tc358746.c b/drivers/media/i2c/tc358746.c
> index a455848d60c15..6e4c484ae1bdc 100644
> --- a/drivers/media/i2c/tc358746.c
> +++ b/drivers/media/i2c/tc358746.c
> @@ -1460,7 +1460,7 @@ static int tc358746_async_register(struct tc358746 *tc358746)
>  		return err;
>  	}
>  
> -	v4l2_async_nf_init(&tc358746->notifier);
> +	v4l2_async_subdev_nf_init(&tc358746->notifier, &tc358746->sd);
>  	asd = v4l2_async_nf_add_fwnode_remote(&tc358746->notifier, ep,
>  					      struct v4l2_async_connection);
>  	fwnode_handle_put(ep);
> @@ -1472,7 +1472,7 @@ static int tc358746_async_register(struct tc358746 *tc358746)
>  
>  	tc358746->notifier.ops = &tc358746_notify_ops;
>  
> -	err = v4l2_async_subdev_nf_register(&tc358746->sd, &tc358746->notifier);
> +	err = v4l2_async_nf_register(&tc358746->notifier);
>  	if (err)
>  		goto err_cleanup;
>  
> diff --git a/drivers/media/pci/intel/ipu3/ipu3-cio2-main.c b/drivers/media/pci/intel/ipu3/ipu3-cio2-main.c
> index 0f43b5e10f187..8de03d007d0b7 100644
> --- a/drivers/media/pci/intel/ipu3/ipu3-cio2-main.c
> +++ b/drivers/media/pci/intel/ipu3/ipu3-cio2-main.c
> @@ -1502,7 +1502,7 @@ static int cio2_parse_firmware(struct cio2_device *cio2)
>  	 * suspend.
>  	 */
>  	cio2->notifier.ops = &cio2_async_ops;
> -	ret = v4l2_async_nf_register(&cio2->v4l2_dev, &cio2->notifier);
> +	ret = v4l2_async_nf_register(&cio2->notifier);
>  	if (ret)
>  		dev_err(dev, "failed to register async notifier : %d\n", ret);
>  
> @@ -1797,7 +1797,7 @@ static int cio2_pci_probe(struct pci_dev *pci_dev,
>  	if (r)
>  		goto fail_v4l2_device_unregister;
>  
> -	v4l2_async_nf_init(&cio2->notifier);
> +	v4l2_async_nf_init(&cio2->notifier, &cio2->v4l2_dev);
>  
>  	/* Register notifier for subdevices we care */
>  	r = cio2_parse_firmware(cio2);
> diff --git a/drivers/media/platform/atmel/atmel-isi.c b/drivers/media/platform/atmel/atmel-isi.c
> index 7dbad99d4e45e..121eaa6994084 100644
> --- a/drivers/media/platform/atmel/atmel-isi.c
> +++ b/drivers/media/platform/atmel/atmel-isi.c
> @@ -1159,7 +1159,7 @@ static int isi_graph_init(struct atmel_isi *isi)
>  	if (!ep)
>  		return -EINVAL;
>  
> -	v4l2_async_nf_init(&isi->notifier);
> +	v4l2_async_nf_init(&isi->notifier, &isi->v4l2_dev);
>  
>  	asd = v4l2_async_nf_add_fwnode_remote(&isi->notifier,
>  					      of_fwnode_handle(ep),
> @@ -1171,7 +1171,7 @@ static int isi_graph_init(struct atmel_isi *isi)
>  
>  	isi->notifier.ops = &isi_graph_notify_ops;
>  
> -	ret = v4l2_async_nf_register(&isi->v4l2_dev, &isi->notifier);
> +	ret = v4l2_async_nf_register(&isi->notifier);
>  	if (ret < 0) {
>  		dev_err(isi->dev, "Notifier registration failed\n");
>  		v4l2_async_nf_cleanup(&isi->notifier);
> diff --git a/drivers/media/platform/cadence/cdns-csi2rx.c b/drivers/media/platform/cadence/cdns-csi2rx.c
> index b0731c07eace0..d7d6b63306521 100644
> --- a/drivers/media/platform/cadence/cdns-csi2rx.c
> +++ b/drivers/media/platform/cadence/cdns-csi2rx.c
> @@ -399,7 +399,7 @@ static int csi2rx_parse_dt(struct csi2rx_priv *csi2rx)
>  		return -EINVAL;
>  	}
>  
> -	v4l2_async_nf_init(&csi2rx->notifier);
> +	v4l2_async_subdev_nf_init(&csi2rx->notifier, &csi2rx->subdev);
>  
>  	asd = v4l2_async_nf_add_fwnode_remote(&csi2rx->notifier, fwh,
>  					      struct v4l2_async_connection);
> @@ -409,7 +409,7 @@ static int csi2rx_parse_dt(struct csi2rx_priv *csi2rx)
>  
>  	csi2rx->notifier.ops = &csi2rx_notifier_ops;
>  
> -	ret = v4l2_async_subdev_nf_register(&csi2rx->subdev, &csi2rx->notifier);
> +	ret = v4l2_async_nf_register(&csi2rx->notifier);
>  	if (ret)
>  		v4l2_async_nf_cleanup(&csi2rx->notifier);
>  
> diff --git a/drivers/media/platform/intel/pxa_camera.c b/drivers/media/platform/intel/pxa_camera.c
> index 5df93fd4ff04b..44edd4bdc2c11 100644
> --- a/drivers/media/platform/intel/pxa_camera.c
> +++ b/drivers/media/platform/intel/pxa_camera.c
> @@ -2311,7 +2311,7 @@ static int pxa_camera_probe(struct platform_device *pdev)
>  	if (err)
>  		return err;
>  
> -	v4l2_async_nf_init(&pcdev->notifier);
> +	v4l2_async_nf_init(&pcdev->notifier, &pcdev->v4l2_dev);
>  	pcdev->res = res;
>  	pcdev->pdata = pdev->dev.platform_data;
>  	if (pcdev->pdata) {
> @@ -2403,7 +2403,7 @@ static int pxa_camera_probe(struct platform_device *pdev)
>  		goto exit_deactivate;
>  
>  	pcdev->notifier.ops = &pxa_camera_sensor_ops;
> -	err = v4l2_async_nf_register(&pcdev->v4l2_dev, &pcdev->notifier);
> +	err = v4l2_async_nf_register(&pcdev->notifier);
>  	if (err)
>  		goto exit_deactivate;
>  
> diff --git a/drivers/media/platform/marvell/cafe-driver.c b/drivers/media/platform/marvell/cafe-driver.c
> index fbfbb9f67ddfc..ef810249def61 100644
> --- a/drivers/media/platform/marvell/cafe-driver.c
> +++ b/drivers/media/platform/marvell/cafe-driver.c
> @@ -540,7 +540,7 @@ static int cafe_pci_probe(struct pci_dev *pdev,
>  	if (ret)
>  		goto out_smbus_shutdown;
>  
> -	v4l2_async_nf_init(&mcam->notifier);
> +	v4l2_async_nf_init(&mcam->notifier, &mcam->v4l2_dev);
>  
>  	asd = v4l2_async_nf_add_i2c(&mcam->notifier,
>  				    i2c_adapter_id(cam->i2c_adapter),
> diff --git a/drivers/media/platform/marvell/mcam-core.c b/drivers/media/platform/marvell/mcam-core.c
> index bcfcecdb03ea2..dbcd4f15bda30 100644
> --- a/drivers/media/platform/marvell/mcam-core.c
> +++ b/drivers/media/platform/marvell/mcam-core.c
> @@ -1873,7 +1873,7 @@ int mccic_register(struct mcam_camera *cam)
>  	cam->mbus_code = mcam_def_mbus_code;
>  
>  	cam->notifier.ops = &mccic_notify_ops;
> -	ret = v4l2_async_nf_register(&cam->v4l2_dev, &cam->notifier);
> +	ret = v4l2_async_nf_register(&cam->notifier);
>  	if (ret < 0) {
>  		cam_warn(cam, "failed to register a sensor notifier");
>  		goto out;
> diff --git a/drivers/media/platform/marvell/mmp-driver.c b/drivers/media/platform/marvell/mmp-driver.c
> index dbc1368b91210..76e0ac9cd34f3 100644
> --- a/drivers/media/platform/marvell/mmp-driver.c
> +++ b/drivers/media/platform/marvell/mmp-driver.c
> @@ -239,7 +239,7 @@ static int mmpcam_probe(struct platform_device *pdev)
>  	if (!ep)
>  		return -ENODEV;
>  
> -	v4l2_async_nf_init(&mcam->notifier);
> +	v4l2_async_nf_init(&mcam->notifier, &mcam->v4l2_dev);
>  
>  	asd = v4l2_async_nf_add_fwnode_remote(&mcam->notifier, ep,
>  					      struct v4l2_async_connection);
> diff --git a/drivers/media/platform/microchip/microchip-csi2dc.c b/drivers/media/platform/microchip/microchip-csi2dc.c
> index d631c3880c536..988c1cc1d8b6b 100644
> --- a/drivers/media/platform/microchip/microchip-csi2dc.c
> +++ b/drivers/media/platform/microchip/microchip-csi2dc.c
> @@ -523,7 +523,7 @@ static int csi2dc_prepare_notifier(struct csi2dc_device *csi2dc,
>  	struct v4l2_async_connection *asd;
>  	int ret = 0;
>  
> -	v4l2_async_nf_init(&csi2dc->notifier);
> +	v4l2_async_subdev_nf_init(&csi2dc->notifier, &csi2dc->csi2dc_sd);
>  
>  	asd = v4l2_async_nf_add_fwnode_remote(&csi2dc->notifier,
>  					      input_fwnode,
> @@ -542,8 +542,7 @@ static int csi2dc_prepare_notifier(struct csi2dc_device *csi2dc,
>  
>  	csi2dc->notifier.ops = &csi2dc_async_ops;
>  
> -	ret = v4l2_async_subdev_nf_register(&csi2dc->csi2dc_sd,
> -					    &csi2dc->notifier);
> +	ret = v4l2_async_nf_register(&csi2dc->notifier);
>  	if (ret) {
>  		dev_err(csi2dc->dev, "fail to register async notifier: %d\n",
>  			ret);
> diff --git a/drivers/media/platform/microchip/microchip-sama5d2-isc.c b/drivers/media/platform/microchip/microchip-sama5d2-isc.c
> index 10e6cebf629e6..d78d289bd4250 100644
> --- a/drivers/media/platform/microchip/microchip-sama5d2-isc.c
> +++ b/drivers/media/platform/microchip/microchip-sama5d2-isc.c
> @@ -529,7 +529,7 @@ static int microchip_isc_probe(struct platform_device *pdev)
>  		struct fwnode_handle *fwnode =
>  			of_fwnode_handle(subdev_entity->epn);
>  
> -		v4l2_async_nf_init(&subdev_entity->notifier);
> +		v4l2_async_nf_init(&subdev_entity->notifier, &isc->v4l2_dev);
>  
>  		asd = v4l2_async_nf_add_fwnode_remote(&subdev_entity->notifier,
>  						      fwnode,
> @@ -545,8 +545,7 @@ static int microchip_isc_probe(struct platform_device *pdev)
>  
>  		subdev_entity->notifier.ops = &microchip_isc_async_ops;
>  
> -		ret = v4l2_async_nf_register(&isc->v4l2_dev,
> -					     &subdev_entity->notifier);
> +		ret = v4l2_async_nf_register(&subdev_entity->notifier);
>  		if (ret) {
>  			dev_err(dev, "fail to register async notifier\n");
>  			goto cleanup_subdev;
> diff --git a/drivers/media/platform/microchip/microchip-sama7g5-isc.c b/drivers/media/platform/microchip/microchip-sama7g5-isc.c
> index 324810dbdc3af..6d556bb42c12a 100644
> --- a/drivers/media/platform/microchip/microchip-sama7g5-isc.c
> +++ b/drivers/media/platform/microchip/microchip-sama7g5-isc.c
> @@ -519,7 +519,7 @@ static int microchip_xisc_probe(struct platform_device *pdev)
>  		struct fwnode_handle *fwnode =
>  			of_fwnode_handle(subdev_entity->epn);
>  
> -		v4l2_async_nf_init(&subdev_entity->notifier);
> +		v4l2_async_nf_init(&subdev_entity->notifier, &isc->v4l2_dev);
>  
>  		asd = v4l2_async_nf_add_fwnode_remote(&subdev_entity->notifier,
>  						      fwnode,
> @@ -535,8 +535,7 @@ static int microchip_xisc_probe(struct platform_device *pdev)
>  
>  		subdev_entity->notifier.ops = &microchip_isc_async_ops;
>  
> -		ret = v4l2_async_nf_register(&isc->v4l2_dev,
> -					     &subdev_entity->notifier);
> +		ret = v4l2_async_nf_register(&subdev_entity->notifier);
>  		if (ret) {
>  			dev_err(dev, "fail to register async notifier\n");
>  			goto cleanup_subdev;
> diff --git a/drivers/media/platform/nxp/imx-mipi-csis.c b/drivers/media/platform/nxp/imx-mipi-csis.c
> index 390834ce482bd..c0439bd86b21b 100644
> --- a/drivers/media/platform/nxp/imx-mipi-csis.c
> +++ b/drivers/media/platform/nxp/imx-mipi-csis.c
> @@ -1252,7 +1252,7 @@ static int mipi_csis_async_register(struct mipi_csis_device *csis)
>  	unsigned int i;
>  	int ret;
>  
> -	v4l2_async_nf_init(&csis->notifier);
> +	v4l2_async_subdev_nf_init(&csis->notifier, &csis->sd);
>  
>  	ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(csis->dev), 0, 0,
>  					     FWNODE_GRAPH_ENDPOINT_NEXT);
> @@ -1288,7 +1288,7 @@ static int mipi_csis_async_register(struct mipi_csis_device *csis)
>  
>  	csis->notifier.ops = &mipi_csis_notify_ops;
>  
> -	ret = v4l2_async_subdev_nf_register(&csis->sd, &csis->notifier);
> +	ret = v4l2_async_nf_register(&csis->notifier);
>  	if (ret)
>  		return ret;
>  
> diff --git a/drivers/media/platform/nxp/imx7-media-csi.c b/drivers/media/platform/nxp/imx7-media-csi.c
> index 75b7ad65a1141..a9933a97dbef9 100644
> --- a/drivers/media/platform/nxp/imx7-media-csi.c
> +++ b/drivers/media/platform/nxp/imx7-media-csi.c
> @@ -2107,7 +2107,7 @@ static int imx7_csi_async_register(struct imx7_csi *csi)
>  	struct fwnode_handle *ep;
>  	int ret;
>  
> -	v4l2_async_nf_init(&csi->notifier);
> +	v4l2_async_nf_init(&csi->notifier, &csi->v4l2_dev);
>  
>  	ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(csi->dev), 0, 0,
>  					     FWNODE_GRAPH_ENDPOINT_NEXT);
> @@ -2130,7 +2130,7 @@ static int imx7_csi_async_register(struct imx7_csi *csi)
>  
>  	csi->notifier.ops = &imx7_csi_notify_ops;
>  
> -	ret = v4l2_async_nf_register(&csi->v4l2_dev, &csi->notifier);
> +	ret = v4l2_async_nf_register(&csi->notifier);
>  	if (ret)
>  		goto error;
>  
> diff --git a/drivers/media/platform/nxp/imx8-isi/imx8-isi-core.c b/drivers/media/platform/nxp/imx8-isi/imx8-isi-core.c
> index a09f416a64c4f..8d332ac328888 100644
> --- a/drivers/media/platform/nxp/imx8-isi/imx8-isi-core.c
> +++ b/drivers/media/platform/nxp/imx8-isi/imx8-isi-core.c
> @@ -175,7 +175,7 @@ static int mxc_isi_v4l2_init(struct mxc_isi_dev *isi)
>  	}
>  
>  	/* Initialize, fill and register the async notifier. */
> -	v4l2_async_nf_init(&isi->notifier);
> +	v4l2_async_nf_init(&isi->notifier, v4l2_dev);
>  	isi->notifier.ops = &mxc_isi_async_notifier_ops;
>  
>  	for (i = 0; i < isi->pdata->num_ports; ++i) {
> @@ -200,7 +200,7 @@ static int mxc_isi_v4l2_init(struct mxc_isi_dev *isi)
>  		masd->port = i;
>  	}
>  
> -	ret = v4l2_async_nf_register(v4l2_dev, &isi->notifier);
> +	ret = v4l2_async_nf_register(&isi->notifier);
>  	if (ret < 0) {
>  		dev_err(isi->dev,
>  			"Failed to register async notifier: %d\n", ret);
> diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/platform/qcom/camss/camss.c
> index b89e2bb5b505e..f11dc59135a5a 100644
> --- a/drivers/media/platform/qcom/camss/camss.c
> +++ b/drivers/media/platform/qcom/camss/camss.c
> @@ -1640,7 +1640,7 @@ static int camss_probe(struct platform_device *pdev)
>  		goto err_cleanup;
>  	}
>  
> -	v4l2_async_nf_init(&camss->notifier);
> +	v4l2_async_nf_init(&camss->notifier, &camss->v4l2_dev);
>  
>  	num_subdevs = camss_of_parse_ports(camss);
>  	if (num_subdevs < 0) {
> @@ -1655,8 +1655,7 @@ static int camss_probe(struct platform_device *pdev)
>  	if (num_subdevs) {
>  		camss->notifier.ops = &camss_subdev_notifier_ops;
>  
> -		ret = v4l2_async_nf_register(&camss->v4l2_dev,
> -					     &camss->notifier);
> +		ret = v4l2_async_nf_register(&camss->notifier);
>  		if (ret) {
>  			dev_err(dev,
>  				"Failed to register async subdev nodes: %d\n",
> diff --git a/drivers/media/platform/renesas/rcar-isp.c b/drivers/media/platform/renesas/rcar-isp.c
> index 5d6d9ffb5201d..452d3b8da7e1c 100644
> --- a/drivers/media/platform/renesas/rcar-isp.c
> +++ b/drivers/media/platform/renesas/rcar-isp.c
> @@ -392,7 +392,7 @@ static int risp_parse_dt(struct rcar_isp *isp)
>  
>  	dev_dbg(isp->dev, "Found '%pOF'\n", to_of_node(fwnode));
>  
> -	v4l2_async_nf_init(&isp->notifier);
> +	v4l2_async_subdev_nf_init(&isp->notifier, &isp->subdev);
>  	isp->notifier.ops = &risp_notify_ops;
>  
>  	asd = v4l2_async_nf_add_fwnode(&isp->notifier, fwnode,
> @@ -401,7 +401,7 @@ static int risp_parse_dt(struct rcar_isp *isp)
>  	if (IS_ERR(asd))
>  		return PTR_ERR(asd);
>  
> -	ret = v4l2_async_subdev_nf_register(&isp->subdev, &isp->notifier);
> +	ret = v4l2_async_nf_register(&isp->notifier);
>  	if (ret)
>  		v4l2_async_nf_cleanup(&isp->notifier);
>  
> diff --git a/drivers/media/platform/renesas/rcar-vin/rcar-core.c b/drivers/media/platform/renesas/rcar-vin/rcar-core.c
> index 498778eb9892b..65be0f4c88457 100644
> --- a/drivers/media/platform/renesas/rcar-vin/rcar-core.c
> +++ b/drivers/media/platform/renesas/rcar-vin/rcar-core.c
> @@ -376,7 +376,7 @@ static int rvin_group_notifier_init(struct rvin_dev *vin, unsigned int port,
>  
>  	mutex_unlock(&vin->group->lock);
>  
> -	v4l2_async_nf_init(&vin->group->notifier);
> +	v4l2_async_nf_init(&vin->group->notifier, &vin->v4l2_dev);
>  
>  	/*
>  	 * Some subdevices may overlap but the parser function can handle it and
> @@ -400,7 +400,7 @@ static int rvin_group_notifier_init(struct rvin_dev *vin, unsigned int port,
>  		return 0;
>  
>  	vin->group->notifier.ops = &rvin_group_notify_ops;
> -	ret = v4l2_async_nf_register(&vin->v4l2_dev, &vin->group->notifier);
> +	ret = v4l2_async_nf_register(&vin->group->notifier);
>  	if (ret < 0) {
>  		vin_err(vin, "Notifier registration failed\n");
>  		v4l2_async_nf_cleanup(&vin->group->notifier);
> @@ -713,7 +713,7 @@ static int rvin_parallel_init(struct rvin_dev *vin)
>  {
>  	int ret;
>  
> -	v4l2_async_nf_init(&vin->notifier);
> +	v4l2_async_nf_init(&vin->notifier, &vin->v4l2_dev);
>  
>  	ret = rvin_parallel_parse_of(vin);
>  	if (ret)
> @@ -726,7 +726,7 @@ static int rvin_parallel_init(struct rvin_dev *vin)
>  		to_of_node(vin->parallel.asc->match.fwnode));
>  
>  	vin->notifier.ops = &rvin_parallel_notify_ops;
> -	ret = v4l2_async_nf_register(&vin->v4l2_dev, &vin->notifier);
> +	ret = v4l2_async_nf_register(&vin->notifier);
>  	if (ret < 0) {
>  		vin_err(vin, "Notifier registration failed\n");
>  		v4l2_async_nf_cleanup(&vin->notifier);
> diff --git a/drivers/media/platform/renesas/rcar-vin/rcar-csi2.c b/drivers/media/platform/renesas/rcar-vin/rcar-csi2.c
> index de7b479df3a9d..21f8f4be0dfe5 100644
> --- a/drivers/media/platform/renesas/rcar-vin/rcar-csi2.c
> +++ b/drivers/media/platform/renesas/rcar-vin/rcar-csi2.c
> @@ -1076,7 +1076,7 @@ static int rcsi2_parse_dt(struct rcar_csi2 *priv)
>  
>  	dev_dbg(priv->dev, "Found '%pOF'\n", to_of_node(fwnode));
>  
> -	v4l2_async_nf_init(&priv->notifier);
> +	v4l2_async_subdev_nf_init(&priv->notifier, &priv->subdev);
>  	priv->notifier.ops = &rcar_csi2_notify_ops;
>  
>  	asc = v4l2_async_nf_add_fwnode(&priv->notifier, fwnode,
> @@ -1085,7 +1085,7 @@ static int rcsi2_parse_dt(struct rcar_csi2 *priv)
>  	if (IS_ERR(asc))
>  		return PTR_ERR(asc);
>  
> -	ret = v4l2_async_subdev_nf_register(&priv->subdev, &priv->notifier);
> +	ret = v4l2_async_nf_register(&priv->notifier);
>  	if (ret)
>  		v4l2_async_nf_cleanup(&priv->notifier);
>  
> diff --git a/drivers/media/platform/renesas/rcar_drif.c b/drivers/media/platform/renesas/rcar_drif.c
> index 90fda730030d7..c7a925f421228 100644
> --- a/drivers/media/platform/renesas/rcar_drif.c
> +++ b/drivers/media/platform/renesas/rcar_drif.c
> @@ -1207,7 +1207,7 @@ static int rcar_drif_parse_subdevs(struct rcar_drif_sdr *sdr)
>  	struct fwnode_handle *fwnode, *ep;
>  	struct v4l2_async_connection *asd;
>  
> -	v4l2_async_nf_init(notifier);
> +	v4l2_async_nf_init(&sdr->notifier, &sdr->v4l2_dev);
>  
>  	ep = fwnode_graph_get_next_endpoint(of_fwnode_handle(sdr->dev->of_node),
>  					    NULL);
> @@ -1341,7 +1341,7 @@ static int rcar_drif_sdr_probe(struct rcar_drif_sdr *sdr)
>  	sdr->notifier.ops = &rcar_drif_notify_ops;
>  
>  	/* Register notifier */
> -	ret = v4l2_async_nf_register(&sdr->v4l2_dev, &sdr->notifier);
> +	ret = v4l2_async_nf_register(&sdr->notifier);
>  	if (ret < 0) {
>  		dev_err(sdr->dev, "failed: notifier register ret %d\n", ret);
>  		goto cleanup;
> diff --git a/drivers/media/platform/renesas/renesas-ceu.c b/drivers/media/platform/renesas/renesas-ceu.c
> index be6140c93fc0c..c2215205fb3c3 100644
> --- a/drivers/media/platform/renesas/renesas-ceu.c
> +++ b/drivers/media/platform/renesas/renesas-ceu.c
> @@ -1667,7 +1667,7 @@ static int ceu_probe(struct platform_device *pdev)
>  	if (ret)
>  		goto error_pm_disable;
>  
> -	v4l2_async_nf_init(&ceudev->notifier);
> +	v4l2_async_nf_init(&ceudev->notifier, &ceudev->v4l2_dev);
>  
>  	if (IS_ENABLED(CONFIG_OF) && dev->of_node) {
>  		ceu_data = of_device_get_match_data(dev);
> @@ -1689,7 +1689,7 @@ static int ceu_probe(struct platform_device *pdev)
>  
>  	ceudev->notifier.v4l2_dev	= &ceudev->v4l2_dev;
>  	ceudev->notifier.ops		= &ceu_notify_ops;
> -	ret = v4l2_async_nf_register(&ceudev->v4l2_dev, &ceudev->notifier);
> +	ret = v4l2_async_nf_register(&ceudev->notifier);
>  	if (ret)
>  		goto error_cleanup;
>  
> diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-core.c b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-core.c
> index e026ed5337513..fdef43fd1895b 100644
> --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-core.c
> +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-core.c
> @@ -183,7 +183,7 @@ static int rzg2l_cru_mc_parse_of_graph(struct rzg2l_cru_dev *cru)
>  {
>  	int ret;
>  
> -	v4l2_async_nf_init(&cru->notifier);
> +	v4l2_async_nf_init(&cru->notifier, &cru->v4l2_dev);
>  
>  	ret = rzg2l_cru_mc_parse_of(cru);
>  	if (ret)
> @@ -194,7 +194,7 @@ static int rzg2l_cru_mc_parse_of_graph(struct rzg2l_cru_dev *cru)
>  	if (list_empty(&cru->notifier.waiting_list))
>  		return 0;
>  
> -	ret = v4l2_async_nf_register(&cru->v4l2_dev, &cru->notifier);
> +	ret = v4l2_async_nf_register(&cru->notifier);
>  	if (ret < 0) {
>  		dev_err(cru->dev, "Notifier registration failed\n");
>  		v4l2_async_nf_cleanup(&cru->notifier);
> diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
> index f6bf4cdff28c2..7f6a37f835415 100644
> --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
> +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
> @@ -674,7 +674,7 @@ static int rzg2l_csi2_parse_dt(struct rzg2l_csi2 *csi2)
>  	fwnode = fwnode_graph_get_remote_endpoint(ep);
>  	fwnode_handle_put(ep);
>  
> -	v4l2_async_nf_init(&csi2->notifier);
> +	v4l2_async_subdev_nf_init(&csi2->notifier, &csi2->subdev);
>  	csi2->notifier.ops = &rzg2l_csi2_notify_ops;
>  
>  	asd = v4l2_async_nf_add_fwnode(&csi2->notifier, fwnode,
> @@ -683,7 +683,7 @@ static int rzg2l_csi2_parse_dt(struct rzg2l_csi2 *csi2)
>  	if (IS_ERR(asd))
>  		return PTR_ERR(asd);
>  
> -	ret = v4l2_async_subdev_nf_register(&csi2->subdev, &csi2->notifier);
> +	ret = v4l2_async_nf_register(&csi2->notifier);
>  	if (ret)
>  		v4l2_async_nf_cleanup(&csi2->notifier);
>  
> diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c
> index eb88494c2a427..543fd377ab2a4 100644
> --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c
> +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c
> @@ -187,7 +187,7 @@ static int rkisp1_subdev_notifier_register(struct rkisp1_device *rkisp1)
>  	unsigned int index = 0;
>  	int ret = 0;
>  
> -	v4l2_async_nf_init(ntf);
> +	v4l2_async_nf_init(ntf, &rkisp1->v4l2_dev);
>  
>  	ntf->ops = &rkisp1_subdev_notifier_ops;
>  
> @@ -287,7 +287,7 @@ static int rkisp1_subdev_notifier_register(struct rkisp1_device *rkisp1)
>  	if (!index)
>  		dev_dbg(rkisp1->dev, "no remote subdevice found\n");
>  
> -	ret = v4l2_async_nf_register(&rkisp1->v4l2_dev, ntf);
> +	ret = v4l2_async_nf_register(ntf);
>  	if (ret) {
>  		v4l2_async_nf_cleanup(ntf);
>  		return ret;
> diff --git a/drivers/media/platform/samsung/exynos4-is/media-dev.c b/drivers/media/platform/samsung/exynos4-is/media-dev.c
> index 59070616cb1bd..623e52440ccd2 100644
> --- a/drivers/media/platform/samsung/exynos4-is/media-dev.c
> +++ b/drivers/media/platform/samsung/exynos4-is/media-dev.c
> @@ -1479,7 +1479,7 @@ static int fimc_md_probe(struct platform_device *pdev)
>  
>  	platform_set_drvdata(pdev, fmd);
>  
> -	v4l2_async_nf_init(&fmd->subdev_notifier);
> +	v4l2_async_nf_init(&fmd->subdev_notifier, &fmd->v4l2_dev);
>  
>  	ret = fimc_md_register_platform_entities(fmd, dev->of_node);
>  	if (ret)
> @@ -1507,8 +1507,7 @@ static int fimc_md_probe(struct platform_device *pdev)
>  		fmd->subdev_notifier.ops = &subdev_notifier_ops;
>  		fmd->num_sensors = 0;
>  
> -		ret = v4l2_async_nf_register(&fmd->v4l2_dev,
> -					     &fmd->subdev_notifier);
> +		ret = v4l2_async_nf_register(&fmd->subdev_notifier);
>  		if (ret)
>  			goto err_clk_p;
>  	}
> diff --git a/drivers/media/platform/st/stm32/stm32-dcmi.c b/drivers/media/platform/st/stm32/stm32-dcmi.c
> index 6d1197d4464e2..0e8f21602a066 100644
> --- a/drivers/media/platform/st/stm32/stm32-dcmi.c
> +++ b/drivers/media/platform/st/stm32/stm32-dcmi.c
> @@ -1897,7 +1897,7 @@ static int dcmi_graph_init(struct stm32_dcmi *dcmi)
>  		return -EINVAL;
>  	}
>  
> -	v4l2_async_nf_init(&dcmi->notifier);
> +	v4l2_async_nf_init(&dcmi->notifier, &dcmi->v4l2_dev);
>  
>  	asd = v4l2_async_nf_add_fwnode_remote(&dcmi->notifier,
>  					      of_fwnode_handle(ep),
> @@ -1912,7 +1912,7 @@ static int dcmi_graph_init(struct stm32_dcmi *dcmi)
>  
>  	dcmi->notifier.ops = &dcmi_graph_notify_ops;
>  
> -	ret = v4l2_async_nf_register(&dcmi->v4l2_dev, &dcmi->notifier);
> +	ret = v4l2_async_nf_register(&dcmi->notifier);
>  	if (ret < 0) {
>  		dev_err(dcmi->dev, "Failed to register notifier\n");
>  		v4l2_async_nf_cleanup(&dcmi->notifier);
> diff --git a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
> index 38ca534842100..bb903e5ea35ea 100644
> --- a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
> +++ b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
> @@ -122,7 +122,7 @@ static int sun4i_csi_notifier_init(struct sun4i_csi *csi)
>  	struct fwnode_handle *ep;
>  	int ret;
>  
> -	v4l2_async_nf_init(&csi->notifier);
> +	v4l2_async_nf_init(&csi->notifier, &csi->v4l);
>  
>  	ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(csi->dev), 0, 0,
>  					     FWNODE_GRAPH_ENDPOINT_NEXT);
> @@ -240,7 +240,7 @@ static int sun4i_csi_probe(struct platform_device *pdev)
>  	if (ret)
>  		goto err_unregister_media;
>  
> -	ret = v4l2_async_nf_register(&csi->v4l, &csi->notifier);
> +	ret = v4l2_async_nf_register(&csi->notifier);
>  	if (ret) {
>  		dev_err(csi->dev, "Couldn't register our notifier.\n");
>  		goto err_unregister_media;
> diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c
> index ebb725fc11ba5..0dcf605f2764b 100644
> --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c
> +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c
> @@ -819,7 +819,7 @@ int sun6i_csi_bridge_setup(struct sun6i_csi_device *csi_dev)
>  
>  	/* V4L2 Async */
>  
> -	v4l2_async_nf_init(notifier);
> +	v4l2_async_subdev_nf_init(notifier, subdev);
>  	notifier->ops = &sun6i_csi_bridge_notifier_ops;
>  
>  	sun6i_csi_bridge_source_setup(csi_dev, &bridge->source_parallel,
> @@ -829,9 +829,9 @@ int sun6i_csi_bridge_setup(struct sun6i_csi_device *csi_dev)
>  				      SUN6I_CSI_PORT_MIPI_CSI2, NULL);
>  
>  	if (csi_dev->isp_available)
> -		ret = v4l2_async_subdev_nf_register(subdev, notifier);
> +		ret = v4l2_async_nf_register(notifier);
>  	else
> -		ret = v4l2_async_nf_register(v4l2_dev, notifier);
> +		ret = v4l2_async_nf_register(notifier);
>  	if (ret) {
>  		dev_err(dev, "failed to register v4l2 async notifier: %d\n",
>  			ret);
> diff --git a/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c b/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c
> index a78900dd0b7a6..adf966d2f5ca2 100644
> --- a/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c
> +++ b/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c
> @@ -531,7 +531,7 @@ static int sun6i_mipi_csi2_bridge_setup(struct sun6i_mipi_csi2_device *csi2_dev)
>  
>  	/* V4L2 Async */
>  
> -	v4l2_async_nf_init(notifier);
> +	v4l2_async_subdev_nf_init(notifier, subdev);
>  	notifier->ops = &sun6i_mipi_csi2_notifier_ops;
>  
>  	ret = sun6i_mipi_csi2_bridge_source_setup(csi2_dev);
> @@ -540,7 +540,7 @@ static int sun6i_mipi_csi2_bridge_setup(struct sun6i_mipi_csi2_device *csi2_dev)
>  
>  	/* Only register the notifier when a sensor is connected. */
>  	if (ret != -ENODEV) {
> -		ret = v4l2_async_subdev_nf_register(subdev, notifier);
> +		ret = v4l2_async_nf_register(notifier);
>  		if (ret < 0)
>  			goto error_v4l2_notifier_cleanup;
>  
> diff --git a/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c b/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c
> index 909aaef200989..50641d7af320d 100644
> --- a/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c
> +++ b/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c
> @@ -569,7 +569,7 @@ sun8i_a83t_mipi_csi2_bridge_setup(struct sun8i_a83t_mipi_csi2_device *csi2_dev)
>  
>  	/* V4L2 Async */
>  
> -	v4l2_async_nf_init(notifier);
> +	v4l2_async_subdev_nf_init(notifier, subdev);
>  	notifier->ops = &sun8i_a83t_mipi_csi2_notifier_ops;
>  
>  	ret = sun8i_a83t_mipi_csi2_bridge_source_setup(csi2_dev);
> @@ -578,7 +578,7 @@ sun8i_a83t_mipi_csi2_bridge_setup(struct sun8i_a83t_mipi_csi2_device *csi2_dev)
>  
>  	/* Only register the notifier when a sensor is connected. */
>  	if (ret != -ENODEV) {
> -		ret = v4l2_async_subdev_nf_register(subdev, notifier);
> +		ret = v4l2_async_nf_register(notifier);
>  		if (ret < 0)
>  			goto error_v4l2_notifier_cleanup;
>  
> diff --git a/drivers/media/platform/ti/am437x/am437x-vpfe.c b/drivers/media/platform/ti/am437x/am437x-vpfe.c
> index 1457a188fea12..9ecd6b02467c8 100644
> --- a/drivers/media/platform/ti/am437x/am437x-vpfe.c
> +++ b/drivers/media/platform/ti/am437x/am437x-vpfe.c
> @@ -2300,7 +2300,7 @@ vpfe_get_pdata(struct vpfe_device *vpfe)
>  
>  	dev_dbg(dev, "vpfe_get_pdata\n");
>  
> -	v4l2_async_nf_init(&vpfe->notifier);
> +	v4l2_async_nf_init(&vpfe->notifier, &vpfe->v4l2_dev);
>  
>  	if (!IS_ENABLED(CONFIG_OF) || !dev->of_node)
>  		return dev->platform_data;
> @@ -2466,7 +2466,7 @@ static int vpfe_probe(struct platform_device *pdev)
>  	}
>  
>  	vpfe->notifier.ops = &vpfe_async_ops;
> -	ret = v4l2_async_nf_register(&vpfe->v4l2_dev, &vpfe->notifier);
> +	ret = v4l2_async_nf_register(&vpfe->notifier);
>  	if (ret) {
>  		vpfe_err(vpfe, "Error registering async notifier\n");
>  		ret = -EINVAL;
> diff --git a/drivers/media/platform/ti/cal/cal.c b/drivers/media/platform/ti/cal/cal.c
> index bf7a985168c7b..25780e1f103e7 100644
> --- a/drivers/media/platform/ti/cal/cal.c
> +++ b/drivers/media/platform/ti/cal/cal.c
> @@ -895,7 +895,7 @@ static int cal_async_notifier_register(struct cal_dev *cal)
>  	unsigned int i;
>  	int ret;
>  
> -	v4l2_async_nf_init(&cal->notifier);
> +	v4l2_async_nf_init(&cal->notifier, &cal->v4l2_dev);
>  	cal->notifier.ops = &cal_async_notifier_ops;
>  
>  	for (i = 0; i < cal->data->num_csi2_phy; ++i) {
> @@ -919,7 +919,7 @@ static int cal_async_notifier_register(struct cal_dev *cal)
>  		casd->phy = phy;
>  	}
>  
> -	ret = v4l2_async_nf_register(&cal->v4l2_dev, &cal->notifier);
> +	ret = v4l2_async_nf_register(&cal->notifier);
>  	if (ret) {
>  		cal_err(cal, "Error registering async notifier\n");
>  		goto error;
> diff --git a/drivers/media/platform/ti/davinci/vpif_capture.c b/drivers/media/platform/ti/davinci/vpif_capture.c
> index 9b97e26be0892..3f0b161ab50cf 100644
> --- a/drivers/media/platform/ti/davinci/vpif_capture.c
> +++ b/drivers/media/platform/ti/davinci/vpif_capture.c
> @@ -1483,7 +1483,8 @@ static const struct v4l2_async_notifier_operations vpif_async_ops = {
>  };
>  
>  static struct vpif_capture_config *
> -vpif_capture_get_pdata(struct platform_device *pdev)
> +vpif_capture_get_pdata(struct platform_device *pdev,
> +		       struct v4l2_device *v4l2_dev)
>  {
>  	struct device_node *endpoint = NULL;
>  	struct device_node *rem = NULL;
> @@ -1492,7 +1493,7 @@ vpif_capture_get_pdata(struct platform_device *pdev)
>  	struct vpif_capture_chan_config *chan;
>  	unsigned int i;
>  
> -	v4l2_async_nf_init(&vpif_obj.notifier);
> +	v4l2_async_nf_init(&vpif_obj.notifier, v4l2_dev);
>  
>  	/*
>  	 * DT boot: OF node from parent device contains
> @@ -1649,7 +1650,8 @@ static __init int vpif_probe(struct platform_device *pdev)
>  		goto vpif_unregister;
>  	}
>  
> -	pdev->dev.platform_data = vpif_capture_get_pdata(pdev);
> +	pdev->dev.platform_data =
> +		vpif_capture_get_pdata(pdev, &vpif_obj.v4l2_dev);
>  	if (!pdev->dev.platform_data) {
>  		dev_warn(&pdev->dev, "Missing platform data.  Giving up.\n");
>  		goto probe_subdev_out;
> @@ -1683,8 +1685,7 @@ static __init int vpif_probe(struct platform_device *pdev)
>  			goto probe_subdev_out;
>  	} else {
>  		vpif_obj.notifier.ops = &vpif_async_ops;
> -		err = v4l2_async_nf_register(&vpif_obj.v4l2_dev,
> -					     &vpif_obj.notifier);
> +		err = v4l2_async_nf_register(&vpif_obj.notifier);
>  		if (err) {
>  			vpif_err("Error registering async notifier\n");
>  			err = -EINVAL;
> diff --git a/drivers/media/platform/ti/omap3isp/isp.c b/drivers/media/platform/ti/omap3isp/isp.c
> index 5b3266b214874..44ddc1422cc75 100644
> --- a/drivers/media/platform/ti/omap3isp/isp.c
> +++ b/drivers/media/platform/ti/omap3isp/isp.c
> @@ -2425,13 +2425,13 @@ static int isp_probe(struct platform_device *pdev)
>  
>  	isp->notifier.ops = &isp_subdev_notifier_ops;
>  
> -	v4l2_async_nf_init(&isp->notifier);
> +	v4l2_async_nf_init(&isp->notifier, &isp->v4l2_dev);
>  
>  	ret = isp_parse_of_endpoints(isp);
>  	if (ret < 0)
>  		goto error_register_entities;
>  
> -	ret = v4l2_async_nf_register(&isp->v4l2_dev, &isp->notifier);
> +	ret = v4l2_async_nf_register(&isp->notifier);
>  	if (ret)
>  		goto error_register_entities;
>  
> diff --git a/drivers/media/platform/video-mux.c b/drivers/media/platform/video-mux.c
> index e1dd798764312..315c65effe878 100644
> --- a/drivers/media/platform/video-mux.c
> +++ b/drivers/media/platform/video-mux.c
> @@ -360,7 +360,7 @@ static int video_mux_async_register(struct video_mux *vmux,
>  	unsigned int i;
>  	int ret;
>  
> -	v4l2_async_nf_init(&vmux->notifier);
> +	v4l2_async_subdev_nf_init(&vmux->notifier, &vmux->subdev);
>  
>  	for (i = 0; i < num_input_pads; i++) {
>  		struct v4l2_async_connection *asd;
> @@ -395,7 +395,7 @@ static int video_mux_async_register(struct video_mux *vmux,
>  
>  	vmux->notifier.ops = &video_mux_notify_ops;
>  
> -	ret = v4l2_async_subdev_nf_register(&vmux->subdev, &vmux->notifier);
> +	ret = v4l2_async_nf_register(&vmux->notifier);
>  	if (ret)
>  		return ret;
>  
> diff --git a/drivers/media/platform/xilinx/xilinx-vipp.c b/drivers/media/platform/xilinx/xilinx-vipp.c
> index 6bb426a25fe90..4285770fde184 100644
> --- a/drivers/media/platform/xilinx/xilinx-vipp.c
> +++ b/drivers/media/platform/xilinx/xilinx-vipp.c
> @@ -494,7 +494,7 @@ static int xvip_graph_init(struct xvip_composite_device *xdev)
>  		goto done;
>  	}
>  
> -	v4l2_async_nf_init(&xdev->notifier);
> +	v4l2_async_nf_init(&xdev->notifier, &xdev->v4l2_dev);
>  
>  	/* Parse the graph to extract a list of subdevice DT nodes. */
>  	ret = xvip_graph_parse(xdev);
> @@ -512,7 +512,7 @@ static int xvip_graph_init(struct xvip_composite_device *xdev)
>  	/* Register the subdevices notifier. */
>  	xdev->notifier.ops = &xvip_graph_notify_ops;
>  
> -	ret = v4l2_async_nf_register(&xdev->v4l2_dev, &xdev->notifier);
> +	ret = v4l2_async_nf_register(&xdev->notifier);
>  	if (ret < 0) {
>  		dev_err(xdev->dev, "notifier registration failed\n");
>  		goto done;
> diff --git a/drivers/media/v4l2-core/v4l2-async.c b/drivers/media/v4l2-core/v4l2-async.c
> index 12b465a16ec1c..bb172cc18998a 100644
> --- a/drivers/media/v4l2-core/v4l2-async.c
> +++ b/drivers/media/v4l2-core/v4l2-async.c
> @@ -558,13 +558,24 @@ static int v4l2_async_nf_match_valid(struct v4l2_async_notifier *notifier,
>  	return 0;
>  }
>  
> -void v4l2_async_nf_init(struct v4l2_async_notifier *notifier)
> +void v4l2_async_nf_init(struct v4l2_async_notifier *notifier,
> +			struct v4l2_device *v4l2_dev)
>  {
>  	INIT_LIST_HEAD(&notifier->waiting_list);
>  	INIT_LIST_HEAD(&notifier->done_list);
> +	notifier->v4l2_dev = v4l2_dev;
>  }
>  EXPORT_SYMBOL(v4l2_async_nf_init);
>  
> +void v4l2_async_subdev_nf_init(struct v4l2_async_notifier *notifier,
> +			       struct v4l2_subdev *sd)
> +{
> +	INIT_LIST_HEAD(&notifier->waiting_list);
> +	INIT_LIST_HEAD(&notifier->done_list);
> +	notifier->sd = sd;
> +}
> +EXPORT_SYMBOL_GPL(v4l2_async_subdev_nf_init);
> +
>  static int __v4l2_async_nf_register(struct v4l2_async_notifier *notifier)
>  {
>  	struct v4l2_async_connection *asc;
> @@ -605,16 +616,13 @@ static int __v4l2_async_nf_register(struct v4l2_async_notifier *notifier)
>  	return ret;
>  }
>  
> -int v4l2_async_nf_register(struct v4l2_device *v4l2_dev,
> -			   struct v4l2_async_notifier *notifier)
> +int v4l2_async_nf_register(struct v4l2_async_notifier *notifier)
>  {
>  	int ret;
>  
> -	if (WARN_ON(!v4l2_dev || notifier->sd))
> +	if (WARN_ON(!notifier->v4l2_dev == !notifier->sd))
>  		return -EINVAL;
>  
> -	notifier->v4l2_dev = v4l2_dev;
> -
>  	ret = __v4l2_async_nf_register(notifier);
>  	if (ret)
>  		notifier->v4l2_dev = NULL;
> @@ -623,24 +631,6 @@ int v4l2_async_nf_register(struct v4l2_device *v4l2_dev,
>  }
>  EXPORT_SYMBOL(v4l2_async_nf_register);
>  
> -int v4l2_async_subdev_nf_register(struct v4l2_subdev *sd,
> -				  struct v4l2_async_notifier *notifier)
> -{
> -	int ret;
> -
> -	if (WARN_ON(!sd || notifier->v4l2_dev))
> -		return -EINVAL;
> -
> -	notifier->sd = sd;
> -
> -	ret = __v4l2_async_nf_register(notifier);
> -	if (ret)
> -		notifier->sd = NULL;
> -
> -	return ret;
> -}
> -EXPORT_SYMBOL(v4l2_async_subdev_nf_register);
> -
>  static void
>  __v4l2_async_nf_unregister(struct v4l2_async_notifier *notifier)
>  {
> @@ -649,9 +639,6 @@ __v4l2_async_nf_unregister(struct v4l2_async_notifier *notifier)
>  
>  	v4l2_async_nf_unbind_all_subdevs(notifier);
>  
> -	notifier->sd = NULL;
> -	notifier->v4l2_dev = NULL;
> -
>  	list_del(&notifier->notifier_entry);
>  }
>  
> @@ -683,6 +670,9 @@ static void __v4l2_async_nf_cleanup(struct v4l2_async_notifier *notifier)
>  
>  		kfree(asc);
>  	}
> +
> +	notifier->sd = NULL;
> +	notifier->v4l2_dev = NULL;
>  }
>  
>  void v4l2_async_nf_cleanup(struct v4l2_async_notifier *notifier)
> diff --git a/drivers/media/v4l2-core/v4l2-fwnode.c b/drivers/media/v4l2-core/v4l2-fwnode.c
> index 7c3e1648a0f49..dc5df557c3b33 100644
> --- a/drivers/media/v4l2-core/v4l2-fwnode.c
> +++ b/drivers/media/v4l2-core/v4l2-fwnode.c
> @@ -1205,7 +1205,7 @@ int v4l2_async_register_subdev_sensor(struct v4l2_subdev *sd)
>  	if (!notifier)
>  		return -ENOMEM;
>  
> -	v4l2_async_nf_init(notifier);
> +	v4l2_async_subdev_nf_init(notifier, sd);
>  
>  	ret = v4l2_subdev_get_privacy_led(sd);
>  	if (ret < 0)
> @@ -1215,7 +1215,7 @@ int v4l2_async_register_subdev_sensor(struct v4l2_subdev *sd)
>  	if (ret < 0)
>  		goto out_cleanup;
>  
> -	ret = v4l2_async_subdev_nf_register(sd, notifier);
> +	ret = v4l2_async_nf_register(notifier);
>  	if (ret < 0)
>  		goto out_cleanup;
>  
> diff --git a/drivers/staging/media/deprecated/atmel/atmel-sama5d2-isc.c b/drivers/staging/media/deprecated/atmel/atmel-sama5d2-isc.c
> index 58c8c7813e0f9..31b2b48085c59 100644
> --- a/drivers/staging/media/deprecated/atmel/atmel-sama5d2-isc.c
> +++ b/drivers/staging/media/deprecated/atmel/atmel-sama5d2-isc.c
> @@ -507,7 +507,7 @@ static int atmel_isc_probe(struct platform_device *pdev)
>  		struct fwnode_handle *fwnode =
>  			of_fwnode_handle(subdev_entity->epn);
>  
> -		v4l2_async_nf_init(&subdev_entity->notifier);
> +		v4l2_async_nf_init(&subdev_entity->notifier, &isc->v4l2_dev);
>  
>  		asd = v4l2_async_nf_add_fwnode_remote(&subdev_entity->notifier,
>  						      fwnode,
> @@ -523,8 +523,7 @@ static int atmel_isc_probe(struct platform_device *pdev)
>  
>  		subdev_entity->notifier.ops = &atmel_isc_async_ops;
>  
> -		ret = v4l2_async_nf_register(&isc->v4l2_dev,
> -					     &subdev_entity->notifier);
> +		ret = v4l2_async_nf_register(&subdev_entity->notifier);
>  		if (ret) {
>  			dev_err(dev, "fail to register async notifier\n");
>  			goto cleanup_subdev;
> diff --git a/drivers/staging/media/deprecated/atmel/atmel-sama7g5-isc.c b/drivers/staging/media/deprecated/atmel/atmel-sama7g5-isc.c
> index f10ddee0949e1..020034f631f57 100644
> --- a/drivers/staging/media/deprecated/atmel/atmel-sama7g5-isc.c
> +++ b/drivers/staging/media/deprecated/atmel/atmel-sama7g5-isc.c
> @@ -497,7 +497,7 @@ static int microchip_xisc_probe(struct platform_device *pdev)
>  		struct fwnode_handle *fwnode =
>  			of_fwnode_handle(subdev_entity->epn);
>  
> -		v4l2_async_nf_init(&subdev_entity->notifier);
> +		v4l2_async_nf_init(&subdev_entity->notifier, &isc->v4l2_dev);
>  
>  		asd = v4l2_async_nf_add_fwnode_remote(&subdev_entity->notifier,
>  						      fwnode,
> @@ -513,8 +513,7 @@ static int microchip_xisc_probe(struct platform_device *pdev)
>  
>  		subdev_entity->notifier.ops = &atmel_isc_async_ops;
>  
> -		ret = v4l2_async_nf_register(&isc->v4l2_dev,
> -					     &subdev_entity->notifier);
> +		ret = v4l2_async_nf_register(&subdev_entity->notifier);
>  		if (ret) {
>  			dev_err(dev, "fail to register async notifier\n");
>  			goto cleanup_subdev;
> diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c
> index 09b8b396022e0..dda1ebc34692a 100644
> --- a/drivers/staging/media/imx/imx-media-csi.c
> +++ b/drivers/staging/media/imx/imx-media-csi.c
> @@ -1918,7 +1918,7 @@ static int imx_csi_async_register(struct csi_priv *priv)
>  	unsigned int port;
>  	int ret;
>  
> -	v4l2_async_nf_init(&priv->notifier);
> +	v4l2_async_subdev_nf_init(&priv->notifier, &priv->sd);
>  
>  	/* get this CSI's port id */
>  	ret = fwnode_property_read_u32(dev_fwnode(priv->dev), "reg", &port);
> @@ -1944,7 +1944,7 @@ static int imx_csi_async_register(struct csi_priv *priv)
>  
>  	priv->notifier.ops = &csi_notify_ops;
>  
> -	ret = v4l2_async_subdev_nf_register(&priv->sd, &priv->notifier);
> +	ret = v4l2_async_nf_register(&priv->notifier);
>  	if (ret)
>  		return ret;
>  
> diff --git a/drivers/staging/media/imx/imx-media-dev-common.c b/drivers/staging/media/imx/imx-media-dev-common.c
> index 67c1b16db6558..46bf717255b3e 100644
> --- a/drivers/staging/media/imx/imx-media-dev-common.c
> +++ b/drivers/staging/media/imx/imx-media-dev-common.c
> @@ -367,7 +367,7 @@ struct imx_media_dev *imx_media_dev_init(struct device *dev,
>  
>  	INIT_LIST_HEAD(&imxmd->vdev_list);
>  
> -	v4l2_async_nf_init(&imxmd->notifier);
> +	v4l2_async_nf_init(&imxmd->notifier, &imxmd->v4l2_dev);
>  
>  	return imxmd;
>  
> @@ -391,7 +391,7 @@ int imx_media_dev_notifier_register(struct imx_media_dev *imxmd,
>  
>  	/* prepare the async subdev notifier and register it */
>  	imxmd->notifier.ops = ops ? ops : &imx_media_notifier_ops;
> -	ret = v4l2_async_nf_register(&imxmd->v4l2_dev, &imxmd->notifier);
> +	ret = v4l2_async_nf_register(&imxmd->notifier);
>  	if (ret) {
>  		v4l2_err(&imxmd->v4l2_dev,
>  			 "v4l2_async_nf_register failed with %d\n", ret);
> diff --git a/drivers/staging/media/imx/imx6-mipi-csi2.c b/drivers/staging/media/imx/imx6-mipi-csi2.c
> index 2e86f82ad70cd..50f1df09c0a73 100644
> --- a/drivers/staging/media/imx/imx6-mipi-csi2.c
> +++ b/drivers/staging/media/imx/imx6-mipi-csi2.c
> @@ -635,7 +635,7 @@ static int csi2_async_register(struct csi2_dev *csi2)
>  	struct fwnode_handle *ep;
>  	int ret;
>  
> -	v4l2_async_nf_init(&csi2->notifier);
> +	v4l2_async_subdev_nf_init(&csi2->notifier, &csi2->sd);
>  
>  	ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(csi2->dev), 0, 0,
>  					     FWNODE_GRAPH_ENDPOINT_NEXT);
> @@ -660,7 +660,7 @@ static int csi2_async_register(struct csi2_dev *csi2)
>  
>  	csi2->notifier.ops = &csi2_notify_ops;
>  
> -	ret = v4l2_async_subdev_nf_register(&csi2->sd, &csi2->notifier);
> +	ret = v4l2_async_nf_register(&csi2->notifier);
>  	if (ret)
>  		return ret;
>  
> diff --git a/drivers/staging/media/imx/imx8mq-mipi-csi2.c b/drivers/staging/media/imx/imx8mq-mipi-csi2.c
> index 2f723ad34c2c5..6813c44b71039 100644
> --- a/drivers/staging/media/imx/imx8mq-mipi-csi2.c
> +++ b/drivers/staging/media/imx/imx8mq-mipi-csi2.c
> @@ -592,7 +592,7 @@ static int imx8mq_mipi_csi_async_register(struct csi_state *state)
>  	unsigned int i;
>  	int ret;
>  
> -	v4l2_async_nf_init(&state->notifier);
> +	v4l2_async_subdev_nf_init(&state->notifier, &state->sd);
>  
>  	ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(state->dev), 0, 0,
>  					     FWNODE_GRAPH_ENDPOINT_NEXT);
> @@ -629,7 +629,7 @@ static int imx8mq_mipi_csi_async_register(struct csi_state *state)
>  
>  	state->notifier.ops = &imx8mq_mipi_csi_notify_ops;
>  
> -	ret = v4l2_async_subdev_nf_register(&state->sd, &state->notifier);
> +	ret = v4l2_async_nf_register(&state->notifier);
>  	if (ret)
>  		return ret;
>  
> diff --git a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c b/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c
> index dd7dfecb9ef33..ccbb530aa2e23 100644
> --- a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c
> +++ b/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c
> @@ -536,7 +536,7 @@ int sun6i_isp_proc_setup(struct sun6i_isp_device *isp_dev)
>  
>  	/* V4L2 Async */
>  
> -	v4l2_async_nf_init(notifier);
> +	v4l2_async_nf_init(notifier, v4l2_dev);
>  	notifier->ops = &sun6i_isp_proc_notifier_ops;
>  
>  	sun6i_isp_proc_source_setup(isp_dev, &proc->source_csi0,
> @@ -544,7 +544,7 @@ int sun6i_isp_proc_setup(struct sun6i_isp_device *isp_dev)
>  	sun6i_isp_proc_source_setup(isp_dev, &proc->source_csi1,
>  				    SUN6I_ISP_PORT_CSI1);
>  
> -	ret = v4l2_async_nf_register(v4l2_dev, notifier);
> +	ret = v4l2_async_nf_register(notifier);
>  	if (ret) {
>  		v4l2_err(v4l2_dev,
>  			 "failed to register v4l2 async notifier: %d\n", ret);
> diff --git a/drivers/staging/media/tegra-video/vi.c b/drivers/staging/media/tegra-video/vi.c
> index 146b4fd3c8b52..f31d8babf499c 100644
> --- a/drivers/staging/media/tegra-video/vi.c
> +++ b/drivers/staging/media/tegra-video/vi.c
> @@ -1280,7 +1280,7 @@ static int tegra_channel_init(struct tegra_vi_channel *chan)
>  	}
>  
>  	if (!IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG))
> -		v4l2_async_nf_init(&chan->notifier);
> +		v4l2_async_nf_init(&chan->notifier, &vid->v4l2_dev);
>  
>  	return 0;
>  
> @@ -1880,7 +1880,7 @@ static int tegra_vi_graph_init(struct tegra_vi *vi)
>  			continue;
>  
>  		chan->notifier.ops = &tegra_vi_async_ops;
> -		ret = v4l2_async_nf_register(&vid->v4l2_dev, &chan->notifier);
> +		ret = v4l2_async_nf_register(&chan->notifier);
>  		if (ret < 0) {
>  			dev_err(vi->dev,
>  				"failed to register channel %d notifier: %d\n",
> diff --git a/include/media/v4l2-async.h b/include/media/v4l2-async.h
> index d0bef6626e043..65e364d4033a4 100644
> --- a/include/media/v4l2-async.h
> +++ b/include/media/v4l2-async.h
> @@ -146,13 +146,30 @@ void v4l2_async_debug_init(struct dentry *debugfs_dir);
>   * v4l2_async_nf_init - Initialize a notifier.
>   *
>   * @notifier: pointer to &struct v4l2_async_notifier
> + * @v4l2_dev: pointer to &struct v4l2_device
> + *
> + * This function initializes the notifier @asc_entry. It must be called
> + * before adding a subdevice to a notifier, using one of:
> + * v4l2_async_nf_add_fwnode_remote(),
> + * v4l2_async_nf_add_fwnode() or
> + * v4l2_async_nf_add_i2c().
> + */
> +void v4l2_async_nf_init(struct v4l2_async_notifier *notifier,
> +			struct v4l2_device *v4l2_dev);
> +
> +/**
> + * v4l2_async_subdev_nf_init - Initialize a sub-device notifier.
> + *
> + * @notifier: pointer to &struct v4l2_async_notifier
> + * @sd: pointer to &struct v4l2_subdev
>   *
>   * This function initializes the notifier @asc_entry. It must be called
>   * before adding a subdevice to a notifier, using one of:
>   * v4l2_async_nf_add_fwnode_remote(), v4l2_async_nf_add_fwnode() or
>   * v4l2_async_nf_add_i2c().
>   */
> -void v4l2_async_nf_init(struct v4l2_async_notifier *notifier);
> +void v4l2_async_subdev_nf_init(struct v4l2_async_notifier *notifier,
> +			       struct v4l2_subdev *sd);
>  
>  struct v4l2_async_connection *
>  __v4l2_async_nf_add_fwnode(struct v4l2_async_notifier *notifier,
> @@ -257,21 +274,9 @@ v4l2_async_connection_unique(struct v4l2_subdev *sd);
>  /**
>   * v4l2_async_nf_register - registers a subdevice asynchronous notifier
>   *
> - * @v4l2_dev: pointer to &struct v4l2_device
> - * @notifier: pointer to &struct v4l2_async_notifier
> - */
> -int v4l2_async_nf_register(struct v4l2_device *v4l2_dev,
> -			   struct v4l2_async_notifier *notifier);
> -
> -/**
> - * v4l2_async_subdev_nf_register - registers a subdevice asynchronous
> - *					 notifier for a sub-device
> - *
> - * @sd: pointer to &struct v4l2_subdev
>   * @notifier: pointer to &struct v4l2_async_notifier
>   */
> -int v4l2_async_subdev_nf_register(struct v4l2_subdev *sd,
> -				  struct v4l2_async_notifier *notifier);
> +int v4l2_async_nf_register(struct v4l2_async_notifier *notifier);
>  
>  /**
>   * v4l2_async_nf_unregister - unregisters a subdevice

-- 
Regards,

Laurent Pinchart



[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