diff options
author | Lily Zhang <r58066@freescale.com> | 2009-10-11 17:22:14 +0800 |
---|---|---|
committer | Alejandro Gonzalez <alex.gonzalez@digi.com> | 2010-02-12 17:19:22 +0100 |
commit | cd859a372b441680ccc55ab4ad5ce14886c5a6f1 (patch) | |
tree | 392558f10ea0edb7c636a57da6eb289e79acb6ef /drivers/rtc/rtc-mxc_v2.c | |
parent | eec1e88a6bcd530ad33df4f51fa186a263e0a59d (diff) |
ENGR00117168-1 SRTC: Alarm interrupt can not be issued if closing device
When executing the below operations (Open device -> Call
RTC_AIE_ON -> Close device), alarm interrupt can be received
when alarm time expires. This is because all interrupts are
cleared wrongly when the device is closed.
Signed-off-by: Lily Zhang <r58066@freescale.com>
Diffstat (limited to 'drivers/rtc/rtc-mxc_v2.c')
-rw-r--r-- | drivers/rtc/rtc-mxc_v2.c | 15 |
1 files changed, 2 insertions, 13 deletions
diff --git a/drivers/rtc/rtc-mxc_v2.c b/drivers/rtc/rtc-mxc_v2.c index 1b247fb2510a..459607d0d3a2 100644 --- a/drivers/rtc/rtc-mxc_v2.c +++ b/drivers/rtc/rtc-mxc_v2.c @@ -239,6 +239,7 @@ static irqreturn_t mxc_rtc_interrupt(int irq, void *dev_id) u32 lp_status, lp_cr; u32 events = 0; + clk_enable(pdata->clk); lp_status = __raw_readl(ioaddr + SRTC_LPSR); lp_cr = __raw_readl(ioaddr + SRTC_LPCR); @@ -262,6 +263,7 @@ static irqreturn_t mxc_rtc_interrupt(int irq, void *dev_id) /* clear interrupt status */ __raw_writel(lp_status, ioaddr + SRTC_LPSR); + clk_disable(pdata->clk); rtc_update_irq(pdata->rtc, 1, events); return IRQ_HANDLED; @@ -288,19 +290,6 @@ static int mxc_rtc_open(struct device *dev) static void mxc_rtc_release(struct device *dev) { struct rtc_drv_data *pdata = dev_get_drvdata(dev); - void __iomem *ioaddr = pdata->ioaddr; - unsigned long lock_flags = 0; - - spin_lock_irqsave(&rtc_lock, lock_flags); - - /* Disable all rtc interrupts */ - __raw_writel(__raw_readl(ioaddr + SRTC_LPCR) & ~(SRTC_LPCR_ALL_INT_EN), - ioaddr + SRTC_LPCR); - - /* Clear all interrupt status */ - __raw_writel(0xFFFFFFFF, ioaddr + SRTC_LPSR); - - spin_unlock_irqrestore(&rtc_lock, lock_flags); clk_disable(pdata->clk); |