diff options
author | Axel Lin <axel.lin@gmail.com> | 2011-01-12 20:00:05 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-13 11:03:12 -0500 |
commit | 19412ce9fcc9ca2d0f5b62af15c63381f0ac9657 (patch) | |
tree | 61c93d1a1a1290683483a67b943cb49a1276a251 | |
parent | 554ec37aca8f5fbe4d70df462d7032aaa5d95ae9 (diff) |
drivers/rtc/rtc-omap.c: fix a memory leak
request_mem_region() will call kzalloc to allocate memory for struct
resource. release_resource() unregisters the resource but does not free
the allocated memory, thus use release_mem_region() instead to fix the
memory leak.
Also add a missing iounmap() in omap_rtc_remove().
Signed-off-by: Axel Lin <axel.lin@gmail.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Cc: Sekhar Nori <nsekhar@ti.com>
Cc: Kevin Hilman <khilman@deeprootsystems.com>
Cc: Tony Lindgren <tony@atomide.com>
Acked-by: Mark A. Greer <mgreer@mvista.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | drivers/rtc/rtc-omap.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c index 73377b0d65da..e72b523c79a5 100644 --- a/drivers/rtc/rtc-omap.c +++ b/drivers/rtc/rtc-omap.c | |||
@@ -429,13 +429,14 @@ fail1: | |||
429 | fail0: | 429 | fail0: |
430 | iounmap(rtc_base); | 430 | iounmap(rtc_base); |
431 | fail: | 431 | fail: |
432 | release_resource(mem); | 432 | release_mem_region(mem->start, resource_size(mem)); |
433 | return -EIO; | 433 | return -EIO; |
434 | } | 434 | } |
435 | 435 | ||
436 | static int __exit omap_rtc_remove(struct platform_device *pdev) | 436 | static int __exit omap_rtc_remove(struct platform_device *pdev) |
437 | { | 437 | { |
438 | struct rtc_device *rtc = platform_get_drvdata(pdev); | 438 | struct rtc_device *rtc = platform_get_drvdata(pdev); |
439 | struct resource *mem = dev_get_drvdata(&rtc->dev); | ||
439 | 440 | ||
440 | device_init_wakeup(&pdev->dev, 0); | 441 | device_init_wakeup(&pdev->dev, 0); |
441 | 442 | ||
@@ -447,8 +448,9 @@ static int __exit omap_rtc_remove(struct platform_device *pdev) | |||
447 | if (omap_rtc_timer != omap_rtc_alarm) | 448 | if (omap_rtc_timer != omap_rtc_alarm) |
448 | free_irq(omap_rtc_alarm, rtc); | 449 | free_irq(omap_rtc_alarm, rtc); |
449 | 450 | ||
450 | release_resource(dev_get_drvdata(&rtc->dev)); | ||
451 | rtc_device_unregister(rtc); | 451 | rtc_device_unregister(rtc); |
452 | iounmap(rtc_base); | ||
453 | release_mem_region(mem->start, resource_size(mem)); | ||
452 | return 0; | 454 | return 0; |
453 | } | 455 | } |
454 | 456 | ||