Commit 1e5d82e1 authored by Jeff Garzik's avatar Jeff Garzik

[ISDN] HiSax elsa: split huge setup function into four smaller functions

Prep for hotplug API conversion.  Just code movement (+glue).
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent 2fbde4c0
...@@ -30,8 +30,6 @@ ...@@ -30,8 +30,6 @@
#include <linux/serial.h> #include <linux/serial.h>
#include <linux/serial_reg.h> #include <linux/serial_reg.h>
extern const char *CardType[];
static const char *Elsa_revision = "$Revision: 2.32.2.4 $"; static const char *Elsa_revision = "$Revision: 2.32.2.4 $";
static const char *Elsa_Types[] = static const char *Elsa_Types[] =
{"None", "PC", "PCC-8", "PCC-16", "PCF", "PCF-Pro", {"None", "PC", "PCC-8", "PCC-16", "PCF", "PCF-Pro",
...@@ -832,39 +830,12 @@ probe_elsa(struct IsdnCardState *cs) ...@@ -832,39 +830,12 @@ probe_elsa(struct IsdnCardState *cs)
return (CARD_portlist[i]); return (CARD_portlist[i]);
} }
static struct pci_dev *dev_qs1000 __devinitdata = NULL; static int __devinit
static struct pci_dev *dev_qs3000 __devinitdata = NULL; setup_elsa_isa(struct IsdnCard *card)
#ifdef __ISAPNP__
static struct isapnp_device_id elsa_ids[] __devinitdata = {
{ ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0133),
ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0133),
(unsigned long) "Elsa QS1000" },
{ ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0134),
ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0134),
(unsigned long) "Elsa QS3000" },
{ 0, }
};
static struct isapnp_device_id *ipid __devinitdata = &elsa_ids[0];
static struct pnp_card *pnp_c __devinitdata = NULL;
#endif
int __devinit
setup_elsa(struct IsdnCard *card)
{ {
int bytecnt;
u_char val;
struct IsdnCardState *cs = card->cs; struct IsdnCardState *cs = card->cs;
char tmp[64]; u_char val;
strcpy(tmp, Elsa_revision);
printk(KERN_INFO "HiSax: Elsa driver Rev. %s\n", HiSax_getrev(tmp));
cs->hw.elsa.ctrl_reg = 0;
cs->hw.elsa.status = 0;
cs->hw.elsa.MFlag = 0;
cs->subtyp = 0;
if (cs->typ == ISDN_CTYPE_ELSA) {
cs->hw.elsa.base = card->para[0]; cs->hw.elsa.base = card->para[0];
printk(KERN_INFO "Elsa: Microlink IO probing\n"); printk(KERN_INFO "Elsa: Microlink IO probing\n");
if (cs->hw.elsa.base) { if (cs->hw.elsa.base) {
...@@ -877,7 +848,13 @@ setup_elsa(struct IsdnCard *card) ...@@ -877,7 +848,13 @@ setup_elsa(struct IsdnCard *card)
} }
} else } else
cs->hw.elsa.base = probe_elsa(cs); cs->hw.elsa.base = probe_elsa(cs);
if (cs->hw.elsa.base) {
if (!cs->hw.elsa.base) {
printk(KERN_WARNING
"No Elsa Microlink found\n");
return (0);
}
cs->hw.elsa.cfg = cs->hw.elsa.base + ELSA_CONFIG; cs->hw.elsa.cfg = cs->hw.elsa.base + ELSA_CONFIG;
cs->hw.elsa.ctrl = cs->hw.elsa.base + ELSA_CONTROL; cs->hw.elsa.ctrl = cs->hw.elsa.base + ELSA_CONTROL;
cs->hw.elsa.ale = cs->hw.elsa.base + ELSA_ALE; cs->hw.elsa.ale = cs->hw.elsa.base + ELSA_ALE;
...@@ -919,12 +896,30 @@ setup_elsa(struct IsdnCard *card) ...@@ -919,12 +896,30 @@ setup_elsa(struct IsdnCard *card)
"Elsa: Microlink S0 bus power bad\n"); "Elsa: Microlink S0 bus power bad\n");
cs->hw.elsa.status |= ELSA_BAD_PWR; cs->hw.elsa.status |= ELSA_BAD_PWR;
} }
} else {
printk(KERN_WARNING return (1);
"No Elsa Microlink found\n"); }
return (0);
} #ifdef __ISAPNP__
} else if (cs->typ == ISDN_CTYPE_ELSA_PNP) { static struct isapnp_device_id elsa_ids[] __devinitdata = {
{ ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0133),
ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0133),
(unsigned long) "Elsa QS1000" },
{ ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0134),
ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0134),
(unsigned long) "Elsa QS3000" },
{ 0, }
};
static struct isapnp_device_id *ipid __devinitdata = &elsa_ids[0];
static struct pnp_card *pnp_c __devinitdata = NULL;
#endif /* __ISAPNP__ */
static int __devinit
setup_elsa_isapnp(struct IsdnCard *card)
{
struct IsdnCardState *cs = card->cs;
#ifdef __ISAPNP__ #ifdef __ISAPNP__
if (!card->para[1] && isapnp_present()) { if (!card->para[1] && isapnp_present()) {
struct pnp_dev *pnp_d; struct pnp_dev *pnp_d;
...@@ -972,7 +967,8 @@ setup_elsa(struct IsdnCard *card) ...@@ -972,7 +967,8 @@ setup_elsa(struct IsdnCard *card)
return(0); return(0);
} }
} }
#endif #endif /* __ISAPNP__ */
if (card->para[1] && card->para[0]) { if (card->para[1] && card->para[0]) {
cs->hw.elsa.base = card->para[1]; cs->hw.elsa.base = card->para[1];
cs->irq = card->para[0]; cs->irq = card->para[0];
...@@ -993,7 +989,16 @@ setup_elsa(struct IsdnCard *card) ...@@ -993,7 +989,16 @@ setup_elsa(struct IsdnCard *card)
Elsa_Types[cs->subtyp], Elsa_Types[cs->subtyp],
cs->hw.elsa.base, cs->hw.elsa.base,
cs->irq); cs->irq);
} else if (cs->typ == ISDN_CTYPE_ELSA_PCMCIA) {
return (1);
}
static void __devinit
setup_elsa_pcmcia(struct IsdnCard *card)
{
struct IsdnCardState *cs = card->cs;
u_char val;
cs->hw.elsa.base = card->para[1]; cs->hw.elsa.base = card->para[1];
cs->irq = card->para[0]; cs->irq = card->para[0];
val = readreg(cs->hw.elsa.base + 0, cs->hw.elsa.base + 2, IPAC_ID); val = readreg(cs->hw.elsa.base + 0, cs->hw.elsa.base + 2, IPAC_ID);
...@@ -1018,8 +1023,17 @@ setup_elsa(struct IsdnCard *card) ...@@ -1018,8 +1023,17 @@ setup_elsa(struct IsdnCard *card)
Elsa_Types[cs->subtyp], Elsa_Types[cs->subtyp],
cs->hw.elsa.base, cs->hw.elsa.base,
cs->irq); cs->irq);
} else if (cs->typ == ISDN_CTYPE_ELSA_PCI) { }
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
static struct pci_dev *dev_qs1000 __devinitdata = NULL;
static struct pci_dev *dev_qs3000 __devinitdata = NULL;
static int __devinit
setup_elsa_pci(struct IsdnCard *card)
{
struct IsdnCardState *cs = card->cs;
cs->subtyp = 0; cs->subtyp = 0;
if ((dev_qs1000 = pci_find_device(PCI_VENDOR_ID_ELSA, if ((dev_qs1000 = pci_find_device(PCI_VENDOR_ID_ELSA,
PCI_DEVICE_ID_ELSA_MICROLINK, dev_qs1000))) { PCI_DEVICE_ID_ELSA_MICROLINK, dev_qs1000))) {
...@@ -1068,13 +1082,25 @@ setup_elsa(struct IsdnCard *card) ...@@ -1068,13 +1082,25 @@ setup_elsa(struct IsdnCard *card)
cs->hw.elsa.base, cs->hw.elsa.base,
cs->hw.elsa.cfg, cs->hw.elsa.cfg,
cs->irq); cs->irq);
return (1);
}
#else #else
printk(KERN_WARNING "Elsa: Elsa PCI and NO_PCI_BIOS\n");
printk(KERN_WARNING "Elsa: unable to config Elsa PCI\n"); static void __devinit
return (0); setup_elsa_pci(struct IsdnCard *card)
{
return (1);
}
#endif /* CONFIG_PCI */ #endif /* CONFIG_PCI */
} else
return (0); static int __devinit
setup_elsa_common(struct IsdnCard *card)
{
struct IsdnCardState *cs = card->cs;
u_char val;
int bytecnt;
switch (cs->subtyp) { switch (cs->subtyp) {
case ELSA_PC: case ELSA_PC:
...@@ -1104,8 +1130,7 @@ setup_elsa(struct IsdnCard *card) ...@@ -1104,8 +1130,7 @@ setup_elsa(struct IsdnCard *card)
here, it would fail. */ here, it would fail. */
if (cs->typ != ISDN_CTYPE_ELSA_PCMCIA && !request_region(cs->hw.elsa.base, bytecnt, "elsa isdn")) { if (cs->typ != ISDN_CTYPE_ELSA_PCMCIA && !request_region(cs->hw.elsa.base, bytecnt, "elsa isdn")) {
printk(KERN_WARNING printk(KERN_WARNING
"HiSax: %s config port %#lx-%#lx already in use\n", "HiSax: ELSA config port %#lx-%#lx already in use\n",
CardType[card->typ],
cs->hw.elsa.base, cs->hw.elsa.base,
cs->hw.elsa.base + bytecnt); cs->hw.elsa.base + bytecnt);
return (0); return (0);
...@@ -1113,8 +1138,7 @@ setup_elsa(struct IsdnCard *card) ...@@ -1113,8 +1138,7 @@ setup_elsa(struct IsdnCard *card)
if ((cs->subtyp == ELSA_QS1000PCI) || (cs->subtyp == ELSA_QS3000PCI)) { if ((cs->subtyp == ELSA_QS1000PCI) || (cs->subtyp == ELSA_QS3000PCI)) {
if (!request_region(cs->hw.elsa.cfg, 0x80, "elsa isdn pci")) { if (!request_region(cs->hw.elsa.cfg, 0x80, "elsa isdn pci")) {
printk(KERN_WARNING printk(KERN_WARNING
"HiSax: %s pci port %x-%x already in use\n", "HiSax: ELSA pci port %x-%x already in use\n",
CardType[card->typ],
cs->hw.elsa.cfg, cs->hw.elsa.cfg,
cs->hw.elsa.cfg + 0x80); cs->hw.elsa.cfg + 0x80);
release_region(cs->hw.elsa.base, bytecnt); release_region(cs->hw.elsa.base, bytecnt);
...@@ -1186,3 +1210,41 @@ setup_elsa(struct IsdnCard *card) ...@@ -1186,3 +1210,41 @@ setup_elsa(struct IsdnCard *card)
} }
return (1); return (1);
} }
int __devinit
setup_elsa(struct IsdnCard *card)
{
int rc;
struct IsdnCardState *cs = card->cs;
char tmp[64];
strcpy(tmp, Elsa_revision);
printk(KERN_INFO "HiSax: Elsa driver Rev. %s\n", HiSax_getrev(tmp));
cs->hw.elsa.ctrl_reg = 0;
cs->hw.elsa.status = 0;
cs->hw.elsa.MFlag = 0;
cs->subtyp = 0;
if (cs->typ == ISDN_CTYPE_ELSA) {
rc = setup_elsa_isa(card);
if (!rc)
return (0);
} else if (cs->typ == ISDN_CTYPE_ELSA_PNP) {
rc = setup_elsa_isapnp(card);
if (!rc)
return (0);
} else if (cs->typ == ISDN_CTYPE_ELSA_PCMCIA)
setup_elsa_pcmcia(card);
else if (cs->typ == ISDN_CTYPE_ELSA_PCI) {
rc = setup_elsa_pci(card);
if (!rc)
return (0);
} else
return (0);
return setup_elsa_common(card);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment