diff options
Diffstat (limited to 'drivers/rtc/rtc-s3c.c')
| -rw-r--r-- | drivers/rtc/rtc-s3c.c | 26 | 
1 files changed, 26 insertions, 0 deletions
| diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index 4e7c04e773e0..7639ab906f02 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c @@ -51,6 +51,27 @@ static enum s3c_cpu_type s3c_rtc_cpu_type;  static DEFINE_SPINLOCK(s3c_rtc_pie_lock); +static void s3c_rtc_alarm_clk_enable(bool enable) +{ +	static DEFINE_SPINLOCK(s3c_rtc_alarm_clk_lock); +	static bool alarm_clk_enabled; +	unsigned long irq_flags; + +	spin_lock_irqsave(&s3c_rtc_alarm_clk_lock, irq_flags); +	if (enable) { +		if (!alarm_clk_enabled) { +			clk_enable(rtc_clk); +			alarm_clk_enabled = true; +		} +	} else { +		if (alarm_clk_enabled) { +			clk_disable(rtc_clk); +			alarm_clk_enabled = false; +		} +	} +	spin_unlock_irqrestore(&s3c_rtc_alarm_clk_lock, irq_flags); +} +  /* IRQ Handlers */  static irqreturn_t s3c_rtc_alarmirq(int irq, void *id) @@ -64,6 +85,9 @@ static irqreturn_t s3c_rtc_alarmirq(int irq, void *id)  		writeb(S3C2410_INTP_ALM, s3c_rtc_base + S3C2410_INTP);  	clk_disable(rtc_clk); + +	s3c_rtc_alarm_clk_enable(false); +  	return IRQ_HANDLED;  } @@ -97,6 +121,8 @@ static int s3c_rtc_setaie(struct device *dev, unsigned int enabled)  	writeb(tmp, s3c_rtc_base + S3C2410_RTCALM);  	clk_disable(rtc_clk); +	s3c_rtc_alarm_clk_enable(enabled); +  	return 0;  } | 
