summaryrefslogtreecommitdiff
path: root/drivers/rtc/rtc-tps6586x.c
diff options
context:
space:
mode:
authorVarun Wadekar <vwadekar@nvidia.com>2011-02-07 19:59:33 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:43:13 -0800
commit91927d862d3c43a5133ead82ed0b9c750e6bb009 (patch)
treefecb413fe513b15c6f169c7e77b8b634b3c949c3 /drivers/rtc/rtc-tps6586x.c
parentcdd2e81286f01b6ab325ee030aa9da98674a060e (diff)
rtc: tps6586x: enable irqs while settings alarms
Bug 770380 Original-Change-Id: I8950a3ef2259b233b1711b266fa7d29270d95bfd Signed-off-by: Varun Wadekar <vwadekar@nvidia.com> Reviewed-on: http://git-master/r/18565 Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com> Rebase-Id: Ra059906c34e171e4cd28e9e07dc4770dd2624793
Diffstat (limited to 'drivers/rtc/rtc-tps6586x.c')
-rw-r--r--drivers/rtc/rtc-tps6586x.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/drivers/rtc/rtc-tps6586x.c b/drivers/rtc/rtc-tps6586x.c
index b988f5433941..7d203b37e6e8 100644
--- a/drivers/rtc/rtc-tps6586x.c
+++ b/drivers/rtc/rtc-tps6586x.c
@@ -39,6 +39,7 @@ struct tps6586x_rtc {
unsigned long epoch_start;
int irq;
struct rtc_device *rtc;
+ bool irq_en;
};
static inline struct device *to_tps6586x_dev(struct device *dev)
@@ -139,6 +140,14 @@ static int tps6586x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
return -EINVAL;
}
+ if (alrm->enabled && !rtc->irq_en) {
+ enable_irq(rtc->irq);
+ rtc->irq_en = true;
+ } else if (!alrm->enabled && rtc->irq_en) {
+ disable_irq(rtc->irq);
+ rtc->irq_en = false;
+ }
+
seconds -= rtc->epoch_start;
ticks = (unsigned long long)seconds << 10;
@@ -202,14 +211,18 @@ static int tps6586x_rtc_alarm_irq_enable(struct device *dev,
dev_err(dev, "failed to set RTC_ENABLE\n");
return err;
}
- enable_irq(rtc->irq);
+
+ if (!rtc->irq_en)
+ enable_irq(rtc->irq);
} else {
err = tps6586x_clr_bits(tps_dev, RTC_CTRL, RTC_ENABLE);
if (err < 0) {
dev_err(dev, "failed to clear RTC_ENABLE\n");
return err;
}
- disable_irq(rtc->irq);
+
+ if (rtc->irq_en)
+ disable_irq(rtc->irq);
}
return 0;
@@ -286,8 +299,8 @@ static int __devinit tps6586x_rtc_probe(struct platform_device *pdev)
rtc->irq = -1;
} else {
device_init_wakeup(&pdev->dev, 1);
- disable_irq(rtc->irq);
enable_irq_wake(rtc->irq);
+ disable_irq(rtc->irq);
}
}