From patchwork Fri Feb 27 23:54:45 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Linn X-Patchwork-Id: 23845 X-Patchwork-Delegate: grant.likely@secretlab.ca Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from ozlabs.org (localhost [127.0.0.1]) by ozlabs.org (Postfix) with ESMTP id 95ECCDDF02 for ; Sat, 28 Feb 2009 11:10:51 +1100 (EST) X-Original-To: linuxppc-dev@ozlabs.org Delivered-To: linuxppc-dev@ozlabs.org X-Greylist: delayed 904 seconds by postgrey-1.31 at ozlabs; Sat, 28 Feb 2009 11:10:06 EST Received: from WA4EHSOBE002.bigfish.com (wa4ehsobe002.messaging.microsoft.com [216.32.181.12]) by ozlabs.org (Postfix) with ESMTP id 764E6DDD01 for ; Sat, 28 Feb 2009 11:10:06 +1100 (EST) Received: from mail135-wa4-R.bigfish.com (10.8.14.236) by WA4EHSOBE002.bigfish.com (10.8.40.22) with Microsoft SMTP Server id 8.1.340.0; Fri, 27 Feb 2009 23:54:59 +0000 Received: from mail135-wa4 (localhost.localdomain [127.0.0.1]) by mail135-wa4-R.bigfish.com (Postfix) with ESMTP id 0814813204B6; Fri, 27 Feb 2009 23:54:59 +0000 (UTC) X-BigFish: VPS13(zzzzzzz2dh95u64h) X-Spam-TCS-SCL: 3:0 Received: by mail135-wa4 (MessageSwitch) id 1235778896408088_29924; Fri, 27 Feb 2009 23:54:56 +0000 (UCT) Received: from xsj-gw1 (unknown [149.199.60.83]) by mail135-wa4.bigfish.com (Postfix) with ESMTP id 4DED2448057; Fri, 27 Feb 2009 23:54:56 +0000 (UTC) Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-smtp1.xilinx.com) by xsj-gw1 with esmtp (Exim 4.63) (envelope-from ) id 1LdCXg-0004Hn-5g; Fri, 27 Feb 2009 15:54:56 -0800 From: John Linn To: grant.likely@secretlab.ca, linuxppc-dev@ozlabs.org, jwboyer@linux.vnet.ibm.com, akonovalov@ru.mvista.com, dbrownell@users.sourceforge.net Subject: [PATCH] Xilinx: SPI: driver not releasing memory Date: Fri, 27 Feb 2009 16:54:45 -0700 X-Mailer: git-send-email 1.5.3.4 Message-ID: <20090227235456.4DED2448057@mail135-wa4.bigfish.com> MIME-Version: 1.0 Cc: John Linn X-BeenThere: linuxppc-dev@ozlabs.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@ozlabs.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@ozlabs.org The driver was not releasing memory when it was removed or when there was a failure during probe. This fixes it. Signed-off-by: John Linn Acked-by: Grant Likely Acked-by: David Brownell --- This is an incremental patch to the patch (updated driver for device tree) that is in the next branch. --- drivers/spi/xilinx_spi.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/spi/xilinx_spi.c b/drivers/spi/xilinx_spi.c index fe7e5f3..494d3f7 100644 --- a/drivers/spi/xilinx_spi.c +++ b/drivers/spi/xilinx_spi.c @@ -354,7 +354,7 @@ static int __init xilinx_spi_of_probe(struct of_device *ofdev, if (xspi->regs == NULL) { rc = -ENOMEM; dev_warn(&ofdev->dev, "ioremap failure\n"); - goto put_master; + goto release_mem; } xspi->irq = r_irq->start; @@ -365,7 +365,7 @@ static int __init xilinx_spi_of_probe(struct of_device *ofdev, prop = of_get_property(ofdev->node, "xlnx,num-ss-bits", &len); if (!prop || len < sizeof(*prop)) { dev_warn(&ofdev->dev, "no 'xlnx,num-ss-bits' property\n"); - goto put_master; + goto unmap_io; } master->num_chipselect = *prop; @@ -397,6 +397,8 @@ free_irq: free_irq(xspi->irq, xspi); unmap_io: iounmap(xspi->regs); +release_mem: + release_mem_region(r_mem->start, resource_size(r_mem)); put_master: spi_master_put(master); return rc; @@ -406,6 +408,7 @@ static int __devexit xilinx_spi_remove(struct of_device *ofdev) { struct xilinx_spi *xspi; struct spi_master *master; + struct resource r_mem; master = platform_get_drvdata(ofdev); xspi = spi_master_get_devdata(master); @@ -413,6 +416,8 @@ static int __devexit xilinx_spi_remove(struct of_device *ofdev) spi_bitbang_stop(&xspi->bitbang); free_irq(xspi->irq, xspi); iounmap(xspi->regs); + if (!of_address_to_resource(ofdev->node, 0, &r_mem)) + release_mem_region(r_mem.start, resource_size(&r_mem)); dev_set_drvdata(&ofdev->dev, 0); spi_master_put(xspi->bitbang.master);