staging: vc04_services: isp: Reorder operations during device probe
authorNaushir Patuck <naush@raspberrypi.com>
Tue, 19 May 2020 14:57:08 +0000 (15:57 +0100)
committerpopcornmix <popcornmix@gmail.com>
Wed, 1 Jul 2020 15:34:18 +0000 (16:34 +0100)
Register the video node at the end of the probe, swapping order with
registering the controls.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
drivers/staging/vc04_services/bcm2835-isp/bcm2835-v4l2-isp.c

index 8347199..815cf50 100644 (file)
@@ -1295,21 +1295,6 @@ static int register_node(struct bcm2835_isp_dev *dev,
        }
        node->queue_init = true;
 
-       /* Define the device names */
-       snprintf(vfd->name, sizeof(node->vfd.name), "%s-%s%d", BCM2835_ISP_NAME,
-                node->name, node->id);
-
-       ret = video_register_device(vfd, VFL_TYPE_GRABBER, video_nr + index);
-       if (ret) {
-               v4l2_err(&dev->v4l2_dev,
-                        "Failed to register video %s[%d] device node\n",
-                        node->name, node->id);
-               return ret;
-       }
-
-       node->registered = true;
-       video_set_drvdata(vfd, node);
-
        /* Set some controls and defaults, but only on the VIDEO_OUTPUT node. */
        if (node_is_output(node)) {
                unsigned int i;
@@ -1324,7 +1309,12 @@ static int register_node(struct bcm2835_isp_dev *dev,
                        .step           = 1,
                };
 
-               v4l2_ctrl_handler_init(&dev->ctrl_handler, 4);
+               ret = v4l2_ctrl_handler_init(&dev->ctrl_handler, 12);
+               if (ret) {
+                       v4l2_err(&dev->v4l2_dev, "ctrl_handler init failed (%d)\n",
+                                ret);
+                       return ret;
+               }
 
                dev->r_gain = 1000;
                dev->b_gain = 1000;
@@ -1350,13 +1340,39 @@ static int register_node(struct bcm2835_isp_dev *dev,
                }
 
                node->vfd.ctrl_handler = &dev->ctrl_handler;
+               if (dev->ctrl_handler.error) {
+                       ret = dev->ctrl_handler.error;
+                       v4l2_err(&dev->v4l2_dev, "controls init failed (%d)\n",
+                                ret);
+                       v4l2_ctrl_handler_free(&dev->ctrl_handler);
+                       goto ctrl_cleanup;
+               }
        }
 
+       /* Define the device names */
+       snprintf(vfd->name, sizeof(node->vfd.name), "%s-%s%d", BCM2835_ISP_NAME,
+                node->name, node->id);
+
+       ret = video_register_device(vfd, VFL_TYPE_GRABBER, video_nr + index);
+       if (ret) {
+               v4l2_err(&dev->v4l2_dev,
+                        "Failed to register video %s[%d] device node\n",
+                        node->name, node->id);
+               goto ctrl_cleanup;
+       }
+
+       node->registered = true;
+       video_set_drvdata(vfd, node);
+
        v4l2_info(&dev->v4l2_dev,
                  "Device node %s[%d] registered as /dev/video%d\n",
                  node->name, node->id, vfd->num);
 
        return 0;
+
+ctrl_cleanup:
+       v4l2_ctrl_handler_free(&dev->ctrl_handler);
+       return ret;
 }
 
 /* Unregister one of the /dev/video<N> nodes associated with the ISP. */