From patchwork Wed Mar 24 11:30:44 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Zapolskiy X-Patchwork-Id: 48394 Return-Path: <3APipSwoJCe0koPedahZXnVbPXa.RdbgiR-aXcjmVddVaTVgdjeh.Rdb@groups.bounces.google.com> X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-yx0-f147.google.com (mail-yx0-f147.google.com [209.85.210.147]) by ozlabs.org (Postfix) with ESMTP id AC185B7CEE for ; Wed, 24 Mar 2010 22:31:13 +1100 (EST) Received: by yxe11 with SMTP id 11sf12345766yxe.1 for ; Wed, 24 Mar 2010 04:31:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=beta; h=domainkey-signature:received:mime-version:x-beenthere:received :received:received:received:received-spf:received:received:received :from:to:cc:subject:date:message-id:x-mailer :x-original-authentication-results:x-original-sender:reply-to :precedence:mailing-list:list-id:list-post:list-help:list-archive :x-thread-url:x-message-url:sender:list-subscribe:list-unsubscribe :content-type; bh=dA9uXbeKVVjFYbXdm5lt4Qn1jmjrMBjPLriVZg4SQjg=; b=RbocDchFbeqXzUgtOe87YALc8l8wu9x+bzbly03UqGTQFm3XWkD2RTcv3ymvquzZs6 wF+e3dvUAPc6JyB2iQKq2Lq9p7dO026IBK4kgJcEY0jT1DgZRgHnVFkaoQs6BiNSW2To hfqUmuHhMqMcwz1r/uuG6Egd9N+aOH3D17B2Q= DomainKey-Signature: a=rsa-sha1; c=nofws; d=googlegroups.com; s=beta; h=mime-version:x-beenthere:received-spf:from:to:cc:subject:date :message-id:x-mailer:x-original-authentication-results :x-original-sender:reply-to:precedence:mailing-list:list-id :list-post:list-help:list-archive:x-thread-url:x-message-url:sender :list-subscribe:list-unsubscribe:content-type; b=cZ/RToSo8APQ7ydpMw22/oe9Yz+QjjVCMp8CjKavci/vKknXAlhdi+DQPSF5NjPEQz u2jammWReCkgDh757d5drDDjXktcJd/y6+JanMEaPUGcH0q5L68sv37qJgDxDC7N40uI Iaj6EGfJ+znhe933EjO3pxlvNaH/Q3/fNRHVg= Received: by 10.91.62.17 with SMTP id p17mr493480agk.56.1269430272148; Wed, 24 Mar 2010 04:31:12 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: rtc-linux@googlegroups.com Received: by 10.87.69.29 with SMTP id w29ls1218650fgk.3.p; Wed, 24 Mar 2010 04:31:10 -0700 (PDT) Received: by 10.87.67.8 with SMTP id u8mr720131fgk.24.1269430270076; Wed, 24 Mar 2010 04:31:10 -0700 (PDT) Received: by 10.87.67.8 with SMTP id u8mr720130fgk.24.1269430270050; Wed, 24 Mar 2010 04:31:10 -0700 (PDT) Received: from fg-out-1718.google.com (fg-out-1718.google.com [72.14.220.158]) by gmr-mx.google.com with ESMTP id 18si885419fxm.5.2010.03.24.04.31.09; Wed, 24 Mar 2010 04:31:09 -0700 (PDT) Received-SPF: pass (google.com: domain of vzapolskiy@gmail.com designates 72.14.220.158 as permitted sender) client-ip=72.14.220.158; Received: by fg-out-1718.google.com with SMTP id 22so1764532fge.3 for ; Wed, 24 Mar 2010 04:31:09 -0700 (PDT) Received: by 10.87.63.20 with SMTP id q20mr10072484fgk.27.1269430268832; Wed, 24 Mar 2010 04:31:08 -0700 (PDT) Received: from localhost.localdomain ([91.213.169.4]) by mx.google.com with ESMTPS id 4sm19732fge.28.2010.03.24.04.31.07 (version=TLSv1/SSLv3 cipher=RC4-MD5); Wed, 24 Mar 2010 04:31:08 -0700 (PDT) From: Vladimir Zapolskiy To: rtc-linux@googlegroups.com Cc: Vladimir Zapolskiy , Alessandro Zummo , Daniel Mack , Andrew Morton Subject: [rtc-linux] [PATCH 1/2] rtc-mxc: multiple fixes in rtc-mxc probe method Date: Wed, 24 Mar 2010 14:30:44 +0300 Message-Id: <1269430245-22546-1-git-send-email-vzapolskiy@gmail.com> X-Mailer: git-send-email 1.6.6.1 X-Original-Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of vzapolskiy@gmail.com designates 72.14.220.158 as permitted sender) smtp.mail=vzapolskiy@gmail.com; dkim=pass (test mode) header.i=@gmail.com X-Original-Sender: vzapolskiy@gmail.com Reply-To: rtc-linux@googlegroups.com Precedence: list Mailing-list: list rtc-linux@googlegroups.com; contact rtc-linux+owners@googlegroups.com List-ID: List-Post: , List-Help: , List-Archive: X-Thread-Url: http://groups.google.com/group/rtc-linux/t/bdb9f13a6f48c21c X-Message-Url: http://groups.google.com/group/rtc-linux/msg/7b379a8a5afa2bb0 Sender: rtc-linux@googlegroups.com List-Subscribe: , List-Unsubscribe: , On exit paths in mxc_rtc_probe() method some resources are not freed correctly. This patch fixes: * unrequested memory region containing imx RTC registers * iounmap() isn't called on exit_free_pdata branch * clock get rate is called for freed clock source * clock isn't disabled on exit_put_clk branch To simplify the fix managed device resources are used. Signed-off-by: Vladimir Zapolskiy Cc: Alessandro Zummo Cc: Daniel Mack Cc: Andrew Morton --- drivers/rtc/rtc-mxc.c | 26 +++++++++++++------------- 1 files changed, 13 insertions(+), 13 deletions(-) diff --git a/drivers/rtc/rtc-mxc.c b/drivers/rtc/rtc-mxc.c index 8710f94..b3fa23d 100644 --- a/drivers/rtc/rtc-mxc.c +++ b/drivers/rtc/rtc-mxc.c @@ -383,21 +383,26 @@ static int __init mxc_rtc_probe(struct platform_device *pdev) struct rtc_device *rtc; struct rtc_plat_data *pdata = NULL; u32 reg; - int ret, rate; + unsigned long rate; + int ret; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) return -ENODEV; - pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); + pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); if (!pdata) return -ENOMEM; - pdata->ioaddr = ioremap(res->start, resource_size(res)); + if (!devm_request_mem_region(&pdev->dev, res->start, + resource_size(res), pdev->name)) + return -EBUSY; + + pdata->ioaddr = devm_ioremap(&pdev->dev, res->start, + resource_size(res)); clk = clk_get(&pdev->dev, "ckil"); if (IS_ERR(clk)) { - iounmap(pdata->ioaddr); ret = PTR_ERR(clk); goto exit_free_pdata; } @@ -412,8 +417,7 @@ static int __init mxc_rtc_probe(struct platform_device *pdev) else if (rate == 38400) reg = RTC_INPUT_CLK_38400HZ; else { - dev_err(&pdev->dev, "rtc clock is not valid (%lu)\n", - clk_get_rate(clk)); + dev_err(&pdev->dev, "rtc clock is not valid (%lu)\n", rate); ret = -EINVAL; goto exit_free_pdata; } @@ -449,8 +453,8 @@ static int __init mxc_rtc_probe(struct platform_device *pdev) pdata->irq = platform_get_irq(pdev, 0); if (pdata->irq >= 0 && - request_irq(pdata->irq, mxc_rtc_interrupt, IRQF_SHARED, - pdev->name, pdev) < 0) { + devm_request_irq(&pdev->dev, pdata->irq, mxc_rtc_interrupt, + IRQF_SHARED, pdev->name, pdev) < 0) { dev_warn(&pdev->dev, "interrupt not available.\n"); pdata->irq = -1; } @@ -458,10 +462,10 @@ static int __init mxc_rtc_probe(struct platform_device *pdev) return 0; exit_put_clk: + clk_disable(pdata->clk); clk_put(pdata->clk); exit_free_pdata: - kfree(pdata); return ret; } @@ -472,12 +476,8 @@ static int __exit mxc_rtc_remove(struct platform_device *pdev) rtc_device_unregister(pdata->rtc); - if (pdata->irq >= 0) - free_irq(pdata->irq, pdev); - clk_disable(pdata->clk); clk_put(pdata->clk); - kfree(pdata); platform_set_drvdata(pdev, NULL); return 0;