Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=386900781205d203c1141d3e2dae759f1b531193
Commit:     386900781205d203c1141d3e2dae759f1b531193
Parent:     4a2b108379743405bc488eaef6a75080aa1bbba4
Author:     Akinobu Mita <[EMAIL PROTECTED]>
AuthorDate: Mon Jan 21 12:15:19 2008 -0300
Committer:  Mauro Carvalho Chehab <[EMAIL PROTECTED]>
CommitDate: Fri Jan 25 19:05:22 2008 -0200

    V4L/DVB (7077): bt878: remove handcrafted PCI subsystem ID check
    
    This patch moves the subsystem ID and subsystem vendor ID check from probing
    function to the PCI generic function by describing subsystem IDs in
    pci_device_id table. This enables to add new PCI IDs to a device driver 
pci_ids
    table at runtime by new_id file in sysfs pci driver tree.
    
    Signed-off-by: Akinobu Mita <[EMAIL PROTECTED]>
    Signed-off-by: Manu Abraham <[EMAIL PROTECTED]>
    Signed-off-by: Mauro Carvalho Chehab <[EMAIL PROTECTED]>
---
 Documentation/dvb/bt8xx.txt     |   12 ++++++
 drivers/media/dvb/bt8xx/bt878.c |   76 +++++++++++++++++----------------------
 drivers/media/dvb/bt8xx/bt878.h |    6 ---
 3 files changed, 45 insertions(+), 49 deletions(-)

diff --git a/Documentation/dvb/bt8xx.txt b/Documentation/dvb/bt8xx.txt
index ecb47ad..b7b1d1b 100644
--- a/Documentation/dvb/bt8xx.txt
+++ b/Documentation/dvb/bt8xx.txt
@@ -78,6 +78,18 @@ Example:
 For a full list of card ID's please see 
Documentation/video4linux/CARDLIST.bttv.
 In case of further problems please subscribe and send questions to the mailing 
list: [EMAIL PROTECTED]
 
+2c) Probing the cards with broken PCI subsystem ID
+--------------------------------------------------
+There are some TwinHan cards that the EEPROM has become corrupted for some
+reason. The cards do not have correct PCI subsystem ID. But we can force
+probing the cards with broken PCI subsystem ID
+
+       $ echo 109e 0878 $subvendor $subdevice > \
+               /sys/bus/pci/drivers/bt878/new_id
+
+109e: PCI_VENDOR_ID_BROOKTREE
+0878: PCI_DEVICE_ID_BROOKTREE_878
+
 Authors: Richard Walker,
         Jamie Honan,
         Michael Hunold,
diff --git a/drivers/media/dvb/bt8xx/bt878.c b/drivers/media/dvb/bt8xx/bt878.c
index 85e36a1..c7bbb40 100644
--- a/drivers/media/dvb/bt8xx/bt878.c
+++ b/drivers/media/dvb/bt8xx/bt878.c
@@ -378,23 +378,37 @@ bt878_device_control(struct bt878 *bt, unsigned int cmd, 
union dst_gpio_packet *
 
 EXPORT_SYMBOL(bt878_device_control);
 
+#define BROOKTREE_878_DEVICE(vend, dev, name) \
+       { \
+               .vendor = PCI_VENDOR_ID_BROOKTREE, \
+               .device = PCI_DEVICE_ID_BROOKTREE_878, \
+               .subvendor = (vend), .subdevice = (dev), \
+               .driver_data = (unsigned long) name \
+       }
 
-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" },
-       { 0xdb1118ac, BTTV_BOARD_DVICO_DVBT_LITE,               "Ultraview 
DVB-T Lite" },
-       { 0xd50018ac, BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE,       "DViCO 
FusionHDTV 5 Lite" },
-       { 0x20007063, BTTV_BOARD_PC_HDTV,                       "pcHDTV HD-2000 
TV" },
-       { 0x00261822, BTTV_BOARD_TWINHAN_DST,                   "DNTV Live! 
Mini" }
+static struct pci_device_id bt878_pci_tbl[] __devinitdata = {
+       BROOKTREE_878_DEVICE(0x0071, 0x0101, "Nebula Electronics DigiTV"),
+       BROOKTREE_878_DEVICE(0x1461, 0x0761, "AverMedia AverTV DVB-T 761"),
+       BROOKTREE_878_DEVICE(0x11bd, 0x001c, "Pinnacle PCTV Sat"),
+       BROOKTREE_878_DEVICE(0x11bd, 0x0026, "Pinnacle PCTV SAT CI"),
+       BROOKTREE_878_DEVICE(0x1822, 0x0001, "Twinhan VisionPlus DVB"),
+       BROOKTREE_878_DEVICE(0x270f, 0xfc00,
+                               "ChainTech digitop DST-1000 DVB-S"),
+       BROOKTREE_878_DEVICE(0x1461, 0x0771, "AVermedia AverTV DVB-T 771"),
+       BROOKTREE_878_DEVICE(0x18ac, 0xdb10, "DViCO FusionHDTV DVB-T Lite"),
+       BROOKTREE_878_DEVICE(0x18ac, 0xdb11, "Ultraview DVB-T Lite"),
+       BROOKTREE_878_DEVICE(0x18ac, 0xd500, "DViCO FusionHDTV 5 Lite"),
+       BROOKTREE_878_DEVICE(0x7063, 0x2000, "pcHDTV HD-2000 TV"),
+       BROOKTREE_878_DEVICE(0x1822, 0x0026, "DNTV Live! Mini"),
+       { }
 };
 
+MODULE_DEVICE_TABLE(pci, bt878_pci_tbl);
+
+static const char * __devinit card_name(const struct pci_device_id *id)
+{
+       return id->driver_data ? (const char *)id->driver_data : "Unknown";
+}
 
 /***********************/
 /* PCI device handling */
@@ -403,15 +417,13 @@ static struct cards card_list[] __devinitdata = {
 static int __devinit bt878_probe(struct pci_dev *dev,
                                 const struct pci_device_id *pci_id)
 {
-       int result = 0, has_dvb = 0, i;
+       int result = 0;
        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);
@@ -423,25 +435,11 @@ static int __devinit bt878_probe(struct pci_dev *dev,
        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;
-               }
-       }
+       cardid = dev->subsystem_device << 16;
+       cardid |= dev->subsystem_vendor;
 
-       if (!has_dvb) {
-               printk("%s: card id=[0x%x], Unknown card.\nExiting..\n", 
__func__, cardid);
-               result = -EINVAL;
-
-               goto fail0;
-       }
+       printk(KERN_INFO "%s: card id=[0x%x],[ %s ] has DVB functions.\n",
+                               __func__, cardid, card_name(pci_id));
 
        bt = &bt878[bt878_num];
        bt->dev = dev;
@@ -572,14 +570,6 @@ static void __devexit bt878_remove(struct pci_dev *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,
diff --git a/drivers/media/dvb/bt8xx/bt878.h b/drivers/media/dvb/bt8xx/bt878.h
index d593bc1..375fd28 100644
--- a/drivers/media/dvb/bt8xx/bt878.h
+++ b/drivers/media/dvb/bt8xx/bt878.h
@@ -101,12 +101,6 @@
 #define BTTV_BOARD_DVICO_DVBT_LITE         0x80
 #define BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE 0x87
 
-struct cards {
-       __u32 pci_id;
-       __u16 card_id;
-       char  *name;
-};
-
 extern int bt878_num;
 
 struct bt878 {
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to