Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5c236343 authored by Mike Frysinger's avatar Mike Frysinger Committed by Linus Torvalds
Browse files

Blackfin RTC driver: the frequency function is in units of Hz, not units of...


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: default avatarMike Frysinger <michael.frysinger@analog.com>
Signed-off-by: default avatarBryan Wu <bryan.wu@analog.com>
Acked-by: default avatarAlessandro Zummo <alessandro.zummo@towertech.it>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 8f26795a
Loading
Loading
Loading
Loading
+17 −7
Original line number Diff line number Diff line
@@ -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,8 +405,7 @@ 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);