Merge ../linux-2.6-watchdog-mm
[linux-drm-fsl-dcu.git] / drivers / isdn / hisax / diva.c
index e294fa3918f3799dbbf5adbe266e1d77f1d8bbff..3dacfff93f5fb6c51ff0c873278f800bfed9c8e6 100644 (file)
@@ -289,7 +289,7 @@ MemWriteHSCX_IPACX(struct IsdnCardState *cs, int hscx, u_char offset, u_char val
 #include "hscx_irq.c"
 
 static irqreturn_t
-diva_interrupt(int intno, void *dev_id, struct pt_regs *regs)
+diva_interrupt(int intno, void *dev_id)
 {
        struct IsdnCardState *cs = dev_id;
        u_char val, sval;
@@ -319,7 +319,7 @@ diva_interrupt(int intno, void *dev_id, struct pt_regs *regs)
 }
 
 static irqreturn_t
-diva_irq_ipac_isa(int intno, void *dev_id, struct pt_regs *regs)
+diva_irq_ipac_isa(int intno, void *dev_id)
 {
        struct IsdnCardState *cs = dev_id;
        u_char ista,val;
@@ -630,7 +630,7 @@ Memhscx_int_main(struct IsdnCardState *cs, u_char val)
 }
 
 static irqreturn_t
-diva_irq_ipac_pci(int intno, void *dev_id, struct pt_regs *regs)
+diva_irq_ipac_pci(int intno, void *dev_id)
 {
        struct IsdnCardState *cs = dev_id;
        u_char ista,val;
@@ -685,7 +685,7 @@ Start_IPACPCI:
 }
 
 static irqreturn_t
-diva_irq_ipacx_pci(int intno, void *dev_id, struct pt_regs *regs)
+diva_irq_ipacx_pci(int intno, void *dev_id)
 {
        struct IsdnCardState *cs = dev_id;
        u_char val;
@@ -716,8 +716,10 @@ release_io_diva(struct IsdnCardState *cs)
 
                *cfg = 0; /* disable INT0/1 */ 
                *cfg = 2; /* reset pending INT0 */
-               iounmap((void *)cs->hw.diva.cfg_reg);
-               iounmap((void *)cs->hw.diva.pci_cfg);
+               if (cs->hw.diva.cfg_reg)
+                       iounmap((void *)cs->hw.diva.cfg_reg);
+               if (cs->hw.diva.pci_cfg)
+                       iounmap((void *)cs->hw.diva.pci_cfg);
                return;
        } else if (cs->subtyp != DIVA_IPAC_ISA) {
                del_timer(&cs->hw.diva.tl);
@@ -733,6 +735,23 @@ release_io_diva(struct IsdnCardState *cs)
        }
 }
 
+static void
+iounmap_diva(struct IsdnCardState *cs)
+{
+       if ((cs->subtyp == DIVA_IPAC_PCI) || (cs->subtyp == DIVA_IPACX_PCI)) {
+               if (cs->hw.diva.cfg_reg) {
+                       iounmap((void *)cs->hw.diva.cfg_reg);
+                       cs->hw.diva.cfg_reg = 0;
+               }
+               if (cs->hw.diva.pci_cfg) {
+                       iounmap((void *)cs->hw.diva.pci_cfg);
+                       cs->hw.diva.pci_cfg = 0;
+               }
+       }
+
+       return;
+}
+
 static void
 reset_diva(struct IsdnCardState *cs)
 {
@@ -1069,11 +1088,13 @@ setup_diva(struct IsdnCard *card)
 
                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;
@@ -1123,6 +1144,7 @@ ready:
                               CardType[card->typ],
                               cs->hw.diva.cfg_reg,
                               cs->hw.diva.cfg_reg + bytecnt);
+                       iounmap_diva(cs);
                        return (0);
                }
        }