aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/cx88/cx88-mpeg.c
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2009-01-06 14:06:07 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-01-07 19:18:56 -0500
commite32fadc4c2e5975a8e40541e2ba72a7032ed4cf4 (patch)
tree7718a6d3d28f6e70d8c51e8ef0eef72022935c19 /drivers/media/video/cx88/cx88-mpeg.c
parent571d864c68d429a82fd61e97404a2de210ffc72d (diff)
V4L/DVB (10190): cx88: Fix some Kbuild troubles
As Randy Dunlap <randy.dunlap@oracle.com> reported, cx88 has some compilation issues: drivers/built-in.o: In function `cx88_call_i2c_clients': (.text+0x20af17): undefined reference to `videobuf_dvb_get_frontend' drivers/built-in.o: In function `cx8802_probe': cx88-mpeg.c:(.devinit.text+0x268c4): undefined reference to `videobuf_dvb_alloc_frontend' cx88-mpeg.c:(.devinit.text+0x268ea): undefined reference to `videobuf_dvb_dealloc_frontends' With those configs: CONFIG_VIDEO_CX88=y CONFIG_VIDEO_CX88_BLACKBIRD=y CONFIG_VIDEO_CX88_DVB=m CONFIG_DVB_CORE=m After carefully examining the code, with the current code, several cx88 drivers (cx8800, cx8802, cx88_dvb and cx88_blackbird) should be compiled as a module, if one of them is marked as such. Just fixing Kconfig could create a very complex set of rules. Also, this hides a problem with the current approach where the dvb functionality weren't confined inside dvb module. What happens is that: - cx88-i2c (part of cx8800) has some special rules if DVB; - cx88-mpeg (cx8802 module) has also part of DVB init code; - cx88-dvb has the rest of the dvb code; - cx88-blackbird can be used with cx88-mpeg, having cx88-dvb or not. So, instead of doing some tricks at Kconfig and wait for a next breakage, this patch moves the dvb code inside cx88-i2c and cx88-mpeg into cx88-dvb. Another problem is that cx8802 were being compiled, even without cx88-dvb and cx88-blackbird modules. While on this code, let's fix also a reported problem: http://www.linuxtv.org/pipermail/linux-dvb/2009-January/031225.html A solution for the issue were proposed here: http://www.mail-archive.com/linux-media@vger.kernel.org/msg00021.html Thanks to Randy, Andy, Gregoire and Thomas for helping us to detect and solve the issues. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/cx88/cx88-mpeg.c')
-rw-r--r--drivers/media/video/cx88/cx88-mpeg.c30
1 files changed, 4 insertions, 26 deletions
diff --git a/drivers/media/video/cx88/cx88-mpeg.c b/drivers/media/video/cx88/cx88-mpeg.c
index 59164fc94f5f..b295b76737e3 100644
--- a/drivers/media/video/cx88/cx88-mpeg.c
+++ b/drivers/media/video/cx88/cx88-mpeg.c
@@ -787,6 +787,9 @@ static int __devinit cx8802_probe(struct pci_dev *pci_dev,
787 dev->pci = pci_dev; 787 dev->pci = pci_dev;
788 dev->core = core; 788 dev->core = core;
789 789
790 /* Maintain a reference so cx88-video can query the 8802 device. */
791 core->dvbdev = dev;
792
790 err = cx8802_init_common(dev); 793 err = cx8802_init_common(dev);
791 if (err != 0) 794 if (err != 0)
792 goto fail_free; 795 goto fail_free;
@@ -794,32 +797,6 @@ static int __devinit cx8802_probe(struct pci_dev *pci_dev,
794 INIT_LIST_HEAD(&dev->drvlist); 797 INIT_LIST_HEAD(&dev->drvlist);
795 list_add_tail(&dev->devlist,&cx8802_devlist); 798 list_add_tail(&dev->devlist,&cx8802_devlist);
796 799
797#if defined(CONFIG_VIDEO_CX88_DVB) || defined(CONFIG_VIDEO_CX88_DVB_MODULE)
798 mutex_init(&dev->frontends.lock);
799 INIT_LIST_HEAD(&dev->frontends.felist);
800
801 if (core->board.num_frontends) {
802 struct videobuf_dvb_frontend *fe;
803 int i;
804
805 printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
806 core->board.num_frontends);
807 for (i = 1; i <= core->board.num_frontends; i++) {
808 fe = videobuf_dvb_alloc_frontend(&dev->frontends, i);
809 if(fe == NULL) {
810 printk(KERN_ERR "%s() failed to alloc\n",
811 __func__);
812 videobuf_dvb_dealloc_frontends(&dev->frontends);
813 err = -ENOMEM;
814 goto fail_free;
815 }
816 }
817 }
818#endif
819
820 /* Maintain a reference so cx88-video can query the 8802 device. */
821 core->dvbdev = dev;
822
823 /* now autoload cx88-dvb or cx88-blackbird */ 800 /* now autoload cx88-dvb or cx88-blackbird */
824 request_modules(dev); 801 request_modules(dev);
825 return 0; 802 return 0;
@@ -827,6 +804,7 @@ static int __devinit cx8802_probe(struct pci_dev *pci_dev,
827 fail_free: 804 fail_free:
828 kfree(dev); 805 kfree(dev);
829 fail_core: 806 fail_core:
807 core->dvbdev = NULL;
830 cx88_core_put(core,pci_dev); 808 cx88_core_put(core,pci_dev);
831 return err; 809 return err;
832} 810}