aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Cameron <jic23@cam.ac.uk>2009-01-06 17:42:12 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-01-06 18:59:24 -0500
commit5d2a50371ddf127afa782ad3147469be8e9bd69f (patch)
treebc7b7032512c17f493e5f656044c79c17952f517
parent2fac6674ddf3164da42a76d62f8912073d629a30 (diff)
rtc: move power of 2 periodic frequency check down into drivers
Move the power of 2 check on frequencies down into individual rtc drivers This is to allow for non power of 2 real time clock periodic interrupts such as those on the pxa27x to be found in the new pxa27x-rtc driver Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk> Signed-off-by: Alessandro Zummo <a.zummo@towertech.it> Cc: David Brownell <david-b@pacbell.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/rtc/interface.c3
-rw-r--r--drivers/rtc/rtc-cmos.c3
-rw-r--r--drivers/rtc/rtc-s3c.c3
-rw-r--r--drivers/rtc/rtc-sh.c3
-rw-r--r--drivers/rtc/rtc-vr41xx.c3
5 files changed, 12 insertions, 3 deletions
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
index 43276f29d636..50482d1321e8 100644
--- a/drivers/rtc/interface.c
+++ b/drivers/rtc/interface.c
@@ -504,9 +504,6 @@ int rtc_irq_set_freq(struct rtc_device *rtc, struct rtc_task *task, int freq)
504 if (rtc->ops->irq_set_freq == NULL) 504 if (rtc->ops->irq_set_freq == NULL)
505 return -ENXIO; 505 return -ENXIO;
506 506
507 if (!is_power_of_2(freq))
508 return -EINVAL;
509
510 spin_lock_irqsave(&rtc->irq_task_lock, flags); 507 spin_lock_irqsave(&rtc->irq_task_lock, flags);
511 if (rtc->irq_task != NULL && task == NULL) 508 if (rtc->irq_task != NULL && task == NULL)
512 err = -EBUSY; 509 err = -EBUSY;
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c
index cf98a5d8358e..b6d35f50e404 100644
--- a/drivers/rtc/rtc-cmos.c
+++ b/drivers/rtc/rtc-cmos.c
@@ -35,6 +35,7 @@
35#include <linux/spinlock.h> 35#include <linux/spinlock.h>
36#include <linux/platform_device.h> 36#include <linux/platform_device.h>
37#include <linux/mod_devicetable.h> 37#include <linux/mod_devicetable.h>
38#include <linux/log2.h>
38 39
39/* this is for "generic access to PC-style RTC" using CMOS_READ/CMOS_WRITE */ 40/* this is for "generic access to PC-style RTC" using CMOS_READ/CMOS_WRITE */
40#include <asm-generic/rtc.h> 41#include <asm-generic/rtc.h>
@@ -384,6 +385,8 @@ static int cmos_irq_set_freq(struct device *dev, int freq)
384 if (!is_valid_irq(cmos->irq)) 385 if (!is_valid_irq(cmos->irq))
385 return -ENXIO; 386 return -ENXIO;
386 387
388 if (!is_power_of_2(freq))
389 return -EINVAL;
387 /* 0 = no irqs; 1 = 2^15 Hz ... 15 = 2^0 Hz */ 390 /* 0 = no irqs; 1 = 2^15 Hz ... 15 = 2^0 Hz */
388 f = ffs(freq); 391 f = ffs(freq);
389 if (f-- > 16) 392 if (f-- > 16)
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c
index 7a568beba3f0..e0d7b9991505 100644
--- a/drivers/rtc/rtc-s3c.c
+++ b/drivers/rtc/rtc-s3c.c
@@ -94,6 +94,9 @@ static int s3c_rtc_setfreq(struct device *dev, int freq)
94{ 94{
95 unsigned int tmp; 95 unsigned int tmp;
96 96
97 if (!is_power_of_2(freq))
98 return -EINVAL;
99
97 spin_lock_irq(&s3c_rtc_pie_lock); 100 spin_lock_irq(&s3c_rtc_pie_lock);
98 101
99 tmp = readb(s3c_rtc_base + S3C2410_TICNT) & S3C2410_TICNT_ENABLE; 102 tmp = readb(s3c_rtc_base + S3C2410_TICNT) & S3C2410_TICNT_ENABLE;
diff --git a/drivers/rtc/rtc-sh.c b/drivers/rtc/rtc-sh.c
index 5ed66acf8ca5..1c3fc6b428e9 100644
--- a/drivers/rtc/rtc-sh.c
+++ b/drivers/rtc/rtc-sh.c
@@ -24,6 +24,7 @@
24#include <linux/interrupt.h> 24#include <linux/interrupt.h>
25#include <linux/spinlock.h> 25#include <linux/spinlock.h>
26#include <linux/io.h> 26#include <linux/io.h>
27#include <linux/log2.h>
27#include <asm/rtc.h> 28#include <asm/rtc.h>
28 29
29#define DRV_NAME "sh-rtc" 30#define DRV_NAME "sh-rtc"
@@ -551,6 +552,8 @@ static int sh_rtc_irq_set_state(struct device *dev, int enabled)
551 552
552static int sh_rtc_irq_set_freq(struct device *dev, int freq) 553static int sh_rtc_irq_set_freq(struct device *dev, int freq)
553{ 554{
555 if (!is_power_of_2(freq))
556 return -EINVAL;
554 return sh_rtc_ioctl(dev, RTC_IRQP_SET, freq); 557 return sh_rtc_ioctl(dev, RTC_IRQP_SET, freq);
555} 558}
556 559
diff --git a/drivers/rtc/rtc-vr41xx.c b/drivers/rtc/rtc-vr41xx.c
index 57b7aac092a3..f11297aff854 100644
--- a/drivers/rtc/rtc-vr41xx.c
+++ b/drivers/rtc/rtc-vr41xx.c
@@ -27,6 +27,7 @@
27#include <linux/rtc.h> 27#include <linux/rtc.h>
28#include <linux/spinlock.h> 28#include <linux/spinlock.h>
29#include <linux/types.h> 29#include <linux/types.h>
30#include <linux/log2.h>
30 31
31#include <asm/div64.h> 32#include <asm/div64.h>
32#include <asm/io.h> 33#include <asm/io.h>
@@ -210,6 +211,8 @@ static int vr41xx_rtc_irq_set_freq(struct device *dev, int freq)
210{ 211{
211 unsigned long count; 212 unsigned long count;
212 213
214 if (!is_power_of_2(freq))
215 return -EINVAL;
213 count = RTC_FREQUENCY; 216 count = RTC_FREQUENCY;
214 do_div(count, freq); 217 do_div(count, freq);
215 218