media: pxa_camera: Register V4L2 device early
authorSakari Ailus <sakari.ailus@linux.intel.com>
Wed, 29 Mar 2023 12:54:05 +0000 (14:54 +0200)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Thu, 10 Aug 2023 05:58:31 +0000 (07:58 +0200)
Register V4L2 device before initialising the notifier. This way the device
can be made available to the V4L2 async framework from the notifier init
time onwards. A subsequent patch will add struct v4l2_device as an
argument to v4l2_async_nf_init().

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Tested-by: Philipp Zabel <p.zabel@pengutronix.de> # imx6qp
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> # rcar + adv746x
Tested-by: Aishwarya Kothari <aishwarya.kothari@toradex.com> # Apalis i.MX6Q with TC358743
Tested-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> # Renesas RZ/G2L SMARC
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/platform/intel/pxa_camera.c

index 2453bf58f92def1c29878d8061a40087c590fb6a..6112d31c22282af5c0a99b79f6c9c87887c38fd7 100644 (file)
@@ -2298,6 +2298,10 @@ static int pxa_camera_probe(struct platform_device *pdev)
        pcdev->irq = irq;
        pcdev->base = base;
 
+       err = v4l2_device_register(&pdev->dev, &pcdev->v4l2_dev);
+       if (err)
+               return err;
+
        v4l2_async_nf_init(&pcdev->notifier);
        pcdev->res = res;
        pcdev->pdata = pdev->dev.platform_data;
@@ -2315,10 +2319,10 @@ static int pxa_camera_probe(struct platform_device *pdev)
        } else if (pdev->dev.of_node) {
                err = pxa_camera_pdata_from_dt(&pdev->dev, pcdev);
        } else {
-               return -ENODEV;
+               err = -ENODEV;
        }
        if (err < 0)
-               return err;
+               goto exit_v4l2_device_unregister;
 
        if (!(pcdev->platform_flags & (PXA_CAMERA_DATAWIDTH_8 |
                        PXA_CAMERA_DATAWIDTH_9 | PXA_CAMERA_DATAWIDTH_10))) {
@@ -2384,13 +2388,10 @@ static int pxa_camera_probe(struct platform_device *pdev)
        pxa_camera_activate(pcdev);
 
        platform_set_drvdata(pdev, pcdev);
-       err = v4l2_device_register(&pdev->dev, &pcdev->v4l2_dev);
-       if (err)
-               goto exit_deactivate;
 
        err = pxa_camera_init_videobuf2(pcdev);
        if (err)
-               goto exit_v4l2_device_unregister;
+               goto exit_deactivate;
 
        /* request irq */
        err = devm_request_irq(&pdev->dev, pcdev->irq, pxa_camera_irq, 0,
@@ -2403,11 +2404,9 @@ static int pxa_camera_probe(struct platform_device *pdev)
        pcdev->notifier.ops = &pxa_camera_sensor_ops;
        err = v4l2_async_nf_register(&pcdev->v4l2_dev, &pcdev->notifier);
        if (err)
-               goto exit_v4l2_device_unregister;
+               goto exit_deactivate;
 
        return 0;
-exit_v4l2_device_unregister:
-       v4l2_device_unregister(&pcdev->v4l2_dev);
 exit_deactivate:
        pxa_camera_deactivate(pcdev);
        tasklet_kill(&pcdev->task_eof);
@@ -2419,6 +2418,8 @@ exit_free_dma_y:
        dma_release_channel(pcdev->dma_chans[0]);
 exit_notifier_cleanup:
        v4l2_async_nf_cleanup(&pcdev->notifier);
+exit_v4l2_device_unregister:
+       v4l2_device_unregister(&pcdev->v4l2_dev);
        return err;
 }