diff options
Diffstat (limited to 'drivers/rtc/rtc-sirfsoc.c')
| -rw-r--r-- | drivers/rtc/rtc-sirfsoc.c | 13 | 
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/rtc/rtc-sirfsoc.c b/drivers/rtc/rtc-sirfsoc.c index aa7ed4b5f7f0..63460cf80f1b 100644 --- a/drivers/rtc/rtc-sirfsoc.c +++ b/drivers/rtc/rtc-sirfsoc.c @@ -44,6 +44,7 @@ struct sirfsoc_rtc_drv {  	struct rtc_device	*rtc;  	u32			rtc_base;  	u32			irq; +	unsigned		irq_wake;  	/* Overflow for every 8 years extra time */  	u32			overflow_rtc;  #ifdef CONFIG_PM @@ -355,8 +356,8 @@ static int sirfsoc_rtc_suspend(struct device *dev)  	rtcdrv->saved_counter =  		sirfsoc_rtc_iobrg_readl(rtcdrv->rtc_base + RTC_CN);  	rtcdrv->saved_overflow_rtc = rtcdrv->overflow_rtc; -	if (device_may_wakeup(&pdev->dev)) -		enable_irq_wake(rtcdrv->irq); +	if (device_may_wakeup(&pdev->dev) && !enable_irq_wake(rtcdrv->irq)) +		rtcdrv->irq_wake = 1;  	return 0;  } @@ -423,8 +424,10 @@ static int sirfsoc_rtc_resume(struct device *dev)  	struct platform_device *pdev = to_platform_device(dev);  	struct sirfsoc_rtc_drv *rtcdrv = platform_get_drvdata(pdev);  	sirfsoc_rtc_thaw(dev); -	if (device_may_wakeup(&pdev->dev)) +	if (device_may_wakeup(&pdev->dev) && rtcdrv->irq_wake) {  		disable_irq_wake(rtcdrv->irq); +		rtcdrv->irq_wake = 0; +	}  	return 0;  } @@ -434,8 +437,10 @@ static int sirfsoc_rtc_restore(struct device *dev)  	struct platform_device *pdev = to_platform_device(dev);  	struct sirfsoc_rtc_drv *rtcdrv = platform_get_drvdata(pdev); -	if (device_may_wakeup(&pdev->dev)) +	if (device_may_wakeup(&pdev->dev) && rtcdrv->irq_wake) {  		disable_irq_wake(rtcdrv->irq); +		rtcdrv->irq_wake = 0; +	}  	return 0;  }  | 
