Blackfin RTC driver: the frequency function is in units of Hz, not units of seconds, so lock our driver down to 1 Hz
Signed-off-by: Mike Frysinger <michael.frysinger@analog.com> Signed-off-by: Bryan Wu <bryan.wu@analog.com> Acked-by: Alessandro Zummo <alessandro.zummo@towertech.it> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
8f26795a22
Коммит
5c236343eb
|
@ -72,7 +72,7 @@ struct bfin_rtc {
|
|||
#define SEC_BITS_OFF 0
|
||||
|
||||
/* Some helper functions to convert between the common RTC notion of time
|
||||
* and the internal Blackfin notion that is stored in 32bits.
|
||||
* and the internal Blackfin notion that is encoded in 32bits.
|
||||
*/
|
||||
static inline u32 rtc_time_to_bfin(unsigned long now)
|
||||
{
|
||||
|
@ -112,6 +112,11 @@ static inline void rtc_bfin_to_tm(u32 rtc_bfin, struct rtc_time *tm)
|
|||
* If anyone can point out the obvious solution here, i'm listening :). This
|
||||
* shouldn't be an issue on an SMP or preempt system as this function should
|
||||
* only be called with the rtc lock held.
|
||||
*
|
||||
* Other options:
|
||||
* - disable PREN so the sync happens at 32.768kHZ ... but this changes the
|
||||
* inc rate for all RTC registers from 1HZ to 32.768kHZ ...
|
||||
* - use the write complete IRQ
|
||||
*/
|
||||
static void rtc_bfin_sync_pending(void)
|
||||
{
|
||||
|
@ -356,12 +361,18 @@ static int bfin_rtc_proc(struct device *dev, struct seq_file *seq)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* bfin_irq_set_freq - make sure hardware supports requested freq
|
||||
* @dev: pointer to RTC device structure
|
||||
* @freq: requested frequency rate
|
||||
*
|
||||
* The Blackfin RTC can only generate periodic events at 1 per
|
||||
* second (1 Hz), so reject any attempt at changing it.
|
||||
*/
|
||||
static int bfin_irq_set_freq(struct device *dev, int freq)
|
||||
{
|
||||
struct bfin_rtc *rtc = dev_get_drvdata(dev);
|
||||
stampit();
|
||||
rtc->rtc_dev->irq_freq = freq;
|
||||
return 0;
|
||||
return -ENOTTY;
|
||||
}
|
||||
|
||||
static struct rtc_class_ops bfin_rtc_ops = {
|
||||
|
@ -394,14 +405,13 @@ static int __devinit bfin_rtc_probe(struct platform_device *pdev)
|
|||
ret = PTR_ERR(rtc->rtc_dev);
|
||||
goto err;
|
||||
}
|
||||
rtc->rtc_dev->irq_freq = 0;
|
||||
rtc->rtc_dev->max_user_freq = (2 << 16); /* stopwatch is an unsigned 16 bit reg */
|
||||
rtc->rtc_dev->irq_freq = 1;
|
||||
|
||||
platform_set_drvdata(pdev, rtc);
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
err:
|
||||
kfree(rtc);
|
||||
return ret;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче