[ISDN] HiSax sedlbauer: move ISAPNP and PCI code into functions of their own
authorJeff Garzik <jeff@garzik.org>
Wed, 3 Oct 2007 19:37:40 +0000 (15:37 -0400)
committerJeff Garzik <jeff@garzik.org>
Fri, 12 Oct 2007 13:16:49 +0000 (09:16 -0400)
Prep for hotplug API conversion.  Just code movement (+glue).

Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
drivers/isdn/hisax/sedlbauer.c

index ad06f3c..03dfc32 100644 (file)
@@ -518,8 +518,6 @@ Sedl_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        return(0);
 }
 
-static struct pci_dev *dev_sedl __devinitdata = NULL;
-
 #ifdef __ISAPNP__
 static struct isapnp_device_id sedl_ids[] __devinitdata = {
        { ISAPNP_VENDOR('S', 'A', 'G'), ISAPNP_FUNCTION(0x01),
@@ -533,15 +531,158 @@ static struct isapnp_device_id sedl_ids[] __devinitdata = {
 
 static struct isapnp_device_id *ipid __devinitdata = &sedl_ids[0];
 static struct pnp_card *pnp_c __devinitdata = NULL;
-#endif
+
+static int __devinit
+setup_sedlbauer_isapnp(struct IsdnCard *card, int *bytecnt)
+{
+       struct IsdnCardState *cs = card->cs;
+       struct pnp_dev *pnp_d;
+
+       if (!isapnp_present())
+               return -1;
+
+       while(ipid->card_vendor) {
+               if ((pnp_c = pnp_find_card(ipid->card_vendor,
+                       ipid->card_device, pnp_c))) {
+                       pnp_d = NULL;
+                       if ((pnp_d = pnp_find_dev(pnp_c,
+                               ipid->vendor, ipid->function, pnp_d))) {
+                               int err;
+
+                               printk(KERN_INFO "HiSax: %s detected\n",
+                                       (char *)ipid->driver_data);
+                               pnp_disable_dev(pnp_d);
+                               err = pnp_activate_dev(pnp_d);
+                               if (err<0) {
+                                       printk(KERN_WARNING "%s: pnp_activate_dev ret(%d)\n",
+                                               __FUNCTION__, err);
+                                       return(0);
+                               }
+                               card->para[1] = pnp_port_start(pnp_d, 0);
+                               card->para[0] = pnp_irq(pnp_d, 0);
+
+                               if (!card->para[0] || !card->para[1]) {
+                                       printk(KERN_ERR "Sedlbauer PnP:some resources are missing %ld/%lx\n",
+                                               card->para[0], card->para[1]);
+                                       pnp_disable_dev(pnp_d);
+                                       return(0);
+                               }
+                               cs->hw.sedl.cfg_reg = card->para[1];
+                               cs->irq = card->para[0];
+                               if (ipid->function == ISAPNP_FUNCTION(0x2)) {
+                                       cs->subtyp = SEDL_SPEED_FAX;
+                                       cs->hw.sedl.chip = SEDL_CHIP_ISAC_ISAR;
+                                       *bytecnt = 16;
+                               } else {
+                                       cs->subtyp = SEDL_SPEED_CARD_WIN;
+                                       cs->hw.sedl.chip = SEDL_CHIP_TEST;
+                               }
+
+                               return (1);
+                       } else {
+                               printk(KERN_ERR "Sedlbauer PnP: PnP error card found, no device\n");
+                               return(0);
+                       }
+               }
+               ipid++;
+               pnp_c = NULL;
+       } 
+
+       printk(KERN_INFO "Sedlbauer PnP: no ISAPnP card found\n");
+       return -1;
+}
+#else
+
+static int __devinit
+setup_sedlbauer_isapnp(struct IsdnCard *card, int *bytecnt)
+{
+       return -1;
+}
+#endif /* __ISAPNP__ */
+
+#ifdef CONFIG_PCI
+static struct pci_dev *dev_sedl __devinitdata = NULL;
+
+static int __devinit
+setup_sedlbauer_pci(struct IsdnCard *card)
+{
+       struct IsdnCardState *cs = card->cs;
+       u16 sub_vendor_id, sub_id;
+
+       if ((dev_sedl = pci_find_device(PCI_VENDOR_ID_TIGERJET,
+                       PCI_DEVICE_ID_TIGERJET_100, dev_sedl))) {
+               if (pci_enable_device(dev_sedl))
+                       return(0);
+               cs->irq = dev_sedl->irq;
+               if (!cs->irq) {
+                       printk(KERN_WARNING "Sedlbauer: No IRQ for PCI card found\n");
+                       return(0);
+               }
+               cs->hw.sedl.cfg_reg = pci_resource_start(dev_sedl, 0);
+       } else {
+               printk(KERN_WARNING "Sedlbauer: No PCI card found\n");
+               return(0);
+       }
+       cs->irq_flags |= IRQF_SHARED;
+       cs->hw.sedl.bus = SEDL_BUS_PCI;
+       sub_vendor_id = dev_sedl->subsystem_vendor;
+       sub_id = dev_sedl->subsystem_device;
+       printk(KERN_INFO "Sedlbauer: PCI subvendor:%x subid %x\n",
+               sub_vendor_id, sub_id);
+       printk(KERN_INFO "Sedlbauer: PCI base adr %#x\n",
+               cs->hw.sedl.cfg_reg);
+       if (sub_id != PCI_SUB_ID_SEDLBAUER) {
+               printk(KERN_ERR "Sedlbauer: unknown sub id %#x\n", sub_id);
+               return(0);
+       }
+       if (sub_vendor_id == PCI_SUBVENDOR_SPEEDFAX_PYRAMID) {
+               cs->hw.sedl.chip = SEDL_CHIP_ISAC_ISAR;
+               cs->subtyp = SEDL_SPEEDFAX_PYRAMID;
+       } else if (sub_vendor_id == PCI_SUBVENDOR_SPEEDFAX_PCI) {
+               cs->hw.sedl.chip = SEDL_CHIP_ISAC_ISAR;
+               cs->subtyp = SEDL_SPEEDFAX_PCI;
+       } else if (sub_vendor_id == PCI_SUBVENDOR_HST_SAPHIR3) {
+               cs->hw.sedl.chip = SEDL_CHIP_IPAC;
+               cs->subtyp = HST_SAPHIR3;
+       } else if (sub_vendor_id == PCI_SUBVENDOR_SEDLBAUER_PCI) {
+               cs->hw.sedl.chip = SEDL_CHIP_IPAC;
+               cs->subtyp = SEDL_SPEED_PCI;
+       } else {
+               printk(KERN_ERR "Sedlbauer: unknown sub vendor id %#x\n",
+                       sub_vendor_id);
+               return(0);
+       }
+
+       cs->hw.sedl.reset_on = SEDL_ISAR_PCI_ISAR_RESET_ON;
+       cs->hw.sedl.reset_off = SEDL_ISAR_PCI_ISAR_RESET_OFF;
+       byteout(cs->hw.sedl.cfg_reg, 0xff);
+       byteout(cs->hw.sedl.cfg_reg, 0x00);
+       byteout(cs->hw.sedl.cfg_reg+ 2, 0xdd);
+       byteout(cs->hw.sedl.cfg_reg+ 5, 0); /* disable all IRQ */
+       byteout(cs->hw.sedl.cfg_reg +3, cs->hw.sedl.reset_on);
+       mdelay(2);
+       byteout(cs->hw.sedl.cfg_reg +3, cs->hw.sedl.reset_off);
+       mdelay(10);
+
+       return (1);
+}
+
+#else
+
+static int __devinit
+setup_sedlbauer_pci(struct IsdnCard *card)
+{
+       return (1);
+}
+
+#endif /* CONFIG_PCI */
 
 int __devinit
 setup_sedlbauer(struct IsdnCard *card)
 {
-       int bytecnt, ver, val;
+       int bytecnt = 8, ver, val, rc;
        struct IsdnCardState *cs = card->cs;
        char tmp[64];
-       u16 sub_vendor_id, sub_id;
 
        strcpy(tmp, Sedlbauer_revision);
        printk(KERN_INFO "HiSax: Sedlbauer driver Rev. %s\n", HiSax_getrev(tmp));
@@ -569,124 +710,21 @@ setup_sedlbauer(struct IsdnCard *card)
                        bytecnt = 16;
                }
        } else {
-#ifdef __ISAPNP__
-               if (isapnp_present()) {
-                       struct pnp_dev *pnp_d;
-                       while(ipid->card_vendor) {
-                               if ((pnp_c = pnp_find_card(ipid->card_vendor,
-                                       ipid->card_device, pnp_c))) {
-                                       pnp_d = NULL;
-                                       if ((pnp_d = pnp_find_dev(pnp_c,
-                                               ipid->vendor, ipid->function, pnp_d))) {
-                                               int err;
-
-                                               printk(KERN_INFO "HiSax: %s detected\n",
-                                                       (char *)ipid->driver_data);
-                                               pnp_disable_dev(pnp_d);
-                                               err = pnp_activate_dev(pnp_d);
-                                               if (err<0) {
-                                                       printk(KERN_WARNING "%s: pnp_activate_dev ret(%d)\n",
-                                                               __FUNCTION__, err);
-                                                       return(0);
-                                               }
-                                               card->para[1] = pnp_port_start(pnp_d, 0);
-                                               card->para[0] = pnp_irq(pnp_d, 0);
-
-                                               if (!card->para[0] || !card->para[1]) {
-                                                       printk(KERN_ERR "Sedlbauer PnP:some resources are missing %ld/%lx\n",
-                                                               card->para[0], card->para[1]);
-                                                       pnp_disable_dev(pnp_d);
-                                                       return(0);
-                                               }
-                                               cs->hw.sedl.cfg_reg = card->para[1];
-                                               cs->irq = card->para[0];
-                                               if (ipid->function == ISAPNP_FUNCTION(0x2)) {
-                                                       cs->subtyp = SEDL_SPEED_FAX;
-                                                       cs->hw.sedl.chip = SEDL_CHIP_ISAC_ISAR;
-                                                       bytecnt = 16;
-                                               } else {
-                                                       cs->subtyp = SEDL_SPEED_CARD_WIN;
-                                                       cs->hw.sedl.chip = SEDL_CHIP_TEST;
-                                               }
-                                               goto ready;
-                                       } else {
-                                               printk(KERN_ERR "Sedlbauer PnP: PnP error card found, no device\n");
-                                               return(0);
-                                       }
-                               }
-                               ipid++;
-                               pnp_c = NULL;
-                       } 
-                       if (!ipid->card_vendor) {
-                               printk(KERN_INFO "Sedlbauer PnP: no ISAPnP card found\n");
-                       }
-               }
-#endif
-/* Probe for Sedlbauer speed pci */
-#ifdef CONFIG_PCI
-               if ((dev_sedl = pci_find_device(PCI_VENDOR_ID_TIGERJET,
-                               PCI_DEVICE_ID_TIGERJET_100, dev_sedl))) {
-                       if (pci_enable_device(dev_sedl))
-                               return(0);
-                       cs->irq = dev_sedl->irq;
-                       if (!cs->irq) {
-                               printk(KERN_WARNING "Sedlbauer: No IRQ for PCI card found\n");
-                               return(0);
-                       }
-                       cs->hw.sedl.cfg_reg = pci_resource_start(dev_sedl, 0);
-               } else {
-                       printk(KERN_WARNING "Sedlbauer: No PCI card found\n");
-                       return(0);
-               }
-               cs->irq_flags |= IRQF_SHARED;
-               cs->hw.sedl.bus = SEDL_BUS_PCI;
-               sub_vendor_id = dev_sedl->subsystem_vendor;
-               sub_id = dev_sedl->subsystem_device;
-               printk(KERN_INFO "Sedlbauer: PCI subvendor:%x subid %x\n",
-                       sub_vendor_id, sub_id);
-               printk(KERN_INFO "Sedlbauer: PCI base adr %#x\n",
-                       cs->hw.sedl.cfg_reg);
-               if (sub_id != PCI_SUB_ID_SEDLBAUER) {
-                       printk(KERN_ERR "Sedlbauer: unknown sub id %#x\n", sub_id);
-                       return(0);
-               }
-               if (sub_vendor_id == PCI_SUBVENDOR_SPEEDFAX_PYRAMID) {
-                       cs->hw.sedl.chip = SEDL_CHIP_ISAC_ISAR;
-                       cs->subtyp = SEDL_SPEEDFAX_PYRAMID;
-               } else if (sub_vendor_id == PCI_SUBVENDOR_SPEEDFAX_PCI) {
-                       cs->hw.sedl.chip = SEDL_CHIP_ISAC_ISAR;
-                       cs->subtyp = SEDL_SPEEDFAX_PCI;
-               } else if (sub_vendor_id == PCI_SUBVENDOR_HST_SAPHIR3) {
-                       cs->hw.sedl.chip = SEDL_CHIP_IPAC;
-                       cs->subtyp = HST_SAPHIR3;
-               } else if (sub_vendor_id == PCI_SUBVENDOR_SEDLBAUER_PCI) {
-                       cs->hw.sedl.chip = SEDL_CHIP_IPAC;
-                       cs->subtyp = SEDL_SPEED_PCI;
-               } else {
-                       printk(KERN_ERR "Sedlbauer: unknown sub vendor id %#x\n",
-                               sub_vendor_id);
-                       return(0);
-               }
+               rc = setup_sedlbauer_isapnp(card, &bytecnt);
+               if (!rc)
+                       return (0);
+               if (rc > 0)
+                       goto ready;
+
+               /* Probe for Sedlbauer speed pci */
+               rc = setup_sedlbauer_pci(card);
+               if (!rc)
+                       return (0);
+
                bytecnt = 256;
-               cs->hw.sedl.reset_on = SEDL_ISAR_PCI_ISAR_RESET_ON;
-               cs->hw.sedl.reset_off = SEDL_ISAR_PCI_ISAR_RESET_OFF;
-               byteout(cs->hw.sedl.cfg_reg, 0xff);
-               byteout(cs->hw.sedl.cfg_reg, 0x00);
-               byteout(cs->hw.sedl.cfg_reg+ 2, 0xdd);
-               byteout(cs->hw.sedl.cfg_reg+ 5, 0); /* disable all IRQ */
-               byteout(cs->hw.sedl.cfg_reg +3, cs->hw.sedl.reset_on);
-               mdelay(2);
-               byteout(cs->hw.sedl.cfg_reg +3, cs->hw.sedl.reset_off);
-               mdelay(10);
-#else
-               printk(KERN_WARNING "Sedlbauer: NO_PCI_BIOS\n");
-               return (0);
-#endif /* CONFIG_PCI */
        }       
 
-#ifdef __ISAPNP__
 ready: 
-#endif
 
        /* In case of the sedlbauer pcmcia card, this region is in use,
         * reserved for us by the card manager. So we do not check it