|
@@ -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 0;
|
|
|
|
|
|
+ return -ENOTTY;
|
|
}
|
|
}
|
|
|
|
|
|
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->max_user_freq = (2 << 16); /* stopwatch is an unsigned 16 bit reg */
|
|
|
|
|
|
+ rtc->rtc_dev->irq_freq = 1;
|
|
|
|
|
|
platform_set_drvdata(pdev, rtc);
|
|
platform_set_drvdata(pdev, rtc);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
-err:
|
|
|
|
|
|
+ err:
|
|
kfree(rtc);
|
|
kfree(rtc);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|