mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 05:02:12 +00:00
[ISDN] HiSax diva: split setup into three smaller functions
Just code movement, and the glue to call the new functions. Preparation for hotplug APIs. Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
parent
7da0d9801b
commit
4b5a9b3d8e
@ -25,8 +25,6 @@
|
|||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/isapnp.h>
|
#include <linux/isapnp.h>
|
||||||
|
|
||||||
extern const char *CardType[];
|
|
||||||
|
|
||||||
static const char *Diva_revision = "$Revision: 1.33.2.6 $";
|
static const char *Diva_revision = "$Revision: 1.33.2.6 $";
|
||||||
|
|
||||||
#define byteout(addr,val) outb(val,addr)
|
#define byteout(addr,val) outb(val,addr)
|
||||||
@ -906,225 +904,15 @@ Diva_card_msg(struct IsdnCardState *cs, int mt, void *arg)
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pci_dev *dev_diva __devinitdata = NULL;
|
static int __devinit setup_diva_common(struct IsdnCardState *cs)
|
||||||
static struct pci_dev *dev_diva_u __devinitdata = NULL;
|
|
||||||
static struct pci_dev *dev_diva201 __devinitdata = NULL;
|
|
||||||
static struct pci_dev *dev_diva202 __devinitdata = NULL;
|
|
||||||
|
|
||||||
#ifdef __ISAPNP__
|
|
||||||
static struct isapnp_device_id diva_ids[] __devinitdata = {
|
|
||||||
{ ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x51),
|
|
||||||
ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x51),
|
|
||||||
(unsigned long) "Diva picola" },
|
|
||||||
{ ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x51),
|
|
||||||
ISAPNP_VENDOR('E', 'I', 'C'), ISAPNP_FUNCTION(0x51),
|
|
||||||
(unsigned long) "Diva picola" },
|
|
||||||
{ ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x71),
|
|
||||||
ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x71),
|
|
||||||
(unsigned long) "Diva 2.0" },
|
|
||||||
{ ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x71),
|
|
||||||
ISAPNP_VENDOR('E', 'I', 'C'), ISAPNP_FUNCTION(0x71),
|
|
||||||
(unsigned long) "Diva 2.0" },
|
|
||||||
{ ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0xA1),
|
|
||||||
ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0xA1),
|
|
||||||
(unsigned long) "Diva 2.01" },
|
|
||||||
{ ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0xA1),
|
|
||||||
ISAPNP_VENDOR('E', 'I', 'C'), ISAPNP_FUNCTION(0xA1),
|
|
||||||
(unsigned long) "Diva 2.01" },
|
|
||||||
{ 0, }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct isapnp_device_id *ipid __devinitdata = &diva_ids[0];
|
|
||||||
static struct pnp_card *pnp_c __devinitdata = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
int __devinit
|
|
||||||
setup_diva(struct IsdnCard *card)
|
|
||||||
{
|
{
|
||||||
int bytecnt = 8;
|
int bytecnt;
|
||||||
u_char val;
|
u_char val;
|
||||||
struct IsdnCardState *cs = card->cs;
|
|
||||||
char tmp[64];
|
|
||||||
|
|
||||||
strcpy(tmp, Diva_revision);
|
if ((cs->subtyp == DIVA_ISA) || (cs->subtyp == DIVA_IPAC_ISA))
|
||||||
printk(KERN_INFO "HiSax: Eicon.Diehl Diva driver Rev. %s\n", HiSax_getrev(tmp));
|
bytecnt = 8;
|
||||||
if (cs->typ != ISDN_CTYPE_DIEHLDIVA)
|
else
|
||||||
return(0);
|
bytecnt = 32;
|
||||||
cs->hw.diva.status = 0;
|
|
||||||
if (card->para[1]) {
|
|
||||||
cs->hw.diva.ctrl_reg = 0;
|
|
||||||
cs->hw.diva.cfg_reg = card->para[1];
|
|
||||||
val = readreg(cs->hw.diva.cfg_reg + DIVA_IPAC_ADR,
|
|
||||||
cs->hw.diva.cfg_reg + DIVA_IPAC_DATA, IPAC_ID);
|
|
||||||
printk(KERN_INFO "Diva: IPAC version %x\n", val);
|
|
||||||
if ((val == 1) || (val==2)) {
|
|
||||||
cs->subtyp = DIVA_IPAC_ISA;
|
|
||||||
cs->hw.diva.ctrl = 0;
|
|
||||||
cs->hw.diva.isac = card->para[1] + DIVA_IPAC_DATA;
|
|
||||||
cs->hw.diva.hscx = card->para[1] + DIVA_IPAC_DATA;
|
|
||||||
cs->hw.diva.isac_adr = card->para[1] + DIVA_IPAC_ADR;
|
|
||||||
cs->hw.diva.hscx_adr = card->para[1] + DIVA_IPAC_ADR;
|
|
||||||
test_and_set_bit(HW_IPAC, &cs->HW_Flags);
|
|
||||||
} else {
|
|
||||||
cs->subtyp = DIVA_ISA;
|
|
||||||
cs->hw.diva.ctrl = card->para[1] + DIVA_ISA_CTRL;
|
|
||||||
cs->hw.diva.isac = card->para[1] + DIVA_ISA_ISAC_DATA;
|
|
||||||
cs->hw.diva.hscx = card->para[1] + DIVA_HSCX_DATA;
|
|
||||||
cs->hw.diva.isac_adr = card->para[1] + DIVA_ISA_ISAC_ADR;
|
|
||||||
cs->hw.diva.hscx_adr = card->para[1] + DIVA_HSCX_ADR;
|
|
||||||
}
|
|
||||||
cs->irq = card->para[0];
|
|
||||||
} 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 "Diva PnP:some resources are missing %ld/%lx\n",
|
|
||||||
card->para[0], card->para[1]);
|
|
||||||
pnp_disable_dev(pnp_d);
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
cs->hw.diva.cfg_reg = card->para[1];
|
|
||||||
cs->irq = card->para[0];
|
|
||||||
if (ipid->function == ISAPNP_FUNCTION(0xA1)) {
|
|
||||||
cs->subtyp = DIVA_IPAC_ISA;
|
|
||||||
cs->hw.diva.ctrl = 0;
|
|
||||||
cs->hw.diva.isac =
|
|
||||||
card->para[1] + DIVA_IPAC_DATA;
|
|
||||||
cs->hw.diva.hscx =
|
|
||||||
card->para[1] + DIVA_IPAC_DATA;
|
|
||||||
cs->hw.diva.isac_adr =
|
|
||||||
card->para[1] + DIVA_IPAC_ADR;
|
|
||||||
cs->hw.diva.hscx_adr =
|
|
||||||
card->para[1] + DIVA_IPAC_ADR;
|
|
||||||
test_and_set_bit(HW_IPAC, &cs->HW_Flags);
|
|
||||||
} else {
|
|
||||||
cs->subtyp = DIVA_ISA;
|
|
||||||
cs->hw.diva.ctrl =
|
|
||||||
card->para[1] + DIVA_ISA_CTRL;
|
|
||||||
cs->hw.diva.isac =
|
|
||||||
card->para[1] + DIVA_ISA_ISAC_DATA;
|
|
||||||
cs->hw.diva.hscx =
|
|
||||||
card->para[1] + DIVA_HSCX_DATA;
|
|
||||||
cs->hw.diva.isac_adr =
|
|
||||||
card->para[1] + DIVA_ISA_ISAC_ADR;
|
|
||||||
cs->hw.diva.hscx_adr =
|
|
||||||
card->para[1] + DIVA_HSCX_ADR;
|
|
||||||
}
|
|
||||||
goto ready;
|
|
||||||
} else {
|
|
||||||
printk(KERN_ERR "Diva PnP: PnP error card found, no device\n");
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ipid++;
|
|
||||||
pnp_c=NULL;
|
|
||||||
}
|
|
||||||
if (!ipid->card_vendor) {
|
|
||||||
printk(KERN_INFO "Diva PnP: no ISAPnP card found\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_PCI
|
|
||||||
cs->subtyp = 0;
|
|
||||||
if ((dev_diva = pci_find_device(PCI_VENDOR_ID_EICON,
|
|
||||||
PCI_DEVICE_ID_EICON_DIVA20, dev_diva))) {
|
|
||||||
if (pci_enable_device(dev_diva))
|
|
||||||
return(0);
|
|
||||||
cs->subtyp = DIVA_PCI;
|
|
||||||
cs->irq = dev_diva->irq;
|
|
||||||
cs->hw.diva.cfg_reg = pci_resource_start(dev_diva, 2);
|
|
||||||
} else if ((dev_diva_u = pci_find_device(PCI_VENDOR_ID_EICON,
|
|
||||||
PCI_DEVICE_ID_EICON_DIVA20_U, dev_diva_u))) {
|
|
||||||
if (pci_enable_device(dev_diva_u))
|
|
||||||
return(0);
|
|
||||||
cs->subtyp = DIVA_PCI;
|
|
||||||
cs->irq = dev_diva_u->irq;
|
|
||||||
cs->hw.diva.cfg_reg = pci_resource_start(dev_diva_u, 2);
|
|
||||||
} else if ((dev_diva201 = pci_find_device(PCI_VENDOR_ID_EICON,
|
|
||||||
PCI_DEVICE_ID_EICON_DIVA201, dev_diva201))) {
|
|
||||||
if (pci_enable_device(dev_diva201))
|
|
||||||
return(0);
|
|
||||||
cs->subtyp = DIVA_IPAC_PCI;
|
|
||||||
cs->irq = dev_diva201->irq;
|
|
||||||
cs->hw.diva.pci_cfg =
|
|
||||||
(ulong) ioremap(pci_resource_start(dev_diva201, 0), 4096);
|
|
||||||
cs->hw.diva.cfg_reg =
|
|
||||||
(ulong) ioremap(pci_resource_start(dev_diva201, 1), 4096);
|
|
||||||
} else if ((dev_diva202 = pci_find_device(PCI_VENDOR_ID_EICON,
|
|
||||||
PCI_DEVICE_ID_EICON_DIVA202, dev_diva202))) {
|
|
||||||
if (pci_enable_device(dev_diva202))
|
|
||||||
return(0);
|
|
||||||
cs->subtyp = DIVA_IPACX_PCI;
|
|
||||||
cs->irq = dev_diva202->irq;
|
|
||||||
cs->hw.diva.pci_cfg =
|
|
||||||
(ulong) ioremap(pci_resource_start(dev_diva202, 0), 4096);
|
|
||||||
cs->hw.diva.cfg_reg =
|
|
||||||
(ulong) ioremap(pci_resource_start(dev_diva202, 1), 4096);
|
|
||||||
} else {
|
|
||||||
printk(KERN_WARNING "Diva: No PCI card found\n");
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!cs->irq) {
|
|
||||||
printk(KERN_WARNING "Diva: No IRQ for PCI card found\n");
|
|
||||||
iounmap_diva(cs);
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!cs->hw.diva.cfg_reg) {
|
|
||||||
printk(KERN_WARNING "Diva: No IO-Adr for PCI card found\n");
|
|
||||||
iounmap_diva(cs);
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
cs->irq_flags |= IRQF_SHARED;
|
|
||||||
#else
|
|
||||||
printk(KERN_WARNING "Diva: cfgreg 0 and NO_PCI_BIOS\n");
|
|
||||||
printk(KERN_WARNING "Diva: unable to config DIVA PCI\n");
|
|
||||||
return (0);
|
|
||||||
#endif /* CONFIG_PCI */
|
|
||||||
if ((cs->subtyp == DIVA_IPAC_PCI) ||
|
|
||||||
(cs->subtyp == DIVA_IPACX_PCI) ) {
|
|
||||||
cs->hw.diva.ctrl = 0;
|
|
||||||
cs->hw.diva.isac = 0;
|
|
||||||
cs->hw.diva.hscx = 0;
|
|
||||||
cs->hw.diva.isac_adr = 0;
|
|
||||||
cs->hw.diva.hscx_adr = 0;
|
|
||||||
test_and_set_bit(HW_IPAC, &cs->HW_Flags);
|
|
||||||
bytecnt = 0;
|
|
||||||
} else {
|
|
||||||
cs->hw.diva.ctrl = cs->hw.diva.cfg_reg + DIVA_PCI_CTRL;
|
|
||||||
cs->hw.diva.isac = cs->hw.diva.cfg_reg + DIVA_PCI_ISAC_DATA;
|
|
||||||
cs->hw.diva.hscx = cs->hw.diva.cfg_reg + DIVA_HSCX_DATA;
|
|
||||||
cs->hw.diva.isac_adr = cs->hw.diva.cfg_reg + DIVA_PCI_ISAC_ADR;
|
|
||||||
cs->hw.diva.hscx_adr = cs->hw.diva.cfg_reg + DIVA_HSCX_ADR;
|
|
||||||
bytecnt = 32;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __ISAPNP__
|
|
||||||
ready:
|
|
||||||
#endif
|
|
||||||
|
|
||||||
printk(KERN_INFO
|
printk(KERN_INFO
|
||||||
"Diva: %s card configured at %#lx IRQ %d\n",
|
"Diva: %s card configured at %#lx IRQ %d\n",
|
||||||
@ -1145,7 +933,7 @@ ready:
|
|||||||
if (!request_region(cs->hw.diva.cfg_reg, bytecnt, "diva isdn")) {
|
if (!request_region(cs->hw.diva.cfg_reg, bytecnt, "diva isdn")) {
|
||||||
printk(KERN_WARNING
|
printk(KERN_WARNING
|
||||||
"HiSax: %s config port %lx-%lx already in use\n",
|
"HiSax: %s config port %lx-%lx already in use\n",
|
||||||
CardType[card->typ],
|
"diva",
|
||||||
cs->hw.diva.cfg_reg,
|
cs->hw.diva.cfg_reg,
|
||||||
cs->hw.diva.cfg_reg + bytecnt);
|
cs->hw.diva.cfg_reg + bytecnt);
|
||||||
iounmap_diva(cs);
|
iounmap_diva(cs);
|
||||||
@ -1206,3 +994,290 @@ ready:
|
|||||||
}
|
}
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_ISA
|
||||||
|
|
||||||
|
static int __devinit setup_diva_isa(struct IsdnCard *card)
|
||||||
|
{
|
||||||
|
struct IsdnCardState *cs = card->cs;
|
||||||
|
u_char val;
|
||||||
|
|
||||||
|
if (!card->para[1])
|
||||||
|
return (-1); /* card not found; continue search */
|
||||||
|
|
||||||
|
cs->hw.diva.ctrl_reg = 0;
|
||||||
|
cs->hw.diva.cfg_reg = card->para[1];
|
||||||
|
val = readreg(cs->hw.diva.cfg_reg + DIVA_IPAC_ADR,
|
||||||
|
cs->hw.diva.cfg_reg + DIVA_IPAC_DATA, IPAC_ID);
|
||||||
|
printk(KERN_INFO "Diva: IPAC version %x\n", val);
|
||||||
|
if ((val == 1) || (val==2)) {
|
||||||
|
cs->subtyp = DIVA_IPAC_ISA;
|
||||||
|
cs->hw.diva.ctrl = 0;
|
||||||
|
cs->hw.diva.isac = card->para[1] + DIVA_IPAC_DATA;
|
||||||
|
cs->hw.diva.hscx = card->para[1] + DIVA_IPAC_DATA;
|
||||||
|
cs->hw.diva.isac_adr = card->para[1] + DIVA_IPAC_ADR;
|
||||||
|
cs->hw.diva.hscx_adr = card->para[1] + DIVA_IPAC_ADR;
|
||||||
|
test_and_set_bit(HW_IPAC, &cs->HW_Flags);
|
||||||
|
} else {
|
||||||
|
cs->subtyp = DIVA_ISA;
|
||||||
|
cs->hw.diva.ctrl = card->para[1] + DIVA_ISA_CTRL;
|
||||||
|
cs->hw.diva.isac = card->para[1] + DIVA_ISA_ISAC_DATA;
|
||||||
|
cs->hw.diva.hscx = card->para[1] + DIVA_HSCX_DATA;
|
||||||
|
cs->hw.diva.isac_adr = card->para[1] + DIVA_ISA_ISAC_ADR;
|
||||||
|
cs->hw.diva.hscx_adr = card->para[1] + DIVA_HSCX_ADR;
|
||||||
|
}
|
||||||
|
cs->irq = card->para[0];
|
||||||
|
|
||||||
|
return (1); /* card found */
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* if !CONFIG_ISA */
|
||||||
|
|
||||||
|
static int __devinit setup_diva_isa(struct IsdnCard *card)
|
||||||
|
{
|
||||||
|
return (-1); /* card not found; continue search */
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_ISA */
|
||||||
|
|
||||||
|
#ifdef __ISAPNP__
|
||||||
|
static struct isapnp_device_id diva_ids[] __devinitdata = {
|
||||||
|
{ ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x51),
|
||||||
|
ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x51),
|
||||||
|
(unsigned long) "Diva picola" },
|
||||||
|
{ ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x51),
|
||||||
|
ISAPNP_VENDOR('E', 'I', 'C'), ISAPNP_FUNCTION(0x51),
|
||||||
|
(unsigned long) "Diva picola" },
|
||||||
|
{ ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x71),
|
||||||
|
ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x71),
|
||||||
|
(unsigned long) "Diva 2.0" },
|
||||||
|
{ ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x71),
|
||||||
|
ISAPNP_VENDOR('E', 'I', 'C'), ISAPNP_FUNCTION(0x71),
|
||||||
|
(unsigned long) "Diva 2.0" },
|
||||||
|
{ ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0xA1),
|
||||||
|
ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0xA1),
|
||||||
|
(unsigned long) "Diva 2.01" },
|
||||||
|
{ ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0xA1),
|
||||||
|
ISAPNP_VENDOR('E', 'I', 'C'), ISAPNP_FUNCTION(0xA1),
|
||||||
|
(unsigned long) "Diva 2.01" },
|
||||||
|
{ 0, }
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct isapnp_device_id *ipid __devinitdata = &diva_ids[0];
|
||||||
|
static struct pnp_card *pnp_c __devinitdata = NULL;
|
||||||
|
|
||||||
|
static int __devinit setup_diva_isapnp(struct IsdnCard *card)
|
||||||
|
{
|
||||||
|
struct IsdnCardState *cs = card->cs;
|
||||||
|
struct pnp_dev *pnp_d;
|
||||||
|
|
||||||
|
if (!isapnp_present())
|
||||||
|
return (-1); /* card not found; continue search */
|
||||||
|
|
||||||
|
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 "Diva PnP:some resources are missing %ld/%lx\n",
|
||||||
|
card->para[0], card->para[1]);
|
||||||
|
pnp_disable_dev(pnp_d);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
cs->hw.diva.cfg_reg = card->para[1];
|
||||||
|
cs->irq = card->para[0];
|
||||||
|
if (ipid->function == ISAPNP_FUNCTION(0xA1)) {
|
||||||
|
cs->subtyp = DIVA_IPAC_ISA;
|
||||||
|
cs->hw.diva.ctrl = 0;
|
||||||
|
cs->hw.diva.isac =
|
||||||
|
card->para[1] + DIVA_IPAC_DATA;
|
||||||
|
cs->hw.diva.hscx =
|
||||||
|
card->para[1] + DIVA_IPAC_DATA;
|
||||||
|
cs->hw.diva.isac_adr =
|
||||||
|
card->para[1] + DIVA_IPAC_ADR;
|
||||||
|
cs->hw.diva.hscx_adr =
|
||||||
|
card->para[1] + DIVA_IPAC_ADR;
|
||||||
|
test_and_set_bit(HW_IPAC, &cs->HW_Flags);
|
||||||
|
} else {
|
||||||
|
cs->subtyp = DIVA_ISA;
|
||||||
|
cs->hw.diva.ctrl =
|
||||||
|
card->para[1] + DIVA_ISA_CTRL;
|
||||||
|
cs->hw.diva.isac =
|
||||||
|
card->para[1] + DIVA_ISA_ISAC_DATA;
|
||||||
|
cs->hw.diva.hscx =
|
||||||
|
card->para[1] + DIVA_HSCX_DATA;
|
||||||
|
cs->hw.diva.isac_adr =
|
||||||
|
card->para[1] + DIVA_ISA_ISAC_ADR;
|
||||||
|
cs->hw.diva.hscx_adr =
|
||||||
|
card->para[1] + DIVA_HSCX_ADR;
|
||||||
|
}
|
||||||
|
return (1); /* card found */
|
||||||
|
} else {
|
||||||
|
printk(KERN_ERR "Diva PnP: PnP error card found, no device\n");
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ipid++;
|
||||||
|
pnp_c=NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (-1); /* card not found; continue search */
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* if !ISAPNP */
|
||||||
|
|
||||||
|
static int __devinit setup_diva_isapnp(struct IsdnCard *card)
|
||||||
|
{
|
||||||
|
return (-1); /* card not found; continue search */
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ISAPNP */
|
||||||
|
|
||||||
|
#ifdef CONFIG_PCI
|
||||||
|
static struct pci_dev *dev_diva __devinitdata = NULL;
|
||||||
|
static struct pci_dev *dev_diva_u __devinitdata = NULL;
|
||||||
|
static struct pci_dev *dev_diva201 __devinitdata = NULL;
|
||||||
|
static struct pci_dev *dev_diva202 __devinitdata = NULL;
|
||||||
|
|
||||||
|
static int __devinit setup_diva_pci(struct IsdnCard *card)
|
||||||
|
{
|
||||||
|
struct IsdnCardState *cs = card->cs;
|
||||||
|
|
||||||
|
cs->subtyp = 0;
|
||||||
|
if ((dev_diva = pci_find_device(PCI_VENDOR_ID_EICON,
|
||||||
|
PCI_DEVICE_ID_EICON_DIVA20, dev_diva))) {
|
||||||
|
if (pci_enable_device(dev_diva))
|
||||||
|
return(0);
|
||||||
|
cs->subtyp = DIVA_PCI;
|
||||||
|
cs->irq = dev_diva->irq;
|
||||||
|
cs->hw.diva.cfg_reg = pci_resource_start(dev_diva, 2);
|
||||||
|
} else if ((dev_diva_u = pci_find_device(PCI_VENDOR_ID_EICON,
|
||||||
|
PCI_DEVICE_ID_EICON_DIVA20_U, dev_diva_u))) {
|
||||||
|
if (pci_enable_device(dev_diva_u))
|
||||||
|
return(0);
|
||||||
|
cs->subtyp = DIVA_PCI;
|
||||||
|
cs->irq = dev_diva_u->irq;
|
||||||
|
cs->hw.diva.cfg_reg = pci_resource_start(dev_diva_u, 2);
|
||||||
|
} else if ((dev_diva201 = pci_find_device(PCI_VENDOR_ID_EICON,
|
||||||
|
PCI_DEVICE_ID_EICON_DIVA201, dev_diva201))) {
|
||||||
|
if (pci_enable_device(dev_diva201))
|
||||||
|
return(0);
|
||||||
|
cs->subtyp = DIVA_IPAC_PCI;
|
||||||
|
cs->irq = dev_diva201->irq;
|
||||||
|
cs->hw.diva.pci_cfg =
|
||||||
|
(ulong) ioremap(pci_resource_start(dev_diva201, 0), 4096);
|
||||||
|
cs->hw.diva.cfg_reg =
|
||||||
|
(ulong) ioremap(pci_resource_start(dev_diva201, 1), 4096);
|
||||||
|
} else if ((dev_diva202 = pci_find_device(PCI_VENDOR_ID_EICON,
|
||||||
|
PCI_DEVICE_ID_EICON_DIVA202, dev_diva202))) {
|
||||||
|
if (pci_enable_device(dev_diva202))
|
||||||
|
return(0);
|
||||||
|
cs->subtyp = DIVA_IPACX_PCI;
|
||||||
|
cs->irq = dev_diva202->irq;
|
||||||
|
cs->hw.diva.pci_cfg =
|
||||||
|
(ulong) ioremap(pci_resource_start(dev_diva202, 0), 4096);
|
||||||
|
cs->hw.diva.cfg_reg =
|
||||||
|
(ulong) ioremap(pci_resource_start(dev_diva202, 1), 4096);
|
||||||
|
} else {
|
||||||
|
return (-1); /* card not found; continue search */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cs->irq) {
|
||||||
|
printk(KERN_WARNING "Diva: No IRQ for PCI card found\n");
|
||||||
|
iounmap_diva(cs);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cs->hw.diva.cfg_reg) {
|
||||||
|
printk(KERN_WARNING "Diva: No IO-Adr for PCI card found\n");
|
||||||
|
iounmap_diva(cs);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
cs->irq_flags |= IRQF_SHARED;
|
||||||
|
|
||||||
|
if ((cs->subtyp == DIVA_IPAC_PCI) ||
|
||||||
|
(cs->subtyp == DIVA_IPACX_PCI) ) {
|
||||||
|
cs->hw.diva.ctrl = 0;
|
||||||
|
cs->hw.diva.isac = 0;
|
||||||
|
cs->hw.diva.hscx = 0;
|
||||||
|
cs->hw.diva.isac_adr = 0;
|
||||||
|
cs->hw.diva.hscx_adr = 0;
|
||||||
|
test_and_set_bit(HW_IPAC, &cs->HW_Flags);
|
||||||
|
} else {
|
||||||
|
cs->hw.diva.ctrl = cs->hw.diva.cfg_reg + DIVA_PCI_CTRL;
|
||||||
|
cs->hw.diva.isac = cs->hw.diva.cfg_reg + DIVA_PCI_ISAC_DATA;
|
||||||
|
cs->hw.diva.hscx = cs->hw.diva.cfg_reg + DIVA_HSCX_DATA;
|
||||||
|
cs->hw.diva.isac_adr = cs->hw.diva.cfg_reg + DIVA_PCI_ISAC_ADR;
|
||||||
|
cs->hw.diva.hscx_adr = cs->hw.diva.cfg_reg + DIVA_HSCX_ADR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (1); /* card found */
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* if !CONFIG_PCI */
|
||||||
|
|
||||||
|
static int __devinit setup_diva_pci(struct IsdnCard *card)
|
||||||
|
{
|
||||||
|
return (-1); /* card not found; continue search */
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_PCI */
|
||||||
|
|
||||||
|
int __devinit
|
||||||
|
setup_diva(struct IsdnCard *card)
|
||||||
|
{
|
||||||
|
int rc, have_card = 0;
|
||||||
|
struct IsdnCardState *cs = card->cs;
|
||||||
|
char tmp[64];
|
||||||
|
|
||||||
|
strcpy(tmp, Diva_revision);
|
||||||
|
printk(KERN_INFO "HiSax: Eicon.Diehl Diva driver Rev. %s\n", HiSax_getrev(tmp));
|
||||||
|
if (cs->typ != ISDN_CTYPE_DIEHLDIVA)
|
||||||
|
return(0);
|
||||||
|
cs->hw.diva.status = 0;
|
||||||
|
|
||||||
|
rc = setup_diva_isa(card);
|
||||||
|
if (!rc)
|
||||||
|
return rc;
|
||||||
|
if (rc > 0) {
|
||||||
|
have_card = 1;
|
||||||
|
goto ready;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = setup_diva_isapnp(card);
|
||||||
|
if (!rc)
|
||||||
|
return rc;
|
||||||
|
if (rc > 0) {
|
||||||
|
have_card = 1;
|
||||||
|
goto ready;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = setup_diva_pci(card);
|
||||||
|
if (!rc)
|
||||||
|
return rc;
|
||||||
|
if (rc > 0)
|
||||||
|
have_card = 1;
|
||||||
|
|
||||||
|
ready:
|
||||||
|
if (!have_card) {
|
||||||
|
printk(KERN_WARNING "Diva: No ISA, ISAPNP or PCI card found\n");
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return setup_diva_common(card->cs);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user