V4L/DVB (9271): videobuf: data storage optimisation (2)
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / cx88 / cx88-mpeg.c
index a6b061c2644a7d72446a0a79713180c64e3d6c8d..6df5cf31418627025e16752fdecbab998040a7ed 100644 (file)
@@ -768,7 +768,8 @@ static int __devinit cx8802_probe(struct pci_dev *pci_dev,
 {
        struct cx8802_dev *dev;
        struct cx88_core  *core;
-       int err;
+       struct videobuf_dvb_frontend *demod;
+       int err,i;
 
        /* general setup */
        core = cx88_core_get(pci_dev);
@@ -781,6 +782,11 @@ static int __devinit cx8802_probe(struct pci_dev *pci_dev,
        if (!core->board.mpeg)
                goto fail_core;
 
+       if (!core->board.num_frontends) {
+               printk(KERN_ERR "%s() .num_frontends should be non-zero, err = %d\n", __func__, err);
+               goto fail_core;
+       }
+
        err = -ENOMEM;
        dev = kzalloc(sizeof(*dev),GFP_KERNEL);
        if (NULL == dev)
@@ -795,6 +801,20 @@ static int __devinit cx8802_probe(struct pci_dev *pci_dev,
        INIT_LIST_HEAD(&dev->drvlist);
        list_add_tail(&dev->devlist,&cx8802_devlist);
 
+       mutex_init(&dev->frontends.lock);
+       INIT_LIST_HEAD(&dev->frontends.felist);
+
+       printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__, core->board.num_frontends);
+
+       for (i = 1; i <= core->board.num_frontends; i++) {
+               demod = videobuf_dvb_alloc_frontend(&dev->frontends, i);
+               if(demod == NULL) {
+                       printk(KERN_ERR "%s() failed to alloc\n", __func__);
+                       err = -ENOMEM;
+                       goto fail_free;
+               }
+       }
+
        /* Maintain a reference so cx88-video can query the 8802 device. */
        core->dvbdev = dev;