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:
parent
8f26795a22
commit
5c236343eb
|
@ -72,7 +72,7 @@ struct bfin_rtc {
|
||||||
#define SEC_BITS_OFF 0
|
#define SEC_BITS_OFF 0
|
||||||
|
|
||||||
/* Some helper functions to convert between the common RTC notion of time
|
/* 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)
|
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
|
* 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
|
* shouldn't be an issue on an SMP or preempt system as this function should
|
||||||
* only be called with the rtc lock held.
|
* 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)
|
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;
|
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)
|
static int bfin_irq_set_freq(struct device *dev, int freq)
|
||||||
{
|
{
|
||||||
struct bfin_rtc *rtc = dev_get_drvdata(dev);
|
|
||||||
stampit();
|
stampit();
|
||||||
rtc->rtc_dev->irq_freq = freq;
|
return -ENOTTY;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct rtc_class_ops bfin_rtc_ops = {
|
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);
|
ret = PTR_ERR(rtc->rtc_dev);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
rtc->rtc_dev->irq_freq = 0;
|
rtc->rtc_dev->irq_freq = 1;
|
||||||
rtc->rtc_dev->max_user_freq = (2 << 16); /* stopwatch is an unsigned 16 bit reg */
|
|
||||||
|
|
||||||
platform_set_drvdata(pdev, rtc);
|
platform_set_drvdata(pdev, rtc);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
kfree(rtc);
|
kfree(rtc);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue