diff options
author | Varun Wadekar <vwadekar@nvidia.com> | 2011-02-07 19:59:33 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:43:13 -0800 |
commit | 91927d862d3c43a5133ead82ed0b9c750e6bb009 (patch) | |
tree | fecb413fe513b15c6f169c7e77b8b634b3c949c3 /drivers/rtc/rtc-tps6586x.c | |
parent | cdd2e81286f01b6ab325ee030aa9da98674a060e (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.c | 19 |
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); } } |