Subject: axonram fixes From: Arnd Bergmann Make sure we always iounmap the memory area, both in the error path and at module unload. Extracted from Maxim's latest version of the full patch. Signed-off-by: Arnd Bergmann Index: linux-2.6/arch/powerpc/sysdev/axonram.c =================================================================== --- linux-2.6.orig/arch/powerpc/sysdev/axonram.c +++ linux-2.6/arch/powerpc/sysdev/axonram.c @@ -208,7 +208,7 @@ axon_ram_probe(struct of_device *device, goto failed; } - device->dev.platform_data = (void*) bank; + device->dev.platform_data = bank; bank->device = device; @@ -233,6 +233,11 @@ axon_ram_probe(struct of_device *device, bank->ph_addr = resource.start; bank->io_addr = (unsigned long) ioremap_flags( bank->ph_addr, bank->size, _PAGE_NO_CACHE); + if (bank->io_addr == 0) { + dev_err(&device->dev, "ioremap() failed\n"); + rc = -EFAULT; + goto failed; + } bank->disk = alloc_disk(AXON_RAM_MINORS_PER_DISK); if (bank->disk == NULL) { @@ -316,6 +321,9 @@ failed: bank->disk->disk_name); del_gendisk(bank->disk); } + device->dev.platform_data = NULL; + if (bank->io_addr != 0) + iounmap((void*) bank->io_addr); kfree(bank); } @@ -339,6 +347,7 @@ axon_ram_remove(struct of_device *device blk_cleanup_queue(bank->disk->queue); unregister_blkdev(bank->disk->major, bank->disk->disk_name); del_gendisk(bank->disk); + iounmap((void*) bank->io_addr); kfree(bank); return 0;