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).