aboutsummaryrefslogtreecommitdiff
path: root/drivers/media/dvb/bt8xx
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/dvb/bt8xx')
-rw-r--r--drivers/media/dvb/bt8xx/Kconfig18
-rw-r--r--drivers/media/dvb/bt8xx/Makefile3
-rw-r--r--drivers/media/dvb/bt8xx/bt878.c588
-rw-r--r--drivers/media/dvb/bt8xx/bt878.h147
-rw-r--r--drivers/media/dvb/bt8xx/dst.c1449
-rw-r--r--drivers/media/dvb/bt8xx/dst_ca.c764
-rw-r--r--drivers/media/dvb/bt8xx/dst_ca.h58
-rw-r--r--drivers/media/dvb/bt8xx/dst_common.h156
-rw-r--r--drivers/media/dvb/bt8xx/dst_priv.h35
-rw-r--r--drivers/media/dvb/bt8xx/dvb-bt8xx.c818
-rw-r--r--drivers/media/dvb/bt8xx/dvb-bt8xx.h59
11 files changed, 0 insertions, 4095 deletions
diff --git a/drivers/media/dvb/bt8xx/Kconfig b/drivers/media/dvb/bt8xx/Kconfig
deleted file mode 100644
index b12545f093f..00000000000
--- a/drivers/media/dvb/bt8xx/Kconfig
+++ /dev/null
@@ -1,18 +0,0 @@
-config DVB_BT8XX
- tristate "Nebula/Pinnacle PCTV/Twinhan PCI cards"
- depends on DVB_CORE && PCI && VIDEO_BT848
- select DVB_MT352
- select DVB_SP887X
- select DVB_NXT6000
- select DVB_CX24110
- select DVB_OR51211
- help
- Support for PCI cards based on the Bt8xx PCI bridge. Examples are
- the Nebula cards, the Pinnacle PCTV cards, the Twinhan DST cards and
- pcHDTV HD2000 cards.
-
- Since these cards have no MPEG decoder onboard, they transmit
- only compressed MPEG data over the PCI bus, so you need
- an external software decoder to watch TV on your computer.
-
- Say Y if you own such a device and want to use it.
diff --git a/drivers/media/dvb/bt8xx/Makefile b/drivers/media/dvb/bt8xx/Makefile
deleted file mode 100644
index d188e4c670b..00000000000
--- a/drivers/media/dvb/bt8xx/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-obj-$(CONFIG_DVB_BT8XX) += bt878.o dvb-bt8xx.o dst.o dst_ca.o
-
-EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/video -Idrivers/media/dvb/frontends
diff --git a/drivers/media/dvb/bt8xx/bt878.c b/drivers/media/dvb/bt8xx/bt878.c
deleted file mode 100644
index 3c5a8e273c4..00000000000
--- a/drivers/media/dvb/bt8xx/bt878.c
+++ /dev/null
@@ -1,588 +0,0 @@
-/*
- * bt878.c: part of the driver for the Pinnacle PCTV Sat DVB PCI card
- *
- * Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@t-online.de>
- *
- * large parts based on the bttv driver
- * Copyright (C) 1996,97,98 Ralph Metzler (rjkm@metzlerbros.de)
- * & Marcus Metzler (mocm@metzlerbros.de)
- * (c) 1999,2000 Gerd Knorr <kraxel@goldbach.in-berlin.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
-
- * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
- *
- */
-
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/kernel.h>
-#include <linux/pci.h>
-#include <asm/io.h>
-#include <linux/ioport.h>
-#include <asm/pgtable.h>
-#include <asm/page.h>
-#include <linux/types.h>
-#include <linux/interrupt.h>
-#include <linux/kmod.h>
-#include <linux/vmalloc.h>
-#include <linux/init.h>
-
-#include "dmxdev.h"
-#include "dvbdev.h"
-#include "bt878.h"
-#include "dst_priv.h"
-
-
-/**************************************/
-/* Miscellaneous utility definitions */
-/**************************************/
-
-static unsigned int bt878_verbose = 1;
-static unsigned int bt878_debug;
-
-module_param_named(verbose, bt878_verbose, int, 0444);
-MODULE_PARM_DESC(verbose,
- "verbose startup messages, default is 1 (yes)");
-module_param_named(debug, bt878_debug, int, 0644);
-MODULE_PARM_DESC(debug, "Turn on/off debugging, default is 0 (off).");
-
-int bt878_num;
-struct bt878 bt878[BT878_MAX];
-
-EXPORT_SYMBOL(bt878_debug);
-EXPORT_SYMBOL(bt878_verbose);
-EXPORT_SYMBOL(bt878_num);
-EXPORT_SYMBOL(bt878);
-
-#define btwrite(dat,adr) bmtwrite((dat), (bt->bt878_mem+(adr)))
-#define btread(adr) bmtread(bt->bt878_mem+(adr))
-
-#define btand(dat,adr) btwrite((dat) & btread(adr), adr)
-#define btor(dat,adr) btwrite((dat) | btread(adr), adr)
-#define btaor(dat,mask,adr) btwrite((dat) | ((mask) & btread(adr)), adr)
-
-#if defined(dprintk)
-#undef dprintk
-#endif
-#define dprintk if(bt878_debug) printk
-
-static void bt878_mem_free(struct bt878 *bt)
-{
- if (bt->buf_cpu) {
- pci_free_consistent(bt->dev, bt->buf_size, bt->buf_cpu,
- bt->buf_dma);
- bt->buf_cpu = NULL;
- }
-
- if (bt->risc_cpu) {
- pci_free_consistent(bt->dev, bt->risc_size, bt->risc_cpu,
- bt->risc_dma);
- bt->risc_cpu = NULL;
- }
-}
-
-static int bt878_mem_alloc(struct bt878 *bt)
-{
- if (!bt->buf_cpu) {
- bt->buf_size = 128 * 1024;
-
- bt->buf_cpu =
- pci_alloc_consistent(bt->dev, bt->buf_size,
- &bt->buf_dma);
-
- if (!bt->buf_cpu)
- return -ENOMEM;
-
- memset(bt->buf_cpu, 0, bt->buf_size);
- }
-
- if (!bt->risc_cpu) {
- bt->risc_size = PAGE_SIZE;
- bt->risc_cpu =
- pci_alloc_consistent(bt->dev, bt->risc_size,
- &bt->risc_dma);
-
- if (!bt->risc_cpu) {
- bt878_mem_free(bt);
- return -ENOMEM;
- }
-
- memset(bt->risc_cpu, 0, bt->risc_size);
- }
-
- return 0;
-}
-
-/* RISC instructions */
-#define RISC_WRITE (0x01 << 28)
-#define RISC_JUMP (0x07 << 28)
-#define RISC_SYNC (0x08 << 28)
-
-/* RISC bits */
-#define RISC_WR_SOL (1 << 27)
-#define RISC_WR_EOL (1 << 26)
-#define RISC_IRQ (1 << 24)
-#define RISC_STATUS(status) ((((~status) & 0x0F) << 20) | ((status & 0x0F) << 16))
-#define RISC_SYNC_RESYNC (1 << 15)
-#define RISC_SYNC_FM1 0x06
-#define RISC_SYNC_VRO 0x0C
-
-#define RISC_FLUSH() bt->risc_pos = 0
-#define RISC_INSTR(instr) bt->risc_cpu[bt->risc_pos++] = cpu_to_le32(instr)
-
-static int bt878_make_risc(struct bt878 *bt)
-{
- bt->block_bytes = bt->buf_size >> 4;
- bt->block_count = 1 << 4;
- bt->line_bytes = bt->block_bytes;
- bt->line_count = bt->block_count;
-
- while (bt->line_bytes > 4095) {
- bt->line_bytes >>= 1;
- bt->line_count <<= 1;
- }
-
- if (bt->line_count > 255) {
- printk("bt878: buffer size error!\n");
- return -EINVAL;
- }
- return 0;
-}
-
-
-static void bt878_risc_program(struct bt878 *bt, u32 op_sync_orin)
-{
- u32 buf_pos = 0;
- u32 line;
-
- RISC_FLUSH();
- RISC_INSTR(RISC_SYNC | RISC_SYNC_FM1 | op_sync_orin);
- RISC_INSTR(0);
-
- dprintk("bt878: risc len lines %u, bytes per line %u\n",
- bt->line_count, bt->line_bytes);
- for (line = 0; line < bt->line_count; line++) {
- // At the beginning of every block we issue an IRQ with previous (finished) block number set
- if (!(buf_pos % bt->block_bytes))
- RISC_INSTR(RISC_WRITE | RISC_WR_SOL | RISC_WR_EOL |
- RISC_IRQ |
- RISC_STATUS(((buf_pos /
- bt->block_bytes) +
- (bt->block_count -
- 1)) %
- bt->block_count) | bt->
- line_bytes);
- else
- RISC_INSTR(RISC_WRITE | RISC_WR_SOL | RISC_WR_EOL |
- bt->line_bytes);
- RISC_INSTR(bt->buf_dma + buf_pos);
- buf_pos += bt->line_bytes;
- }
-
- RISC_INSTR(RISC_SYNC | op_sync_orin | RISC_SYNC_VRO);
- RISC_INSTR(0);
-
- RISC_INSTR(RISC_JUMP);
- RISC_INSTR(bt->risc_dma);
-
- btwrite((bt->line_count << 16) | bt->line_bytes, BT878_APACK_LEN);
-}
-
-/*****************************/
-/* Start/Stop grabbing funcs */
-/*****************************/
-
-void bt878_start(struct bt878 *bt, u32 controlreg, u32 op_sync_orin,
- u32 irq_err_ignore)
-{
- u32 int_mask;
-
- dprintk("bt878 debug: bt878_start (ctl=%8.8x)\n", controlreg);
- /* complete the writing of the risc dma program now we have
- * the card specifics
- */
- bt878_risc_program(bt, op_sync_orin);
- controlreg &= ~0x1f;
- controlreg |= 0x1b;
-
- btwrite(cpu_to_le32(bt->risc_dma), BT878_ARISC_START);
-
- /* original int mask had :
- * 6 2 8 4 0
- * 1111 1111 1000 0000 0000
- * SCERR|OCERR|PABORT|RIPERR|FDSR|FTRGT|FBUS|RISCI
- * Hacked for DST to:
- * SCERR | OCERR | FDSR | FTRGT | FBUS | RISCI
- */
- int_mask = BT878_ASCERR | BT878_AOCERR | BT878_APABORT |
- BT878_ARIPERR | BT878_APPERR | BT878_AFDSR | BT878_AFTRGT |
- BT878_AFBUS | BT878_ARISCI;
-
-
- /* ignore pesky bits */
- int_mask &= ~irq_err_ignore;
-
- btwrite(int_mask, BT878_AINT_MASK);
- btwrite(controlreg, BT878_AGPIO_DMA_CTL);
-}
-
-void bt878_stop(struct bt878 *bt)
-{
- u32 stat;
- int i = 0;
-
- dprintk("bt878 debug: bt878_stop\n");
-
- btwrite(0, BT878_AINT_MASK);
- btand(~0x13, BT878_AGPIO_DMA_CTL);
-
- do {
- stat = btread(BT878_AINT_STAT);
- if (!(stat & BT878_ARISC_EN))
- break;
- i++;
- } while (i < 500);
-
- dprintk("bt878(%d) debug: bt878_stop, i=%d, stat=0x%8.8x\n",
- bt->nr, i, stat);
-}
-
-EXPORT_SYMBOL(bt878_start);
-EXPORT_SYMBOL(bt878_stop);
-
-/*****************************/
-/* Interrupt service routine */
-/*****************************/
-
-static irqreturn_t bt878_irq(int irq, void *dev_id, struct pt_regs *regs)
-{
- u32 stat, astat, mask;
- int count;
- struct bt878 *bt;
-
- bt = (struct bt878 *) dev_id;
-
- count = 0;
- while (1) {
- stat = btread(BT878_AINT_STAT);
- mask = btread(BT878_AINT_MASK);
- if (!(astat = (stat & mask)))
- return IRQ_NONE; /* this interrupt is not for me */
-/* dprintk("bt878(%d) debug: irq count %d, stat 0x%8.8x, mask 0x%8.8x\n",bt->nr,count,stat,mask); */
- btwrite(astat, BT878_AINT_STAT); /* try to clear interupt condition */
-
-
- if (astat & (BT878_ASCERR | BT878_AOCERR)) {
- if (bt878_verbose) {
- printk("bt878(%d): irq%s%s risc_pc=%08x\n",
- bt->nr,
- (astat & BT878_ASCERR) ? " SCERR" :
- "",
- (astat & BT878_AOCERR) ? " OCERR" :
- "", btread(BT878_ARISC_PC));
- }
- }
- if (astat & (BT878_APABORT | BT878_ARIPERR | BT878_APPERR)) {
- if (bt878_verbose) {
- printk
- ("bt878(%d): irq%s%s%s risc_pc=%08x\n",
- bt->nr,
- (astat & BT878_APABORT) ? " PABORT" :
- "",
- (astat & BT878_ARIPERR) ? " RIPERR" :
- "",
- (astat & BT878_APPERR) ? " PPERR" :
- "", btread(BT878_ARISC_PC));
- }
- }
- if (astat & (BT878_AFDSR | BT878_AFTRGT | BT878_AFBUS)) {
- if (bt878_verbose) {
- printk
- ("bt878(%d): irq%s%s%s risc_pc=%08x\n",
- bt->nr,
- (astat & BT878_AFDSR) ? " FDSR" : "",
- (astat & BT878_AFTRGT) ? " FTRGT" :
- "",
- (astat & BT878_AFBUS) ? " FBUS" : "",
- btread(BT878_ARISC_PC));
- }
- }
- if (astat & BT878_ARISCI) {
- bt->finished_block = (stat & BT878_ARISCS) >> 28;
- tasklet_schedule(&bt->tasklet);
- break;
- }
- count++;
- if (count > 20) {
- btwrite(0, BT878_AINT_MASK);
- printk(KERN_ERR
- "bt878(%d): IRQ lockup, cleared int mask\n",
- bt->nr);
- break;
- }
- }
- return IRQ_HANDLED;
-}
-
-int
-bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet *mp)
-{
- int retval;
-
- retval = 0;
- if (down_interruptible (&bt->gpio_lock))
- return -ERESTARTSYS;
- /* special gpio signal */
- switch (cmd) {
- case DST_IG_ENABLE:
- // dprintk("dvb_bt8xx: dst enable mask 0x%02x enb 0x%02x \n", mp->dstg.enb.mask, mp->dstg.enb.enable);
- retval = bttv_gpio_enable(bt->bttv_nr,
- mp->enb.mask,
- mp->enb.enable);
- break;
- case DST_IG_WRITE:
- // dprintk("dvb_bt8xx: dst write gpio mask 0x%02x out 0x%02x\n", mp->dstg.outp.mask, mp->dstg.outp.highvals);
- retval = bttv_write_gpio(bt->bttv_nr,
- mp->outp.mask,
- mp->outp.highvals);
-
- break;
- case DST_IG_READ:
- /* read */
- retval = bttv_read_gpio(bt->bttv_nr, &mp->rd.value);
- // dprintk("dvb_bt8xx: dst read gpio 0x%02x\n", (unsigned)mp->dstg.rd.value);
- break;
- case DST_IG_TS:
- /* Set packet size */
- bt->TS_Size = mp->psize;
- break;
-
- default:
- retval = -EINVAL;
- break;
- }
- up(&bt->gpio_lock);
- return retval;
-}
-
-EXPORT_SYMBOL(bt878_device_control);
-
-/***********************/
-/* PCI device handling */
-/***********************/
-
-static int __devinit bt878_probe(struct pci_dev *dev,
- const struct pci_device_id *pci_id)
-{
- int result;
- unsigned char lat;
- struct bt878 *bt;
-#if defined(__powerpc__)
- unsigned int cmd;
-#endif
-
- printk(KERN_INFO "bt878: Bt878 AUDIO function found (%d).\n",
- bt878_num);
- if (pci_enable_device(dev))
- return -EIO;
-
- bt = &bt878[bt878_num];
- bt->dev = dev;
- bt->nr = bt878_num;
- bt->shutdown = 0;
-
- bt->id = dev->device;
- bt->irq = dev->irq;
- bt->bt878_adr = pci_resource_start(dev, 0);
- if (!request_mem_region(pci_resource_start(dev, 0),
- pci_resource_len(dev, 0), "bt878")) {
- result = -EBUSY;
- goto fail0;
- }
-
- pci_read_config_byte(dev, PCI_CLASS_REVISION, &bt->revision);
- pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
- printk(KERN_INFO "bt878(%d): Bt%x (rev %d) at %02x:%02x.%x, ",
- bt878_num, bt->id, bt->revision, dev->bus->number,
- PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
- printk("irq: %d, latency: %d, memory: 0x%lx\n",
- bt->irq, lat, bt->bt878_adr);
-
-
-#if defined(__powerpc__)
- /* on OpenFirmware machines (PowerMac at least), PCI memory cycle */
- /* response on cards with no firmware is not enabled by OF */
- pci_read_config_dword(dev, PCI_COMMAND, &cmd);
- cmd = (cmd | PCI_COMMAND_MEMORY);
- pci_write_config_dword(dev, PCI_COMMAND, cmd);
-#endif
-
-#ifdef __sparc__
- bt->bt878_mem = (unsigned char *) bt->bt878_adr;
-#else
- bt->bt878_mem = ioremap(bt->bt878_adr, 0x1000);
-#endif
-
- /* clear interrupt mask */
- btwrite(0, BT848_INT_MASK);
-
- result = request_irq(bt->irq, bt878_irq,
- SA_SHIRQ | SA_INTERRUPT, "bt878",
- (void *) bt);
- if (result == -EINVAL) {
- printk(KERN_ERR "bt878(%d): Bad irq number or handler\n",
- bt878_num);
- goto fail1;
- }
- if (result == -EBUSY) {
- printk(KERN_ERR
- "bt878(%d): IRQ %d busy, change your PnP config in BIOS\n",
- bt878_num, bt->irq);
- goto fail1;
- }
- if (result < 0)
- goto fail1;
-
- pci_set_master(dev);
- pci_set_drvdata(dev, bt);
-
-/* if(init_bt878(btv) < 0) {
- bt878_remove(dev);
- return -EIO;
- }
-*/
-
- if ((result = bt878_mem_alloc(bt))) {
- printk("bt878: failed to allocate memory!\n");
- goto fail2;
- }
-
- bt878_make_risc(bt);
- btwrite(0, BT878_AINT_MASK);
- bt878_num++;
-
- return 0;
-
- fail2:
- free_irq(bt->irq, bt);
- fail1:
- release_mem_region(pci_resource_start(bt->dev, 0),
- pci_resource_len(bt->dev, 0));
- fail0:
- pci_disable_device(dev);
- return result;
-}
-
-static void __devexit bt878_remove(struct pci_dev *pci_dev)
-{
- u8 command;
- struct bt878 *bt = pci_get_drvdata(pci_dev);
-
- if (bt878_verbose)
- printk("bt878(%d): unloading\n", bt->nr);
-
- /* turn off all capturing, DMA and IRQs */
- btand(~0x13, BT878_AGPIO_DMA_CTL);
-
- /* first disable interrupts before unmapping the memory! */
- btwrite(0, BT878_AINT_MASK);
- btwrite(~0U, BT878_AINT_STAT);
-
- /* disable PCI bus-mastering */
- pci_read_config_byte(bt->dev, PCI_COMMAND, &command);
- /* Should this be &=~ ?? */
- command &= ~PCI_COMMAND_MASTER;
- pci_write_config_byte(bt->dev, PCI_COMMAND, command);
-
- free_irq(bt->irq, bt);
- printk(KERN_DEBUG "bt878_mem: 0x%p.\n", bt->bt878_mem);
- if (bt->bt878_mem)
- iounmap(bt->bt878_mem);
-
- release_mem_region(pci_resource_start(bt->dev, 0),
- pci_resource_len(bt->dev, 0));
- /* wake up any waiting processes
- because shutdown flag is set, no new processes (in this queue)
- are expected
- */
- bt->shutdown = 1;
- bt878_mem_free(bt);
-
- pci_set_drvdata(pci_dev, NULL);
- pci_disable_device(pci_dev);
- return;
-}
-
-static struct pci_device_id bt878_pci_tbl[] __devinitdata = {
- {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BROOKTREE_878,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
- {0,}
-};
-
-MODULE_DEVICE_TABLE(pci, bt878_pci_tbl);
-
-static struct pci_driver bt878_pci_driver = {
- .name = "bt878",
- .id_table = bt878_pci_tbl,
- .probe = bt878_probe,
- .remove = bt878_remove,
-};
-
-static int bt878_pci_driver_registered = 0;
-
-/*******************************/
-/* Module management functions */
-/*******************************/
-
-static int bt878_init_module(void)
-{
- bt878_num = 0;
- bt878_pci_driver_registered = 0;
-
- printk(KERN_INFO "bt878: AUDIO driver version %d.%d.%d loaded\n",
- (BT878_VERSION_CODE >> 16) & 0xff,
- (BT878_VERSION_CODE >> 8) & 0xff,
- BT878_VERSION_CODE & 0xff);
-/*
- bt878_check_chipset();
-*/
- /* later we register inside of bt878_find_audio_dma()
- * because we may want to ignore certain cards */
- bt878_pci_driver_registered = 1;
- return pci_register_driver(&bt878_pci_driver);
-}
-
-static void bt878_cleanup_module(void)
-{
- if (bt878_pci_driver_registered) {
- bt878_pci_driver_registered = 0;
- pci_unregister_driver(&bt878_pci_driver);
- }
- return;
-}
-
-module_init(bt878_init_module);
-module_exit(bt878_cleanup_module);
-
-//MODULE_AUTHOR("XXX");
-MODULE_LICENSE("GPL");
-
-/*
- * Local variables:
- * c-basic-offset: 8
- * End:
- */
diff --git a/drivers/media/dvb/bt8xx/bt878.h b/drivers/media/dvb/bt8xx/bt878.h
deleted file mode 100644
index 837623f7fcd..00000000000
--- a/drivers/media/dvb/bt8xx/bt878.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- bt878.h - Bt878 audio module (register offsets)
-
- Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@t-online.de>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#ifndef _BT878_H_
-#define _BT878_H_
-
-#include <linux/interrupt.h>
-#include <linux/pci.h>
-#include <linux/sched.h>
-#include <linux/spinlock.h>
-#include "bt848.h"
-#include "bttv.h"
-
-#define BT878_VERSION_CODE 0x000000
-
-#define BT878_AINT_STAT 0x100
-#define BT878_ARISCS (0xf<<28)
-#define BT878_ARISC_EN (1<<27)
-#define BT878_ASCERR (1<<19)
-#define BT878_AOCERR (1<<18)
-#define BT878_APABORT (1<<17)
-#define BT878_ARIPERR (1<<16)
-#define BT878_APPERR (1<<15)
-#define BT878_AFDSR (1<<14)
-#define BT878_AFTRGT (1<<13)
-#define BT878_AFBUS (1<<12)
-#define BT878_ARISCI (1<<11)
-#define BT878_AOFLOW (1<<3)
-
-#define BT878_AINT_MASK 0x104
-
-#define BT878_AGPIO_DMA_CTL 0x10c
-#define BT878_A_GAIN (0xf<<28)
-#define BT878_A_G2X (1<<27)
-#define BT878_A_PWRDN (1<<26)
-#define BT878_A_SEL (3<<24)
-#define BT878_DA_SCE (1<<23)
-#define BT878_DA_LRI (1<<22)
-#define BT878_DA_MLB (1<<21)
-#define BT878_DA_LRD (0x1f<<16)
-#define BT878_DA_DPM (1<<15)
-#define BT878_DA_SBR (1<<14)
-#define BT878_DA_ES2 (1<<13)
-#define BT878_DA_LMT (1<<12)
-#define BT878_DA_SDR (0xf<<8)
-#define BT878_DA_IOM (3<<6)
-#define BT878_DA_APP (1<<5)
-#define BT878_ACAP_EN (1<<4)
-#define BT878_PKTP (3<<2)
-#define BT878_RISC_EN (1<<1)
-#define BT878_FIFO_EN 1
-
-#define BT878_APACK_LEN 0x110
-#define BT878_AFP_LEN (0xff<<16)
-#define BT878_ALP_LEN 0xfff
-
-#define BT878_ARISC_START 0x114
-
-#define BT878_ARISC_PC 0x120
-
-/* BT878 FUNCTION 0 REGISTERS */
-#define BT878_GPIO_DMA_CTL 0x10c
-
-/* Interrupt register */
-#define BT878_INT_STAT 0x100
-#define BT878_INT_MASK 0x104
-#define BT878_I2CRACK (1<<25)
-#define BT878_I2CDONE (1<<8)
-
-#define BT878_MAX 4
-
-#define BT878_RISC_SYNC_MASK (1 << 15)
-
-extern int bt878_num;
-
-struct bt878 {
- struct semaphore gpio_lock;
- unsigned int nr;
- unsigned int bttv_nr;
- struct i2c_adapter *adapter;
- struct pci_dev *dev;
- unsigned int id;
- unsigned int TS_Size;
- unsigned char revision;
- unsigned int irq;
- unsigned long bt878_adr;
- volatile void __iomem *bt878_mem; /* function 1 */
-
- volatile u32 finished_block;
- volatile u32 last_block;
- u32 block_count;
- u32 block_bytes;
- u32 line_bytes;
- u32 line_count;
-
- u32 buf_size;
- u8 *buf_cpu;
- dma_addr_t buf_dma;
-
- u32 risc_size;
- u32 *risc_cpu;
- dma_addr_t risc_dma;
- u32 risc_pos;
-
- struct tasklet_struct tasklet;
- int shutdown;
-};
-
-extern struct bt878 bt878[BT878_MAX];
-
-void bt878_start(struct bt878 *bt, u32 controlreg, u32 op_sync_orin,
- u32 irq_err_ignore);
-void bt878_stop(struct bt878 *bt);
-
-#if defined(__powerpc__) /* big-endian */
-extern __inline__ void io_st_le32(volatile unsigned __iomem *addr, unsigned val)
-{
- __asm__ __volatile__("stwbrx %1,0,%2":"=m"(*addr):"r"(val),
- "r"(addr));
- __asm__ __volatile__("eieio":::"memory");
-}
-
-#define bmtwrite(dat,adr) io_st_le32((adr),(dat))
-#define bmtread(adr) ld_le32((adr))
-#else
-#define bmtwrite(dat,adr) writel((dat), (adr))
-#define bmtread(adr) readl(adr)
-#endif
-
-#endif
diff --git a/drivers/media/dvb/bt8xx/dst.c b/drivers/media/dvb/bt8xx/dst.c
deleted file mode 100644
index 07a0b0a968a..00000000000
--- a/drivers/media/dvb/bt8xx/dst.c
+++ /dev/null
@@ -1,1449 +0,0 @@
-/*
-
- Frontend/Card driver for TwinHan DST Frontend
- Copyright (C) 2003 Jamie Honan
- Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/string.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-#include <linux/delay.h>
-#include <asm/div64.h>
-
-#include "dvb_frontend.h"
-#include "dst_priv.h"
-#include "dst_common.h"
-
-
-static unsigned int verbose = 1;
-module_param(verbose, int, 0644);
-MODULE_PARM_DESC(verbose, "verbose startup messages, default is 1 (yes)");
-
-static unsigned int debug = 1;
-module_param(debug, int, 0644);
-MODULE_PARM_DESC(debug, "debug messages, default is 0 (yes)");
-
-static unsigned int dst_addons;
-module_param(dst_addons, int, 0644);
-MODULE_PARM_DESC(dst_addons, "CA daughterboard, default is 0 (No addons)");
-
-#define dprintk if (debug) printk
-
-#define HAS_LOCK 1
-#define ATTEMPT_TUNE 2
-#define HAS_POWER 4
-
-static void dst_packsize(struct dst_state* state, int psize)
-{
- union dst_gpio_packet bits;
-
- bits.psize = psize;
- bt878_device_control(state->bt, DST_IG_TS, &bits);
-}
-
-int dst_gpio_outb(struct dst_state* state, u32 mask, u32 enbb, u32 outhigh, int delay)
-{
- union dst_gpio_packet enb;
- union dst_gpio_packet bits;
- int err;
-
- enb.enb.mask = mask;
- enb.enb.enable = enbb;
- if (verbose > 4)
- dprintk("%s: mask=[%04x], enbb=[%04x], outhigh=[%04x]\n", __FUNCTION__, mask, enbb, outhigh);
-
- if ((err = bt878_device_control(state->bt, DST_IG_ENABLE, &enb)) < 0) {
- dprintk("%s: dst_gpio_enb error (err == %i, mask == %02x, enb == %02x)\n", __FUNCTION__, err, mask, enbb);
- return -EREMOTEIO;
- }
- udelay(1000);
- /* because complete disabling means no output, no need to do output packet */
- if (enbb == 0)
- return 0;
-
- if (delay)
- msleep(10);
-
- bits.outp.mask = enbb;
- bits.outp.highvals = outhigh;
-
- if ((err = bt878_device_control(state->bt, DST_IG_WRITE, &bits)) < 0) {
- dprintk("%s: dst_gpio_outb error (err == %i, enbb == %02x, outhigh == %02x)\n", __FUNCTION__, err, enbb, outhigh);
- return -EREMOTEIO;
- }
- return 0;
-}
-EXPORT_SYMBOL(dst_gpio_outb);
-
-int dst_gpio_inb(struct dst_state *state, u8 * result)
-{
- union dst_gpio_packet rd_packet;
- int err;
-
- *result = 0;
-
- if ((err = bt878_device_control(state->bt, DST_IG_READ, &rd_packet)) < 0) {
- dprintk("%s: dst_gpio_inb error (err == %i)\n", __FUNCTION__, err);
- return -EREMOTEIO;
- }
-
- *result = (u8) rd_packet.rd.value;
- return 0;
-}
-EXPORT_SYMBOL(dst_gpio_inb);
-
-int rdc_reset_state(struct dst_state *state)
-{
- if (verbose > 1)
- dprintk("%s: Resetting state machine\n", __FUNCTION__);
-
- if (dst_gpio_outb(state, RDC_8820_INT, RDC_8820_INT, 0, NO_DELAY) < 0) {
- dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
- return -1;
- }
-
- msleep(10);
-
- if (dst_gpio_outb(state, RDC_8820_INT, RDC_8820_INT, RDC_8820_INT, NO_DELAY) < 0) {
- dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
- msleep(10);
- return -1;
- }
-
- return 0;
-}
-EXPORT_SYMBOL(rdc_reset_state);
-
-int rdc_8820_reset(struct dst_state *state)
-{
- if (verbose > 1)
- dprintk("%s: Resetting DST\n", __FUNCTION__);
-
- if (dst_gpio_outb(state, RDC_8820_RESET, RDC_8820_RESET, 0, NO_DELAY) < 0) {
- dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
- return -1;
- }
- udelay(1000);
- if (dst_gpio_outb(state, RDC_8820_RESET, RDC_8820_RESET, RDC_8820_RESET, DELAY) < 0) {
- dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
- return -1;
- }
-
- return 0;
-}
-EXPORT_SYMBOL(rdc_8820_reset);
-
-int dst_pio_enable(struct dst_state *state)
-{
- if (dst_gpio_outb(state, ~0, RDC_8820_PIO_0_ENABLE, 0, NO_DELAY) < 0) {
- dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
- return -1;
- }
- udelay(1000);
- return 0;
-}
-EXPORT_SYMBOL(dst_pio_enable);
-
-int dst_pio_disable(struct dst_state *state)
-{
- if (dst_gpio_outb(state, ~0, RDC_8820_PIO_0_DISABLE, RDC_8820_PIO_0_DISABLE, NO_DELAY) < 0) {
- dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
- return -1;
- }
- if (state->type_flags & DST_TYPE_HAS_FW_1)
- udelay(1000);
-
- return 0;
-}
-EXPORT_SYMBOL(dst_pio_disable);
-
-int dst_wait_dst_ready(struct dst_state *state, u8 delay_mode)
-{
- u8 reply;
- int i;
-
- for (i = 0; i < 200; i++) {
- if (dst_gpio_inb(state, &reply) < 0) {
- dprintk("%s: dst_gpio_inb ERROR !\n", __FUNCTION__);
- return -1;
- }
-
- if ((reply & RDC_8820_PIO_0_ENABLE) == 0) {
- if (verbose > 4)
- dprintk("%s: dst wait ready after %d\n", __FUNCTION__, i);
- return 1;
- }
- msleep(10);
- }
- if (verbose > 1)
- dprintk("%s: dst wait NOT ready after %d\n", __FUNCTION__, i);
-
- return 0;
-}
-EXPORT_SYMBOL(dst_wait_dst_ready);
-
-int dst_error_recovery(struct dst_state *state)
-{
- dprintk("%s: Trying to return from previous errors...\n", __FUNCTION__);
- dst_pio_disable(state);
- msleep(10);
- dst_pio_enable(state);
- msleep(10);
-
- return 0;
-}
-EXPORT_SYMBOL(dst_error_recovery);
-
-int dst_error_bailout(struct dst_state *state)
-{
- dprintk("%s: Trying to bailout from previous error...\n", __FUNCTION__);
- rdc_8820_reset(state);
- dst_pio_disable(state);
- msleep(10);
-
- return 0;
-}
-EXPORT_SYMBOL(dst_error_bailout);
-
-
-int dst_comm_init(struct dst_state* state)
-{
- if (verbose > 1)
- dprintk ("%s: Initializing DST..\n", __FUNCTION__);
- if ((dst_pio_enable(state)) < 0) {
- dprintk("%s: PIO Enable Failed.\n", __FUNCTION__);
- return -1;
- }
- if ((rdc_reset_state(state)) < 0) {
- dprintk("%s: RDC 8820 State RESET Failed.\n", __FUNCTION__);
- return -1;
- }
- if (state->type_flags & DST_TYPE_HAS_FW_1)
- msleep(100);
- else
- msleep(5);
-
- return 0;
-}
-EXPORT_SYMBOL(dst_comm_init);
-
-
-int write_dst(struct dst_state *state, u8 *data, u8 len)
-{
- struct i2c_msg msg = {
- .addr = state->config->demod_address,.flags = 0,.buf = data,.len = len
- };
-
- int err;
- int cnt;
- if (debug && (verbose > 4)) {
- u8 i;
- if (verbose > 4) {
- dprintk("%s writing [ ", __FUNCTION__);
- for (i = 0; i < len; i++)
- dprintk("%02x ", data[i]);
- dprintk("]\n");
- }
- }
- for (cnt = 0; cnt < 2; cnt++) {
- if ((err = i2c_transfer(state->i2c, &msg, 1)) < 0) {
- dprintk("%s: _write_dst error (err == %i, len == 0x%02x, b0 == 0x%02x)\n", __FUNCTION__, err, len, data[0]);
- dst_error_recovery(state);
- continue;
- } else
- break;
- }
-
- if (cnt >= 2) {
- if (verbose > 1)
- printk("%s: RDC 8820 RESET...\n", __FUNCTION__);
- dst_error_bailout(state);
-
- return -1;
- }
-
- return 0;
-}
-EXPORT_SYMBOL(write_dst);
-
-int read_dst(struct dst_state *state, u8 * ret, u8 len)
-{
- struct i2c_msg msg = {.addr = state->config->demod_address,.flags = I2C_M_RD,.buf = ret,.len = len };
- int err;
- int cnt;
-
- for (cnt = 0; cnt < 2; cnt++) {
- if ((err = i2c_transfer(state->i2c, &msg, 1)) < 0) {
-
- dprintk("%s: read_dst error (err == %i, len == 0x%02x, b0 == 0x%02x)\n", __FUNCTION__, err, len, ret[0]);
- dst_error_recovery(state);
-
- continue;
- } else
- break;
- }
- if (cnt >= 2) {
- if (verbose > 1)
- printk("%s: RDC 8820 RESET...\n", __FUNCTION__);
- dst_error_bailout(state);
-
- return -1;
- }
- if (debug && (verbose > 4)) {
- dprintk("%s reply is 0x%x\n", __FUNCTION__, ret[0]);
- for (err = 1; err < len; err++)
- dprintk(" 0x%x", ret[err]);
- if (err > 1)
- dprintk("\n");
- }
-
- return 0;
-}
-EXPORT_SYMBOL(read_dst);
-
-static int dst_set_polarization(struct dst_state *state)
-{
- switch (state->voltage) {
- case SEC_VOLTAGE_13: // vertical
- printk("%s: Polarization=[Vertical]\n", __FUNCTION__);
- state->tx_tuna[8] &= ~0x40; //1
- break;
-
- case SEC_VOLTAGE_18: // horizontal
- printk("%s: Polarization=[Horizontal]\n", __FUNCTION__);
- state->tx_tuna[8] |= 0x40; // 0
- break;
-
- case SEC_VOLTAGE_OFF:
-
- break;
- }
-
- return 0;
-}
-
-static int dst_set_freq(struct dst_state *state, u32 freq)
-{
- state->frequency = freq;
- if (debug > 4)
- dprintk("%s: set Frequency %u\n", __FUNCTION__, freq);
-
- if (state->dst_type == DST_TYPE_IS_SAT) {
- freq = freq / 1000;
- if (freq < 950 || freq > 2150)
- return -EINVAL;
-
- state->tx_tuna[2] = (freq >> 8);
- state->tx_tuna[3] = (u8) freq;
- state->tx_tuna[4] = 0x01;
- state->tx_tuna[8] &= ~0x04;
- if (state->type_flags & DST_TYPE_HAS_OBS_REGS) {
- if (freq < 1531)
- state->tx_tuna[8] |= 0x04;
- }
-
- } else if (state->dst_type == DST_TYPE_IS_TERR) {
- freq = freq / 1000;
- if (freq < 137000 || freq > 858000)
- return -EINVAL;
-
- state->tx_tuna[2] = (freq >> 16) & 0xff;
- state->tx_tuna[3] = (freq >> 8) & 0xff;
- state->tx_tuna[4] = (u8) freq;
-
- } else if (state->dst_type == DST_TYPE_IS_CABLE) {
- state->tx_tuna[2] = (freq >> 16) & 0xff;
- state->tx_tuna[3] = (freq >> 8) & 0xff;
- state->tx_tuna[4] = (u8) freq;
-
- } else
- return -EINVAL;
- return 0;
-}
-
-static int dst_set_bandwidth(struct dst_state* state, fe_bandwidth_t bandwidth)
-{
- state->bandwidth = bandwidth;
-
- if (state->dst_type != DST_TYPE_IS_TERR)
- return 0;
-
- switch (bandwidth) {
- case BANDWIDTH_6_MHZ:
- if (state->dst_hw_cap & DST_TYPE_HAS_CA)
- state->tx_tuna[7] = 0x06;
- else {
- state->tx_tuna[6] = 0x06;
- state->tx_tuna[7] = 0x00;
- }
- break;
-
- case BANDWIDTH_7_MHZ:
- if (state->dst_hw_cap & DST_TYPE_HAS_CA)
- state->tx_tuna[7] = 0x07;
- else {
- state->tx_tuna[6] = 0x07;
- state->tx_tuna[7] = 0x00;
- }
- break;
-
- case BANDWIDTH_8_MHZ:
- if (state->dst_hw_cap & DST_TYPE_HAS_CA)
- state->tx_tuna[7] = 0x08;
- else {
- state->tx_tuna[6] = 0x08;
- state->tx_tuna[7] = 0x00;
- }
- break;
-
- default:
- return -EINVAL;
- }
- return 0;
-}
-
-static int dst_set_inversion(struct dst_state* state, fe_spectral_inversion_t inversion)
-{
- state->inversion = inversion;
- switch (inversion) {
- case INVERSION_OFF: // Inversion = Normal
- state->tx_tuna[8] &= ~0x80;
- break;
-
- case INVERSION_ON:
- state->tx_tuna[8] |= 0x80;
- break;
- default:
- return -EINVAL;
- }
- return 0;
-}
-
-static int dst_set_fec(struct dst_state* state, fe_code_rate_t fec)
-{
- state->fec = fec;
- return 0;
-}
-
-static fe_code_rate_t dst_get_fec(struct dst_state* state)
-{
- return state->fec;
-}
-
-static int dst_set_symbolrate(struct dst_state* state, u32 srate)
-{
- u8 *val;
- u32 symcalc;
- u64 sval;
-
- state->symbol_rate = srate;
-
- if (state->dst_type == DST_TYPE_IS_TERR) {
- return 0;
- }
- if (debug > 4)
- dprintk("%s: set symrate %u\n", __FUNCTION__, srate);
- srate /= 1000;
- val = &state->tx_tuna[0];
-
- if (state->type_flags & DST_TYPE_HAS_SYMDIV) {
- sval = srate;
- sval <<= 20;
- do_div(sval, 88000);
- symcalc = (u32) sval;
-
- if (debug > 4)
- dprintk("%s: set symcalc %u\n", __FUNCTION__, symcalc);
-
- val[5] = (u8) (symcalc >> 12);
- val[6] = (u8) (symcalc >> 4);
- val[7] = (u8) (symcalc << 4);
- } else {
- val[5] = (u8) (srate >> 16) & 0x7f;
- val[6] = (u8) (srate >> 8);
- val[7] = (u8) srate;
- }
- val[8] &= ~0x20;
- if (srate > 8000)
- val[8] |= 0x20;
- return 0;
-}
-
-
-static int dst_set_modulation(struct dst_state *state, fe_modulation_t modulation)
-{
- if (state->dst_type != DST_TYPE_IS_CABLE)
- return 0;
-
- state->modulation = modulation;
- switch (modulation) {
- case QAM_16:
- state->tx_tuna[8] = 0x10;
- break;
-
- case QAM_32:
- state->tx_tuna[8] = 0x20;
- break;
-
- case QAM_64:
- state->tx_tuna[8] = 0x40;
- break;
-
- case QAM_128:
- state->tx_tuna[8] = 0x80;
- break;
-
- case QAM_256:
- state->tx_tuna[8] = 0x00;
- break;
-
- case QPSK:
- case QAM_AUTO:
- case VSB_8:
- case VSB_16:
- default:
- return -EINVAL;
-
- }
-
- return 0;
-}
-
-static fe_modulation_t dst_get_modulation(struct dst_state *state)
-{
- return state->modulation;
-}
-
-
-u8 dst_check_sum(u8 * buf, u32 len)
-{
- u32 i;
- u8 val = 0;
- if (!len)
- return 0;
- for (i = 0; i < len; i++) {
- val += buf[i];
- }
- return ((~val) + 1);
-}
-EXPORT_SYMBOL(dst_check_sum);
-
-static void dst_type_flags_print(u32 type_flags)
-{
- printk("DST type flags :");
- if (type_flags & DST_TYPE_HAS_NEWTUNE)
- printk(" 0x%x newtuner", DST_TYPE_HAS_NEWTUNE);
- if (type_flags & DST_TYPE_HAS_TS204)
- printk(" 0x%x ts204", DST_TYPE_HAS_TS204);
- if (type_flags & DST_TYPE_HAS_SYMDIV)
- printk(" 0x%x symdiv", DST_TYPE_HAS_SYMDIV);
- if (type_flags & DST_TYPE_HAS_FW_1)
- printk(" 0x%x firmware version = 1", DST_TYPE_HAS_FW_1);
- if (type_flags & DST_TYPE_HAS_FW_2)
- printk(" 0x%x firmware version = 2", DST_TYPE_HAS_FW_2);
- if (type_flags & DST_TYPE_HAS_FW_3)
- printk(" 0x%x firmware version = 3", DST_TYPE_HAS_FW_3);
-// if ((type_flags & DST_TYPE_HAS_FW_BUILD) && new_fw)
-
- printk("\n");
-}
-
-
-static int dst_type_print (u8 type)
-{
- char *otype;
- switch (type) {
- case DST_TYPE_IS_SAT:
- otype = "satellite";
- break;
-
- case DST_TYPE_IS_TERR:
- otype = "terrestrial";
- break;
-
- case DST_TYPE_IS_CABLE:
- otype = "cable";
- break;
-
- default:
- printk("%s: invalid dst type %d\n", __FUNCTION__, type);
- return -EINVAL;
- }
- printk("DST type : %s\n", otype);
-
- return 0;
-}
-
-/*
- Known cards list
- Satellite
- -------------------
- 200103A
- VP-1020 DST-MOT LG(old), TS=188
-
- VP-1020 DST-03T LG(new), TS=204
- VP-1022 DST-03T LG(new), TS=204
- VP-1025 DST-03T LG(new), TS=204
-
- VP-1030 DSTMCI, LG(new), TS=188
- VP-1032 DSTMCI, LG(new), TS=188
-
- Cable
- -------------------
- VP-2030 DCT-CI, Samsung, TS=204
- VP-2021 DCT-CI, Unknown, TS=204
- VP-2031 DCT-CI, Philips, TS=188
- VP-2040 DCT-CI, Philips, TS=188, with CA daughter board
- VP-2040 DCT-CI, Philips, TS=204, without CA daughter board
-
- Terrestrial
- -------------------
- VP-3050 DTTNXT TS=188
- VP-3040 DTT-CI, Philips, TS=188
- VP-3040 DTT-CI, Philips, TS=204
-
- ATSC
- -------------------
- VP-3220 ATSCDI, TS=188
- VP-3250 ATSCAD, TS=188
-
-*/
-
-struct dst_types dst_tlist[] = {
- {
- .device_id = "200103A",
- .offset = 0,
- .dst_type = DST_TYPE_IS_SAT,
- .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1 | DST_TYPE_HAS_OBS_REGS,
- .dst_feature = 0
- }, /* obsolete */
-
- {
- .device_id = "DST-020",
- .offset = 0,
- .dst_type = DST_TYPE_IS_SAT,
- .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1,
- .dst_feature = 0
- }, /* obsolete */
-
- {
- .device_id = "DST-030",
- .offset = 0,
- .dst_type = DST_TYPE_IS_SAT,
- .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1,
- .dst_feature = 0
- }, /* obsolete */
-
- {
- .device_id = "DST-03T",
- .offset = 0,
- .dst_type = DST_TYPE_IS_SAT,
- .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_TS204 | DST_TYPE_HAS_FW_2,
- .dst_feature = DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4 | DST_TYPE_HAS_DISEQC5
- | DST_TYPE_HAS_MAC | DST_TYPE_HAS_MOTO
- },
-
- {
- .device_id = "DST-MOT",
- .offset = 0,
- .dst_type = DST_TYPE_IS_SAT,
- .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1,
- .dst_feature = 0
- }, /* obsolete */
-
- {
- .device_id = "DST-CI",
- .offset = 1,
- .dst_type = DST_TYPE_IS_SAT,
- .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1,
- .dst_feature = DST_TYPE_HAS_CA
- }, /* An OEM board */
-
- {
- .device_id = "DSTMCI",
- .offset = 1,
- .dst_type = DST_TYPE_IS_SAT,
- .type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD | DST_TYPE_HAS_INC_COUNT,
- .dst_feature = DST_TYPE_HAS_CA | DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4
- | DST_TYPE_HAS_MOTO | DST_TYPE_HAS_MAC
- },
-
- {
- .device_id = "DSTFCI",
- .offset = 1,
- .dst_type = DST_TYPE_IS_SAT,
- .type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1,
- .dst_feature = 0
- }, /* unknown to vendor */
-
- {
- .device_id = "DCT-CI",
- .offset = 1,
- .dst_type = DST_TYPE_IS_CABLE,
- .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1
- | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD,
- .dst_feature = DST_TYPE_HAS_CA
- },
-
- {
- .device_id = "DCTNEW",
- .offset = 1,
- .dst_type = DST_TYPE_IS_CABLE,
- .type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_3,
- .dst_feature = 0
- },
-
- {
- .device_id = "DTT-CI",
- .offset = 1,
- .dst_type = DST_TYPE_IS_TERR,
- .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD,
- .dst_feature = 0
- },
-
- {
- .device_id = "DTTDIG",
- .offset = 1,
- .dst_type = DST_TYPE_IS_TERR,
- .type_flags = DST_TYPE_HAS_FW_2,
- .dst_feature = 0
- },
-
- {
- .device_id = "DTTNXT",
- .offset = 1,
- .dst_type = DST_TYPE_IS_TERR,
- .type_flags = DST_TYPE_HAS_FW_2,
- .dst_feature = DST_TYPE_HAS_ANALOG
- },
-
- {
- .device_id = "ATSCDI",
- .offset = 1,
- .dst_type = DST_TYPE_IS_ATSC,
- .type_flags = DST_TYPE_HAS_FW_2,
- .dst_feature = 0
- },
-
- {
- .device_id = "ATSCAD",
- .offset = 1,
- .dst_type = DST_TYPE_IS_ATSC,
- .type_flags = DST_TYPE_HAS_FW_2,
- .dst_feature = 0
- },
-
- { }
-
-};
-
-
-static int dst_get_device_id(struct dst_state *state)
-{
- u8 reply;
-
- int i;
- struct dst_types *p_dst_type;
- u8 use_dst_type = 0;
- u32 use_type_flags = 0;
-
- static u8 device_type[8] = {0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff};
-
- device_type[7] = dst_check_sum(device_type, 7);
-
- if (write_dst(state, device_type, FIXED_COMM))
- return -1; /* Write failed */
-
- if ((dst_pio_disable(state)) < 0)
- return -1;
-
- if (read_dst(state, &reply, GET_ACK))
- return -1; /* Read failure */
-
- if (reply != ACK) {
- dprintk("%s: Write not Acknowledged! [Reply=0x%02x]\n", __FUNCTION__, reply);
- return -1; /* Unack'd write */
- }
-
- if (!dst_wait_dst_ready(state, DEVICE_INIT))
- return -1; /* DST not ready yet */
-
- if (read_dst(state, state->rxbuffer, FIXED_COMM))
- return -1;
-
- dst_pio_disable(state);
-
- if (state->rxbuffer[7] != dst_check_sum(state->rxbuffer, 7)) {
- dprintk("%s: Checksum failure! \n", __FUNCTION__);
- return -1; /* Checksum failure */
- }
-
- state->rxbuffer[7] = '\0';
-
- for (i = 0, p_dst_type = dst_tlist; i < ARRAY_SIZE (dst_tlist); i++, p_dst_type++) {
- if (!strncmp (&state->rxbuffer[p_dst_type->offset], p_dst_type->device_id, strlen (p_dst_type->device_id))) {
- use_type_flags = p_dst_type->type_flags;
- use_dst_type = p_dst_type->dst_type;
-
- /* Card capabilities */
- state->dst_hw_cap = p_dst_type->dst_feature;
- printk ("%s: Recognise [%s]\n", __FUNCTION__, p_dst_type->device_id);
-
- break;
- }
- }
-
- if (i >= sizeof (dst_tlist) / sizeof (dst_tlist [0])) {
- printk("%s: Unable to recognize %s or %s\n", __FUNCTION__, &state->rxbuffer[0], &state->rxbuffer[1]);
- printk("%s: please email linux-dvb@linuxtv.org with this type in\n", __FUNCTION__);
- use_dst_type = DST_TYPE_IS_SAT;
- use_type_flags = DST_TYPE_HAS_SYMDIV;
- }
-
- dst_type_print(use_dst_type);
- state->type_flags = use_type_flags;
- state->dst_type = use_dst_type;
- dst_type_flags_print(state->type_flags);
-
- if (state->type_flags & DST_TYPE_HAS_TS204) {
- dst_packsize(state, 204);
- }
-
- return 0;
-}
-
-static int dst_probe(struct dst_state *state)
-{
- if ((rdc_8820_reset(state)) < 0) {
- dprintk("%s: RDC 8820 RESET Failed.\n", __FUNCTION__);
- return -1;
- }
- if (dst_addons & DST_TYPE_HAS_CA)
- msleep(4000);
- else
- msleep(100);
-
- if ((dst_comm_init(state)) < 0) {
- dprintk("%s: DST Initialization Failed.\n", __FUNCTION__);
- return -1;
- }
- msleep(100);
- if (dst_get_device_id(state) < 0) {
- dprintk("%s: unknown device.\n", __FUNCTION__);
- return -1;
- }
-
- return 0;
-}
-
-int dst_command(struct dst_state* state, u8 * data, u8 len)
-{
- u8 reply;
- if ((dst_comm_init(state)) < 0) {
- dprintk("%s: DST Communication Initialization Failed.\n", __FUNCTION__);
- return -1;
- }
-
- if (write_dst(state, data, len)) {
- if (verbose > 1)
- dprintk("%s: Tring to recover.. \n", __FUNCTION__);
- if ((dst_error_recovery(state)) < 0) {
- dprintk("%s: Recovery Failed.\n", __FUNCTION__);
- return -1;
- }
- return -1;
- }
- if ((dst_pio_disable(state)) < 0) {
- dprintk("%s: PIO Disable Failed.\n", __FUNCTION__);
- return -1;
- }
- if (state->type_flags & DST_TYPE_HAS_FW_1)
- udelay(3000);
-
- if (read_dst(state, &reply, GET_ACK)) {
- if (verbose > 1)
- dprintk("%s: Trying to recover.. \n", __FUNCTION__);
- if ((dst_error_recovery(state)) < 0) {
- dprintk("%s: Recovery Failed.\n", __FUNCTION__);
- return -1;
- }
- return -1;
- }
-
- if (reply != ACK) {
- dprintk("%s: write not acknowledged 0x%02x \n", __FUNCTION__, reply);
- return -1;
- }
- if (len >= 2 && data[0] == 0 && (data[1] == 1 || data[1] == 3))
- return 0;
-
-// udelay(3000);
- if (state->type_flags & DST_TYPE_HAS_FW_1)
- udelay(3000);
- else
- udelay(2000);
-
- if (!dst_wait_dst_ready(state, NO_DELAY))
- return -1;
-
- if (read_dst(state, state->rxbuffer, FIXED_COMM)) {
- if (verbose > 1)
- dprintk("%s: Trying to recover.. \n", __FUNCTION__);
- if ((dst_error_recovery(state)) < 0) {
- dprintk("%s: Recovery failed.\n", __FUNCTION__);
- return -1;
- }
- return -1;
- }
-
- if (state->rxbuffer[7] != dst_check_sum(state->rxbuffer, 7)) {
- dprintk("%s: checksum failure\n", __FUNCTION__);
- return -1;
- }
-
- return 0;
-}
-EXPORT_SYMBOL(dst_command);
-
-static int dst_get_signal(struct dst_state* state)
-{
- int retval;
- u8 get_signal[] = { 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb };
- dprintk("%s: Getting Signal strength and other parameters\n", __FUNCTION__);
- if ((state->diseq_flags & ATTEMPT_TUNE) == 0) {
- state->decode_lock = state->decode_strength = state->decode_snr = 0;
- return 0;
- }
- if (0 == (state->diseq_flags & HAS_LOCK)) {
- state->decode_lock = state->decode_strength = state->decode_snr = 0;
- return 0;
- }
- if (time_after_eq(jiffies, state->cur_jiff + (HZ / 5))) {
- retval = dst_command(state, get_signal, 8);
- if (retval < 0)
- return retval;
- if (state->dst_type == DST_TYPE_IS_SAT) {
- state->decode_lock = ((state->rxbuffer[6] & 0x10) == 0) ? 1 : 0;
- state->decode_strength = state->rxbuffer[5] << 8;
- state->decode_snr = state->rxbuffer[2] << 8 | state->rxbuffer[3];
- } else if ((state->dst_type == DST_TYPE_IS_TERR) || (state->dst_type == DST_TYPE_IS_CABLE)) {
- state->decode_lock = (state->rxbuffer[1]) ? 1 : 0;
- state->decode_strength = state->rxbuffer[4] << 8;
- state->decode_snr = state->rxbuffer[3] << 8;
- }
- state->cur_jiff = jiffies;
- }
- return 0;
-}
-
-static int dst_tone_power_cmd(struct dst_state* state)
-{
- u8 paket[8] = { 0x00, 0x09, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00 };
-
- if (state->dst_type == DST_TYPE_IS_TERR)
- return 0;
-
- paket[4] = state->tx_tuna[4];
- paket[2] = state->tx_tuna[2];
- paket[3] = state->tx_tuna[3];
- paket[7] = dst_check_sum (paket, 7);
- dst_command(state, paket, 8);
-
- return 0;
-}
-
-static int dst_get_tuna(struct dst_state* state)
-{
- int retval;
-
- if ((state->diseq_flags & ATTEMPT_TUNE) == 0)
- return 0;
-
- state->diseq_flags &= ~(HAS_LOCK);
- if (!dst_wait_dst_ready(state, NO_DELAY))
- return 0;
-
- if (state->type_flags & DST_TYPE_HAS_NEWTUNE) {
- /* how to get variable length reply ???? */
- retval = read_dst(state, state->rx_tuna, 10);
- } else {
- retval = read_dst(state, &state->rx_tuna[2], FIXED_COMM);
- }
-
- if (retval < 0) {
- dprintk("%s: read not successful\n", __FUNCTION__);
- return 0;
- }
-
- if (state->type_flags & DST_TYPE_HAS_NEWTUNE) {
- if (state->rx_tuna[9] != dst_check_sum(&state->rx_tuna[0], 9)) {
- dprintk("%s: checksum failure?\n", __FUNCTION__);
- return 0;
- }
- } else {
- if (state->rx_tuna[9] != dst_check_sum(&state->rx_tuna[2], 7)) {
- dprintk("%s: checksum failure?\n", __FUNCTION__);
- return 0;
- }
- }
- if (state->rx_tuna[2] == 0 && state->rx_tuna[3] == 0)
- return 0;
- state->decode_freq = ((state->rx_tuna[2] & 0x7f) << 8) + state->rx_tuna[3];
-
- state->decode_lock = 1;
- state->diseq_flags |= HAS_LOCK;
-
- return 1;
-}
-
-static int dst_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage);
-
-static int dst_write_tuna(struct dvb_frontend* fe)
-{
- struct dst_state* state = fe->demodulator_priv;
- int retval;
- u8 reply;
-
- if (debug > 4)
- dprintk("%s: type_flags 0x%x \n", __FUNCTION__, state->type_flags);
-
- state->decode_freq = 0;
- state->decode_lock = state->decode_strength = state->decode_snr = 0;
- if (state->dst_type == DST_TYPE_IS_SAT) {
- if (!(state->diseq_flags & HAS_POWER))
- dst_set_voltage(fe, SEC_VOLTAGE_13);
- }
- state->diseq_flags &= ~(HAS_LOCK | ATTEMPT_TUNE);
-
- if ((dst_comm_init(state)) < 0) {
- dprintk("%s: DST Communication initialization failed.\n", __FUNCTION__);
- return -1;
- }
-
- if (state->type_flags & DST_TYPE_HAS_NEWTUNE) {
- state->tx_tuna[9] = dst_check_sum(&state->tx_tuna[0], 9);
- retval = write_dst(state, &state->tx_tuna[0], 10);
-
- } else {
- state->tx_tuna[9] = dst_check_sum(&state->tx_tuna[2], 7);
- retval = write_dst(state, &state->tx_tuna[2], FIXED_COMM);
- }
- if (retval < 0) {
- dst_pio_disable(state);
- dprintk("%s: write not successful\n", __FUNCTION__);
- return retval;
- }
-
- if ((dst_pio_disable(state)) < 0) {
- dprintk("%s: DST PIO disable failed !\n", __FUNCTION__);
- return -1;
- }
-
- if ((read_dst(state, &reply, GET_ACK) < 0)) {
- dprintk("%s: read verify not successful.\n", __FUNCTION__);
- return -1;
- }
- if (reply != ACK) {
- dprintk("%s: write not acknowledged 0x%02x \n", __FUNCTION__, reply);
- return 0;
- }
- state->diseq_flags |= ATTEMPT_TUNE;
-
- return dst_get_tuna(state);
-}
-
-/*
- * line22k0 0x00, 0x09, 0x00, 0xff, 0x01, 0x00, 0x00, 0x00
- * line22k1 0x00, 0x09, 0x01, 0xff, 0x01, 0x00, 0x00, 0x00
- * line22k2 0x00, 0x09, 0x02, 0xff, 0x01, 0x00, 0x00, 0x00
- * tone 0x00, 0x09, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00
- * data 0x00, 0x09, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00
- * power_off 0x00, 0x09, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00
- * power_on 0x00, 0x09, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00
- * Diseqc 1 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf0, 0xec
- * Diseqc 2 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf4, 0xe8
- * Diseqc 3 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf8, 0xe4
- * Diseqc 4 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xfc, 0xe0
- */
-
-static int dst_set_diseqc(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd* cmd)
-{
- struct dst_state* state = fe->demodulator_priv;
- u8 paket[8] = { 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf0, 0xec };
-
- if (state->dst_type != DST_TYPE_IS_SAT)
- return 0;
-
- if (cmd->msg_len == 0 || cmd->msg_len > 4)
- return -EINVAL;
- memcpy(&paket[3], cmd->msg, cmd->msg_len);
- paket[7] = dst_check_sum(&paket[0], 7);
- dst_command(state, paket, 8);
- return 0;
-}
-
-static int dst_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage)
-{
- int need_cmd;
- struct dst_state* state = fe->demodulator_priv;
-
- state->voltage = voltage;
-
- if (state->dst_type != DST_TYPE_IS_SAT)
- return 0;
-
- need_cmd = 0;
- switch (voltage) {
- case SEC_VOLTAGE_13:
- case SEC_VOLTAGE_18:
- if ((state->diseq_flags & HAS_POWER) == 0)
- need_cmd = 1;
- state->diseq_flags |= HAS_POWER;
- state->tx_tuna[4] = 0x01;
- break;
-
- case SEC_VOLTAGE_OFF:
- need_cmd = 1;
- state->diseq_flags &= ~(HAS_POWER | HAS_LOCK | ATTEMPT_TUNE);
- state->tx_tuna[4] = 0x00;
- break;
-
- default:
- return -EINVAL;
- }
- if (need_cmd)
- dst_tone_power_cmd(state);
-
- return 0;
-}
-
-static int dst_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
-{
- struct dst_state* state = fe->demodulator_priv;
-
- state->tone = tone;
-
- if (state->dst_type != DST_TYPE_IS_SAT)
- return 0;
-
- switch (tone) {
- case SEC_TONE_OFF:
- if (state->type_flags & DST_TYPE_HAS_OBS_REGS)
- state->tx_tuna[2] = 0x00;
- else
- state->tx_tuna[2] = 0xff;
-
- break;
-
- case SEC_TONE_ON:
- state->tx_tuna[2] = 0x02;
- break;
-
- default:
- return -EINVAL;
- }
- dst_tone_power_cmd(state);
-
- return 0;
-}
-
-static int dst_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t minicmd)
-{
- struct dst_state *state = fe->demodulator_priv;
-
- if (state->dst_type != DST_TYPE_IS_SAT)
- return 0;
-
- state->minicmd = minicmd;
-
- switch (minicmd) {
- case SEC_MINI_A:
- state->tx_tuna[3] = 0x02;
- break;
- case SEC_MINI_B:
- state->tx_tuna[3] = 0xff;
- break;
- }
- dst_tone_power_cmd(state);
-
- return 0;
-}
-
-
-static int dst_init(struct dvb_frontend* fe)
-{
- struct dst_state* state = fe->demodulator_priv;
- static u8 ini_satci_tuna[] = { 9, 0, 3, 0xb6, 1, 0, 0x73, 0x21, 0, 0 };
- static u8 ini_satfta_tuna[] = { 0, 0, 3, 0xb6, 1, 0x55, 0xbd, 0x50, 0, 0 };
- static u8 ini_tvfta_tuna[] = { 0, 0, 3, 0xb6, 1, 7, 0x0, 0x0, 0, 0 };
- static u8 ini_tvci_tuna[] = { 9, 0, 3, 0xb6, 1, 7, 0x0, 0x0, 0, 0 };
- static u8 ini_cabfta_tuna[] = { 0, 0, 3, 0xb6, 1, 7, 0x0, 0x0, 0, 0 };
- static u8 ini_cabci_tuna[] = { 9, 0, 3, 0xb6, 1, 7, 0x0, 0x0, 0, 0 };
-// state->inversion = INVERSION_ON;
- state->inversion = INVERSION_OFF;
- state->voltage = SEC_VOLTAGE_13;
- state->tone = SEC_TONE_OFF;
- state->symbol_rate = 29473000;
- state->fec = FEC_AUTO;
- state->diseq_flags = 0;
- state->k22 = 0x02;
- state->bandwidth = BANDWIDTH_7_MHZ;
- state->cur_jiff = jiffies;
- if (state->dst_type == DST_TYPE_IS_SAT) {
- state->frequency = 950000;
- memcpy(state->tx_tuna, ((state->type_flags & DST_TYPE_HAS_NEWTUNE) ? ini_satci_tuna : ini_satfta_tuna), sizeof(ini_satfta_tuna));
- } else if (state->dst_type == DST_TYPE_IS_TERR) {
- state->frequency = 137000000;
- memcpy(state->tx_tuna, ((state->type_flags & DST_TYPE_HAS_NEWTUNE) ? ini_tvci_tuna : ini_tvfta_tuna), sizeof(ini_tvfta_tuna));
- } else if (state->dst_type == DST_TYPE_IS_CABLE) {
- state->frequency = 51000000;
- memcpy(state->tx_tuna, ((state->type_flags & DST_TYPE_HAS_NEWTUNE) ? ini_cabci_tuna : ini_cabfta_tuna), sizeof(ini_cabfta_tuna));
- }
-
- return 0;
-}
-
-static int dst_read_status(struct dvb_frontend* fe, fe_status_t* status)
-{
- struct dst_state* state = fe->demodulator_priv;
-
- *status = 0;
- if (state->diseq_flags & HAS_LOCK) {
-// dst_get_signal(state); // don't require(?) to ask MCU
- if (state->decode_lock)
- *status |= FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_SYNC | FE_HAS_VITERBI;
- }
-
- return 0;
-}
-
-static int dst_read_signal_strength(struct dvb_frontend* fe, u16* strength)
-{
- struct dst_state* state = fe->demodulator_priv;
-
- dst_get_signal(state);
- *strength = state->decode_strength;
-
- return 0;
-}
-
-static int dst_read_snr(struct dvb_frontend* fe, u16* snr)
-{
- struct dst_state* state = fe->demodulator_priv;
-
- dst_get_signal(state);
- *snr = state->decode_snr;
-
- return 0;
-}
-
-static int dst_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
-{
- struct dst_state* state = fe->demodulator_priv;
-
- dst_set_freq(state, p->frequency);
- if (verbose > 4)
- dprintk("Set Frequency=[%d]\n", p->frequency);
-
-// dst_set_inversion(state, p->inversion);
- if (state->dst_type == DST_TYPE_IS_SAT) {
- if (state->type_flags & DST_TYPE_HAS_OBS_REGS)
- dst_set_inversion(state, p->inversion);
-
- dst_set_fec(state, p->u.qpsk.fec_inner);
- dst_set_symbolrate(state, p->u.qpsk.symbol_rate);
- dst_set_polarization(state);
- if (verbose > 4)
- dprintk("Set Symbolrate=[%d]\n", p->u.qpsk.symbol_rate);
-
- } else if (state->dst_type == DST_TYPE_IS_TERR) {
- dst_set_bandwidth(state, p->u.ofdm.bandwidth);
- } else if (state->dst_type == DST_TYPE_IS_CABLE) {
- dst_set_fec(state, p->u.qam.fec_inner);
- dst_set_symbolrate(state, p->u.qam.symbol_rate);
- dst_set_modulation(state, p->u.qam.modulation);
- }
- dst_write_tuna(fe);
-
- return 0;
-}
-
-static int dst_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
-{
- struct dst_state* state = fe->demodulator_priv;
-
- p->frequency = state->decode_freq;
-// p->inversion = state->inversion;
- if (state->dst_type == DST_TYPE_IS_SAT) {
- if (state->type_flags & DST_TYPE_HAS_OBS_REGS)
- p->inversion = state->inversion;
-
- p->u.qpsk.symbol_rate = state->symbol_rate;
- p->u.qpsk.fec_inner = dst_get_fec(state);
- } else if (state->dst_type == DST_TYPE_IS_TERR) {
- p->u.ofdm.bandwidth = state->bandwidth;
- } else if (state->dst_type == DST_TYPE_IS_CABLE) {
- p->u.qam.symbol_rate = state->symbol_rate;
- p->u.qam.fec_inner = dst_get_fec(state);
-// p->u.qam.modulation = QAM_AUTO;
- p->u.qam.modulation = dst_get_modulation(state);
- }
-
- return 0;
-}
-
-static void dst_release(struct dvb_frontend* fe)
-{
- struct dst_state* state = fe->demodulator_priv;
- kfree(state);
-}
-
-static struct dvb_frontend_ops dst_dvbt_ops;
-static struct dvb_frontend_ops dst_dvbs_ops;
-static struct dvb_frontend_ops dst_dvbc_ops;
-
-struct dst_state* dst_attach(struct dst_state *state, struct dvb_adapter *dvb_adapter)
-{
-
- /* check if the ASIC is there */
- if (dst_probe(state) < 0) {
- if (state)
- kfree(state);
-
- return NULL;
- }
- /* determine settings based on type */
- switch (state->dst_type) {
- case DST_TYPE_IS_TERR:
- memcpy(&state->ops, &dst_dvbt_ops, sizeof(struct dvb_frontend_ops));
- break;
-
- case DST_TYPE_IS_CABLE:
- memcpy(&state->ops, &dst_dvbc_ops, sizeof(struct dvb_frontend_ops));
- break;
-
- case DST_TYPE_IS_SAT:
- memcpy(&state->ops, &dst_dvbs_ops, sizeof(struct dvb_frontend_ops));
- break;
-
- default:
- printk("%s: unknown DST type. please report to the LinuxTV.org DVB mailinglist.\n", __FUNCTION__);
- if (state)
- kfree(state);
-
- return NULL;
- }
-
- /* create dvb_frontend */
- state->frontend.ops = &state->ops;
- state->frontend.demodulator_priv = state;
-
- return state; /* Manu (DST is a card not a frontend) */
-}
-
-EXPORT_SYMBOL(dst_attach);
-
-static struct dvb_frontend_ops dst_dvbt_ops = {
-
- .info = {
- .name = "DST DVB-T",
- .type = FE_OFDM,
- .frequency_min = 137000000,
- .frequency_max = 858000000,
- .frequency_stepsize = 166667,
- .caps = FE_CAN_FEC_AUTO | FE_CAN_QAM_AUTO | FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO
- },
-
- .release = dst_release,
-
- .init = dst_init,
-
- .set_frontend = dst_set_frontend,
- .get_frontend = dst_get_frontend,
-
- .read_status = dst_read_status,
- .read_signal_strength = dst_read_signal_strength,
- .read_snr = dst_read_snr,
-};
-
-static struct dvb_frontend_ops dst_dvbs_ops = {
-
- .info = {
- .name = "DST DVB-S",
- .type = FE_QPSK,
- .frequency_min = 950000,
- .frequency_max = 2150000,
- .frequency_stepsize = 1000, /* kHz for QPSK frontends */
- .frequency_tolerance = 29500,
- .symbol_rate_min = 1000000,
- .symbol_rate_max = 45000000,
- /* . symbol_rate_tolerance = ???,*/
- .caps = FE_CAN_FEC_AUTO | FE_CAN_QPSK
- },
-
- .release = dst_release,
-
- .init = dst_init,
-
- .set_frontend = dst_set_frontend,
- .get_frontend = dst_get_frontend,
-
- .read_status = dst_read_status,
- .read_signal_strength = dst_read_signal_strength,
- .read_snr = dst_read_snr,
-
- .diseqc_send_burst = dst_send_burst,
- .diseqc_send_master_cmd = dst_set_diseqc,
- .set_voltage = dst_set_voltage,
- .set_tone = dst_set_tone,
-};
-
-static struct dvb_frontend_ops dst_dvbc_ops = {
-
- .info = {
- .name = "DST DVB-C",
- .type = FE_QAM,
- .frequency_stepsize = 62500,
- .frequency_min = 51000000,
- .frequency_max = 858000000,
- .symbol_rate_min = 1000000,
- .symbol_rate_max = 45000000,
- /* . symbol_rate_tolerance = ???,*/
- .caps = FE_CAN_FEC_AUTO | FE_CAN_QAM_AUTO
- },
-
- .release = dst_release,
-
- .init = dst_init,
-
- .set_frontend = dst_set_frontend,
- .get_frontend = dst_get_frontend,
-
- .read_status = dst_read_status,
- .read_signal_strength = dst_read_signal_strength,
- .read_snr = dst_read_snr,
-};
-
-
-MODULE_DESCRIPTION("DST DVB-S/T/C Combo Frontend driver");
-MODULE_AUTHOR("Jamie Honan, Manu Abraham");
-MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/bt8xx/dst_ca.c b/drivers/media/dvb/bt8xx/dst_ca.c
deleted file mode 100644
index bfaacd5fc20..00000000000
--- a/drivers/media/dvb/bt8xx/dst_ca.c
+++ /dev/null
@@ -1,764 +0,0 @@
-/*
- CA-driver for TwinHan DST Frontend/Card
-
- Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/string.h>
-
-#include <linux/dvb/ca.h>
-#include "dvbdev.h"
-#include "dvb_frontend.h"
-
-#include "dst_ca.h"
-#include "dst_common.h"
-
-static unsigned int verbose = 5;
-module_param(verbose, int, 0644);
-MODULE_PARM_DESC(verbose, "verbose startup messages, default is 1 (yes)");
-
-static unsigned int debug = 1;
-module_param(debug, int, 0644);
-MODULE_PARM_DESC(debug, "debug messages, default is 1 (yes)");
-
-#define dprintk if (debug) printk
-
-/* Need some more work */
-static int ca_set_slot_descr(void)
-{
- /* We could make this more graceful ? */
- return -EOPNOTSUPP;
-}
-
-/* Need some more work */
-static int ca_set_pid(void)
-{
- /* We could make this more graceful ? */
- return -EOPNOTSUPP;
-}
-
-
-static int put_checksum(u8 *check_string, int length)
-{
- u8 i = 0, checksum = 0;
-
- if (verbose > 3) {
- dprintk("%s: ========================= Checksum calculation ===========================\n", __FUNCTION__);
- dprintk("%s: String Length=[0x%02x]\n", __FUNCTION__, length);
-
- dprintk("%s: String=[", __FUNCTION__);
- }
- while (i < length) {
- if (verbose > 3)
- dprintk(" %02x", check_string[i]);
- checksum += check_string[i];
- i++;
- }
- if (verbose > 3) {
- dprintk(" ]\n");
- dprintk("%s: Sum=[%02x]\n", __FUNCTION__, checksum);
- }
- check_string[length] = ~checksum + 1;
- if (verbose > 3) {
- dprintk("%s: Checksum=[%02x]\n", __FUNCTION__, check_string[length]);
- dprintk("%s: ==========================================================================\n", __FUNCTION__);
- }
-
- return 0;
-}
-
-static int dst_ci_command(struct dst_state* state, u8 * data, u8 *ca_string, u8 len, int read)
-{
- u8 reply;
-
- dst_comm_init(state);
- msleep(65);
-
- if (write_dst(state, data, len)) {
- dprintk("%s: Write not successful, trying to recover\n", __FUNCTION__);
- dst_error_recovery(state);
- return -1;
- }
-
- if ((dst_pio_disable(state)) < 0) {
- dprintk("%s: DST PIO disable failed.\n", __FUNCTION__);
- return -1;
- }
-
- if (read_dst(state, &reply, GET_ACK) < 0) {
- dprintk("%s: Read not successful, trying to recover\n", __FUNCTION__);
- dst_error_recovery(state);
- return -1;
- }
-
- if (read) {
- if (! dst_wait_dst_ready(state, LONG_DELAY)) {
- dprintk("%s: 8820 not ready\n", __FUNCTION__);
- return -1;
- }
-
- if (read_dst(state, ca_string, 128) < 0) { /* Try to make this dynamic */
- dprintk("%s: Read not successful, trying to recover\n", __FUNCTION__);
- dst_error_recovery(state);
- return -1;
- }
- }
-
- return 0;
-}
-
-
-static int dst_put_ci(struct dst_state *state, u8 *data, int len, u8 *ca_string, int read)
-{
- u8 dst_ca_comm_err = 0;
-
- while (dst_ca_comm_err < RETRIES) {
- dst_comm_init(state);
- if (verbose > 2)
- dprintk("%s: Put Command\n", __FUNCTION__);
- if (dst_ci_command(state, data, ca_string, len, read)) { // If error
- dst_error_recovery(state);
- dst_ca_comm_err++; // work required here.
- }
- break;
- }
-
- return 0;
-}
-
-
-
-static int ca_get_app_info(struct dst_state *state)
-{
- static u8 command[8] = {0x07, 0x40, 0x01, 0x00, 0x01, 0x00, 0x00, 0xff};
-
- put_checksum(&command[0], command[0]);
- if ((dst_put_ci(state, command, sizeof(command), state->messages, GET_REPLY)) < 0) {
- dprintk("%s: -->dst_put_ci FAILED !\n", __FUNCTION__);
- return -1;
- }
- if (verbose > 1) {
- dprintk("%s: -->dst_put_ci SUCCESS !\n", __FUNCTION__);
-
- dprintk("%s: ================================ CI Module Application Info ======================================\n", __FUNCTION__);
- dprintk("%s: Application Type=[%d], Application Vendor=[%d], Vendor Code=[%d]\n%s: Application info=[%s]\n",
- __FUNCTION__, state->messages[7], (state->messages[8] << 8) | state->messages[9],
- (state->messages[10] << 8) | state->messages[11], __FUNCTION__, (char *)(&state->messages[12]));
- dprintk("%s: ==================================================================================================\n", __FUNCTION__);
- }
-
- return 0;
-}
-
-static int ca_get_slot_caps(struct dst_state *state, struct ca_caps *p_ca_caps, void *arg)
-{
- int i;
- u8 slot_cap[256];
- static u8 slot_command[8] = {0x07, 0x40, 0x02, 0x00, 0x02, 0x00, 0x00, 0xff};
-
- put_checksum(&slot_command[0], slot_command[0]);
- if ((dst_put_ci(state, slot_command, sizeof (slot_command), slot_cap, GET_REPLY)) < 0) {
- dprintk("%s: -->dst_put_ci FAILED !\n", __FUNCTION__);
- return -1;
- }
- if (verbose > 1)
- dprintk("%s: -->dst_put_ci SUCCESS !\n", __FUNCTION__);
-
- /* Will implement the rest soon */
-
- if (verbose > 1) {
- dprintk("%s: Slot cap = [%d]\n", __FUNCTION__, slot_cap[7]);
- dprintk("===================================\n");
- for (i = 0; i < 8; i++)
- dprintk(" %d", slot_cap[i]);
- dprintk("\n");
- }
-
- p_ca_caps->slot_num = 1;
- p_ca_caps->slot_type = 1;
- p_ca_caps->descr_num = slot_cap[7];
- p_ca_caps->descr_type = 1;
-
-
- if (copy_to_user((struct ca_caps *)arg, p_ca_caps, sizeof (struct ca_caps))) {
- return -EFAULT;
- }
-
- return 0;
-}
-
-/* Need some more work */
-static int ca_get_slot_descr(struct dst_state *state, struct ca_msg *p_ca_message, void *arg)
-{
- return -EOPNOTSUPP;
-}
-
-
-static int ca_get_slot_info(struct dst_state *state, struct ca_slot_info *p_ca_slot_info, void *arg)
-{
- int i;
- static u8 slot_command[8] = {0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff};
-
- u8 *slot_info = state->rxbuffer;
-
- put_checksum(&slot_command[0], 7);
- if ((dst_put_ci(state, slot_command, sizeof (slot_command), slot_info, GET_REPLY)) < 0) {
- dprintk("%s: -->dst_put_ci FAILED !\n", __FUNCTION__);
- return -1;
- }
- if (verbose > 1)
- dprintk("%s: -->dst_put_ci SUCCESS !\n", __FUNCTION__);
-
- /* Will implement the rest soon */
-
- if (verbose > 1) {
- dprintk("%s: Slot info = [%d]\n", __FUNCTION__, slot_info[3]);
- dprintk("===================================\n");
- for (i = 0; i < 8; i++)
- dprintk(" %d", slot_info[i]);
- dprintk("\n");
- }
-
- if (slot_info[4] & 0x80) {
- p_ca_slot_info->flags = CA_CI_MODULE_PRESENT;
- p_ca_slot_info->num = 1;
- p_ca_slot_info->type = CA_CI;
- }
- else if (slot_info[4] & 0x40) {
- p_ca_slot_info->flags = CA_CI_MODULE_READY;
- p_ca_slot_info->num = 1;
- p_ca_slot_info->type = CA_CI;
- }
- else {
- p_ca_slot_info->flags = 0;
- }
-
- if (copy_to_user((struct ca_slot_info *)arg, p_ca_slot_info, sizeof (struct ca_slot_info))) {
- return -EFAULT;
- }
-
- return 0;
-}
-
-
-
-
-static int ca_get_message(struct dst_state *state, struct ca_msg *p_ca_message, void *arg)
-{
- u8 i = 0;
- u32 command = 0;
-
- if (copy_from_user(p_ca_message, (void *)arg, sizeof (struct ca_msg)))
- return -EFAULT;
-
-
- if (p_ca_message->msg) {
- if (verbose > 3)
- dprintk("Message = [%02x %02x %02x]\n", p_ca_message->msg[0], p_ca_message->msg[1], p_ca_message->msg[2]);
-
- for (i = 0; i < 3; i++) {
- command = command | p_ca_message->msg[i];
- if (i < 2)
- command = command << 8;
- }
- if (verbose > 3)
- dprintk("%s:Command=[0x%x]\n", __FUNCTION__, command);
-
- switch (command) {
- case CA_APP_INFO:
- memcpy(p_ca_message->msg, state->messages, 128);
- if (copy_to_user((void *)arg, p_ca_message, sizeof (struct ca_msg)) )
- return -EFAULT;
- break;
- }
- }
-
- return 0;
-}
-
-static int handle_dst_tag(struct dst_state *state, struct ca_msg *p_ca_message, struct ca_msg *hw_buffer, u32 length)
-{
- if (state->dst_hw_cap & DST_TYPE_HAS_SESSION) {
- hw_buffer->msg[2] = p_ca_message->msg[1]; /* MSB */
- hw_buffer->msg[3] = p_ca_message->msg[2]; /* LSB */
- }
- else {
- hw_buffer->msg[0] = (length & 0xff) + 7;
- hw_buffer->msg[1] = 0x40;
- hw_buffer->msg[2] = 0x03;
- hw_buffer->msg[3] = 0x00;
- hw_buffer->msg[4] = 0x03;
- hw_buffer->msg[5] = length & 0xff;
- hw_buffer->msg[6] = 0x00;
- }
- return 0;
-}
-
-
-static int write_to_8820(struct dst_state *state, struct ca_msg *hw_buffer, u8 length, u8 reply)
-{
- if ((dst_put_ci(state, hw_buffer->msg, length, hw_buffer->msg, reply)) < 0) {
- dprintk("%s: DST-CI Command failed.\n", __FUNCTION__);
- dprintk("%s: Resetting DST.\n", __FUNCTION__);
- rdc_reset_state(state);
- return -1;
- }
- if (verbose > 2)
- dprintk("%s: DST-CI Command succes.\n", __FUNCTION__);
-
- return 0;
-}
-
-u32 asn_1_decode(u8 *asn_1_array)
-{
- u8 length_field = 0, word_count = 0, count = 0;
- u32 length = 0;
-
- length_field = asn_1_array[0];
- dprintk("%s: Length field=[%02x]\n", __FUNCTION__, length_field);
- if (length_field < 0x80) {
- length = length_field & 0x7f;
- dprintk("%s: Length=[%02x]\n", __FUNCTION__, length);
- } else {
- word_count = length_field & 0x7f;
- for (count = 0; count < word_count; count++) {
- length = (length | asn_1_array[count + 1]) << 8;
- dprintk("%s: Length=[%04x]\n", __FUNCTION__, length);
- }
- }
- return length;
-}
-
-static int init_buffer(u8 *buffer, u32 length)
-{
- u32 i;
- for (i = 0; i < length; i++)
- buffer[i] = 0;
-
- return 0;
-}
-
-static int debug_string(u8 *msg, u32 length, u32 offset)
-{
- u32 i;
-
- dprintk(" String=[ ");
- for (i = offset; i < length; i++)
- dprintk("%02x ", msg[i]);
- dprintk("]\n");
-
- return 0;
-}
-
-static int copy_string(u8 *destination, u8 *source, u32 dest_offset, u32 source_offset, u32 length)
-{
- u32 i;
- dprintk("%s: Copying [", __FUNCTION__);
- for (i = 0; i < length; i++) {
- destination[i + dest_offset] = source[i + source_offset];
- dprintk(" %02x", source[i + source_offset]);
- }
- dprintk("]\n");
-
- return i;
-}
-
-static int modify_4_bits(u8 *message, u32 pos)
-{
- message[pos] &= 0x0f;
-
- return 0;
-}
-
-
-
-static int ca_set_pmt(struct dst_state *state, struct ca_msg *p_ca_message, struct ca_msg *hw_buffer, u8 reply, u8 query)
-{
- u32 length = 0, count = 0;
- u8 asn_1_words, program_header_length;
- u16 program_info_length = 0, es_info_length = 0;
- u32 hw_offset = 0, buf_offset = 0, i;
- u8 dst_tag_length;
-
- length = asn_1_decode(&p_ca_message->msg[3]);
- dprintk("%s: CA Message length=[%d]\n", __FUNCTION__, length);
- dprintk("%s: ASN.1 ", __FUNCTION__);
- debug_string(&p_ca_message->msg[4], length, 0); // length does not include tag and length
-
- init_buffer(hw_buffer->msg, length);
- handle_dst_tag(state, p_ca_message, hw_buffer, length);
-
- hw_offset = 7;
- asn_1_words = 1; // just a hack to test, should compute this one
- buf_offset = 3;
- program_header_length = 6;
- dst_tag_length = 7;
-
-// debug_twinhan_ca_params(state, p_ca_message, hw_buffer, reply, query, length, hw_offset, buf_offset);
-// dprintk("%s: Program Header(BUF)", __FUNCTION__);
-// debug_string(&p_ca_message->msg[4], program_header_length, 0);
-// dprintk("%s: Copying Program header\n", __FUNCTION__);
- copy_string(hw_buffer->msg, p_ca_message->msg, hw_offset, (buf_offset + asn_1_words), program_header_length);
- buf_offset += program_header_length, hw_offset += program_header_length;
- modify_4_bits(hw_buffer->msg, (hw_offset - 2));
- if (state->type_flags & DST_TYPE_HAS_INC_COUNT) { // workaround
- dprintk("%s: Probably an ASIC bug !!!\n", __FUNCTION__);
- debug_string(hw_buffer->msg, (hw_offset + program_header_length), 0);
- hw_buffer->msg[hw_offset - 1] += 1;
- }
-
-// dprintk("%s: Program Header(HW), Count=[%d]", __FUNCTION__, count);
-// debug_string(hw_buffer->msg, hw_offset, 0);
-
- program_info_length = ((program_info_length | (p_ca_message->msg[buf_offset - 1] & 0x0f)) << 8) | p_ca_message->msg[buf_offset];
- dprintk("%s: Program info length=[%02x]\n", __FUNCTION__, program_info_length);
- if (program_info_length) {
- count = copy_string(hw_buffer->msg, p_ca_message->msg, hw_offset, (buf_offset + 1), (program_info_length + 1) ); // copy next elem, not current
- buf_offset += count, hw_offset += count;
-// dprintk("%s: Program level ", __FUNCTION__);
-// debug_string(hw_buffer->msg, hw_offset, 0);
- }
-
- buf_offset += 1;// hw_offset += 1;
- for (i = buf_offset; i < length; i++) {
-// dprintk("%s: Stream Header ", __FUNCTION__);
- count = copy_string(hw_buffer->msg, p_ca_message->msg, hw_offset, buf_offset, 5);
- modify_4_bits(hw_buffer->msg, (hw_offset + 3));
-
- hw_offset += 5, buf_offset += 5, i += 4;
-// debug_string(hw_buffer->msg, hw_offset, (hw_offset - 5));
- es_info_length = ((es_info_length | (p_ca_message->msg[buf_offset - 1] & 0x0f)) << 8) | p_ca_message->msg[buf_offset];
- dprintk("%s: ES info length=[%02x]\n", __FUNCTION__, es_info_length);
- if (es_info_length) {
- // copy descriptors @ STREAM level
- dprintk("%s: Descriptors @ STREAM level...!!! \n", __FUNCTION__);
- }
-
- }
- hw_buffer->msg[length + dst_tag_length] = dst_check_sum(hw_buffer->msg, (length + dst_tag_length));
-// dprintk("%s: Total length=[%d], Checksum=[%02x]\n", __FUNCTION__, (length + dst_tag_length), hw_buffer->msg[length + dst_tag_length]);
- debug_string(hw_buffer->msg, (length + dst_tag_length + 1), 0); // dst tags also
- write_to_8820(state, hw_buffer, (length + dst_tag_length + 1), reply); // checksum
-
- return 0;
-}
-
-
-/* Board supports CA PMT reply ? */
-static int dst_check_ca_pmt(struct dst_state *state, struct ca_msg *p_ca_message, struct ca_msg *hw_buffer)
-{
- int ca_pmt_reply_test = 0;
-
- /* Do test board */
- /* Not there yet but soon */
-
-
- /* CA PMT Reply capable */
- if (ca_pmt_reply_test) {
- if ((ca_set_pmt(state, p_ca_message, hw_buffer, 1, GET_REPLY)) < 0) {
- dprintk("%s: ca_set_pmt.. failed !\n", __FUNCTION__);
- return -1;
- }
-
- /* Process CA PMT Reply */
- /* will implement soon */
- dprintk("%s: Not there yet\n", __FUNCTION__);
- }
- /* CA PMT Reply not capable */
- if (!ca_pmt_reply_test) {
- if ((ca_set_pmt(state, p_ca_message, hw_buffer, 0, NO_REPLY)) < 0) {
- dprintk("%s: ca_set_pmt.. failed !\n", __FUNCTION__);
- return -1;
- }
- if (verbose > 3)
- dprintk("%s: ca_set_pmt.. success !\n", __FUNCTION__);
- /* put a dummy message */
-
- }
- return 0;
-}
-
-static int ca_send_message(struct dst_state *state, struct ca_msg *p_ca_message, void *arg)
-{
- int i = 0;
- unsigned int ca_message_header_len;
-
- u32 command = 0;
- struct ca_msg *hw_buffer;
-
- if ((hw_buffer = (struct ca_msg *) kmalloc(sizeof (struct ca_msg), GFP_KERNEL)) == NULL) {
- dprintk("%s: Memory allocation failure\n", __FUNCTION__);
- return -ENOMEM;
- }
- if (verbose > 3)
- dprintk("%s\n", __FUNCTION__);
-
- if (copy_from_user(p_ca_message, (void *)arg, sizeof (struct ca_msg)))
- return -EFAULT;
-
- if (p_ca_message->msg) {
- ca_message_header_len = p_ca_message->length; /* Restore it back when you are done */
- /* EN50221 tag */
- command = 0;
-
- for (i = 0; i < 3; i++) {
- command = command | p_ca_message->msg[i];
- if (i < 2)
- command = command << 8;
- }
- if (verbose > 3)
- dprintk("%s:Command=[0x%x]\n", __FUNCTION__, command);
-
- switch (command) {
- case CA_PMT:
- if (verbose > 3)
-// dprintk("Command = SEND_CA_PMT\n");
- dprintk("Command = SEND_CA_PMT\n");
-// if ((ca_set_pmt(state, p_ca_message, hw_buffer, 0, 0)) < 0) {
- if ((ca_set_pmt(state, p_ca_message, hw_buffer, 0, 0)) < 0) { // code simplification started
- dprintk("%s: -->CA_PMT Failed !\n", __FUNCTION__);
- return -1;
- }
- if (verbose > 3)
- dprintk("%s: -->CA_PMT Success !\n", __FUNCTION__);
-// retval = dummy_set_pmt(state, p_ca_message, hw_buffer, 0, 0);
-
- break;
-
- case CA_PMT_REPLY:
- if (verbose > 3)
- dprintk("Command = CA_PMT_REPLY\n");
- /* Have to handle the 2 basic types of cards here */
- if ((dst_check_ca_pmt(state, p_ca_message, hw_buffer)) < 0) {
- dprintk("%s: -->CA_PMT_REPLY Failed !\n", __FUNCTION__);
- return -1;
- }
- if (verbose > 3)
- dprintk("%s: -->CA_PMT_REPLY Success !\n", __FUNCTION__);
-
- /* Certain boards do behave different ? */
-// retval = ca_set_pmt(state, p_ca_message, hw_buffer, 1, 1);
-
- case CA_APP_INFO_ENQUIRY: // only for debugging
- if (verbose > 3)
- dprintk("%s: Getting Cam Application information\n", __FUNCTION__);
-
- if ((ca_get_app_info(state)) < 0) {
- dprintk("%s: -->CA_APP_INFO_ENQUIRY Failed !\n", __FUNCTION__);
- return -1;
- }
- if (verbose > 3)
- dprintk("%s: -->CA_APP_INFO_ENQUIRY Success !\n", __FUNCTION__);
-
- break;
- }
- }
- return 0;
-}
-
-static int dst_ca_ioctl(struct inode *inode, struct file *file, unsigned int cmd, void *arg)
-{
- struct dvb_device* dvbdev = (struct dvb_device*) file->private_data;
- struct dst_state* state = (struct dst_state*) dvbdev->priv;
- struct ca_slot_info *p_ca_slot_info;
- struct ca_caps *p_ca_caps;
- struct ca_msg *p_ca_message;
-
- if ((p_ca_message = (struct ca_msg *) kmalloc(sizeof (struct ca_msg), GFP_KERNEL)) == NULL) {
- dprintk("%s: Memory allocation failure\n", __FUNCTION__);
- return -ENOMEM;
- }
-
- if ((p_ca_slot_info = (struct ca_slot_info *) kmalloc(sizeof (struct ca_slot_info), GFP_KERNEL)) == NULL) {
- dprintk("%s: Memory allocation failure\n", __FUNCTION__);
- return -ENOMEM;
- }
-
- if ((p_ca_caps = (struct ca_caps *) kmalloc(sizeof (struct ca_caps), GFP_KERNEL)) == NULL) {
- dprintk("%s: Memory allocation failure\n", __FUNCTION__);
- return -ENOMEM;
- }
-
- /* We have now only the standard ioctl's, the driver is upposed to handle internals. */
- switch (cmd) {
- case CA_SEND_MSG:
- if (verbose > 1)
- dprintk("%s: Sending message\n", __FUNCTION__);
- if ((ca_send_message(state, p_ca_message, arg)) < 0) {
- dprintk("%s: -->CA_SEND_MSG Failed !\n", __FUNCTION__);
- return -1;
- }
-
- break;
-
- case CA_GET_MSG:
- if (verbose > 1)
- dprintk("%s: Getting message\n", __FUNCTION__);
- if ((ca_get_message(state, p_ca_message, arg)) < 0) {
- dprintk("%s: -->CA_GET_MSG Failed !\n", __FUNCTION__);
- return -1;
- }
- if (verbose > 1)
- dprintk("%s: -->CA_GET_MSG Success !\n", __FUNCTION__);
-
- break;
-
- case CA_RESET:
- if (verbose > 1)
- dprintk("%s: Resetting DST\n", __FUNCTION__);
- dst_error_bailout(state);
- msleep(4000);
-
- break;
-
- case CA_GET_SLOT_INFO:
- if (verbose > 1)
- dprintk("%s: Getting Slot info\n", __FUNCTION__);
- if ((ca_get_slot_info(state, p_ca_slot_info, arg)) < 0) {
- dprintk("%s: -->CA_GET_SLOT_INFO Failed !\n", __FUNCTION__);
- return -1;
- }
- if (verbose > 1)
- dprintk("%s: -->CA_GET_SLOT_INFO Success !\n", __FUNCTION__);
-
- break;
-
- case CA_GET_CAP:
- if (verbose > 1)
- dprintk("%s: Getting Slot capabilities\n", __FUNCTION__);
- if ((ca_get_slot_caps(state, p_ca_caps, arg)) < 0) {
- dprintk("%s: -->CA_GET_CAP Failed !\n", __FUNCTION__);
- return -1;
- }
- if (verbose > 1)
- dprintk("%s: -->CA_GET_CAP Success !\n", __FUNCTION__);
-
- break;
-
- case CA_GET_DESCR_INFO:
- if (verbose > 1)
- dprintk("%s: Getting descrambler description\n", __FUNCTION__);
- if ((ca_get_slot_descr(state, p_ca_message, arg)) < 0) {
- dprintk("%s: -->CA_GET_DESCR_INFO Failed !\n", __FUNCTION__);
- return -1;
- }
- if (verbose > 1)
- dprintk("%s: -->CA_GET_DESCR_INFO Success !\n", __FUNCTION__);
-
- break;
-
- case CA_SET_DESCR:
- if (verbose > 1)
- dprintk("%s: Setting descrambler\n", __FUNCTION__);
- if ((ca_set_slot_descr()) < 0) {
- dprintk("%s: -->CA_SET_DESCR Failed !\n", __FUNCTION__);
- return -1;
- }
- if (verbose > 1)
- dprintk("%s: -->CA_SET_DESCR Success !\n", __FUNCTION__);
-
- break;
-
- case CA_SET_PID:
- if (verbose > 1)
- dprintk("%s: Setting PID\n", __FUNCTION__);
- if ((ca_set_pid()) < 0) {
- dprintk("%s: -->CA_SET_PID Failed !\n", __FUNCTION__);
- return -1;
- }
- if (verbose > 1)
- dprintk("%s: -->CA_SET_PID Success !\n", __FUNCTION__);
-
- default:
- return -EOPNOTSUPP;
- };
-
- return 0;
-}
-
-static int dst_ca_open(struct inode *inode, struct file *file)
-{
- if (verbose > 4)
- dprintk("%s:Device opened [%p]\n", __FUNCTION__, file);
- try_module_get(THIS_MODULE);
-
- return 0;
-}
-
-static int dst_ca_release(struct inode *inode, struct file *file)
-{
- if (verbose > 4)
- dprintk("%s:Device closed.\n", __FUNCTION__);
- module_put(THIS_MODULE);
-
- return 0;
-}
-
-static int dst_ca_read(struct file *file, char __user * buffer, size_t length, loff_t * offset)
-{
- int bytes_read = 0;
-
- if (verbose > 4)
- dprintk("%s:Device read.\n", __FUNCTION__);
-
- return bytes_read;
-}
-
-static int dst_ca_write(struct file *file, const char __user * buffer, size_t length, loff_t * offset)
-{
- if (verbose > 4)
- dprintk("%s:Device write.\n", __FUNCTION__);
-
- return 0;
-}
-
-static struct file_operations dst_ca_fops = {
- .owner = THIS_MODULE,
- .ioctl = (void *)dst_ca_ioctl,
- .open = dst_ca_open,
- .release = dst_ca_release,
- .read = dst_ca_read,
- .write = dst_ca_write
-};
-
-static struct dvb_device dvbdev_ca = {
- .priv = NULL,
- .users = 1,
- .readers = 1,
- .writers = 1,
- .fops = &dst_ca_fops
-};
-
-int dst_ca_attach(struct dst_state *dst, struct dvb_adapter *dvb_adapter)
-{
- struct dvb_device *dvbdev;
- if (verbose > 4)
- dprintk("%s:registering DST-CA device\n", __FUNCTION__);
- dvb_register_device(dvb_adapter, &dvbdev, &dvbdev_ca, dst, DVB_DEVICE_CA);
- return 0;
-}
-
-EXPORT_SYMBOL(dst_ca_attach);
-
-MODULE_DESCRIPTION("DST DVB-S/T/C Combo CA driver");
-MODULE_AUTHOR("Manu Abraham");
-MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/bt8xx/dst_ca.h b/drivers/media/dvb/bt8xx/dst_ca.h
deleted file mode 100644
index 59cd0ddd6d8..00000000000
--- a/drivers/media/dvb/bt8xx/dst_ca.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- CA-driver for TwinHan DST Frontend/Card
-
- Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#ifndef _DST_CA_H_
-#define _DST_CA_H_
-
-#define RETRIES 5
-
-
-#define CA_APP_INFO_ENQUIRY 0x9f8020
-#define CA_APP_INFO 0x9f8021
-#define CA_ENTER_MENU 0x9f8022
-#define CA_INFO_ENQUIRY 0x9f8030
-#define CA_INFO 0x9f8031
-#define CA_PMT 0x9f8032
-#define CA_PMT_REPLY 0x9f8033
-
-#define CA_CLOSE_MMI 0x9f8800
-#define CA_DISPLAY_CONTROL 0x9f8801
-#define CA_DISPLAY_REPLY 0x9f8802
-#define CA_TEXT_LAST 0x9f8803
-#define CA_TEXT_MORE 0x9f8804
-#define CA_KEYPAD_CONTROL 0x9f8805
-#define CA_KEYPRESS 0x9f8806
-
-#define CA_ENQUIRY 0x9f8807
-#define CA_ANSWER 0x9f8808
-#define CA_MENU_LAST 0x9f8809
-#define CA_MENU_MORE 0x9f880a
-#define CA_MENU_ANSWER 0x9f880b
-#define CA_LIST_LAST 0x9f880c
-#define CA_LIST_MORE 0x9f880d
-
-
-struct dst_ca_private {
- struct dst_state *dst;
- struct dvb_device *dvbdev;
-};
-
-
-#endif
diff --git a/drivers/media/dvb/bt8xx/dst_common.h b/drivers/media/dvb/bt8xx/dst_common.h
deleted file mode 100644
index ef532a6acea..00000000000
--- a/drivers/media/dvb/bt8xx/dst_common.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- Frontend-driver for TwinHan DST Frontend
-
- Copyright (C) 2003 Jamie Honan
- Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#ifndef DST_COMMON_H
-#define DST_COMMON_H
-
-#include <linux/dvb/frontend.h>
-#include <linux/device.h>
-#include "bt878.h"
-
-#include "dst_ca.h"
-
-
-#define NO_DELAY 0
-#define LONG_DELAY 1
-#define DEVICE_INIT 2
-
-#define DELAY 1
-
-#define DST_TYPE_IS_SAT 0
-#define DST_TYPE_IS_TERR 1
-#define DST_TYPE_IS_CABLE 2
-#define DST_TYPE_IS_ATSC 3
-
-#define DST_TYPE_HAS_NEWTUNE 1
-#define DST_TYPE_HAS_TS204 2
-#define DST_TYPE_HAS_SYMDIV 4
-#define DST_TYPE_HAS_FW_1 8
-#define DST_TYPE_HAS_FW_2 16
-#define DST_TYPE_HAS_FW_3 32
-#define DST_TYPE_HAS_FW_BUILD 64
-#define DST_TYPE_HAS_OBS_REGS 128
-#define DST_TYPE_HAS_INC_COUNT 256
-
-/* Card capability list */
-
-#define DST_TYPE_HAS_MAC 1
-#define DST_TYPE_HAS_DISEQC3 2
-#define DST_TYPE_HAS_DISEQC4 4
-#define DST_TYPE_HAS_DISEQC5 8
-#define DST_TYPE_HAS_MOTO 16
-#define DST_TYPE_HAS_CA 32
-#define DST_TYPE_HAS_ANALOG 64 /* Analog inputs */
-#define DST_TYPE_HAS_SESSION 128
-
-
-#define RDC_8820_PIO_0_DISABLE 0
-#define RDC_8820_PIO_0_ENABLE 1
-#define RDC_8820_INT 2
-#define RDC_8820_RESET 4
-
-/* DST Communication */
-#define GET_REPLY 1
-#define NO_REPLY 0
-
-#define GET_ACK 1
-#define FIXED_COMM 8
-
-#define ACK 0xff
-
-struct dst_state {
-
- struct i2c_adapter* i2c;
-
- struct bt878* bt;
-
- struct dvb_frontend_ops ops;
-
- /* configuration settings */
- const struct dst_config* config;
-
- struct dvb_frontend frontend;
-
- /* private ASIC data */
- u8 tx_tuna[10];
- u8 rx_tuna[10];
- u8 rxbuffer[10];
- u8 diseq_flags;
- u8 dst_type;
- u32 type_flags;
- u32 frequency; /* intermediate frequency in kHz for QPSK */
- fe_spectral_inversion_t inversion;
- u32 symbol_rate; /* symbol rate in Symbols per second */
- fe_code_rate_t fec;
- fe_sec_voltage_t voltage;
- fe_sec_tone_mode_t tone;
- u32 decode_freq;
- u8 decode_lock;
- u16 decode_strength;
- u16 decode_snr;
- unsigned long cur_jiff;
- u8 k22;
- fe_bandwidth_t bandwidth;
- u32 dst_hw_cap;
- u8 dst_fw_version;
- fe_sec_mini_cmd_t minicmd;
- fe_modulation_t modulation;
- u8 messages[256];
-};
-
-struct dst_types {
- char *device_id;
- int offset;
- u8 dst_type;
- u32 type_flags;
- u32 dst_feature;
-};
-
-
-
-struct dst_config
-{
- /* the ASIC i2c address */
- u8 demod_address;
-};
-
-
-int rdc_reset_state(struct dst_state *state);
-int rdc_8820_reset(struct dst_state *state);
-
-int dst_wait_dst_ready(struct dst_state *state, u8 delay_mode);
-int dst_pio_enable(struct dst_state *state);
-int dst_pio_disable(struct dst_state *state);
-int dst_error_recovery(struct dst_state* state);
-int dst_error_bailout(struct dst_state *state);
-int dst_comm_init(struct dst_state* state);
-
-int write_dst(struct dst_state *state, u8 * data, u8 len);
-int read_dst(struct dst_state *state, u8 * ret, u8 len);
-u8 dst_check_sum(u8 * buf, u32 len);
-struct dst_state* dst_attach(struct dst_state* state, struct dvb_adapter *dvb_adapter);
-int dst_ca_attach(struct dst_state *state, struct dvb_adapter *dvb_adapter);
-int dst_gpio_outb(struct dst_state* state, u32 mask, u32 enbb, u32 outhigh, int delay);
-
-int dst_command(struct dst_state* state, u8 * data, u8 len);
-
-
-#endif // DST_COMMON_H
diff --git a/drivers/media/dvb/bt8xx/dst_priv.h b/drivers/media/dvb/bt8xx/dst_priv.h
deleted file mode 100644
index 3974a4c6ebe..00000000000
--- a/drivers/media/dvb/bt8xx/dst_priv.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * dst-bt878.h: part of the DST driver for the TwinHan DST Frontend
- *
- * Copyright (C) 2003 Jamie Honan
- */
-
-struct dst_gpio_enable {
- u32 mask;
- u32 enable;
-};
-
-struct dst_gpio_output {
- u32 mask;
- u32 highvals;
-};
-
-struct dst_gpio_read {
- unsigned long value;
-};
-
-union dst_gpio_packet {
- struct dst_gpio_enable enb;
- struct dst_gpio_output outp;
- struct dst_gpio_read rd;
- int psize;
-};
-
-#define DST_IG_ENABLE 0
-#define DST_IG_WRITE 1
-#define DST_IG_READ 2
-#define DST_IG_TS 3
-
-struct bt878;
-
-int bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet *mp);
diff --git a/drivers/media/dvb/bt8xx/dvb-bt8xx.c b/drivers/media/dvb/bt8xx/dvb-bt8xx.c
deleted file mode 100644
index 6f857c6091f..00000000000
--- a/drivers/media/dvb/bt8xx/dvb-bt8xx.c
+++ /dev/null
@@ -1,818 +0,0 @@
-/*
- * Bt8xx based DVB adapter driver
- *
- * Copyright (C) 2002,2003 Florian Schirmer <jolt@tuxbox.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-#include <linux/bitops.h>
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/init.h>
-#include <linux/device.h>
-#include <linux/delay.h>
-#include <linux/slab.h>
-#include <linux/i2c.h>
-
-#include "dmxdev.h"
-#include "dvbdev.h"
-#include "dvb_demux.h"
-#include "dvb_frontend.h"
-
-#include "dvb-bt8xx.h"
-
-#include "bt878.h"
-
-static int debug;
-
-module_param(debug, int, 0644);
-MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
-
-#define dprintk( args... ) \
- do { \
- if (debug) printk(KERN_DEBUG args); \
- } while (0)
-
-static void dvb_bt8xx_task(unsigned long data)
-{
- struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *)data;
-
- //printk("%d ", card->bt->finished_block);
-
- while (card->bt->last_block != card->bt->finished_block) {
- (card->bt->TS_Size ? dvb_dmx_swfilter_204 : dvb_dmx_swfilter)
- (&card->demux,
- &card->bt->buf_cpu[card->bt->last_block *
- card->bt->block_bytes],
- card->bt->block_bytes);
- card->bt->last_block = (card->bt->last_block + 1) %
- card->bt->block_count;
- }
-}
-
-static int dvb_bt8xx_start_feed(struct dvb_demux_feed *dvbdmxfeed)
-{
- struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
- struct dvb_bt8xx_card *card = dvbdmx->priv;
- int rc;
-
- dprintk("dvb_bt8xx: start_feed\n");
-
- if (!dvbdmx->dmx.frontend)
- return -EINVAL;
-
- down(&card->lock);
- card->nfeeds++;
- rc = card->nfeeds;
- if (card->nfeeds == 1)
- bt878_start(card->bt, card->gpio_mode,
- card->op_sync_orin, card->irq_err_ignore);
- up(&card->lock);
- return rc;
-}
-
-static int dvb_bt8xx_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
-{
- struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
- struct dvb_bt8xx_card *card = dvbdmx->priv;
-
- dprintk("dvb_bt8xx: stop_feed\n");
-
- if (!dvbdmx->dmx.frontend)
- return -EINVAL;
-
- down(&card->lock);
- card->nfeeds--;
- if (card->nfeeds == 0)
- bt878_stop(card->bt);
- up(&card->lock);
-
- return 0;
-}
-
-static int is_pci_slot_eq(struct pci_dev* adev, struct pci_dev* bdev)
-{
- if ((adev->subsystem_vendor == bdev->subsystem_vendor) &&
- (adev->subsystem_device == bdev->subsystem_device) &&
- (adev->bus->number == bdev->bus->number) &&
- (PCI_SLOT(adev->devfn) == PCI_SLOT(bdev->devfn)))
- return 1;
- return 0;
-}
-
-static struct bt878 __init *dvb_bt8xx_878_match(unsigned int bttv_nr, struct pci_dev* bttv_pci_dev)
-{
- unsigned int card_nr;
-
- /* Hmm, n squared. Hope n is small */
- for (card_nr = 0; card_nr < bt878_num; card_nr++) {
- if (is_pci_slot_eq(bt878[card_nr].dev, bttv_pci_dev))
- return &bt878[card_nr];
- }
- return NULL;
-}
-
-
-static int thomson_dtt7579_demod_init(struct dvb_frontend* fe)
-{
- static u8 mt352_clock_config [] = { 0x89, 0x38, 0x38 };
- static u8 mt352_reset [] = { 0x50, 0x80 };
- static u8 mt352_adc_ctl_1_cfg [] = { 0x8E, 0x40 };
- static u8 mt352_agc_cfg [] = { 0x67, 0x28, 0x20 };
- static u8 mt352_gpp_ctl_cfg [] = { 0x8C, 0x33 };
- static u8 mt352_capt_range_cfg[] = { 0x75, 0x32 };
-
- mt352_write(fe, mt352_clock_config, sizeof(mt352_clock_config));
- udelay(2000);
- mt352_write(fe, mt352_reset, sizeof(mt352_reset));
- mt352_write(fe, mt352_adc_ctl_1_cfg, sizeof(mt352_adc_ctl_1_cfg));
-
- mt352_write(fe, mt352_agc_cfg, sizeof(mt352_agc_cfg));
- mt352_write(fe, mt352_gpp_ctl_cfg, sizeof(mt352_gpp_ctl_cfg));
- mt352_write(fe, mt352_capt_range_cfg, sizeof(mt352_capt_range_cfg));
-
- return 0;
-}
-
-static int thomson_dtt7579_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf)
-{
- u32 div;
- unsigned char bs = 0;
- unsigned char cp = 0;
-
- #define IF_FREQUENCYx6 217 /* 6 * 36.16666666667MHz */
- div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6;
-
- if (params->frequency < 542000000) cp = 0xb4;
- else if (params->frequency < 771000000) cp = 0xbc;
- else cp = 0xf4;
-
- if (params->frequency == 0) bs = 0x03;
- else if (params->frequency < 443250000) bs = 0x02;
- else bs = 0x08;
-
- pllbuf[0] = 0xc0; // Note: non-linux standard PLL i2c address
- pllbuf[1] = div >> 8;
- pllbuf[2] = div & 0xff;
- pllbuf[3] = cp;
- pllbuf[4] = bs;
-
- return 0;
-}
-
-static struct mt352_config thomson_dtt7579_config = {
-
- .demod_address = 0x0f,
- .demod_init = thomson_dtt7579_demod_init,
- .pll_set = thomson_dtt7579_pll_set,
-};
-
-static int cx24108_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
-{
- u32 freq = params->frequency;
-
- int i, a, n, pump;
- u32 band, pll;
-
-
- u32 osci[]={950000,1019000,1075000,1178000,1296000,1432000,
- 1576000,1718000,1856000,2036000,2150000};
- u32 bandsel[]={0,0x00020000,0x00040000,0x00100800,0x00101000,
- 0x00102000,0x00104000,0x00108000,0x00110000,
- 0x00120000,0x00140000};
-
-#define XTAL 1011100 /* Hz, really 1.0111 MHz and a /10 prescaler */
- printk("cx24108 debug: entering SetTunerFreq, freq=%d\n",freq);
-
- /* This is really the bit driving the tuner chip cx24108 */
-
- if(freq<950000) freq=950000; /* kHz */
- if(freq>2150000) freq=2150000; /* satellite IF is 950..2150MHz */
-
- /* decide which VCO to use for the input frequency */
- for(i=1;(i<sizeof(osci)/sizeof(osci[0]))&&(osci[i]<freq);i++);
- printk("cx24108 debug: select vco #%d (f=%d)\n",i,freq);
- band=bandsel[i];
- /* the gain values must be set by SetSymbolrate */
- /* compute the pll divider needed, from Conexant data sheet,
- resolved for (n*32+a), remember f(vco) is f(receive) *2 or *4,
- depending on the divider bit. It is set to /4 on the 2 lowest
- bands */
- n=((i<=2?2:1)*freq*10L)/(XTAL/100);
- a=n%32; n/=32; if(a==0) n--;
- pump=(freq<(osci[i-1]+osci[i])/2);
- pll=0xf8000000|
- ((pump?1:2)<<(14+11))|
- ((n&0x1ff)<<(5+11))|
- ((a&0x1f)<<11);
- /* everything is shifted left 11 bits to left-align the bits in the
- 32bit word. Output to the tuner goes MSB-aligned, after all */
- printk("cx24108 debug: pump=%d, n=%d, a=%d\n",pump,n,a);
- cx24110_pll_write(fe,band);
- /* set vga and vca to their widest-band settings, as a precaution.
- SetSymbolrate might not be called to set this up */
- cx24110_pll_write(fe,0x500c0000);
- cx24110_pll_write(fe,0x83f1f800);
- cx24110_pll_write(fe,pll);
-/* writereg(client,0x56,0x7f);*/
-
- return 0;
-}
-
-static int pinnsat_pll_init(struct dvb_frontend* fe)
-{
- return 0;
-}
-
-
-static struct cx24110_config pctvsat_config = {
-
- .demod_address = 0x55,
- .pll_init = pinnsat_pll_init,
- .pll_set = cx24108_pll_set,
-};
-
-
-static int microtune_mt7202dtf_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
-{
- struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *) fe->dvb->priv;
- u8 cfg, cpump, band_select;
- u8 data[4];
- u32 div;
- struct i2c_msg msg = { .addr = 0x60, .flags = 0, .buf = data, .len = sizeof(data) };
-
- div = (36000000 + params->frequency + 83333) / 166666;
- cfg = 0x88;
-
- if (params->frequency < 175000000) cpump = 2;
- else if (params->frequency < 390000000) cpump = 1;
- else if (params->frequency < 470000000) cpump = 2;
- else if (params->frequency < 750000000) cpump = 2;
- else cpump = 3;
-
- if (params->frequency < 175000000) band_select = 0x0e;
- else if (params->frequency < 470000000) band_select = 0x05;
- else band_select = 0x03;
-
- data[0] = (div >> 8) & 0x7f;
- data[1] = div & 0xff;
- data[2] = ((div >> 10) & 0x60) | cfg;
- data[3] = cpump | band_select;
-
- i2c_transfer(card->i2c_adapter, &msg, 1);
- return (div * 166666 - 36000000);
-}
-
-static int microtune_mt7202dtf_request_firmware(struct dvb_frontend* fe, const struct firmware **fw, char* name)
-{
- struct dvb_bt8xx_card* bt = (struct dvb_bt8xx_card*) fe->dvb->priv;
-
- return request_firmware(fw, name, &bt->bt->dev->dev);
-}
-
-static struct sp887x_config microtune_mt7202dtf_config = {
-
- .demod_address = 0x70,
- .pll_set = microtune_mt7202dtf_pll_set,
- .request_firmware = microtune_mt7202dtf_request_firmware,
-};
-
-
-
-static int advbt771_samsung_tdtc9251dh0_demod_init(struct dvb_frontend* fe)
-{
- static u8 mt352_clock_config [] = { 0x89, 0x38, 0x2d };
- static u8 mt352_reset [] = { 0x50, 0x80 };
- static u8 mt352_adc_ctl_1_cfg [] = { 0x8E, 0x40 };
- static u8 mt352_agc_cfg [] = { 0x67, 0x10, 0x23, 0x00, 0xFF, 0xFF,
- 0x00, 0xFF, 0x00, 0x40, 0x40 };
- static u8 mt352_av771_extra[] = { 0xB5, 0x7A };
- static u8 mt352_capt_range_cfg[] = { 0x75, 0x32 };
-
-
- mt352_write(fe, mt352_clock_config, sizeof(mt352_clock_config));
- udelay(2000);
- mt352_write(fe, mt352_reset, sizeof(mt352_reset));
- mt352_write(fe, mt352_adc_ctl_1_cfg, sizeof(mt352_adc_ctl_1_cfg));
-
- mt352_write(fe, mt352_agc_cfg,sizeof(mt352_agc_cfg));
- udelay(2000);
- mt352_write(fe, mt352_av771_extra,sizeof(mt352_av771_extra));
- mt352_write(fe, mt352_capt_range_cfg, sizeof(mt352_capt_range_cfg));
-
- return 0;
-}
-
-static int advbt771_samsung_tdtc9251dh0_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf)
-{
- u32 div;
- unsigned char bs = 0;
- unsigned char cp = 0;
-
- #define IF_FREQUENCYx6 217 /* 6 * 36.16666666667MHz */
- div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6;
-
- if (params->frequency < 150000000) cp = 0xB4;
- else if (params->frequency < 173000000) cp = 0xBC;
- else if (params->frequency < 250000000) cp = 0xB4;
- else if (params->frequency < 400000000) cp = 0xBC;
- else if (params->frequency < 420000000) cp = 0xF4;
- else if (params->frequency < 470000000) cp = 0xFC;
- else if (params->frequency < 600000000) cp = 0xBC;
- else if (params->frequency < 730000000) cp = 0xF4;
- else cp = 0xFC;
-
- if (params->frequency < 150000000) bs = 0x01;
- else if (params->frequency < 173000000) bs = 0x01;
- else if (params->frequency < 250000000) bs = 0x02;
- else if (params->frequency < 400000000) bs = 0x02;
- else if (params->frequency < 420000000) bs = 0x02;
- else if (params->frequency < 470000000) bs = 0x02;
- else if (params->frequency < 600000000) bs = 0x08;
- else if (params->frequency < 730000000) bs = 0x08;
- else bs = 0x08;
-
- pllbuf[0] = 0xc2; // Note: non-linux standard PLL i2c address
- pllbuf[1] = div >> 8;
- pllbuf[2] = div & 0xff;
- pllbuf[3] = cp;
- pllbuf[4] = bs;
-
- return 0;
-}
-
-static struct mt352_config advbt771_samsung_tdtc9251dh0_config = {
-
- .demod_address = 0x0f,
- .demod_init = advbt771_samsung_tdtc9251dh0_demod_init,
- .pll_set = advbt771_samsung_tdtc9251dh0_pll_set,
-};
-
-
-static struct dst_config dst_config = {
-
- .demod_address = 0x55,
-};
-
-
-static int or51211_request_firmware(struct dvb_frontend* fe, const struct firmware **fw, char* name)
-{
- struct dvb_bt8xx_card* bt = (struct dvb_bt8xx_card*) fe->dvb->priv;
-
- return request_firmware(fw, name, &bt->bt->dev->dev);
-}
-
-static void or51211_setmode(struct dvb_frontend * fe, int mode)
-{
- struct dvb_bt8xx_card *bt = fe->dvb->priv;
- bttv_write_gpio(bt->bttv_nr, 0x0002, mode); /* Reset */
- msleep(20);
-}
-
-static void or51211_reset(struct dvb_frontend * fe)
-{
- struct dvb_bt8xx_card *bt = fe->dvb->priv;
-
- /* RESET DEVICE
- * reset is controled by GPIO-0
- * when set to 0 causes reset and when to 1 for normal op
- * must remain reset for 128 clock cycles on a 50Mhz clock
- * also PRM1 PRM2 & PRM4 are controled by GPIO-1,GPIO-2 & GPIO-4
- * We assume that the reset has be held low long enough or we
- * have been reset by a power on. When the driver is unloaded
- * reset set to 0 so if reloaded we have been reset.
- */
- /* reset & PRM1,2&4 are outputs */
- int ret = bttv_gpio_enable(bt->bttv_nr, 0x001F, 0x001F);
- if (ret != 0) {
- printk(KERN_WARNING "or51211: Init Error - Can't Reset DVR "
- "(%i)\n", ret);
- }
- bttv_write_gpio(bt->bttv_nr, 0x001F, 0x0000); /* Reset */
- msleep(20);
- /* Now set for normal operation */
- bttv_write_gpio(bt->bttv_nr, 0x0001F, 0x0001);
- /* wait for operation to begin */
- msleep(500);
-}
-
-static void or51211_sleep(struct dvb_frontend * fe)
-{
- struct dvb_bt8xx_card *bt = fe->dvb->priv;
- bttv_write_gpio(bt->bttv_nr, 0x0001, 0x0000);
-}
-
-static struct or51211_config or51211_config = {
-
- .demod_address = 0x15,
- .request_firmware = or51211_request_firmware,
- .setmode = or51211_setmode,
- .reset = or51211_reset,
- .sleep = or51211_sleep,
-};
-
-
-static int vp3021_alps_tded4_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
-{
- struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *) fe->dvb->priv;
- u8 buf[4];
- u32 div;
- struct i2c_msg msg = { .addr = 0x60, .flags = 0, .buf = buf, .len = sizeof(buf) };
-
- div = (params->frequency + 36166667) / 166667;
-
- buf[0] = (div >> 8) & 0x7F;
- buf[1] = div & 0xFF;
- buf[2] = 0x85;
- if ((params->frequency >= 47000000) && (params->frequency < 153000000))
- buf[3] = 0x01;
- else if ((params->frequency >= 153000000) && (params->frequency < 430000000))
- buf[3] = 0x02;
- else if ((params->frequency >= 430000000) && (params->frequency < 824000000))
- buf[3] = 0x0C;
- else if ((params->frequency >= 824000000) && (params->frequency < 863000000))
- buf[3] = 0x8C;
- else
- return -EINVAL;
-
- i2c_transfer(card->i2c_adapter, &msg, 1);
- return 0;
-}
-
-static struct nxt6000_config vp3021_alps_tded4_config = {
-
- .demod_address = 0x0a,
- .clock_inversion = 1,
- .pll_set = vp3021_alps_tded4_pll_set,
-};
-
-
-static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
-{
- int ret;
- struct dst_state* state = NULL;
-
- switch(type) {
-#ifdef BTTV_DVICO_DVBT_LITE
- case BTTV_DVICO_DVBT_LITE:
- card->fe = mt352_attach(&thomson_dtt7579_config, card->i2c_adapter);
- if (card->fe != NULL) {
- card->fe->ops->info.frequency_min = 174000000;
- card->fe->ops->info.frequency_max = 862000000;
- break;
- }
- break;
-#endif
-
-#ifdef BTTV_TWINHAN_VP3021
- case BTTV_TWINHAN_VP3021:
-#else
- case BTTV_NEBULA_DIGITV:
-#endif
- card->fe = nxt6000_attach(&vp3021_alps_tded4_config, card->i2c_adapter);
- if (card->fe != NULL) {
- break;
- }
- break;
-
- case BTTV_AVDVBT_761:
- card->fe = sp887x_attach(&microtune_mt7202dtf_config, card->i2c_adapter);
- if (card->fe != NULL) {
- break;
- }
- break;
-
- case BTTV_AVDVBT_771:
- card->fe = mt352_attach(&advbt771_samsung_tdtc9251dh0_config, card->i2c_adapter);
- if (card->fe != NULL) {
- card->fe->ops->info.frequency_min = 174000000;
- card->fe->ops->info.frequency_max = 862000000;
- break;
- }
- break;
-
- case BTTV_TWINHAN_DST:
- /* DST is not a frontend driver !!! */
- state = (struct dst_state *) kmalloc(sizeof (struct dst_state), GFP_KERNEL);
- /* Setup the Card */
- state->config = &dst_config;
- state->i2c = card->i2c_adapter;
- state->bt = card->bt;
-
- /* DST is not a frontend, attaching the ASIC */
- if ((dst_attach(state, &card->dvb_adapter)) == NULL) {
- printk("%s: Could not find a Twinhan DST.\n", __FUNCTION__);
- break;
- }
- card->fe = &state->frontend;
-
- /* Attach other DST peripherals if any */
- /* Conditional Access device */
- if (state->dst_hw_cap & DST_TYPE_HAS_CA) {
- ret = dst_ca_attach(state, &card->dvb_adapter);
- }
- if (card->fe != NULL) {
- break;
- }
- break;
-
- case BTTV_PINNACLESAT:
- card->fe = cx24110_attach(&pctvsat_config, card->i2c_adapter);
- if (card->fe != NULL) {
- break;
- }
- break;
-
- case BTTV_PC_HDTV:
- card->fe = or51211_attach(&or51211_config, card->i2c_adapter);
- if (card->fe != NULL) {
- break;
- }
- break;
- }
-
- if (card->fe == NULL) {
- printk("dvb-bt8xx: A frontend driver was not found for device %04x/%04x subsystem %04x/%04x\n",
- card->bt->dev->vendor,
- card->bt->dev->device,
- card->bt->dev->subsystem_vendor,
- card->bt->dev->subsystem_device);
- } else {
- if (dvb_register_frontend(&card->dvb_adapter, card->fe)) {
- printk("dvb-bt8xx: Frontend registration failed!\n");
- if (card->fe->ops->release)
- card->fe->ops->release(card->fe);
- card->fe = NULL;
- }
- }
-}
-
-static int __init dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)
-{
- int result;
-
- if ((result = dvb_register_adapter(&card->dvb_adapter, card->card_name,
- THIS_MODULE)) < 0) {
- printk("dvb_bt8xx: dvb_register_adapter failed (errno = %d)\n", result);
- return result;
-
- }
- card->dvb_adapter.priv = card;
-
- card->bt->adapter = card->i2c_adapter;
-
- memset(&card->demux, 0, sizeof(struct dvb_demux));
-
- card->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING | DMX_MEMORY_BASED_FILTERING;
-
- card->demux.priv = card;
- card->demux.filternum = 256;
- card->demux.feednum = 256;
- card->demux.start_feed = dvb_bt8xx_start_feed;
- card->demux.stop_feed = dvb_bt8xx_stop_feed;
- card->demux.write_to_decoder = NULL;
-
- if ((result = dvb_dmx_init(&card->demux)) < 0) {
- printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);
-
- dvb_unregister_adapter(&card->dvb_adapter);
- return result;
- }
-
- card->dmxdev.filternum = 256;
- card->dmxdev.demux = &card->demux.dmx;
- card->dmxdev.capabilities = 0;
-
- if ((result = dvb_dmxdev_init(&card->dmxdev, &card->dvb_adapter)) < 0) {
- printk("dvb_bt8xx: dvb_dmxdev_init failed (errno = %d)\n", result);
-
- dvb_dmx_release(&card->demux);
- dvb_unregister_adapter(&card->dvb_adapter);
- return result;
- }
-
- card->fe_hw.source = DMX_FRONTEND_0;
-
- if ((result = card->demux.dmx.add_frontend(&card->demux.dmx, &card->fe_hw)) < 0) {
- printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);
-
- dvb_dmxdev_release(&card->dmxdev);
- dvb_dmx_release(&card->demux);
- dvb_unregister_adapter(&card->dvb_adapter);
- return result;
- }
-
- card->fe_mem.source = DMX_MEMORY_FE;
-
- if ((result = card->demux.dmx.add_frontend(&card->demux.dmx, &card->fe_mem)) < 0) {
- printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);
-
- card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
- dvb_dmxdev_release(&card->dmxdev);
- dvb_dmx_release(&card->demux);
- dvb_unregister_adapter(&card->dvb_adapter);
- return result;
- }
-
- if ((result = card->demux.dmx.connect_frontend(&card->demux.dmx, &card->fe_hw)) < 0) {
- printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);
-
- card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_mem);
- card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
- dvb_dmxdev_release(&card->dmxdev);
- dvb_dmx_release(&card->demux);
- dvb_unregister_adapter(&card->dvb_adapter);
- return result;
- }
-
- dvb_net_init(&card->dvb_adapter, &card->dvbnet, &card->demux.dmx);
-
- tasklet_init(&card->bt->tasklet, dvb_bt8xx_task, (unsigned long) card);
-
- frontend_init(card, type);
-
- return 0;
-}
-
-static int dvb_bt8xx_probe(struct device *dev)
-{
- struct bttv_sub_device *sub = to_bttv_sub_dev(dev);
- struct dvb_bt8xx_card *card;
- struct pci_dev* bttv_pci_dev;
- int ret;
-
- if (!(card = kmalloc(sizeof(struct dvb_bt8xx_card), GFP_KERNEL)))
- return -ENOMEM;
-
- memset(card, 0, sizeof(*card));
- init_MUTEX(&card->lock);
- card->bttv_nr = sub->core->nr;
- strncpy(card->card_name, sub->core->name, sizeof(sub->core->name));
- card->i2c_adapter = &sub->core->i2c_adap;
-
- switch(sub->core->type)
- {
- case BTTV_PINNACLESAT:
- card->gpio_mode = 0x0400c060;
- /* should be: BT878_A_GAIN=0,BT878_A_PWRDN,BT878_DA_DPM,BT878_DA_SBR,
- BT878_DA_IOM=1,BT878_DA_APP to enable serial highspeed mode. */
- card->op_sync_orin = 0;
- card->irq_err_ignore = 0;
- break;
-
-#ifdef BTTV_DVICO_DVBT_LITE
- case BTTV_DVICO_DVBT_LITE:
-#endif
- card->gpio_mode = 0x0400C060;
- card->op_sync_orin = 0;
- card->irq_err_ignore = 0;
- /* 26, 15, 14, 6, 5
- * A_PWRDN DA_DPM DA_SBR DA_IOM_DA
- * DA_APP(parallel) */
- break;
-
-#ifdef BTTV_TWINHAN_VP3021
- case BTTV_TWINHAN_VP3021:
-#else
- case BTTV_NEBULA_DIGITV:
-#endif
- case BTTV_AVDVBT_761:
- card->gpio_mode = (1 << 26) | (1 << 14) | (1 << 5);
- card->op_sync_orin = 0;
- card->irq_err_ignore = 0;
- /* A_PWRDN DA_SBR DA_APP (high speed serial) */
- break;
-
- case BTTV_AVDVBT_771: //case 0x07711461:
- card->gpio_mode = 0x0400402B;
- card->op_sync_orin = BT878_RISC_SYNC_MASK;
- card->irq_err_ignore = 0;
- /* A_PWRDN DA_SBR DA_APP[0] PKTP=10 RISC_ENABLE FIFO_ENABLE*/
- break;
-
- case BTTV_TWINHAN_DST:
- card->gpio_mode = 0x2204f2c;
- card->op_sync_orin = BT878_RISC_SYNC_MASK;
- card->irq_err_ignore = BT878_APABORT | BT878_ARIPERR |
- BT878_APPERR | BT878_AFBUS;
- /* 25,21,14,11,10,9,8,3,2 then
- * 0x33 = 5,4,1,0
- * A_SEL=SML, DA_MLB, DA_SBR,
- * DA_SDR=f, fifo trigger = 32 DWORDS
- * IOM = 0 == audio A/D
- * DPM = 0 == digital audio mode
- * == async data parallel port
- * then 0x33 (13 is set by start_capture)
- * DA_APP = async data parallel port,
- * ACAP_EN = 1,
- * RISC+FIFO ENABLE */
- break;
-
- case BTTV_PC_HDTV:
- card->gpio_mode = 0x0100EC7B;
- card->op_sync_orin = 0;
- card->irq_err_ignore = 0;
- break;
-
- default:
- printk(KERN_WARNING "dvb_bt8xx: Unknown bttv card type: %d.\n",
- sub->core->type);
- kfree(card);
- return -ENODEV;
- }
-
- dprintk("dvb_bt8xx: identified card%d as %s\n", card->bttv_nr, card->card_name);
-
- if (!(bttv_pci_dev = bttv_get_pcidev(card->bttv_nr))) {
- printk("dvb_bt8xx: no pci device for card %d\n", card->bttv_nr);
- kfree(card);
- return -EFAULT;
- }
-
- if (!(card->bt = dvb_bt8xx_878_match(card->bttv_nr, bttv_pci_dev))) {
- printk("dvb_bt8xx: unable to determine DMA core of card %d,\n",
- card->bttv_nr);
- printk("dvb_bt8xx: if you have the ALSA bt87x audio driver "
- "installed, try removing it.\n");
-
- kfree(card);
- return -EFAULT;
-
- }
-
- init_MUTEX(&card->bt->gpio_lock);
- card->bt->bttv_nr = sub->core->nr;
-
- if ( (ret = dvb_bt8xx_load_card(card, sub->core->type)) ) {
- kfree(card);
- return ret;
- }
-
- dev_set_drvdata(dev, card);
- return 0;
-}
-
-static int dvb_bt8xx_remove(struct device *dev)
-{
- struct dvb_bt8xx_card *card = dev_get_drvdata(dev);
-
- dprintk("dvb_bt8xx: unloading card%d\n", card->bttv_nr);
-
- bt878_stop(card->bt);
- tasklet_kill(&card->bt->tasklet);
- dvb_net_release(&card->dvbnet);
- card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_mem);
- card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
- dvb_dmxdev_release(&card->dmxdev);
- dvb_dmx_release(&card->demux);
- if (card->fe) dvb_unregister_frontend(card->fe);
- dvb_unregister_adapter(&card->dvb_adapter);
-
- kfree(card);
-
- return 0;
-}
-
-static struct bttv_sub_driver driver = {
- .drv = {
- .name = "dvb-bt8xx",
- .probe = dvb_bt8xx_probe,
- .remove = dvb_bt8xx_remove,
- /* FIXME:
- * .shutdown = dvb_bt8xx_shutdown,
- * .suspend = dvb_bt8xx_suspend,
- * .resume = dvb_bt8xx_resume,
- */
- },
-};
-
-static int __init dvb_bt8xx_init(void)
-{
- return bttv_sub_register(&driver, "dvb");
-}
-
-static void __exit dvb_bt8xx_exit(void)
-{
- bttv_sub_unregister(&driver);
-}
-
-module_init(dvb_bt8xx_init);
-module_exit(dvb_bt8xx_exit);
-
-MODULE_DESCRIPTION("Bt8xx based DVB adapter driver");
-MODULE_AUTHOR("Florian Schirmer <jolt@tuxbox.org>");
-MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/bt8xx/dvb-bt8xx.h b/drivers/media/dvb/bt8xx/dvb-bt8xx.h
deleted file mode 100644
index 2923b3b0dd3..00000000000
--- a/drivers/media/dvb/bt8xx/dvb-bt8xx.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Bt8xx based DVB adapter driver
- *
- * Copyright (C) 2002,2003 Florian Schirmer <jolt@tuxbox.org>
- * Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@t-online.de>
- * Copyright (C) 1999-2001 Ralph Metzler & Marcus Metzler for convergence integrated media GmbH
- * Copyright (C) 1998,1999 Christian Theiss <mistert@rz.fh-augsburg.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-#ifndef DVB_BT8XX_H
-#define DVB_BT8XX_H
-
-#include <linux/i2c.h>
-#include "dvbdev.h"
-#include "dvb_net.h"
-#include "bttv.h"
-#include "mt352.h"
-#include "sp887x.h"
-#include "dst_common.h"
-#include "nxt6000.h"
-#include "cx24110.h"
-#include "or51211.h"
-
-struct dvb_bt8xx_card {
- struct semaphore lock;
- int nfeeds;
- char card_name[32];
- struct dvb_adapter dvb_adapter;
- struct bt878 *bt;
- unsigned int bttv_nr;
- struct dvb_demux demux;
- struct dmxdev dmxdev;
- struct dmx_frontend fe_hw;
- struct dmx_frontend fe_mem;
- u32 gpio_mode;
- u32 op_sync_orin;
- u32 irq_err_ignore;
- struct i2c_adapter *i2c_adapter;
- struct dvb_net dvbnet;
-
- struct dvb_frontend* fe;
-};
-
-#endif /* DVB_BT8XX_H */