mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
rtc: omap: add runtime pm support
OMAP1 RTC driver is used in multiple devices like, OMAPL138 and AM33XX. Driver currently doesn't handle any clocks, which may be right for OMAP1 architecture but in case of AM33XX, the clock/module needs to be enabled in order to access the registers. So convert this driver to runtime pm, which internally handles rest. [[email protected]: handle error path] Signed-off-by: Vaibhav Hiremath <[email protected]> Signed-off-by: Afzal Mohammed <[email protected]> Acked-by: Sekhar Nori <[email protected]> Cc: Grant Likely <[email protected]> Cc: Sekhar Nori <[email protected]> Cc: Kevin Hilman <[email protected]> Cc: Russell King <[email protected]> Cc: Alessandro Zummo <[email protected]> Cc: Daniel Mack <[email protected]> Cc: Vaibhav Hiremath <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
427af9a621
commit
fc9bd9022e
1 changed files with 18 additions and 0 deletions
|
|
@ -22,6 +22,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
|
|
@ -364,6 +365,10 @@ static int __init omap_rtc_probe(struct platform_device *pdev)
|
|||
goto fail;
|
||||
}
|
||||
|
||||
/* Enable the clock/module so that we can access the registers */
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
pm_runtime_get_sync(&pdev->dev);
|
||||
|
||||
id_entry = platform_get_device_id(pdev);
|
||||
if (id_entry && (id_entry->driver_data & OMAP_RTC_HAS_KICKER)) {
|
||||
rtc_writel(KICK0_VALUE, OMAP_RTC_KICK0_REG);
|
||||
|
|
@ -448,6 +453,8 @@ fail1:
|
|||
fail0:
|
||||
if (id_entry && (id_entry->driver_data & OMAP_RTC_HAS_KICKER))
|
||||
rtc_writel(0, OMAP_RTC_KICK0_REG);
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
iounmap(rtc_base);
|
||||
fail:
|
||||
release_mem_region(mem->start, resource_size(mem));
|
||||
|
|
@ -474,6 +481,11 @@ static int __exit omap_rtc_remove(struct platform_device *pdev)
|
|||
rtc_device_unregister(rtc);
|
||||
if (id_entry && (id_entry->driver_data & OMAP_RTC_HAS_KICKER))
|
||||
rtc_writel(0, OMAP_RTC_KICK0_REG);
|
||||
|
||||
/* Disable the clock/module */
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
iounmap(rtc_base);
|
||||
release_mem_region(mem->start, resource_size(mem));
|
||||
return 0;
|
||||
|
|
@ -496,11 +508,17 @@ static int omap_rtc_suspend(struct platform_device *pdev, pm_message_t state)
|
|||
else
|
||||
rtc_write(0, OMAP_RTC_INTERRUPTS_REG);
|
||||
|
||||
/* Disable the clock/module */
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int omap_rtc_resume(struct platform_device *pdev)
|
||||
{
|
||||
/* Enable the clock/module so that we can access the registers */
|
||||
pm_runtime_get_sync(&pdev->dev);
|
||||
|
||||
if (device_may_wakeup(&pdev->dev))
|
||||
disable_irq_wake(omap_rtc_alarm);
|
||||
else
|
||||
|
|
|
|||
Loading…
Reference in a new issue