summaryrefslogtreecommitdiff
path: root/drivers/rtc/rtc-mxc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rtc/rtc-mxc.c')
-rw-r--r--drivers/rtc/rtc-mxc.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/rtc/rtc-mxc.c b/drivers/rtc/rtc-mxc.c
index da96395d7f8f..4c186934042f 100644
--- a/drivers/rtc/rtc-mxc.c
+++ b/drivers/rtc/rtc-mxc.c
@@ -317,13 +317,25 @@ static int rtc_update_alarm(struct device *dev, struct rtc_time *alrm)
*/
static irqreturn_t mxc_rtc_interrupt(int irq, void *dev_id)
{
- struct platform_device *pdev = dev_id;
- struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
- void __iomem *ioaddr = pdata->ioaddr;
+ struct platform_device *pdev;
+ struct rtc_plat_data *pdata;
+ void __iomem *ioaddr;
u32 status;
u32 events = 0;
spin_lock(&rtc_lock);
- status = readw(ioaddr + RTC_RTCISR) & readw(ioaddr + RTC_RTCIENR);
+ status = readw(IO_ADDRESS(RTC_BASE_ADDR + RTC_RTCISR)) &
+ readw(IO_ADDRESS(RTC_BASE_ADDR + RTC_RTCIENR));
+
+ /* This IRQ is shared, so make sure an interrupt really occurred */
+ if (unlikely(!status)) {
+ spin_unlock(&rtc_lock);
+ return IRQ_NONE;
+ }
+
+ pdev = dev_id;
+ pdata = platform_get_drvdata(pdev);
+ ioaddr = pdata->ioaddr;
+
/* clear interrupt sources */
writew(status, ioaddr + RTC_RTCISR);