mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 03:06:10 +00:00
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>
This commit is contained in:
parent
2fac6674dd
commit
5d2a50371d
5 changed files with 12 additions and 3 deletions
|
@ -504,9 +504,6 @@ int rtc_irq_set_freq(struct rtc_device *rtc, struct rtc_task *task, int freq)
|
|||
if (rtc->ops->irq_set_freq == NULL)
|
||||
return -ENXIO;
|
||||
|
||||
if (!is_power_of_2(freq))
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&rtc->irq_task_lock, flags);
|
||||
if (rtc->irq_task != NULL && task == NULL)
|
||||
err = -EBUSY;
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/log2.h>
|
||||
|
||||
/* this is for "generic access to PC-style RTC" using CMOS_READ/CMOS_WRITE */
|
||||
#include <asm-generic/rtc.h>
|
||||
|
@ -384,6 +385,8 @@ static int cmos_irq_set_freq(struct device *dev, int freq)
|
|||
if (!is_valid_irq(cmos->irq))
|
||||
return -ENXIO;
|
||||
|
||||
if (!is_power_of_2(freq))
|
||||
return -EINVAL;
|
||||
/* 0 = no irqs; 1 = 2^15 Hz ... 15 = 2^0 Hz */
|
||||
f = ffs(freq);
|
||||
if (f-- > 16)
|
||||
|
|
|
@ -94,6 +94,9 @@ static int s3c_rtc_setfreq(struct device *dev, int freq)
|
|||
{
|
||||
unsigned int tmp;
|
||||
|
||||
if (!is_power_of_2(freq))
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irq(&s3c_rtc_pie_lock);
|
||||
|
||||
tmp = readb(s3c_rtc_base + S3C2410_TICNT) & S3C2410_TICNT_ENABLE;
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/log2.h>
|
||||
#include <asm/rtc.h>
|
||||
|
||||
#define DRV_NAME "sh-rtc"
|
||||
|
@ -551,6 +552,8 @@ static int sh_rtc_irq_set_state(struct device *dev, int enabled)
|
|||
|
||||
static int sh_rtc_irq_set_freq(struct device *dev, int freq)
|
||||
{
|
||||
if (!is_power_of_2(freq))
|
||||
return -EINVAL;
|
||||
return sh_rtc_ioctl(dev, RTC_IRQP_SET, freq);
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include <linux/rtc.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/log2.h>
|
||||
|
||||
#include <asm/div64.h>
|
||||
#include <asm/io.h>
|
||||
|
@ -210,6 +211,8 @@ static int vr41xx_rtc_irq_set_freq(struct device *dev, int freq)
|
|||
{
|
||||
unsigned long count;
|
||||
|
||||
if (!is_power_of_2(freq))
|
||||
return -EINVAL;
|
||||
count = RTC_FREQUENCY;
|
||||
do_div(count, freq);
|
||||
|
||||
|
|
Loading…
Reference in a new issue