[ISDN] HiSax avm_pci: split setup into three smaller functions
authorJeff Garzik <jeff@garzik.org>
Wed, 3 Oct 2007 19:23:49 +0000 (15:23 -0400)
committerJeff Garzik <jeff@garzik.org>
Fri, 12 Oct 2007 13:16:48 +0000 (09:16 -0400)
Preparation for new ISA/PNP/PCI APIs.

Just code movement, and the glue to call the new functions.

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

index b04a178..f8b7978 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/isapnp.h>
 #include <linux/interrupt.h>
 
-extern const char *CardType[];
 static const char *avm_pci_rev = "$Revision: 1.29.2.4 $";
 
 #define  AVM_FRITZ_PCI         1
@@ -726,100 +725,15 @@ AVM_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        return(0);
 }
 
-#ifdef CONFIG_PCI
-static struct pci_dev *dev_avm __devinitdata = NULL;
-#endif
-#ifdef __ISAPNP__
-static struct pnp_card *pnp_avm_c __devinitdata = NULL;
-#endif
-
-int __devinit
-setup_avm_pcipnp(struct IsdnCard *card)
+static int __devinit avm_setup_rest(struct IsdnCardState *cs)
 {
        u_int val, ver;
-       struct IsdnCardState *cs = card->cs;
-       char tmp[64];
 
-       strcpy(tmp, avm_pci_rev);
-       printk(KERN_INFO "HiSax: AVM PCI driver Rev. %s\n", HiSax_getrev(tmp));
-       if (cs->typ != ISDN_CTYPE_FRITZPCI)
-               return (0);
-       if (card->para[1]) {
-               /* old manual method */
-               cs->hw.avm.cfg_reg = card->para[1];
-               cs->irq = card->para[0];
-               cs->subtyp = AVM_FRITZ_PNP;
-               goto ready;
-       }
-#ifdef __ISAPNP__
-       if (isapnp_present()) {
-               struct pnp_dev *pnp_avm_d = NULL;
-               if ((pnp_avm_c = pnp_find_card(
-                       ISAPNP_VENDOR('A', 'V', 'M'),
-                       ISAPNP_FUNCTION(0x0900), pnp_avm_c))) {
-                       if ((pnp_avm_d = pnp_find_dev(pnp_avm_c,
-                               ISAPNP_VENDOR('A', 'V', 'M'),
-                               ISAPNP_FUNCTION(0x0900), pnp_avm_d))) {
-                               int err;
-
-                               pnp_disable_dev(pnp_avm_d);
-                               err = pnp_activate_dev(pnp_avm_d);
-                               if (err<0) {
-                                       printk(KERN_WARNING "%s: pnp_activate_dev ret(%d)\n",
-                                               __FUNCTION__, err);
-                                       return(0);
-                               }
-                               cs->hw.avm.cfg_reg =
-                                       pnp_port_start(pnp_avm_d, 0);
-                               cs->irq = pnp_irq(pnp_avm_d, 0);
-                               if (!cs->irq) {
-                                       printk(KERN_ERR "FritzPnP:No IRQ\n");
-                                       return(0);
-                               }
-                               if (!cs->hw.avm.cfg_reg) {
-                                       printk(KERN_ERR "FritzPnP:No IO address\n");
-                                       return(0);
-                               }
-                               cs->subtyp = AVM_FRITZ_PNP;
-                               goto ready;
-                       }
-               }
-       } else {
-               printk(KERN_INFO "FritzPnP: no ISA PnP present\n");
-       }
-#endif
-#ifdef CONFIG_PCI
-       if ((dev_avm = pci_find_device(PCI_VENDOR_ID_AVM,
-               PCI_DEVICE_ID_AVM_A1,  dev_avm))) {
-               if (pci_enable_device(dev_avm))
-                       return(0);
-               cs->irq = dev_avm->irq;
-               if (!cs->irq) {
-                       printk(KERN_ERR "FritzPCI: No IRQ for PCI card found\n");
-                       return(0);
-               }
-               cs->hw.avm.cfg_reg = pci_resource_start(dev_avm, 1);
-               if (!cs->hw.avm.cfg_reg) {
-                       printk(KERN_ERR "FritzPCI: No IO-Adr for PCI card found\n");
-                       return(0);
-               }
-               cs->subtyp = AVM_FRITZ_PCI;
-       } else {
-               printk(KERN_WARNING "FritzPCI: No PCI card found\n");
-               return(0);
-       }
-       cs->irq_flags |= IRQF_SHARED;
-#else
-       printk(KERN_WARNING "FritzPCI: NO_PCI_BIOS\n");
-       return (0);
-#endif /* CONFIG_PCI */
-ready:
        cs->hw.avm.isac = cs->hw.avm.cfg_reg + 0x10;
        if (!request_region(cs->hw.avm.cfg_reg, 32,
                (cs->subtyp == AVM_FRITZ_PCI) ? "avm PCI" : "avm PnP")) {
                printk(KERN_WARNING
-                      "HiSax: %s config port %x-%x already in use\n",
-                      CardType[card->typ],
+                      "HiSax: Fritz!PCI/PNP config port %x-%x already in use\n",
                       cs->hw.avm.cfg_reg,
                       cs->hw.avm.cfg_reg + 31);
                return (0);
@@ -860,3 +774,137 @@ ready:
        ISACVersion(cs, (cs->subtyp == AVM_FRITZ_PCI) ? "AVM PCI:" : "AVM PnP:");
        return (1);
 }
+
+#ifndef __ISAPNP__
+
+static int __devinit avm_pnp_setup(struct IsdnCardState *cs)
+{
+       return(1);      /* no-op: success */
+}
+
+#else
+
+static struct pnp_card *pnp_avm_c __devinitdata = NULL;
+
+static int __devinit avm_pnp_setup(struct IsdnCardState *cs)
+{
+       struct pnp_dev *pnp_avm_d = NULL;
+
+       if (!isapnp_present())
+               return(1);      /* no-op: success */
+
+       if ((pnp_avm_c = pnp_find_card(
+               ISAPNP_VENDOR('A', 'V', 'M'),
+               ISAPNP_FUNCTION(0x0900), pnp_avm_c))) {
+               if ((pnp_avm_d = pnp_find_dev(pnp_avm_c,
+                       ISAPNP_VENDOR('A', 'V', 'M'),
+                       ISAPNP_FUNCTION(0x0900), pnp_avm_d))) {
+                       int err;
+
+                       pnp_disable_dev(pnp_avm_d);
+                       err = pnp_activate_dev(pnp_avm_d);
+                       if (err<0) {
+                               printk(KERN_WARNING "%s: pnp_activate_dev ret(%d)\n",
+                                       __FUNCTION__, err);
+                               return(0);
+                       }
+                       cs->hw.avm.cfg_reg =
+                               pnp_port_start(pnp_avm_d, 0);
+                       cs->irq = pnp_irq(pnp_avm_d, 0);
+                       if (!cs->irq) {
+                               printk(KERN_ERR "FritzPnP:No IRQ\n");
+                               return(0);
+                       }
+                       if (!cs->hw.avm.cfg_reg) {
+                               printk(KERN_ERR "FritzPnP:No IO address\n");
+                               return(0);
+                       }
+                       cs->subtyp = AVM_FRITZ_PNP;
+
+                       return (2);     /* goto 'ready' label */
+               }
+       }
+
+       return (1);
+}
+
+#endif /* __ISAPNP__ */
+
+#ifndef CONFIG_PCI
+
+static int __devinit avm_pci_setup(struct IsdnCardState *cs)
+{
+       return(1);      /* no-op: success */
+}
+
+#else
+
+static struct pci_dev *dev_avm __devinitdata = NULL;
+
+static int __devinit avm_pci_setup(struct IsdnCardState *cs)
+{
+       if ((dev_avm = pci_find_device(PCI_VENDOR_ID_AVM,
+               PCI_DEVICE_ID_AVM_A1, dev_avm))) {
+
+               if (pci_enable_device(dev_avm))
+                       return(0);
+
+               cs->irq = dev_avm->irq;
+               if (!cs->irq) {
+                       printk(KERN_ERR "FritzPCI: No IRQ for PCI card found\n");
+                       return(0);
+               }
+
+               cs->hw.avm.cfg_reg = pci_resource_start(dev_avm, 1);
+               if (!cs->hw.avm.cfg_reg) {
+                       printk(KERN_ERR "FritzPCI: No IO-Adr for PCI card found\n");
+                       return(0);
+               }
+
+               cs->subtyp = AVM_FRITZ_PCI;
+       } else {
+               printk(KERN_WARNING "FritzPCI: No PCI card found\n");
+               return(0);
+       }
+
+       cs->irq_flags |= IRQF_SHARED;
+
+       return (1);
+}
+
+#endif /* CONFIG_PCI */
+
+int __devinit
+setup_avm_pcipnp(struct IsdnCard *card)
+{
+       struct IsdnCardState *cs = card->cs;
+       char tmp[64];
+       int rc;
+
+       strcpy(tmp, avm_pci_rev);
+       printk(KERN_INFO "HiSax: AVM PCI driver Rev. %s\n", HiSax_getrev(tmp));
+
+       if (cs->typ != ISDN_CTYPE_FRITZPCI)
+               return (0);
+
+       if (card->para[1]) {
+               /* old manual method */
+               cs->hw.avm.cfg_reg = card->para[1];
+               cs->irq = card->para[0];
+               cs->subtyp = AVM_FRITZ_PNP;
+               goto ready;
+       }
+
+       rc = avm_pnp_setup(cs);
+       if (rc < 1)
+               return (0);
+       if (rc == 2)
+               goto ready;
+
+       rc = avm_pci_setup(cs);
+       if (rc < 1)
+               return (0);
+
+ready:
+       return avm_setup_rest(cs);
+}