V4L/DVB: ngene: start separating out DVB functions into separate file
authorDevin Heitmueller <dheitmueller@kernellabs.com>
Sun, 14 Mar 2010 02:10:13 +0000 (23:10 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 19 May 2010 15:59:09 +0000 (12:59 -0300)
Start moving the dvb specific code to ngene-dvb.c.  Note that there is still
stuff in ngene-core.c which could potentially be moved out, but it will require
considerable reworking of the logic in order to continue to properly support
DVB while also being able to support transport streams coming from analog MPEG
encoders.

Signed-off-by: Devin Heitmueller <dheitmueller@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/ngene/Makefile
drivers/media/dvb/ngene/ngene-core.c
drivers/media/dvb/ngene/ngene-dvb.c [new file with mode: 0644]
drivers/media/dvb/ngene/ngene.h

index f01c4a1627d313a9d7d5d9498056b5d256798512..0608aabb14eeab3b4a883bf0d2330d0063701cf3 100644 (file)
@@ -2,7 +2,7 @@
 # Makefile for the nGene device driver
 #
 
-ngene-objs := ngene-core.o ngene-i2c.o ngene-cards.o
+ngene-objs := ngene-core.o ngene-i2c.o ngene-cards.o ngene-dvb.o
 
 obj-$(CONFIG_DVB_NGENE) += ngene.o
 
index 8a64f644192afd17ebeabc81e2dbc9838c28fbac..c8b4dfa0ab5f07f5df9ad6906730b618c2344426 100644 (file)
@@ -503,7 +503,7 @@ static u8 ITUFeatureDecoderSetup[8] = {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x04, 0x00
 };
 
-static void FillTSBuffer(void *Buffer, int Length, u32 Flags)
+void FillTSBuffer(void *Buffer, int Length, u32 Flags)
 {
        u32 *ptr = Buffer;
 
@@ -716,62 +716,7 @@ static int ngene_command_stream_control(struct ngene *dev, u8 stream,
        return 0;
 }
 
-
-/****************************************************************************/
-/* EEPROM TAGS **************************************************************/
-/****************************************************************************/
-
-/****************************************************************************/
-/* DVB functions and API interface ******************************************/
-/****************************************************************************/
-
-static void swap_buffer(u32 *p, u32 len)
-{
-       while (len) {
-               *p = swab32(*p);
-               p++;
-               len -= 4;
-       }
-}
-
-
-static void *tsin_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags)
-{
-       struct ngene_channel *chan = priv;
-
-
-#ifdef COMMAND_TIMEOUT_WORKAROUND
-       if (chan->users > 0)
-#endif
-               dvb_dmx_swfilter(&chan->demux, buf, len);
-       return NULL;
-}
-
-u8 fill_ts[188] = { 0x47, 0x1f, 0xff, 0x10 };
-
-static void *tsout_exchange(void *priv, void *buf, u32 len,
-                           u32 clock, u32 flags)
-{
-       struct ngene_channel *chan = priv;
-       struct ngene *dev = chan->dev;
-       u32 alen;
-
-       alen = dvb_ringbuffer_avail(&dev->tsout_rbuf);
-       alen -= alen % 188;
-
-       if (alen < len)
-               FillTSBuffer(buf + alen, len - alen, flags);
-       else
-               alen = len;
-       dvb_ringbuffer_read(&dev->tsout_rbuf, buf, alen);
-       if (flags & DF_SWAP32)
-               swap_buffer((u32 *)buf, alen);
-       wake_up_interruptible(&dev->tsout_rbuf.queue);
-       return buf;
-}
-
-
-static void set_transfer(struct ngene_channel *chan, int state)
+void set_transfer(struct ngene_channel *chan, int state)
 {
        u8 control = 0, mode = 0, flags = 0;
        struct ngene *dev = chan->dev;
@@ -838,77 +783,6 @@ static void set_transfer(struct ngene_channel *chan, int state)
        }
 }
 
-static int ngene_start_feed(struct dvb_demux_feed *dvbdmxfeed)
-{
-       struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
-       struct ngene_channel *chan = dvbdmx->priv;
-
-       if (chan->users == 0) {
-#ifdef COMMAND_TIMEOUT_WORKAROUND
-               if (!chan->running)
-#endif
-                       set_transfer(chan, 1);
-               /* msleep(10); */
-       }
-
-       return ++chan->users;
-}
-
-static int ngene_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
-{
-       struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
-       struct ngene_channel *chan = dvbdmx->priv;
-
-       if (--chan->users)
-               return chan->users;
-
-#ifndef COMMAND_TIMEOUT_WORKAROUND
-       set_transfer(chan, 0);
-#endif
-
-       return 0;
-}
-
-static int my_dvb_dmx_ts_card_init(struct dvb_demux *dvbdemux, char *id,
-                                  int (*start_feed)(struct dvb_demux_feed *),
-                                  int (*stop_feed)(struct dvb_demux_feed *),
-                                  void *priv)
-{
-       dvbdemux->priv = priv;
-
-       dvbdemux->filternum = 256;
-       dvbdemux->feednum = 256;
-       dvbdemux->start_feed = start_feed;
-       dvbdemux->stop_feed = stop_feed;
-       dvbdemux->write_to_decoder = NULL;
-       dvbdemux->dmx.capabilities = (DMX_TS_FILTERING |
-                                     DMX_SECTION_FILTERING |
-                                     DMX_MEMORY_BASED_FILTERING);
-       return dvb_dmx_init(dvbdemux);
-}
-
-static int my_dvb_dmxdev_ts_card_init(struct dmxdev *dmxdev,
-                                     struct dvb_demux *dvbdemux,
-                                     struct dmx_frontend *hw_frontend,
-                                     struct dmx_frontend *mem_frontend,
-                                     struct dvb_adapter *dvb_adapter)
-{
-       int ret;
-
-       dmxdev->filternum = 256;
-       dmxdev->demux = &dvbdemux->dmx;
-       dmxdev->capabilities = 0;
-       ret = dvb_dmxdev_init(dmxdev, dvb_adapter);
-       if (ret < 0)
-               return ret;
-
-       hw_frontend->source = DMX_FRONTEND_0;
-       dvbdemux->dmx.add_frontend(&dvbdemux->dmx, hw_frontend);
-       mem_frontend->source = DMX_MEMORY_FE;
-       dvbdemux->dmx.add_frontend(&dvbdemux->dmx, mem_frontend);
-       return dvbdemux->dmx.connect_frontend(&dvbdemux->dmx, hw_frontend);
-}
-
 
 /****************************************************************************/
 /* nGene hardware init and release functions ********************************/
diff --git a/drivers/media/dvb/ngene/ngene-dvb.c b/drivers/media/dvb/ngene/ngene-dvb.c
new file mode 100644 (file)
index 0000000..96013eb
--- /dev/null
@@ -0,0 +1,172 @@
+/*
+ * ngene-dvb.c: nGene PCIe bridge driver - DVB functions
+ *
+ * Copyright (C) 2005-2007 Micronas
+ *
+ * Copyright (C) 2008-2009 Ralph Metzler <rjkm@metzlerbros.de>
+ *                         Modifications for new nGene firmware,
+ *                         support for EEPROM-copying,
+ *                         support for new dual DVB-S2 card prototype
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 only, as published by the Free Software Foundation.
+ *
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA
+ * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/poll.h>
+#include <linux/io.h>
+#include <asm/div64.h>
+#include <linux/pci.h>
+#include <linux/smp_lock.h>
+#include <linux/timer.h>
+#include <linux/version.h>
+#include <linux/byteorder/generic.h>
+#include <linux/firmware.h>
+#include <linux/vmalloc.h>
+
+#include "ngene.h"
+
+#define COMMAND_TIMEOUT_WORKAROUND
+
+
+/****************************************************************************/
+/* COMMAND API interface ****************************************************/
+/****************************************************************************/
+
+/****************************************************************************/
+/* DVB functions and API interface ******************************************/
+/****************************************************************************/
+
+static void swap_buffer(u32 *p, u32 len)
+{
+       while (len) {
+               *p = swab32(*p);
+               p++;
+               len -= 4;
+       }
+}
+
+void *tsin_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags)
+{
+       struct ngene_channel *chan = priv;
+
+
+#ifdef COMMAND_TIMEOUT_WORKAROUND
+       if (chan->users > 0)
+#endif
+               dvb_dmx_swfilter(&chan->demux, buf, len);
+       return NULL;
+}
+
+u8 fill_ts[188] = { 0x47, 0x1f, 0xff, 0x10 };
+
+void *tsout_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags)
+{
+       struct ngene_channel *chan = priv;
+       struct ngene *dev = chan->dev;
+       u32 alen;
+
+       alen = dvb_ringbuffer_avail(&dev->tsout_rbuf);
+       alen -= alen % 188;
+
+       if (alen < len)
+               FillTSBuffer(buf + alen, len - alen, flags);
+       else
+               alen = len;
+       dvb_ringbuffer_read(&dev->tsout_rbuf, buf, alen);
+       if (flags & DF_SWAP32)
+               swap_buffer((u32 *)buf, alen);
+       wake_up_interruptible(&dev->tsout_rbuf.queue);
+       return buf;
+}
+
+
+
+int ngene_start_feed(struct dvb_demux_feed *dvbdmxfeed)
+{
+       struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
+       struct ngene_channel *chan = dvbdmx->priv;
+
+       if (chan->users == 0) {
+#ifdef COMMAND_TIMEOUT_WORKAROUND
+               if (!chan->running)
+#endif
+                       set_transfer(chan, 1);
+               /* msleep(10); */
+       }
+
+       return ++chan->users;
+}
+
+int ngene_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
+{
+       struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
+       struct ngene_channel *chan = dvbdmx->priv;
+
+       if (--chan->users)
+               return chan->users;
+
+#ifndef COMMAND_TIMEOUT_WORKAROUND
+       set_transfer(chan, 0);
+#endif
+
+       return 0;
+}
+
+int my_dvb_dmx_ts_card_init(struct dvb_demux *dvbdemux, char *id,
+                           int (*start_feed)(struct dvb_demux_feed *),
+                           int (*stop_feed)(struct dvb_demux_feed *),
+                           void *priv)
+{
+       dvbdemux->priv = priv;
+
+       dvbdemux->filternum = 256;
+       dvbdemux->feednum = 256;
+       dvbdemux->start_feed = start_feed;
+       dvbdemux->stop_feed = stop_feed;
+       dvbdemux->write_to_decoder = NULL;
+       dvbdemux->dmx.capabilities = (DMX_TS_FILTERING |
+                                     DMX_SECTION_FILTERING |
+                                     DMX_MEMORY_BASED_FILTERING);
+       return dvb_dmx_init(dvbdemux);
+}
+
+int my_dvb_dmxdev_ts_card_init(struct dmxdev *dmxdev,
+                              struct dvb_demux *dvbdemux,
+                              struct dmx_frontend *hw_frontend,
+                              struct dmx_frontend *mem_frontend,
+                              struct dvb_adapter *dvb_adapter)
+{
+       int ret;
+
+       dmxdev->filternum = 256;
+       dmxdev->demux = &dvbdemux->dmx;
+       dmxdev->capabilities = 0;
+       ret = dvb_dmxdev_init(dmxdev, dvb_adapter);
+       if (ret < 0)
+               return ret;
+
+       hw_frontend->source = DMX_FRONTEND_0;
+       dvbdemux->dmx.add_frontend(&dvbdemux->dmx, hw_frontend);
+       mem_frontend->source = DMX_MEMORY_FE;
+       dvbdemux->dmx.add_frontend(&dvbdemux->dmx, mem_frontend);
+       return dvbdemux->dmx.connect_frontend(&dvbdemux->dmx, hw_frontend);
+}
index c2dc8516cb20bb158f8c614d9eaf9a3e38a10ed3..676fcbb79026847cfb8694c5d22d25d711195ddd 100644 (file)
@@ -862,10 +862,27 @@ int __devinit ngene_probe(struct pci_dev *pci_dev,
 void __devexit ngene_remove(struct pci_dev *pdev);
 int ngene_command(struct ngene *dev, struct ngene_command *com);
 int ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level);
+void set_transfer(struct ngene_channel *chan, int state);
+void FillTSBuffer(void *Buffer, int Length, u32 Flags);
 
 /* Provided by ngene-i2c.c */
 int ngene_i2c_init(struct ngene *dev, int dev_nr);
 
+/* Provided by ngene-dvb.c */
+void *tsout_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags);
+void *tsin_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags);
+int ngene_start_feed(struct dvb_demux_feed *dvbdmxfeed);
+int ngene_stop_feed(struct dvb_demux_feed *dvbdmxfeed);
+int my_dvb_dmx_ts_card_init(struct dvb_demux *dvbdemux, char *id,
+                           int (*start_feed)(struct dvb_demux_feed *),
+                           int (*stop_feed)(struct dvb_demux_feed *),
+                           void *priv);
+int my_dvb_dmxdev_ts_card_init(struct dmxdev *dmxdev,
+                              struct dvb_demux *dvbdemux,
+                              struct dmx_frontend *hw_frontend,
+                              struct dmx_frontend *mem_frontend,
+                              struct dvb_adapter *dvb_adapter);
+
 #endif
 
 /*  LocalWords:  Endif