Skip to contentSkip to conversation

rtc: Adding support for spear rtc

PATCH RESEND New Viresh Kumar 3 participants 3 messages Apr 25, 2011 – Apr 28, 2011 Real time clock (RTC)

lore
Share & tools
lore
#0 lore raw

PATCH RESEND 1/1 rtc: Adding support for spear rtc

From: Rajeev Kumar <[email protected]>

---
 drivers/rtc/Kconfig     |    8 +
 drivers/rtc/Makefile    |    1 +
 drivers/rtc/rtc-spear.c |  534 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 543 insertions(+), 0 deletions(-)
 create mode 100644 drivers/rtc/rtc-spear.c
drivers/rtc/Kconfig +8 -0
index e187887..3f7b379 100644
@@ -648,6 +648,14 @@ config RTC_DRV_WM8350
 	  This driver can also be built as a module. If so, the module
 	  will be called "rtc-wm8350".
 
+config RTC_DRV_SPEAR
+	tristate "SPEAR ST RTC"
+	depends on PLAT_SPEAR
+	default y
+	help
+	 If you say Y here you will get support for the RTC found on
+	 spear
+
 config RTC_DRV_PCF50633
 	depends on MFD_PCF50633
 	tristate "NXP PCF50633 RTC"
drivers/rtc/Makefile +1 -0
index ca91c3c..b583db4 100644
@@ -87,6 +87,7 @@ obj-$(CONFIG_RTC_DRV_S35390A)	+= rtc-s35390a.o
 obj-$(CONFIG_RTC_DRV_S3C)	+= rtc-s3c.o
 obj-$(CONFIG_RTC_DRV_SA1100)	+= rtc-sa1100.o
 obj-$(CONFIG_RTC_DRV_SH)	+= rtc-sh.o
+obj-$(CONFIG_RTC_DRV_SPEAR)	+= rtc-spear.o
 obj-$(CONFIG_RTC_DRV_STARFIRE)	+= rtc-starfire.o
 obj-$(CONFIG_RTC_DRV_STK17TA8)	+= rtc-stk17ta8.o
 obj-$(CONFIG_RTC_DRV_STMP)	+= rtc-stmp3xxx.o
drivers/rtc/rtc-spear.c new file +534 -0

534 lines not on this page · raw message

Signature · 1 line
1.7.2.2
#1 lore raw

PATCH RESEND 1/1 rtc: Adding support for spear rtc

Quoted 9 lines · On Mon, 25 Apr 2011 17:00:26 +0530 Viresh Kumar <[email protected]> wrote:

From: Rajeev Kumar <[email protected]>

---
 drivers/rtc/Kconfig     |    8 +
 drivers/rtc/Makefile    |    1 +
 drivers/rtc/rtc-spear.c |  534 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 543 insertions(+), 0 deletions(-)

The driver looks nice and clean.

Quoted 9 lines

...

drivers/rtc/rtc-spear.c new file +6 -0
+static void rtc_wait_not_busy(struct spear_rtc_config *config)
+{
+	int status, count = 0;
+	unsigned long flags;
+
+	/* Assuming BUSY may stay active for 80 msec) */

drivers/rtc/rtc-spear.c line 148

Quoted 10 lines
drivers/rtc/rtc-spear.c new file +10 -0
+	for (count = 0; count < 80; count++) {
+		spin_lock_irqsave(&config->lock, flags);
+		status = readl(config->ioaddr + STATUS_REG);
+		spin_unlock_irqrestore(&config->lock, flags);
+		if ((status & STATUS_BUSY) == 0)
+			break;
+		/* check status busy, after each msec */
+		msleep(1);
+	}
+}

Question. What activity causes STATUS_BUSY to become set?

drivers/rtc/rtc-spear.c line 212

Quoted 12 lines

...

drivers/rtc/rtc-spear.c new file +9 -0
+static int spear_rtc_read_time(struct device *dev, struct rtc_time *tm)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	struct rtc_device *rtc = platform_get_drvdata(pdev);
+	struct spear_rtc_config *config = dev_get_drvdata(&rtc->dev);
+	unsigned int time, date;
+
+	/* we don't report wday/yday/isdst ... */
+	rtc_wait_not_busy(config);

Because here, we've waited for STATUS_BUSY to clear, but we don't appear to have taken any steps to prevent it from getting set again while these steps:

drivers/rtc/rtc-spear.c line 221

Quoted 8 lines
drivers/rtc/rtc-spear.c new file +8 -0
+	time = readl(config->ioaddr + TIME_REG);
+	date = readl(config->ioaddr + DATE_REG);
+	tm->tm_sec = (time >> SECOND_SHIFT) & SECOND_MASK;
+	tm->tm_min = (time >> MINUTE_SHIFT) & MIN_MASK;
+	tm->tm_hour = (time >> HOUR_SHIFT) & HOUR_MASK;
+	tm->tm_mday = (date >> MDAY_SHIFT) & DAY_MASK;
+	tm->tm_mon = (date >> MONTH_SHIFT) & MONTH_MASK;
+	tm->tm_year = (date >> YEAR_SHIFT) & YEAR_MASK;

are in progress?

Quoted 6 lines
drivers/rtc/rtc-spear.c new file +3 -0
+	bcd2tm(tm);
+	return 0;
+}
 
...
#2 lore raw

PATCH RESEND 1/1 rtc: Adding support for spear rtc

Quoted 13 lines · Andrew Morton
Quoted 11 lines · On Mon, 25 Apr 2011 17:00:26 +0530 Viresh Kumar <[email protected]> wrote:

From: Rajeev Kumar <[email protected]>

drivers/rtc/rtc-spear.c new file +10 -0
+static void rtc_wait_not_busy(struct spear_rtc_config *config)
+{
+	int status, count = 0;
+	unsigned long flags;
+
+	/* Assuming BUSY may stay active for 80 msec) */
+	for (count = 0; count < 80; count++) {
+		spin_lock_irqsave(&config->lock, flags);
+		status = readl(config->ioaddr + STATUS_REG);
+		spin_unlock_irqrestore(&config->lock, flags);
Quoted 9 lines

drivers/rtc/rtc-spear.c line 148

Quoted 6 lines
drivers/rtc/rtc-spear.c new file +6 -0
+		if ((status & STATUS_BUSY) == 0)
+			break;
+		/* check status busy, after each msec */
+		msleep(1);
+	}
+}

Question. What activity causes STATUS_BUSY to become set?

STATUS_BUSY is (PD | PT), where
[3] PD: Pending write to Date register.
[2] PT: Pending write to Time register.

So, when we have updated date and time, these bits ensures that date and time are actually written in h/w.

Quoted 17 lines

drivers/rtc/rtc-spear.c line 212

Quoted 12 lines

...

drivers/rtc/rtc-spear.c new file +9 -0
+static int spear_rtc_read_time(struct device *dev, struct rtc_time *tm)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	struct rtc_device *rtc = platform_get_drvdata(pdev);
+	struct spear_rtc_config *config = dev_get_drvdata(&rtc->dev);
+	unsigned int time, date;
+
+	/* we don't report wday/yday/isdst ... */
+	rtc_wait_not_busy(config);

Because here, we've waited for STATUS_BUSY to clear, but we don't appear to have taken any steps to prevent it from getting set again while these steps:

Quoted 11 lines

drivers/rtc/rtc-spear.c line 221

Quoted 8 lines
drivers/rtc/rtc-spear.c new file +8 -0
+	time = readl(config->ioaddr + TIME_REG);
+	date = readl(config->ioaddr + DATE_REG);
+	tm->tm_sec = (time >> SECOND_SHIFT) & SECOND_MASK;
+	tm->tm_min = (time >> MINUTE_SHIFT) & MIN_MASK;
+	tm->tm_hour = (time >> HOUR_SHIFT) & HOUR_MASK;
+	tm->tm_mday = (date >> MDAY_SHIFT) & DAY_MASK;
+	tm->tm_mon = (date >> MONTH_SHIFT) & MONTH_MASK;
+	tm->tm_year = (date >> YEAR_SHIFT) & YEAR_MASK;

are in progress?

Because, we haven't written anything to date and time regs and so BUSY will not be set again during these steps.

Best Rgds
Rajeev