X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fmedia%2Fdvb%2Fbt8xx%2Fbt878.c;h=5500f8a0ffe2c6fa1f0013bbc8dc8ccb810f93dd;hb=43bc926fffd92024b46cafaf7350d669ba9ca884;hp=7f7ec3314c931606ff8c12109adec0ace0dc693f;hpb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;p=linux-2.6.git diff --git a/drivers/media/dvb/bt8xx/bt878.c b/drivers/media/dvb/bt8xx/bt878.c index 7f7ec3314..5500f8a0f 100644 --- a/drivers/media/dvb/bt8xx/bt878.c +++ b/drivers/media/dvb/bt8xx/bt878.c @@ -1,34 +1,34 @@ /* * bt878.c: part of the driver for the Pinnacle PCTV Sat DVB PCI card * - * Copyright (C) 2002 Peter Hettkamp + * Copyright (C) 2002 Peter Hettkamp * * large parts based on the bttv driver - * Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de) - * & Marcus Metzler (mocm@thp.uni-koeln.de) + * Copyright (C) 1996,97,98 Ralph Metzler (rjkm@metzlerbros.de) + * & Marcus Metzler (mocm@metzlerbros.de) * (c) 1999,2000 Gerd Knorr * * 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 #include +#include #include #include #include @@ -44,22 +44,21 @@ #include "dmxdev.h" #include "dvbdev.h" #include "bt878.h" -#include "dst-bt878.h" +#include "dst_priv.h" -#include "dvb_functions.h" /**************************************/ /* Miscellaneous utility definitions */ /**************************************/ -unsigned int bt878_verbose = 1; -unsigned int bt878_debug = 0; -MODULE_PARM(bt878_verbose, "i"); -MODULE_PARM_DESC(bt878_verbose, +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_PARM(bt878_debug, "i"); -MODULE_PARM_DESC(bt878_debug, "debug messages, default is 0 (no)"); -MODULE_LICENSE("GPL"); +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]; @@ -129,21 +128,21 @@ static int bt878_mem_alloc(struct bt878 *bt) } /* RISC instructions */ -#define RISC_WRITE (0x01 << 28) -#define RISC_JUMP (0x07 << 28) -#define RISC_SYNC (0x08 << 28) +#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_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_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) +#define RISC_INSTR(instr) bt->risc_cpu[bt->risc_pos++] = cpu_to_le32(instr) static int bt878_make_risc(struct bt878 *bt) { @@ -174,7 +173,7 @@ static void bt878_risc_program(struct bt878 *bt, u32 op_sync_orin) RISC_INSTR(RISC_SYNC | RISC_SYNC_FM1 | op_sync_orin); RISC_INSTR(0); - dprintk("bt878: risc len lines %u, bytes per line %u\n", + 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 @@ -220,7 +219,7 @@ void bt878_start(struct bt878 *bt, u32 controlreg, u32 op_sync_orin, controlreg &= ~0x1f; controlreg |= 0x1b; - btwrite(cpu_to_le32(bt->risc_dma), BT878_ARISC_START); + btwrite(bt->risc_dma, BT878_ARISC_START); /* original int mask had : * 6 2 8 4 0 @@ -229,14 +228,14 @@ void bt878_start(struct bt878 *bt, u32 controlreg, u32 op_sync_orin, * 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 | + 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); } @@ -339,17 +338,13 @@ static irqreturn_t bt878_irq(int irq, void *dev_id, struct pt_regs *regs) return IRQ_HANDLED; } -extern int bttv_gpio_enable(unsigned int card, unsigned long mask, unsigned long data); -extern int bttv_read_gpio(unsigned int card, unsigned long *data); -extern int bttv_write_gpio(unsigned int card, unsigned long mask, unsigned long data); - 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)) + if (mutex_lock_interruptible(&bt->gpio_lock)) return -ERESTARTSYS; /* special gpio signal */ switch (cmd) { @@ -380,26 +375,28 @@ bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet * retval = -EINVAL; break; } - up(&bt->gpio_lock); + mutex_unlock(&bt->gpio_lock); return retval; } EXPORT_SYMBOL(bt878_device_control); -struct bt878 *bt878_find_by_dvb_adap(struct dvb_adapter *adap) -{ - unsigned int card_nr; - - printk("bt878 find by dvb adap: checking \"%s\"\n",adap->name); - for (card_nr = 0; card_nr < bt878_num; card_nr++) { - if (bt878[card_nr].adap_ptr == adap) - return &bt878[card_nr]; - } - printk("bt878 find by dvb adap: NOT found \"%s\"\n",adap->name); - return NULL; -} -EXPORT_SYMBOL(bt878_find_by_dvb_adap); +static struct cards card_list[] __devinitdata = { + + { 0x01010071, BTTV_BOARD_NEBULA_DIGITV, "Nebula Electronics DigiTV" }, + { 0x07611461, BTTV_BOARD_AVDVBT_761, "AverMedia AverTV DVB-T 761" }, + { 0x001c11bd, BTTV_BOARD_PINNACLESAT, "Pinnacle PCTV Sat" }, + { 0x002611bd, BTTV_BOARD_TWINHAN_DST, "Pinnacle PCTV SAT CI" }, + { 0x00011822, BTTV_BOARD_TWINHAN_DST, "Twinhan VisionPlus DVB" }, + { 0xfc00270f, BTTV_BOARD_TWINHAN_DST, "ChainTech digitop DST-1000 DVB-S" }, + { 0x07711461, BTTV_BOARD_AVDVBT_771, "AVermedia AverTV DVB-T 771" }, + { 0xdb1018ac, BTTV_BOARD_DVICO_DVBT_LITE, "DViCO FusionHDTV DVB-T Lite" }, + { 0xd50018ac, BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE, "DViCO FusionHDTV 5 Lite" }, + { 0x20007063, BTTV_BOARD_PC_HDTV, "pcHDTV HD-2000 TV"}, + { 0, -1, NULL } +}; + /***********************/ /* PCI device handling */ @@ -408,18 +405,41 @@ EXPORT_SYMBOL(bt878_find_by_dvb_adap); static int __devinit bt878_probe(struct pci_dev *dev, const struct pci_device_id *pci_id) { - int result; + int result = 0, has_dvb = 0, i; unsigned char lat; struct bt878 *bt; #if defined(__powerpc__) unsigned int cmd; #endif + unsigned int cardid; + unsigned short id; + struct cards *dvb_cards; printk(KERN_INFO "bt878: Bt878 AUDIO function found (%d).\n", bt878_num); if (pci_enable_device(dev)) return -EIO; + pci_read_config_word(dev, PCI_SUBSYSTEM_ID, &id); + cardid = id << 16; + pci_read_config_word(dev, PCI_SUBSYSTEM_VENDOR_ID, &id); + cardid |= id; + + for (i = 0, dvb_cards = card_list; i < ARRAY_SIZE(card_list); i++, dvb_cards++) { + if (cardid == dvb_cards->pci_id) { + printk("%s: card id=[0x%x],[ %s ] has DVB functions.\n", + __func__, cardid, dvb_cards->name); + has_dvb = 1; + } + } + + if (!has_dvb) { + printk("%s: card id=[0x%x], Unknown card.\nExiting..\n", __func__, cardid); + result = -EINVAL; + + goto fail0; + } + bt = &bt878[bt878_num]; bt->dev = dev; bt->nr = bt878_num; @@ -436,6 +456,8 @@ static int __devinit bt878_probe(struct pci_dev *dev, 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)); @@ -481,9 +503,9 @@ static int __devinit bt878_probe(struct pci_dev *dev, pci_set_drvdata(dev, bt); /* if(init_bt878(btv) < 0) { - bt878_remove(dev); - return -EIO; - } + bt878_remove(dev); + return -EIO; + } */ if ((result = bt878_mem_alloc(bt))) { @@ -516,7 +538,7 @@ static void __devexit bt878_remove(struct pci_dev *pci_dev) printk("bt878(%d): unloading\n", bt->nr); /* turn off all capturing, DMA and IRQs */ - btand(~13, BT878_AGPIO_DMA_CTL); + btand(~0x13, BT878_AGPIO_DMA_CTL); /* first disable interrupts before unmapping the memory! */ btwrite(0, BT878_AINT_MASK); @@ -556,30 +578,19 @@ static struct pci_device_id bt878_pci_tbl[] __devinitdata = { MODULE_DEVICE_TABLE(pci, bt878_pci_tbl); static struct pci_driver bt878_pci_driver = { - .name = "bt878", + .name = "bt878", .id_table = bt878_pci_tbl, - .probe = bt878_probe, - .remove = bt878_remove, + .probe = bt878_probe, + .remove = bt878_remove, }; -static int bt878_pci_driver_registered = 0; - -/* This will be used later by dvb-bt8xx to only use the audio - * dma of certain cards */ -int bt878_find_audio_dma(void) -{ - // pci_register_driver(&bt878_pci_driver); - bt878_pci_driver_registered = 1; - return 0; -} - -EXPORT_SYMBOL(bt878_find_audio_dma); +static int bt878_pci_driver_registered; /*******************************/ /* Module management functions */ /*******************************/ -int bt878_init_module(void) +static int bt878_init_module(void) { bt878_num = 0; bt878_pci_driver_registered = 0; @@ -589,15 +600,15 @@ int bt878_init_module(void) (BT878_VERSION_CODE >> 8) & 0xff, BT878_VERSION_CODE & 0xff); /* - bt878_check_chipset(); + bt878_check_chipset(); */ - /* later we register inside of bt878_find_audio_dma + /* later we register inside of bt878_find_audio_dma() * because we may want to ignore certain cards */ bt878_pci_driver_registered = 1; - return pci_module_init(&bt878_pci_driver); + return pci_register_driver(&bt878_pci_driver); } -void bt878_cleanup_module(void) +static void bt878_cleanup_module(void) { if (bt878_pci_driver_registered) { bt878_pci_driver_registered = 0; @@ -606,11 +617,12 @@ void bt878_cleanup_module(void) return; } -EXPORT_SYMBOL(bt878_init_module); -EXPORT_SYMBOL(bt878_cleanup_module); module_init(bt878_init_module); module_exit(bt878_cleanup_module); +//MODULE_AUTHOR("XXX"); +MODULE_LICENSE("GPL"); + /* * Local variables: * c-basic-offset: 8