In order to reduce even further the size of the big
vivid_create_instance() function, let's place the part of the
logic which creates the device nodes into a separate function.

    With this and the past patches, those warnings finally
    vanishes:

            drivers/media/test-drivers/vivid/vivid-core.c: 
drivers/media/test-drivers/vivid/vivid-core.c:1189 vivid_create_instance() 
parse error: turning off implications after 60 seconds
            drivers/media/test-drivers/vivid/vivid-core.c: 
drivers/media/test-drivers/vivid/vivid-core.c:1257 vivid_create_instance() 
parse error: __split_smt: function too hairy.  Giving up after 303 seconds

The init code also seems more organized after breaking the long
function into a smaller set.

Signed-off-by: Mauro Carvalho Chehab <mchehab+hua...@kernel.org>
---
 drivers/media/test-drivers/vivid/vivid-core.c | 670 +++++++++---------
 1 file changed, 344 insertions(+), 326 deletions(-)

diff --git a/drivers/media/test-drivers/vivid/vivid-core.c 
b/drivers/media/test-drivers/vivid/vivid-core.c
index 69cc8456a323..54df7e0c13fc 100644
--- a/drivers/media/test-drivers/vivid/vivid-core.c
+++ b/drivers/media/test-drivers/vivid/vivid-core.c
@@ -1306,6 +1306,346 @@ static int vivid_create_queues(struct vivid_dev *dev)
        return 0;
 }
 
+static int vivid_create_devnodes(struct platform_device *pdev,
+                                struct vivid_dev *dev, int inst,
+                                unsigned int cec_tx_bus_cnt,
+                                v4l2_std_id tvnorms_cap,
+                                v4l2_std_id tvnorms_out,
+                                unsigned in_type_counter[4],
+                                unsigned out_type_counter[4])
+{
+       struct video_device *vfd;
+       int ret, i;
+
+       if (dev->has_vid_cap) {
+               vfd = &dev->vid_cap_dev;
+               snprintf(vfd->name, sizeof(vfd->name),
+                        "vivid-%03d-vid-cap", inst);
+               vfd->fops = &vivid_fops;
+               vfd->ioctl_ops = &vivid_ioctl_ops;
+               vfd->device_caps = dev->vid_cap_caps;
+               vfd->release = video_device_release_empty;
+               vfd->v4l2_dev = &dev->v4l2_dev;
+               vfd->queue = &dev->vb_vid_cap_q;
+               vfd->tvnorms = tvnorms_cap;
+
+               /*
+                * Provide a mutex to v4l2 core. It will be used to protect
+                * all fops and v4l2 ioctls.
+                */
+               vfd->lock = &dev->mutex;
+               video_set_drvdata(vfd, dev);
+
+#ifdef CONFIG_MEDIA_CONTROLLER
+               dev->vid_cap_pad.flags = MEDIA_PAD_FL_SINK;
+               ret = media_entity_pads_init(&vfd->entity, 1, 
&dev->vid_cap_pad);
+               if (ret)
+                       return ret;
+#endif
+
+#ifdef CONFIG_VIDEO_VIVID_CEC
+               if (in_type_counter[HDMI]) {
+                       ret = cec_register_adapter(dev->cec_rx_adap, 
&pdev->dev);
+                       if (ret < 0) {
+                               cec_delete_adapter(dev->cec_rx_adap);
+                               dev->cec_rx_adap = NULL;
+                               return ret;
+                       }
+                       cec_s_phys_addr(dev->cec_rx_adap, 0, false);
+                       v4l2_info(&dev->v4l2_dev, "CEC adapter %s registered 
for HDMI input 0\n",
+                                 dev_name(&dev->cec_rx_adap->devnode.dev));
+               }
+#endif
+
+               ret = video_register_device(vfd, VFL_TYPE_VIDEO, 
vid_cap_nr[inst]);
+               if (ret < 0)
+                       return ret;
+               v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as 
%s\n",
+                                         video_device_node_name(vfd));
+       }
+
+       if (dev->has_vid_out) {
+               vfd = &dev->vid_out_dev;
+               snprintf(vfd->name, sizeof(vfd->name),
+                        "vivid-%03d-vid-out", inst);
+               vfd->vfl_dir = VFL_DIR_TX;
+               vfd->fops = &vivid_fops;
+               vfd->ioctl_ops = &vivid_ioctl_ops;
+               vfd->device_caps = dev->vid_out_caps;
+               vfd->release = video_device_release_empty;
+               vfd->v4l2_dev = &dev->v4l2_dev;
+               vfd->queue = &dev->vb_vid_out_q;
+               vfd->tvnorms = tvnorms_out;
+
+               /*
+                * Provide a mutex to v4l2 core. It will be used to protect
+                * all fops and v4l2 ioctls.
+                */
+               vfd->lock = &dev->mutex;
+               video_set_drvdata(vfd, dev);
+
+#ifdef CONFIG_MEDIA_CONTROLLER
+               dev->vid_out_pad.flags = MEDIA_PAD_FL_SOURCE;
+               ret = media_entity_pads_init(&vfd->entity, 1, 
&dev->vid_out_pad);
+               if (ret)
+                       return ret;
+#endif
+
+#ifdef CONFIG_VIDEO_VIVID_CEC
+               for (i = 0; i < cec_tx_bus_cnt; i++) {
+                       ret = cec_register_adapter(dev->cec_tx_adap[i], 
&pdev->dev);
+                       if (ret < 0) {
+                               for (; i < cec_tx_bus_cnt; i++) {
+                                       cec_delete_adapter(dev->cec_tx_adap[i]);
+                                       dev->cec_tx_adap[i] = NULL;
+                               }
+                               return ret;
+                       }
+                       v4l2_info(&dev->v4l2_dev, "CEC adapter %s registered 
for HDMI output %d\n",
+                                 dev_name(&dev->cec_tx_adap[i]->devnode.dev), 
i);
+                       if (i < out_type_counter[HDMI])
+                               cec_s_phys_addr(dev->cec_tx_adap[i], (i + 1) << 
12, false);
+                       else
+                               cec_s_phys_addr(dev->cec_tx_adap[i], 0x1000, 
false);
+               }
+#endif
+
+               ret = video_register_device(vfd, VFL_TYPE_VIDEO, 
vid_out_nr[inst]);
+               if (ret < 0)
+                       return ret;
+               v4l2_info(&dev->v4l2_dev, "V4L2 output device registered as 
%s\n",
+                                         video_device_node_name(vfd));
+       }
+
+       if (dev->has_vbi_cap) {
+               vfd = &dev->vbi_cap_dev;
+               snprintf(vfd->name, sizeof(vfd->name),
+                        "vivid-%03d-vbi-cap", inst);
+               vfd->fops = &vivid_fops;
+               vfd->ioctl_ops = &vivid_ioctl_ops;
+               vfd->device_caps = dev->vbi_cap_caps;
+               vfd->release = video_device_release_empty;
+               vfd->v4l2_dev = &dev->v4l2_dev;
+               vfd->queue = &dev->vb_vbi_cap_q;
+               vfd->lock = &dev->mutex;
+               vfd->tvnorms = tvnorms_cap;
+               video_set_drvdata(vfd, dev);
+
+#ifdef CONFIG_MEDIA_CONTROLLER
+               dev->vbi_cap_pad.flags = MEDIA_PAD_FL_SINK;
+               ret = media_entity_pads_init(&vfd->entity, 1, 
&dev->vbi_cap_pad);
+               if (ret)
+                       return ret;
+#endif
+
+               ret = video_register_device(vfd, VFL_TYPE_VBI, 
vbi_cap_nr[inst]);
+               if (ret < 0)
+                       return ret;
+               v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as 
%s, supports %s VBI\n",
+                                         video_device_node_name(vfd),
+                                         (dev->has_raw_vbi_cap && 
dev->has_sliced_vbi_cap) ?
+                                         "raw and sliced" :
+                                         (dev->has_raw_vbi_cap ? "raw" : 
"sliced"));
+       }
+
+       if (dev->has_vbi_out) {
+               vfd = &dev->vbi_out_dev;
+               snprintf(vfd->name, sizeof(vfd->name),
+                        "vivid-%03d-vbi-out", inst);
+               vfd->vfl_dir = VFL_DIR_TX;
+               vfd->fops = &vivid_fops;
+               vfd->ioctl_ops = &vivid_ioctl_ops;
+               vfd->device_caps = dev->vbi_out_caps;
+               vfd->release = video_device_release_empty;
+               vfd->v4l2_dev = &dev->v4l2_dev;
+               vfd->queue = &dev->vb_vbi_out_q;
+               vfd->lock = &dev->mutex;
+               vfd->tvnorms = tvnorms_out;
+               video_set_drvdata(vfd, dev);
+
+#ifdef CONFIG_MEDIA_CONTROLLER
+               dev->vbi_out_pad.flags = MEDIA_PAD_FL_SOURCE;
+               ret = media_entity_pads_init(&vfd->entity, 1, 
&dev->vbi_out_pad);
+               if (ret)
+                       return ret;
+#endif
+
+               ret = video_register_device(vfd, VFL_TYPE_VBI, 
vbi_out_nr[inst]);
+               if (ret < 0)
+                       return ret;
+               v4l2_info(&dev->v4l2_dev, "V4L2 output device registered as %s, 
supports %s VBI\n",
+                                         video_device_node_name(vfd),
+                                         (dev->has_raw_vbi_out && 
dev->has_sliced_vbi_out) ?
+                                         "raw and sliced" :
+                                         (dev->has_raw_vbi_out ? "raw" : 
"sliced"));
+       }
+
+       if (dev->has_sdr_cap) {
+               vfd = &dev->sdr_cap_dev;
+               snprintf(vfd->name, sizeof(vfd->name),
+                        "vivid-%03d-sdr-cap", inst);
+               vfd->fops = &vivid_fops;
+               vfd->ioctl_ops = &vivid_ioctl_ops;
+               vfd->device_caps = dev->sdr_cap_caps;
+               vfd->release = video_device_release_empty;
+               vfd->v4l2_dev = &dev->v4l2_dev;
+               vfd->queue = &dev->vb_sdr_cap_q;
+               vfd->lock = &dev->mutex;
+               video_set_drvdata(vfd, dev);
+
+#ifdef CONFIG_MEDIA_CONTROLLER
+               dev->sdr_cap_pad.flags = MEDIA_PAD_FL_SINK;
+               ret = media_entity_pads_init(&vfd->entity, 1, 
&dev->sdr_cap_pad);
+               if (ret)
+                       return ret;
+#endif
+
+               ret = video_register_device(vfd, VFL_TYPE_SDR, 
sdr_cap_nr[inst]);
+               if (ret < 0)
+                       return ret;
+               v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as 
%s\n",
+                                         video_device_node_name(vfd));
+       }
+
+       if (dev->has_radio_rx) {
+               vfd = &dev->radio_rx_dev;
+               snprintf(vfd->name, sizeof(vfd->name),
+                        "vivid-%03d-rad-rx", inst);
+               vfd->fops = &vivid_radio_fops;
+               vfd->ioctl_ops = &vivid_ioctl_ops;
+               vfd->device_caps = dev->radio_rx_caps;
+               vfd->release = video_device_release_empty;
+               vfd->v4l2_dev = &dev->v4l2_dev;
+               vfd->lock = &dev->mutex;
+               video_set_drvdata(vfd, dev);
+
+               ret = video_register_device(vfd, VFL_TYPE_RADIO, 
radio_rx_nr[inst]);
+               if (ret < 0)
+                       return ret;
+               v4l2_info(&dev->v4l2_dev, "V4L2 receiver device registered as 
%s\n",
+                                         video_device_node_name(vfd));
+       }
+
+       if (dev->has_radio_tx) {
+               vfd = &dev->radio_tx_dev;
+               snprintf(vfd->name, sizeof(vfd->name),
+                        "vivid-%03d-rad-tx", inst);
+               vfd->vfl_dir = VFL_DIR_TX;
+               vfd->fops = &vivid_radio_fops;
+               vfd->ioctl_ops = &vivid_ioctl_ops;
+               vfd->device_caps = dev->radio_tx_caps;
+               vfd->release = video_device_release_empty;
+               vfd->v4l2_dev = &dev->v4l2_dev;
+               vfd->lock = &dev->mutex;
+               video_set_drvdata(vfd, dev);
+
+               ret = video_register_device(vfd, VFL_TYPE_RADIO, 
radio_tx_nr[inst]);
+               if (ret < 0)
+                       return ret;
+               v4l2_info(&dev->v4l2_dev, "V4L2 transmitter device registered 
as %s\n",
+                                         video_device_node_name(vfd));
+       }
+
+       if (dev->has_meta_cap) {
+               vfd = &dev->meta_cap_dev;
+               snprintf(vfd->name, sizeof(vfd->name),
+                        "vivid-%03d-meta-cap", inst);
+               vfd->fops = &vivid_fops;
+               vfd->ioctl_ops = &vivid_ioctl_ops;
+               vfd->device_caps = dev->meta_cap_caps;
+               vfd->release = video_device_release_empty;
+               vfd->v4l2_dev = &dev->v4l2_dev;
+               vfd->queue = &dev->vb_meta_cap_q;
+               vfd->lock = &dev->mutex;
+               vfd->tvnorms = tvnorms_cap;
+               video_set_drvdata(vfd, dev);
+#ifdef CONFIG_MEDIA_CONTROLLER
+               dev->meta_cap_pad.flags = MEDIA_PAD_FL_SINK;
+               ret = media_entity_pads_init(&vfd->entity, 1,
+                                            &dev->meta_cap_pad);
+               if (ret)
+                       return ret;
+#endif
+               ret = video_register_device(vfd, VFL_TYPE_VIDEO,
+                                           meta_cap_nr[inst]);
+               if (ret < 0)
+                       return ret;
+               v4l2_info(&dev->v4l2_dev,
+                         "V4L2 metadata capture device registered as %s\n",
+                         video_device_node_name(vfd));
+       }
+
+       if (dev->has_meta_out) {
+               vfd = &dev->meta_out_dev;
+               snprintf(vfd->name, sizeof(vfd->name),
+                        "vivid-%03d-meta-out", inst);
+               vfd->vfl_dir = VFL_DIR_TX;
+               vfd->fops = &vivid_fops;
+               vfd->ioctl_ops = &vivid_ioctl_ops;
+               vfd->device_caps = dev->meta_out_caps;
+               vfd->release = video_device_release_empty;
+               vfd->v4l2_dev = &dev->v4l2_dev;
+               vfd->queue = &dev->vb_meta_out_q;
+               vfd->lock = &dev->mutex;
+               vfd->tvnorms = tvnorms_out;
+               video_set_drvdata(vfd, dev);
+#ifdef CONFIG_MEDIA_CONTROLLER
+               dev->meta_out_pad.flags = MEDIA_PAD_FL_SOURCE;
+               ret = media_entity_pads_init(&vfd->entity, 1,
+                                            &dev->meta_out_pad);
+               if (ret)
+                       return ret;
+#endif
+               ret = video_register_device(vfd, VFL_TYPE_VIDEO,
+                                           meta_out_nr[inst]);
+               if (ret < 0)
+                       return ret;
+               v4l2_info(&dev->v4l2_dev,
+                         "V4L2 metadata output device registered as %s\n",
+                         video_device_node_name(vfd));
+       }
+
+       if (dev->has_touch_cap) {
+               vfd = &dev->touch_cap_dev;
+               snprintf(vfd->name, sizeof(vfd->name),
+                        "vivid-%03d-touch-cap", inst);
+               vfd->fops = &vivid_fops;
+               vfd->ioctl_ops = &vivid_ioctl_ops;
+               vfd->device_caps = dev->touch_cap_caps;
+               vfd->release = video_device_release_empty;
+               vfd->v4l2_dev = &dev->v4l2_dev;
+               vfd->queue = &dev->vb_touch_cap_q;
+               vfd->tvnorms = tvnorms_cap;
+               vfd->lock = &dev->mutex;
+               video_set_drvdata(vfd, dev);
+#ifdef CONFIG_MEDIA_CONTROLLER
+               dev->touch_cap_pad.flags = MEDIA_PAD_FL_SINK;
+               ret = media_entity_pads_init(&vfd->entity, 1,
+                                            &dev->touch_cap_pad);
+               if (ret)
+                       return ret;
+#endif
+               ret = video_register_device(vfd, VFL_TYPE_TOUCH,
+                                           touch_cap_nr[inst]);
+               if (ret < 0)
+                       return ret;
+               v4l2_info(&dev->v4l2_dev,
+                         "V4L2 touch capture device registered as %s\n",
+                         video_device_node_name(vfd));
+       }
+
+#ifdef CONFIG_MEDIA_CONTROLLER
+       /* Register the media device */
+       ret = media_device_register(&dev->mdev);
+       if (ret) {
+               dev_err(dev->mdev.dev,
+                       "media device register failed (err=%d)\n", ret);
+               return ret;
+       }
+#endif
+       return 0;
+}
+
 static int vivid_create_instance(struct platform_device *pdev, int inst)
 {
        static const struct v4l2_dv_timings def_dv_timings =
@@ -1317,7 +1657,6 @@ static int vivid_create_instance(struct platform_device 
*pdev, int inst)
        bool has_tuner;
        bool has_modulator;
        struct vivid_dev *dev;
-       struct video_device *vfd;
        unsigned node_type = node_types[inst];
        v4l2_std_id tvnorms_cap = 0, tvnorms_out = 0;
        int ret;
@@ -1545,332 +1884,11 @@ static int vivid_create_instance(struct 
platform_device *pdev, int inst)
        v4l2_ctrl_handler_setup(&dev->ctrl_hdl_touch_cap);
 
        /* finally start creating the device nodes */
-       if (dev->has_vid_cap) {
-               vfd = &dev->vid_cap_dev;
-               snprintf(vfd->name, sizeof(vfd->name),
-                        "vivid-%03d-vid-cap", inst);
-               vfd->fops = &vivid_fops;
-               vfd->ioctl_ops = &vivid_ioctl_ops;
-               vfd->device_caps = dev->vid_cap_caps;
-               vfd->release = video_device_release_empty;
-               vfd->v4l2_dev = &dev->v4l2_dev;
-               vfd->queue = &dev->vb_vid_cap_q;
-               vfd->tvnorms = tvnorms_cap;
-
-               /*
-                * Provide a mutex to v4l2 core. It will be used to protect
-                * all fops and v4l2 ioctls.
-                */
-               vfd->lock = &dev->mutex;
-               video_set_drvdata(vfd, dev);
-
-#ifdef CONFIG_MEDIA_CONTROLLER
-               dev->vid_cap_pad.flags = MEDIA_PAD_FL_SINK;
-               ret = media_entity_pads_init(&vfd->entity, 1, 
&dev->vid_cap_pad);
-               if (ret)
-                       goto unreg_dev;
-#endif
-
-#ifdef CONFIG_VIDEO_VIVID_CEC
-               if (in_type_counter[HDMI]) {
-                       ret = cec_register_adapter(dev->cec_rx_adap, 
&pdev->dev);
-                       if (ret < 0) {
-                               cec_delete_adapter(dev->cec_rx_adap);
-                               dev->cec_rx_adap = NULL;
-                               goto unreg_dev;
-                       }
-                       cec_s_phys_addr(dev->cec_rx_adap, 0, false);
-                       v4l2_info(&dev->v4l2_dev, "CEC adapter %s registered 
for HDMI input 0\n",
-                                 dev_name(&dev->cec_rx_adap->devnode.dev));
-               }
-#endif
-
-               ret = video_register_device(vfd, VFL_TYPE_VIDEO, 
vid_cap_nr[inst]);
-               if (ret < 0)
-                       goto unreg_dev;
-               v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as 
%s\n",
-                                         video_device_node_name(vfd));
-       }
-
-       if (dev->has_vid_out) {
-               vfd = &dev->vid_out_dev;
-               snprintf(vfd->name, sizeof(vfd->name),
-                        "vivid-%03d-vid-out", inst);
-               vfd->vfl_dir = VFL_DIR_TX;
-               vfd->fops = &vivid_fops;
-               vfd->ioctl_ops = &vivid_ioctl_ops;
-               vfd->device_caps = dev->vid_out_caps;
-               vfd->release = video_device_release_empty;
-               vfd->v4l2_dev = &dev->v4l2_dev;
-               vfd->queue = &dev->vb_vid_out_q;
-               vfd->tvnorms = tvnorms_out;
-
-               /*
-                * Provide a mutex to v4l2 core. It will be used to protect
-                * all fops and v4l2 ioctls.
-                */
-               vfd->lock = &dev->mutex;
-               video_set_drvdata(vfd, dev);
-
-#ifdef CONFIG_MEDIA_CONTROLLER
-               dev->vid_out_pad.flags = MEDIA_PAD_FL_SOURCE;
-               ret = media_entity_pads_init(&vfd->entity, 1, 
&dev->vid_out_pad);
-               if (ret)
-                       goto unreg_dev;
-#endif
-
-#ifdef CONFIG_VIDEO_VIVID_CEC
-               for (i = 0; i < cec_tx_bus_cnt; i++) {
-                       ret = cec_register_adapter(dev->cec_tx_adap[i], 
&pdev->dev);
-                       if (ret < 0) {
-                               for (; i < cec_tx_bus_cnt; i++) {
-                                       cec_delete_adapter(dev->cec_tx_adap[i]);
-                                       dev->cec_tx_adap[i] = NULL;
-                               }
-                               goto unreg_dev;
-                       }
-                       v4l2_info(&dev->v4l2_dev, "CEC adapter %s registered 
for HDMI output %d\n",
-                                 dev_name(&dev->cec_tx_adap[i]->devnode.dev), 
i);
-                       if (i < out_type_counter[HDMI])
-                               cec_s_phys_addr(dev->cec_tx_adap[i], (i + 1) << 
12, false);
-                       else
-                               cec_s_phys_addr(dev->cec_tx_adap[i], 0x1000, 
false);
-               }
-#endif
-
-               ret = video_register_device(vfd, VFL_TYPE_VIDEO, 
vid_out_nr[inst]);
-               if (ret < 0)
-                       goto unreg_dev;
-               v4l2_info(&dev->v4l2_dev, "V4L2 output device registered as 
%s\n",
-                                         video_device_node_name(vfd));
-       }
-
-       if (dev->has_vbi_cap) {
-               vfd = &dev->vbi_cap_dev;
-               snprintf(vfd->name, sizeof(vfd->name),
-                        "vivid-%03d-vbi-cap", inst);
-               vfd->fops = &vivid_fops;
-               vfd->ioctl_ops = &vivid_ioctl_ops;
-               vfd->device_caps = dev->vbi_cap_caps;
-               vfd->release = video_device_release_empty;
-               vfd->v4l2_dev = &dev->v4l2_dev;
-               vfd->queue = &dev->vb_vbi_cap_q;
-               vfd->lock = &dev->mutex;
-               vfd->tvnorms = tvnorms_cap;
-               video_set_drvdata(vfd, dev);
-
-#ifdef CONFIG_MEDIA_CONTROLLER
-               dev->vbi_cap_pad.flags = MEDIA_PAD_FL_SINK;
-               ret = media_entity_pads_init(&vfd->entity, 1, 
&dev->vbi_cap_pad);
-               if (ret)
-                       goto unreg_dev;
-#endif
-
-               ret = video_register_device(vfd, VFL_TYPE_VBI, 
vbi_cap_nr[inst]);
-               if (ret < 0)
-                       goto unreg_dev;
-               v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as 
%s, supports %s VBI\n",
-                                         video_device_node_name(vfd),
-                                         (dev->has_raw_vbi_cap && 
dev->has_sliced_vbi_cap) ?
-                                         "raw and sliced" :
-                                         (dev->has_raw_vbi_cap ? "raw" : 
"sliced"));
-       }
-
-       if (dev->has_vbi_out) {
-               vfd = &dev->vbi_out_dev;
-               snprintf(vfd->name, sizeof(vfd->name),
-                        "vivid-%03d-vbi-out", inst);
-               vfd->vfl_dir = VFL_DIR_TX;
-               vfd->fops = &vivid_fops;
-               vfd->ioctl_ops = &vivid_ioctl_ops;
-               vfd->device_caps = dev->vbi_out_caps;
-               vfd->release = video_device_release_empty;
-               vfd->v4l2_dev = &dev->v4l2_dev;
-               vfd->queue = &dev->vb_vbi_out_q;
-               vfd->lock = &dev->mutex;
-               vfd->tvnorms = tvnorms_out;
-               video_set_drvdata(vfd, dev);
-
-#ifdef CONFIG_MEDIA_CONTROLLER
-               dev->vbi_out_pad.flags = MEDIA_PAD_FL_SOURCE;
-               ret = media_entity_pads_init(&vfd->entity, 1, 
&dev->vbi_out_pad);
-               if (ret)
-                       goto unreg_dev;
-#endif
-
-               ret = video_register_device(vfd, VFL_TYPE_VBI, 
vbi_out_nr[inst]);
-               if (ret < 0)
-                       goto unreg_dev;
-               v4l2_info(&dev->v4l2_dev, "V4L2 output device registered as %s, 
supports %s VBI\n",
-                                         video_device_node_name(vfd),
-                                         (dev->has_raw_vbi_out && 
dev->has_sliced_vbi_out) ?
-                                         "raw and sliced" :
-                                         (dev->has_raw_vbi_out ? "raw" : 
"sliced"));
-       }
-
-       if (dev->has_sdr_cap) {
-               vfd = &dev->sdr_cap_dev;
-               snprintf(vfd->name, sizeof(vfd->name),
-                        "vivid-%03d-sdr-cap", inst);
-               vfd->fops = &vivid_fops;
-               vfd->ioctl_ops = &vivid_ioctl_ops;
-               vfd->device_caps = dev->sdr_cap_caps;
-               vfd->release = video_device_release_empty;
-               vfd->v4l2_dev = &dev->v4l2_dev;
-               vfd->queue = &dev->vb_sdr_cap_q;
-               vfd->lock = &dev->mutex;
-               video_set_drvdata(vfd, dev);
-
-#ifdef CONFIG_MEDIA_CONTROLLER
-               dev->sdr_cap_pad.flags = MEDIA_PAD_FL_SINK;
-               ret = media_entity_pads_init(&vfd->entity, 1, 
&dev->sdr_cap_pad);
-               if (ret)
-                       goto unreg_dev;
-#endif
-
-               ret = video_register_device(vfd, VFL_TYPE_SDR, 
sdr_cap_nr[inst]);
-               if (ret < 0)
-                       goto unreg_dev;
-               v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as 
%s\n",
-                                         video_device_node_name(vfd));
-       }
-
-       if (dev->has_radio_rx) {
-               vfd = &dev->radio_rx_dev;
-               snprintf(vfd->name, sizeof(vfd->name),
-                        "vivid-%03d-rad-rx", inst);
-               vfd->fops = &vivid_radio_fops;
-               vfd->ioctl_ops = &vivid_ioctl_ops;
-               vfd->device_caps = dev->radio_rx_caps;
-               vfd->release = video_device_release_empty;
-               vfd->v4l2_dev = &dev->v4l2_dev;
-               vfd->lock = &dev->mutex;
-               video_set_drvdata(vfd, dev);
-
-               ret = video_register_device(vfd, VFL_TYPE_RADIO, 
radio_rx_nr[inst]);
-               if (ret < 0)
-                       goto unreg_dev;
-               v4l2_info(&dev->v4l2_dev, "V4L2 receiver device registered as 
%s\n",
-                                         video_device_node_name(vfd));
-       }
-
-       if (dev->has_radio_tx) {
-               vfd = &dev->radio_tx_dev;
-               snprintf(vfd->name, sizeof(vfd->name),
-                        "vivid-%03d-rad-tx", inst);
-               vfd->vfl_dir = VFL_DIR_TX;
-               vfd->fops = &vivid_radio_fops;
-               vfd->ioctl_ops = &vivid_ioctl_ops;
-               vfd->device_caps = dev->radio_tx_caps;
-               vfd->release = video_device_release_empty;
-               vfd->v4l2_dev = &dev->v4l2_dev;
-               vfd->lock = &dev->mutex;
-               video_set_drvdata(vfd, dev);
-
-               ret = video_register_device(vfd, VFL_TYPE_RADIO, 
radio_tx_nr[inst]);
-               if (ret < 0)
-                       goto unreg_dev;
-               v4l2_info(&dev->v4l2_dev, "V4L2 transmitter device registered 
as %s\n",
-                                         video_device_node_name(vfd));
-       }
-
-       if (dev->has_meta_cap) {
-               vfd = &dev->meta_cap_dev;
-               snprintf(vfd->name, sizeof(vfd->name),
-                        "vivid-%03d-meta-cap", inst);
-               vfd->fops = &vivid_fops;
-               vfd->ioctl_ops = &vivid_ioctl_ops;
-               vfd->device_caps = dev->meta_cap_caps;
-               vfd->release = video_device_release_empty;
-               vfd->v4l2_dev = &dev->v4l2_dev;
-               vfd->queue = &dev->vb_meta_cap_q;
-               vfd->lock = &dev->mutex;
-               vfd->tvnorms = tvnorms_cap;
-               video_set_drvdata(vfd, dev);
-#ifdef CONFIG_MEDIA_CONTROLLER
-               dev->meta_cap_pad.flags = MEDIA_PAD_FL_SINK;
-               ret = media_entity_pads_init(&vfd->entity, 1,
-                                            &dev->meta_cap_pad);
-               if (ret)
-                       goto unreg_dev;
-#endif
-               ret = video_register_device(vfd, VFL_TYPE_VIDEO,
-                                           meta_cap_nr[inst]);
-               if (ret < 0)
-                       goto unreg_dev;
-               v4l2_info(&dev->v4l2_dev,
-                         "V4L2 metadata capture device registered as %s\n",
-                         video_device_node_name(vfd));
-       }
-
-       if (dev->has_meta_out) {
-               vfd = &dev->meta_out_dev;
-               snprintf(vfd->name, sizeof(vfd->name),
-                        "vivid-%03d-meta-out", inst);
-               vfd->vfl_dir = VFL_DIR_TX;
-               vfd->fops = &vivid_fops;
-               vfd->ioctl_ops = &vivid_ioctl_ops;
-               vfd->device_caps = dev->meta_out_caps;
-               vfd->release = video_device_release_empty;
-               vfd->v4l2_dev = &dev->v4l2_dev;
-               vfd->queue = &dev->vb_meta_out_q;
-               vfd->lock = &dev->mutex;
-               vfd->tvnorms = tvnorms_out;
-               video_set_drvdata(vfd, dev);
-#ifdef CONFIG_MEDIA_CONTROLLER
-               dev->meta_out_pad.flags = MEDIA_PAD_FL_SOURCE;
-               ret = media_entity_pads_init(&vfd->entity, 1,
-                                            &dev->meta_out_pad);
-               if (ret)
-                       goto unreg_dev;
-#endif
-               ret = video_register_device(vfd, VFL_TYPE_VIDEO,
-                                           meta_out_nr[inst]);
-               if (ret < 0)
-                       goto unreg_dev;
-               v4l2_info(&dev->v4l2_dev,
-                         "V4L2 metadata output device registered as %s\n",
-                         video_device_node_name(vfd));
-       }
-
-       if (dev->has_touch_cap) {
-               vfd = &dev->touch_cap_dev;
-               snprintf(vfd->name, sizeof(vfd->name),
-                        "vivid-%03d-touch-cap", inst);
-               vfd->fops = &vivid_fops;
-               vfd->ioctl_ops = &vivid_ioctl_ops;
-               vfd->device_caps = dev->touch_cap_caps;
-               vfd->release = video_device_release_empty;
-               vfd->v4l2_dev = &dev->v4l2_dev;
-               vfd->queue = &dev->vb_touch_cap_q;
-               vfd->tvnorms = tvnorms_cap;
-               vfd->lock = &dev->mutex;
-               video_set_drvdata(vfd, dev);
-#ifdef CONFIG_MEDIA_CONTROLLER
-               dev->touch_cap_pad.flags = MEDIA_PAD_FL_SINK;
-               ret = media_entity_pads_init(&vfd->entity, 1,
-                                            &dev->touch_cap_pad);
-               if (ret)
-                       goto unreg_dev;
-#endif
-               ret = video_register_device(vfd, VFL_TYPE_TOUCH,
-                                           touch_cap_nr[inst]);
-               if (ret < 0)
-                       goto unreg_dev;
-               v4l2_info(&dev->v4l2_dev,
-                         "V4L2 touch capture device registered as %s\n",
-                         video_device_node_name(vfd));
-       }
-
-#ifdef CONFIG_MEDIA_CONTROLLER
-       /* Register the media device */
-       ret = media_device_register(&dev->mdev);
-       if (ret) {
-               dev_err(dev->mdev.dev,
-                       "media device register failed (err=%d)\n", ret);
+       ret = vivid_create_devnodes(pdev, dev, inst, cec_tx_bus_cnt,
+                                   tvnorms_cap, tvnorms_out,
+                                   in_type_counter, out_type_counter);
+       if (ret)
                goto unreg_dev;
-       }
-#endif
 
        /* Now that everything is fine, let's add it to device list */
        vivid_devs[inst] = dev;
-- 
2.26.2

Reply via email to