From b85fc5e28503324e463045b4e91364e4d7f0228a Mon Sep 17 00:00:00 2001 From: Richard Cochran Date: Fri, 2 Nov 2012 22:25:30 +0000 Subject: [PATCH] cpsw: fix leaking IO mappings The CPSW driver remaps two different IO regions, but fails to unmap them both. This patch fixes the issue by calling iounmap in the appropriate places. Signed-off-by: Richard Cochran Signed-off-by: David S. Miller --- drivers/net/ethernet/ti/cpsw.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index 621524657d055..7654a62ab75ec 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c @@ -1252,14 +1252,12 @@ static int __devinit cpsw_probe(struct platform_device *pdev) ret = -ENOENT; goto clean_clk_ret; } - if (!request_mem_region(priv->cpsw_res->start, resource_size(priv->cpsw_res), ndev->name)) { dev_err(priv->dev, "failed request i/o region\n"); ret = -ENXIO; goto clean_clk_ret; } - regs = ioremap(priv->cpsw_res->start, resource_size(priv->cpsw_res)); if (!regs) { dev_err(priv->dev, "unable to map i/o region\n"); @@ -1274,16 +1272,14 @@ static int __devinit cpsw_probe(struct platform_device *pdev) if (!priv->cpsw_wr_res) { dev_err(priv->dev, "error getting i/o resource\n"); ret = -ENOENT; - goto clean_clk_ret; + goto clean_iomap_ret; } - if (!request_mem_region(priv->cpsw_wr_res->start, resource_size(priv->cpsw_wr_res), ndev->name)) { dev_err(priv->dev, "failed request i/o region\n"); ret = -ENXIO; - goto clean_clk_ret; + goto clean_iomap_ret; } - regs = ioremap(priv->cpsw_wr_res->start, resource_size(priv->cpsw_wr_res)); if (!regs) { @@ -1326,7 +1322,7 @@ static int __devinit cpsw_probe(struct platform_device *pdev) if (!priv->dma) { dev_err(priv->dev, "error initializing dma\n"); ret = -ENOMEM; - goto clean_iomap_ret; + goto clean_wr_iomap_ret; } priv->txch = cpdma_chan_create(priv->dma, tx_chan_num(0), @@ -1407,11 +1403,13 @@ clean_dma_ret: cpdma_chan_destroy(priv->txch); cpdma_chan_destroy(priv->rxch); cpdma_ctlr_destroy(priv->dma); -clean_iomap_ret: - iounmap(priv->regs); +clean_wr_iomap_ret: + iounmap(priv->wr_regs); clean_cpsw_wr_iores_ret: release_mem_region(priv->cpsw_wr_res->start, resource_size(priv->cpsw_wr_res)); +clean_iomap_ret: + iounmap(priv->regs); clean_cpsw_iores_ret: release_mem_region(priv->cpsw_res->start, resource_size(priv->cpsw_res)); @@ -1442,6 +1440,7 @@ static int __devexit cpsw_remove(struct platform_device *pdev) iounmap(priv->regs); release_mem_region(priv->cpsw_res->start, resource_size(priv->cpsw_res)); + iounmap(priv->wr_regs); release_mem_region(priv->cpsw_wr_res->start, resource_size(priv->cpsw_wr_res)); pm_runtime_disable(&pdev->dev); -- 2.39.5