diff options
| author | Jonathan Cameron <jic23@cam.ac.uk> | 2009-01-06 17:42:12 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-06 18:59:24 -0500 |
| commit | 5d2a50371ddf127afa782ad3147469be8e9bd69f (patch) | |
| tree | bc7b7032512c17f493e5f656044c79c17952f517 /drivers/rtc | |
| parent | 2fac6674ddf3164da42a76d62f8912073d629a30 (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>
Diffstat (limited to 'drivers/rtc')
| -rw-r--r-- | drivers/rtc/interface.c | 3 | ||||
| -rw-r--r-- | drivers/rtc/rtc-cmos.c | 3 | ||||
| -rw-r--r-- | drivers/rtc/rtc-s3c.c | 3 | ||||
| -rw-r--r-- | drivers/rtc/rtc-sh.c | 3 | ||||
| -rw-r--r-- | drivers/rtc/rtc-vr41xx.c | 3 |
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 | ||
| 552 | static int sh_rtc_irq_set_freq(struct device *dev, int freq) | 553 | static 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 | ||
