static int __init
 init_arctic_mtd(void)
 {
+       int err = 0;
+
        printk("%s: 0x%08x at 0x%08x\n", NAME, SIZE, PADDR);
 
        arctic_mtd_map.virt = ioremap(PADDR, SIZE);
        printk("%s: probing %d-bit flash bus\n", NAME, BUSWIDTH * 8);
        arctic_mtd = do_map_probe("cfi_probe", &arctic_mtd_map);
 
-       if (!arctic_mtd)
+       if (!arctic_mtd) {
+               iounmap((void *) arctic_mtd_map.virt);
                return -ENXIO;
+       }
 
        arctic_mtd->owner = THIS_MODULE;
 
-       return add_mtd_partitions(arctic_mtd, arctic_partitions, PARTITIONS);
+       err = add_mtd_partitions(arctic_mtd, arctic_partitions, PARTITIONS);
+       if (err) {
+               printk("%s: add_mtd_partitions failed\n", NAME);
+               iounmap((void *) arctic_mtd_map.virt);
+       }
+
+       return err;
 }
 
 static void __exit
 
 static int __init
 init_beech_mtd(void)
 {
+       int err = 0;
+
        printk("%s: 0x%08x at 0x%08x\n", NAME, SIZE, PADDR);
 
        beech_mtd_map.virt = ioremap(PADDR, SIZE);
        printk("%s: probing %d-bit flash bus\n", NAME, BUSWIDTH * 8);
        beech_mtd = do_map_probe("cfi_probe", &beech_mtd_map);
 
-       if (!beech_mtd)
+       if (!beech_mtd) {
+               iounmap((void *) beech_mtd_map.virt);
                return -ENXIO;
+       }
 
        beech_mtd->owner = THIS_MODULE;
 
-       return add_mtd_partitions(beech_mtd, beech_partitions, 2);
+       err = add_mtd_partitions(beech_mtd, beech_partitions, 2);
+       if (err) {
+               printk("%s: add_mtd_partitions failed\n", NAME);
+               iounmap((void *) beech_mtd_map.virt);
+       }
+
+       return err;
 }
 
 static void __exit
 
                cstm_mips_ixx_map[i].phys = cstm_mips_ixx_board_desc[i].window_addr;
                cstm_mips_ixx_map[i].virt = ioremap(cstm_mips_ixx_board_desc[i].window_addr, cstm_mips_ixx_board_desc[i].window_size);
                if (!cstm_mips_ixx_map[i].virt) {
+                       int j = 0;
                        printk(KERN_WARNING "Failed to ioremap\n");
+                       for (j = 0; j < i; j++) {
+                               if (cstm_mips_ixx_map[j].virt) {
+                                       iounmap((void *)cstm_mips_ixx_map[j].virt);
+                                       cstm_mips_ixx_map[j].virt = 0;
+                               }
+                       }
                        return -EIO;
                }
                cstm_mips_ixx_map[i].name = cstm_mips_ixx_board_desc[i].name;
                        cstm_mips_ixx_map[i].map_priv_2 = (unsigned long)mymtd;
                        add_mtd_partitions(mymtd, parts, cstm_mips_ixx_board_desc[i].num_partitions);
                }
-               else
-                  return -ENXIO;
+               else {
+                       for (i = 0; i < PHYSMAP_NUMBER; i++) {
+                               if (cstm_mips_ixx_map[i].virt) {
+                                       iounmap((void *)cstm_mips_ixx_map[i].virt);
+                                       cstm_mips_ixx_map[i].virt = 0;
+                               }
+                       }
+                       return -ENXIO;
+               }
        }
        return 0;
 }
 
                                        ARRAY_SIZE(ebony_small_partitions));
        } else {
                printk("map probe failed for flash\n");
+               iounmap(ebony_small_map.virt);
                return -ENXIO;
        }
 
 
        if (!ebony_large_map.virt) {
                printk("Failed to ioremap flash\n");
+               iounmap(ebony_small_map.virt);
                return -EIO;
        }
 
                                        ARRAY_SIZE(ebony_large_partitions));
        } else {
                printk("map probe failed for flash\n");
+               iounmap(ebony_small_map.virt);
+               iounmap(ebony_large_map.virt);
                return -ENXIO;
        }
 
 
                                map_regions[ix].map_info.size);
                        if(!map_regions[ix].map_info.virt)
                        {
+                               int j = 0;
                                printk(MTD_FORTUNET_PK "%s flash failed to ioremap!\n",
                                        map_regions[ix].map_info.name);
+                               for (j = 0 ; j < ix; j++)
+                                       iounmap(map_regions[j].map_info.virt);
                                return -ENXIO;
                        }
                        simple_map_init(&map_regions[ix].map_info);
 
                return 0;
        }
 
+       iounmap(lasat_map.virt);
        return -ENXIO;
 }
 
                map_destroy(lasat_mtd);
        }
        if (lasat_map.virt) {
+               iounmap(lasat_map.virt);
                lasat_map.virt = 0;
        }
 }
 
        nettel_amd_map.virt = ioremap_nocache(amdaddr, maxsize);
        if (!nettel_amd_map.virt) {
                printk("SNAPGEAR: failed to ioremap() BOOTCS\n");
+               iounmap(nettel_mmcrp);
                return(-EIO);
        }
        simple_map_init(&nettel_amd_map);
                nettel_amd_map.virt = NULL;
 #else
                /* Only AMD flash supported */
-               return(-ENXIO);
+               rc = -ENXIO;
+               goto out_unmap2;
 #endif
        }
 
        nettel_intel_map.virt = ioremap_nocache(intel0addr, maxsize);
        if (!nettel_intel_map.virt) {
                printk("SNAPGEAR: failed to ioremap() ROMCS1\n");
-               return(-EIO);
+               rc = -EIO;
+               goto out_unmap2;
        }
        simple_map_init(&nettel_intel_map);
 
        intel_mtd = do_map_probe("cfi_probe", &nettel_intel_map);
        if (!intel_mtd) {
-               iounmap(nettel_intel_map.virt);
-               return(-ENXIO);
+               rc = -ENXIO;
+               goto out_unmap1;
        }
 
        /* Set PAR to the detected size */
        nettel_intel_map.virt = ioremap_nocache(intel0addr, maxsize);
        if (!nettel_intel_map.virt) {
                printk("SNAPGEAR: failed to ioremap() ROMCS1/2\n");
-               return(-EIO);
+               rc = -EIO;
+               goto out_unmap2;
        }
 
        intel_mtd = do_map_probe("cfi_probe", &nettel_intel_map);
        if (! intel_mtd) {
-               iounmap((void *) nettel_intel_map.virt);
-               return(-ENXIO);
+               rc = -ENXIO;
+               goto out_unmap1;
        }
 
        intel1size = intel_mtd->size - intel0size;
 #endif
 
        return(rc);
+
+#ifdef CONFIG_MTD_CFI_INTELEXT
+out_unmap1:
+       iounmap((void *) nettel_intel_map.virt);
+#endif
+
+out_unmap2:
+       iounmap(nettel_mmcrp);
+       iounmap(nettel_amd_map.virt);
+
+       return(rc);
+               
 }
 
 /****************************************************************************/
                del_mtd_partitions(amd_mtd);
                map_destroy(amd_mtd);
        }
+       if (nettel_mmcrp) {
+               iounmap(nettel_mmcrp);
+               nettel_mmcrp = NULL;
+       }
        if (nettel_amd_map.virt) {
                iounmap(nettel_amd_map.virt);
                nettel_amd_map.virt = NULL;
 
                                        ARRAY_SIZE(ocotea_small_partitions));
        } else {
                printk("map probe failed for flash\n");
+               iounmap(ocotea_small_map.virt);
                return -ENXIO;
        }
 
 
        if (!ocotea_large_map.virt) {
                printk("Failed to ioremap flash\n");
+               iounmap(ocotea_small_map.virt);
                return -EIO;
        }
 
                                        ARRAY_SIZE(ocotea_large_partitions));
        } else {
                printk("map probe failed for flash\n");
+               iounmap(ocotea_small_map.virt);
+               iounmap(ocotea_large_map.virt);
                return -ENXIO;
        }
 
 
        ret = pcmcia_request_configuration(link, &link->conf);
        if(ret != CS_SUCCESS) {
                cs_error(link, RequestConfiguration, ret);
+               if (dev->win_base) {
+                       iounmap(dev->win_base);
+                       dev->win_base = NULL;
+               }
                return -ENODEV;
        }
 
 
 
 int __init init_redwood_flash(void)
 {
+       int err = 0;
+
        printk(KERN_NOTICE "redwood: flash mapping: %x at %x\n",
                        WINDOW_SIZE, WINDOW_ADDR);
 
 
        if (redwood_mtd) {
                redwood_mtd->owner = THIS_MODULE;
-               return add_mtd_partitions(redwood_mtd,
+               err = add_mtd_partitions(redwood_mtd,
                                redwood_flash_partitions,
                                NUM_REDWOOD_FLASH_PARTITIONS);
+               if (err) {
+                       printk("init_redwood_flash: add_mtd_partitions failed\n");
+                       iounmap(redwood_flash_map.virt);
+               }
+               return err;
+
        }
 
+       iounmap(redwood_flash_map.virt);
        return -ENXIO;
 }
 
 
        };
 
        int devicesfound = 0;
-       int i;
+       int i,j;
 
        for (i = 0; i < NUM_FLASH_BANKS; i++) {
                printk (KERN_NOTICE MSG_PREFIX
                        (unsigned long) ioremap (pt[i].addr, pt[i].size);
                if (!sbc8240_map[i].map_priv_1) {
                        printk (MSG_PREFIX "failed to ioremap\n");
+                       for (j = 0; j < i; j++) {
+                               iounmap((void *) sbc8240_map[j].map_priv_1);
+                               sbc8240_map[j].map_priv_1 = 0;
+                       }
                        return -EIO;
                }
                simple_map_init(&sbc8240_mtd[i]);
                if (sbc8240_mtd[i]) {
                        sbc8240_mtd[i]->module = THIS_MODULE;
                        devicesfound++;
+               } else {
+                       if (sbc8240_map[i].map_priv_1) {
+                               iounmap((void *) sbc8240_map[i].map_priv_1);
+                               sbc8240_map[i].map_priv_1 = 0;
+                       }
                }
        }
 
 
 
        if (WALNUT_FLASH_ONBD_N(fpga_brds1)) {
                printk("The on-board flash is disabled (U79 sw 5)!");
+               iounmap(fpga_status_adr);
                return -EIO;
        }
        if (WALNUT_FLASH_SRAM_SEL(fpga_brds1))
 
        if (!walnut_map.virt) {
                printk("Failed to ioremap flash.\n");
+               iounmap(fpga_status_adr);
                return -EIO;
        }
 
                                        ARRAY_SIZE(walnut_partitions));
        } else {
                printk("map probe failed for flash\n");
+               iounmap(fpga_status_adr);
                return -ENXIO;
        }
 
+       iounmap(fpga_status_adr);
        return 0;
 }
 
 
        /* Release resources, unregister device */
        nand_release(ap7312_mtd);
 
+       /* Release io resource */
+       iounmap((void *)this->IO_ADDR_R);
+
        /* Free the MTD device structure */
        kfree(ep7312_mtd);
 }
 
        /* Scan to find existence of the device (it could not be mounted) */
        if (nand_scan(ppchameleon_mtd, 1)) {
                iounmap((void *)ppchameleon_fio_base);
+               ppchameleon_fio_base = NULL;
                kfree(ppchameleon_mtd);
                goto nand_evb_init;
        }
        ppchameleonevb_mtd = kmalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), GFP_KERNEL);
        if (!ppchameleonevb_mtd) {
                printk("Unable to allocate PPChameleonEVB NAND MTD device structure.\n");
+               if (ppchameleon_fio_base)
+                       iounmap(ppchameleon_fio_base);
                return -ENOMEM;
        }
 
        if (!ppchameleonevb_fio_base) {
                printk("ioremap PPChameleonEVB NAND flash failed\n");
                kfree(ppchameleonevb_mtd);
+               if (ppchameleon_fio_base)
+                       iounmap(ppchameleon_fio_base);
                return -EIO;
        }
 
        if (nand_scan(ppchameleonevb_mtd, 1)) {
                iounmap((void *)ppchameleonevb_fio_base);
                kfree(ppchameleonevb_mtd);
+               if (ppchameleon_fio_base)
+                       iounmap(ppchameleon_fio_base);
                return -ENXIO;
        }
 #ifdef CONFIG_MTD_PARTITIONS
 
--- /dev/null
+#define UTS_RELEASE "2.6.18"