rtc: Adding support for spear rtc
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
@@ -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
@@ -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
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]>
Signed-off-by Rajeev Kumar <[email protected]>Signed-off-by Viresh 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 ; +}
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_BUSYto 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_BUSYto 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