V4L/DVB (7616): em28xx-dvb: Properly selects digital mode at the right place
authorMauro Carvalho Chehab <mchehab@infradead.org>
Fri, 18 Apr 2008 00:49:20 +0000 (21:49 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Thu, 24 Apr 2008 17:09:42 +0000 (14:09 -0300)
The driver should be switched to digital mode, when trying to access the
frontend or when streaming.

This patch provides the correct code to support this feature.

Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/video/em28xx/em28xx-dvb.c

index 2e9ec626b60957b2d85743267a949637a87b1261..7df81575b7f242c23937f7dbe71afb0fb5019a3c 100644 (file)
@@ -201,6 +201,18 @@ static int stop_feed(struct dvb_demux_feed *feed)
 }
 
 
+
+/* ------------------------------------------------------------------ */
+static int em28xx_dvb_bus_ctrl(struct dvb_frontend *fe, int acquire)
+{
+       struct em28xx *dev = fe->dvb->priv;
+
+       if (acquire)
+               return em28xx_set_mode(dev, EM28XX_DIGITAL_MODE);
+       else
+               return em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
+}
+
 /* ------------------------------------------------------------------ */
 
 static struct lgdt330x_config em2880_lgdt3303_dev = {
@@ -268,6 +280,10 @@ int register_dvb(struct em28xx_dvb *dvb,
                       dev->name, result);
                goto fail_adapter;
        }
+
+       /* Ensure all frontends negotiate bus access */
+       dvb->frontend->ops.ts_bus_ctrl = em28xx_dvb_bus_ctrl;
+
        dvb->adapter.priv = dev;
 
        /* register frontend */
@@ -287,6 +303,7 @@ int register_dvb(struct em28xx_dvb *dvb,
        dvb->demux.feednum    = 256;
        dvb->demux.start_feed = start_feed;
        dvb->demux.stop_feed  = stop_feed;
+
        result = dvb_dmx_init(&dvb->demux);
        if (result < 0) {
                printk(KERN_WARNING "%s: dvb_dmx_init failed (errno = %d)\n",