Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3efa9970 authored by Amol Lad's avatar Amol Lad Committed by Dominik Brodowski
Browse files

[PATCH] ioremap balanced with iounmap for drivers/pcmcia



ioremap must be balanced by an iounmap and failing to do so can result
in a memory leak.

Signed-off-by: default avatarAmol Lad <amol@verismonetworks.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarDominik Brodowski <linux@dominikbrodowski.net>
parent a230a678
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -310,9 +310,10 @@ static int __init at91_cf_probe(struct platform_device *pdev)
	return 0;

fail2:
	iounmap((void __iomem *) cf->socket.io_offset);
	release_mem_region(io->start, io->end + 1 - io->start);
fail1:
	if (cf->socket.io_offset)
		iounmap((void __iomem *) cf->socket.io_offset);
	if (board->irq_pin)
		free_irq(board->irq_pin, cf);
fail0a:
+10 −0
Original line number Diff line number Diff line
@@ -449,6 +449,16 @@ int au1x00_pcmcia_socket_probe(struct device *dev, struct pcmcia_low_level *ops,
		del_timer_sync(&skt->poll_timer);
		pcmcia_unregister_socket(&skt->socket);
		flush_scheduled_work();
		if (i == 0) {
			iounmap(skt->virt_io + (u32)mips_io_port_base);
			skt->virt_io = NULL;
		}
#ifndef CONFIG_MIPS_XXS1500
		else {
			iounmap(skt->virt_io + (u32)mips_io_port_base);
			skt->virt_io = NULL;
		}
#endif
		ops->hw_shutdown(skt);

	}
+8 −4
Original line number Diff line number Diff line
@@ -427,7 +427,7 @@ static int voltage_set(int slot, int vcc, int vpp)
			reg |= BCSR1_PCCVCC1;
			break;
		default:
			return 1;
			goto out_unmap;
	}

	switch(vpp) {
@@ -438,15 +438,15 @@ static int voltage_set(int slot, int vcc, int vpp)
			if(vcc == vpp)
				reg |= BCSR1_PCCVPP1;
			else
				return 1;
				goto out_unmap;
			break;
		case 120:
			if ((vcc == 33) || (vcc == 50))
				reg |= BCSR1_PCCVPP0;
			else
				return 1;
				goto out_unmap;
		default:
			return 1;
			goto out_unmap;
	}

	/* first, turn off all power */
@@ -457,6 +457,10 @@ static int voltage_set(int slot, int vcc, int vpp)

	iounmap(bcsr_io);
	return 0;

out_unmap:
	iounmap(bcsr_io);
	return 1;
}

#define socket_get(_slot_) PCMCIA_SOCKET_KEY_5V
+2 −1
Original line number Diff line number Diff line
@@ -309,9 +309,10 @@ static int __devinit omap_cf_probe(struct device *dev)
	return 0;

fail2:
	iounmap((void __iomem *) cf->socket.io_offset);
	release_mem_region(cf->phys_cf, SZ_8K);
fail1:
	if (cf->socket.io_offset)
		iounmap((void __iomem *) cf->socket.io_offset);
	free_irq(irq, cf);
fail0:
	kfree(cf);