From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756471AbcHXOTf (ORCPT ); Wed, 24 Aug 2016 10:19:35 -0400 Received: from broadband.actcorp.in ([106.51.129.29]:1632 "EHLO arvind-ThinkPad-Edge-E431" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1750999AbcHXOTd (ORCPT ); Wed, 24 Aug 2016 10:19:33 -0400 X-Greylist: delayed 546 seconds by postgrey-1.27 at vger.kernel.org; Wed, 24 Aug 2016 10:19:33 EDT From: Arvind Yadav To: daniel.lezcano@linaro.org, tglx@linutronix.de Cc: shc_work@mail.ru, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Arvind Yadav Subject: [v.3] clocksource:clps711x-timer:- Unmap a region obtained by remap. Date: Wed, 24 Aug 2016 19:40:21 +0530 Message-Id: <1472047821-5539-1-git-send-email-arvind.yadav.cs@gmail.com> X-Mailer: git-send-email 2.7.4 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org iounmap frees the mapping when timer id is not matching. Signed-off-by: Arvind Yadav --- drivers/clocksource/clps711x-timer.c | 41 +++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/drivers/clocksource/clps711x-timer.c b/drivers/clocksource/clps711x-timer.c index 24db6d6..784c000 100644 --- a/drivers/clocksource/clps711x-timer.c +++ b/drivers/clocksource/clps711x-timer.c @@ -33,14 +33,7 @@ static u64 notrace clps711x_sched_clock_read(void) static int __init _clps711x_clksrc_init(struct clk *clock, void __iomem *base) { - unsigned long rate; - - if (!base) - return -ENOMEM; - if (IS_ERR(clock)) - return PTR_ERR(clock); - - rate = clk_get_rate(clock); + unsigned long rate = clk_get_rate(clock); tcd = base; @@ -67,13 +60,6 @@ static int __init _clps711x_clkevt_init(struct clk *clock, void __iomem *base, struct clock_event_device *clkevt; unsigned long rate; - if (!irq) - return -EINVAL; - if (!base) - return -ENOMEM; - if (IS_ERR(clock)) - return PTR_ERR(clock); - clkevt = kzalloc(sizeof(*clkevt), GFP_KERNEL); if (!clkevt) return -ENOMEM; @@ -106,16 +92,33 @@ void __init clps711x_clksrc_init(void __iomem *tc1_base, void __iomem *tc2_base, #ifdef CONFIG_CLKSRC_OF static int __init clps711x_timer_init(struct device_node *np) { - unsigned int irq = irq_of_parse_and_map(np, 0); - struct clk *clock = of_clk_get(np, 0); - void __iomem *base = of_iomap(np, 0); + unsigned int irq; + struct clk *clock; + void __iomem *base; + int ret; + + clock = of_clk_get(np, 0); + if (IS_ERR(clock)) + return PTR_ERR(clock); + + base = of_iomap(np, 0); + if (!base) + return -ENOMEM; switch (of_alias_get_id(np, "timer")) { case CLPS711X_CLKSRC_CLOCKSOURCE: return _clps711x_clksrc_init(clock, base); case CLPS711X_CLKSRC_CLOCKEVENT: - return _clps711x_clkevt_init(clock, base, irq); + irq = irq_of_parse_and_map(np, 0); + if (!irq) + return -EINVAL; + + ret = _clps711x_clkevt_init(clock, base, irq); + if (ret) + iounmap(base); + return ret; default: + iounmap(base); return -EINVAL; } } -- 2.7.4