staging/bcm2835-isp: Fix cleanup after init fail
authorPhil Elwell <phil@raspberrypi.com>
Thu, 16 Dec 2021 16:25:00 +0000 (16:25 +0000)
committerPhil Elwell <phil@raspberrypi.com>
Thu, 16 Dec 2021 16:31:18 +0000 (16:31 +0000)
bcm2835_isp_remove is called on an initialisation failure, but at that
point the drvdata hasn't been set. This causes a crash when e.g. using
the cutdown firmware (gpu_mem=16).

Move platform_set_drvdata before the instance probing loop to avoid the
problem.

See: https://github.com/raspberrypi/linux/issues/4774

Signed-off-by: Phil Elwell <phil@raspberrypi.com>
drivers/staging/vc04_services/bcm2835-isp/bcm2835-v4l2-isp.c

index 5a0245b..8166f8e 100644 (file)
@@ -1774,6 +1774,8 @@ static int bcm2835_isp_probe(struct platform_device *pdev)
        if (!bcm2835_isp_instances)
                return -ENOMEM;
 
+       platform_set_drvdata(pdev, bcm2835_isp_instances);
+
        for (i = 0; i < BCM2835_ISP_NUM_INSTANCES; i++) {
                ret = bcm2835_isp_probe_instance(pdev,
                                                 &bcm2835_isp_instances[i], i);
@@ -1781,7 +1783,6 @@ static int bcm2835_isp_probe(struct platform_device *pdev)
                        goto error;
        }
 
-       platform_set_drvdata(pdev, bcm2835_isp_instances);
        dev_info(&pdev->dev, "Loaded V4L2 %s\n", BCM2835_ISP_NAME);
        return 0;