aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/cx88
diff options
context:
space:
mode:
authorDarron Broad <darron@kewl.org>2008-10-11 10:44:05 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2008-10-17 16:24:15 -0400
commit59b1842da1c6f33ad2e8da82d3dfb3445751d964 (patch)
tree9a57bcf44df5d76ad845995dcfd5f49e20c68240 /drivers/media/video/cx88
parent2f3af9e64de44743a860fd1eee966222a7accc54 (diff)
V4L/DVB (9227): MFE: Add multi-frontend mutual exclusion
This add frontend R/W mutual exclusion. Prior to this point in time it was possible to open both frontends simultaneously which an MFE card cannot support. In order to stop this, a delayed open is performed which has the following function: - Return EBUSY after a configurable amount of time if a frontend is unavailable due to the other being in use. - Only allow opening of a frontend if the kernel thread of the other has stopped. This solution was chosen to allow switching between frontends to work as seamlessly as possible. When both frontends are actually opened simultaneously then one will only open, but if quick switching is performed between one of many then the new open will succeed in a clean fashion rather than interrupting a kernel thread. Signed-off-by: Darron Broad <darron@kewl.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/cx88')
-rw-r--r--drivers/media/video/cx88/cx88-dvb.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/drivers/media/video/cx88/cx88-dvb.c b/drivers/media/video/cx88/cx88-dvb.c
index 9bb7bee0da6..0dd0ff9227f 100644
--- a/drivers/media/video/cx88/cx88-dvb.c
+++ b/drivers/media/video/cx88/cx88-dvb.c
@@ -594,14 +594,9 @@ static struct stv0288_config tevii_tuner_earda_config = {
594 594
595static int dvb_register(struct cx8802_dev *dev) 595static int dvb_register(struct cx8802_dev *dev)
596{ 596{
597 //struct cx88_core *core = dev->core;
598
599 ///* init struct videobuf_dvb */
600 //fe->dvb.name = core->name;
601 //dev->ts_gen_cntrl = 0x0c;
602
603 struct cx88_core *core = dev->core; 597 struct cx88_core *core = dev->core;
604 struct videobuf_dvb_frontend *fe0, *fe1 = NULL; 598 struct videobuf_dvb_frontend *fe0, *fe1 = NULL;
599 int mfe_shared = 0; /* bus not shared by default */
605 600
606 /* Get the first frontend */ 601 /* Get the first frontend */
607 fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1); 602 fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
@@ -669,6 +664,7 @@ static int dvb_register(struct cx8802_dev *dev)
669 fe1 = videobuf_dvb_get_frontend(&dev->frontends, 2); 664 fe1 = videobuf_dvb_get_frontend(&dev->frontends, 2);
670 if (fe1) { 665 if (fe1) {
671 dev->frontends.gate = 2; 666 dev->frontends.gate = 2;
667 mfe_shared = 1;
672 fe1->dvb.frontend = dvb_attach(cx22702_attach, 668 fe1->dvb.frontend = dvb_attach(cx22702_attach,
673 &hauppauge_hvr_config, 669 &hauppauge_hvr_config,
674 &dev->core->i2c_adap); 670 &dev->core->i2c_adap);
@@ -1013,6 +1009,7 @@ static int dvb_register(struct cx8802_dev *dev)
1013 fe1 = videobuf_dvb_get_frontend(&dev->frontends, 2); 1009 fe1 = videobuf_dvb_get_frontend(&dev->frontends, 2);
1014 if (fe1) { 1010 if (fe1) {
1015 dev->frontends.gate = 2; 1011 dev->frontends.gate = 2;
1012 mfe_shared = 1;
1016 fe1->dvb.frontend = dvb_attach(cx22702_attach, 1013 fe1->dvb.frontend = dvb_attach(cx22702_attach,
1017 &hauppauge_hvr_config, 1014 &hauppauge_hvr_config,
1018 &dev->core->i2c_adap); 1015 &dev->core->i2c_adap);
@@ -1110,7 +1107,7 @@ static int dvb_register(struct cx8802_dev *dev)
1110 1107
1111 /* register everything */ 1108 /* register everything */
1112 return videobuf_dvb_register_bus(&dev->frontends, THIS_MODULE, dev, 1109 return videobuf_dvb_register_bus(&dev->frontends, THIS_MODULE, dev,
1113 &dev->pci->dev, adapter_nr); 1110 &dev->pci->dev, adapter_nr, mfe_shared);
1114 1111
1115frontend_detach: 1112frontend_detach:
1116 if (fe0->dvb.frontend) { 1113 if (fe0->dvb.frontend) {