On Wed, 23 Jul 2003, Jun Sun wrote:
> Most people seem to be happy with getting hwclock working. rtc_set_time()
> does allow a low-oevrhead way to implement a generic rtc driver which
> makes hwclock happy.
Well, some people are not most people and they want a full-featured
implementation as described in Documentation/rtc.txt.
> I like see mc146818rtc related RTC go away eventually, but we don't have to
> agree on that right now.
You'll need to convince guys at the LKML first (me inclusive ;-) ). If
you write a clean and full-featured replacement, you'll most likely be
welcome.
> You can either include it in your next patch (if one is coming). Or
> just let me know and I will flesh it out and check it in.
Here is an optimized replacement I'm going to check in -- OK? Ralf?
I'm working on further changes, but there is no point in coalescing
self-contained changes.
Maciej
--
+ Maciej W. Rozycki, Technical University of Gdansk, Poland +
+--------------------------------------------------------------+
+ e-mail: macro@ds2.pg.gda.pl, PGP key available +
patch-mips-2.4.21-20030711-mips-mmss-0
diff -up --recursive --new-file
linux-mips-2.4.21-20030711.macro/arch/mips/kernel/time.c
linux-mips-2.4.21-20030711/arch/mips/kernel/time.c
--- linux-mips-2.4.21-20030711.macro/arch/mips/kernel/time.c 2003-07-21
20:28:39.000000000 +0000
+++ linux-mips-2.4.21-20030711/arch/mips/kernel/time.c 2003-07-24
08:22:52.000000000 +0000
@@ -62,6 +62,7 @@ static int null_rtc_set_time(unsigned lo
unsigned long (*rtc_get_time)(void) = null_rtc_get_time;
int (*rtc_set_time)(unsigned long) = null_rtc_set_time;
+int (*rtc_set_mmss)(unsigned long);
/*
@@ -364,7 +365,7 @@ void timer_interrupt(int irq, void *dev_
xtime.tv_sec > last_rtc_update + 660 &&
xtime.tv_usec >= 500000 - ((unsigned) tick) / 2 &&
xtime.tv_usec <= 500000 + ((unsigned) tick) / 2) {
- if (rtc_set_time(xtime.tv_sec) == 0) {
+ if (rtc_set_mmss(xtime.tv_sec) == 0) {
last_rtc_update = xtime.tv_sec;
} else {
/* do it again in 60 s */
@@ -473,6 +474,9 @@ void __init time_init(void)
if (board_time_init)
board_time_init();
+ if (!rtc_set_mmss)
+ rtc_set_mmss = rtc_set_time;
+
xtime.tv_sec = rtc_get_time();
xtime.tv_usec = 0;
diff -up --recursive --new-file
linux-mips-2.4.21-20030711.macro/arch/mips64/kernel/time.c
linux-mips-2.4.21-20030711/arch/mips64/kernel/time.c
--- linux-mips-2.4.21-20030711.macro/arch/mips64/kernel/time.c 2003-07-21
20:28:39.000000000 +0000
+++ linux-mips-2.4.21-20030711/arch/mips64/kernel/time.c 2003-07-24
08:22:52.000000000 +0000
@@ -62,6 +62,7 @@ static int null_rtc_set_time(unsigned lo
unsigned long (*rtc_get_time)(void) = null_rtc_get_time;
int (*rtc_set_time)(unsigned long) = null_rtc_set_time;
+int (*rtc_set_mmss)(unsigned long);
/*
@@ -364,7 +365,7 @@ void timer_interrupt(int irq, void *dev_
xtime.tv_sec > last_rtc_update + 660 &&
xtime.tv_usec >= 500000 - ((unsigned) tick) / 2 &&
xtime.tv_usec <= 500000 + ((unsigned) tick) / 2) {
- if (rtc_set_time(xtime.tv_sec) == 0) {
+ if (rtc_set_mmss(xtime.tv_sec) == 0) {
last_rtc_update = xtime.tv_sec;
} else {
/* do it again in 60 s */
@@ -473,6 +474,9 @@ void __init time_init(void)
if (board_time_init)
board_time_init();
+ if (!rtc_set_mmss)
+ rtc_set_mmss = rtc_set_time;
+
xtime.tv_sec = rtc_get_time();
xtime.tv_usec = 0;
diff -up --recursive --new-file
linux-mips-2.4.21-20030711.macro/include/asm-mips/time.h
linux-mips-2.4.21-20030711/include/asm-mips/time.h
--- linux-mips-2.4.21-20030711.macro/include/asm-mips/time.h 2003-07-21
21:02:58.000000000 +0000
+++ linux-mips-2.4.21-20030711/include/asm-mips/time.h 2003-07-24
08:24:08.000000000 +0000
@@ -28,9 +28,12 @@
* RTC ops. By default, they point to no-RTC functions.
* rtc_get_time - mktime(year, mon, day, hour, min, sec) in seconds.
* rtc_set_time - reverse the above translation and set time to RTC.
+ * rtc_set_mmss - similar to rtc_set_time, but only min and sec need
+ * to be set. Used by RTC sync-up.
*/
extern unsigned long (*rtc_get_time)(void);
extern int (*rtc_set_time)(unsigned long);
+extern int (*rtc_set_mmss)(unsigned long);
/*
* to_tm() converts system time back to (year, mon, day, hour, min, sec).
diff -up --recursive --new-file
linux-mips-2.4.21-20030711.macro/include/asm-mips64/time.h
linux-mips-2.4.21-20030711/include/asm-mips64/time.h
--- linux-mips-2.4.21-20030711.macro/include/asm-mips64/time.h 2003-07-21
21:02:58.000000000 +0000
+++ linux-mips-2.4.21-20030711/include/asm-mips64/time.h 2003-07-24
08:24:08.000000000 +0000
@@ -28,9 +28,12 @@
* RTC ops. By default, they point to no-RTC functions.
* rtc_get_time - mktime(year, mon, day, hour, min, sec) in seconds.
* rtc_set_time - reverse the above translation and set time to RTC.
+ * rtc_set_mmss - similar to rtc_set_time, but only min and sec need
+ * to be set. Used by RTC sync-up.
*/
extern unsigned long (*rtc_get_time)(void);
extern int (*rtc_set_time)(unsigned long);
+extern int (*rtc_set_mmss)(unsigned long);
/*
* to_tm() converts system time back to (year, mon, day, hour, min, sec).
|