diff options
| -rw-r--r-- | drivers/rtc/rtc-omap.c | 18 | 
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c index dff9ff476b0..600971407aa 100644 --- a/drivers/rtc/rtc-omap.c +++ b/drivers/rtc/rtc-omap.c @@ -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  |