X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Frtc%2Finterface.c;h=56e490709b87582fff3aaae2f17c43c7f9980a35;hb=9464c7cf61b9433057924c36e6e02f303a00e768;hp=579cd667b16f91a116c988c6a0835f4fdc85673b;hpb=41689045f6a3cbe0550e1d34e9cc20d2e8c432ba;p=linux-2.6.git diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index 579cd667b..56e490709 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c @@ -229,9 +229,6 @@ int rtc_irq_set_state(struct class_device *class_dev, struct rtc_task *task, int unsigned long flags; struct rtc_device *rtc = to_rtc_device(class_dev); - if (rtc->ops->irq_set_state == NULL) - return -ENXIO; - spin_lock_irqsave(&rtc->irq_task_lock, flags); if (rtc->irq_task != task) err = -ENXIO; @@ -246,12 +243,25 @@ EXPORT_SYMBOL_GPL(rtc_irq_set_state); int rtc_irq_set_freq(struct class_device *class_dev, struct rtc_task *task, int freq) { - int err = 0; + int err = 0, tmp = 0; unsigned long flags; struct rtc_device *rtc = to_rtc_device(class_dev); - if (rtc->ops->irq_set_freq == NULL) - return -ENXIO; + /* allowed range is 2-8192 */ + if (freq < 2 || freq > 8192) + return -EINVAL; +/* + FIXME: this does not belong here, will move where appropriate + at a later stage. It cannot hurt right now, trust me :) + if ((freq > rtc_max_user_freq) && (!capable(CAP_SYS_RESOURCE))) + return -EACCES; +*/ + /* check if freq is a power of 2 */ + while (freq > (1 << tmp)) + tmp++; + + if (freq != (1 << tmp)) + return -EINVAL; spin_lock_irqsave(&rtc->irq_task_lock, flags); if (rtc->irq_task != task)