| From 4a649903f91232d02284d53724b0a45728111767 Mon Sep 17 00:00:00 2001 |
| From: John Stultz <john.stultz@linaro.org> |
| Date: Tue, 6 Mar 2012 17:16:09 -0800 |
| Subject: rtc: Provide flag for rtc devices that don't support UIE |
| |
| From: John Stultz <john.stultz@linaro.org> |
| |
| commit 4a649903f91232d02284d53724b0a45728111767 upstream. |
| |
| Richard Weinberger noticed that on some RTC hardware that |
| doesn't support UIE mode, due to coarse granular alarms |
| (like 1minute resolution), the current virtualized RTC |
| support doesn't properly error out when UIE is enabled. |
| |
| Instead the current code queues an alarm for the next second, |
| but it won't fire until up to a miniute later. |
| |
| This patch provides a generic way to flag this sort of hardware |
| and fixes the issue on the mpc5121 where Richard noticed the |
| problem. |
| |
| Reported-by: Richard Weinberger <richard@nod.at> |
| Tested-by: Richard Weinberger <richard@nod.at> |
| Signed-off-by: John Stultz <john.stultz@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/rtc/interface.c | 5 +++++ |
| drivers/rtc/rtc-mpc5121.c | 2 ++ |
| include/linux/rtc.h | 3 ++- |
| 3 files changed, 9 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/rtc/interface.c |
| +++ b/drivers/rtc/interface.c |
| @@ -445,6 +445,11 @@ int rtc_update_irq_enable(struct rtc_dev |
| if (rtc->uie_rtctimer.enabled == enabled) |
| goto out; |
| |
| + if (rtc->uie_unsupported) { |
| + err = -EINVAL; |
| + goto out; |
| + } |
| + |
| if (enabled) { |
| struct rtc_time tm; |
| ktime_t now, onesec; |
| --- a/drivers/rtc/rtc-mpc5121.c |
| +++ b/drivers/rtc/rtc-mpc5121.c |
| @@ -360,6 +360,8 @@ static int __devinit mpc5121_rtc_probe(s |
| &mpc5200_rtc_ops, THIS_MODULE); |
| } |
| |
| + rtc->rtc->uie_unsupported = 1; |
| + |
| if (IS_ERR(rtc->rtc)) { |
| err = PTR_ERR(rtc->rtc); |
| goto out_free_irq; |
| --- a/include/linux/rtc.h |
| +++ b/include/linux/rtc.h |
| @@ -202,7 +202,8 @@ struct rtc_device |
| struct hrtimer pie_timer; /* sub second exp, so needs hrtimer */ |
| int pie_enabled; |
| struct work_struct irqwork; |
| - |
| + /* Some hardware can't support UIE mode */ |
| + int uie_unsupported; |
| |
| #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL |
| struct work_struct uie_task; |