aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/mips/Kconfig1
-rw-r--r--arch/mips/kernel/time.c49
-rw-r--r--arch/mips/pmc-sierra/yosemite/setup.c8
-rw-r--r--arch/mips/sgi-ip22/ip22-time.c6
-rw-r--r--arch/mips/sibyte/swarm/rtc_m41t81.c3
-rw-r--r--arch/mips/sibyte/swarm/rtc_xicor1241.c3
-rw-r--r--include/asm-mips/time.h7
7 files changed, 14 insertions, 63 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index c024113ce280..0cd0f835b13d 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -3,6 +3,7 @@ config MIPS
3 default y 3 default y
4 # Horrible source of confusion. Die, die, die ... 4 # Horrible source of confusion. Die, die, die ...
5 select EMBEDDED 5 select EMBEDDED
6 select RTC_LIB
6 7
7mainmenu "Linux/MIPS Kernel Configuration" 8mainmenu "Linux/MIPS Kernel Configuration"
8 9
diff --git a/arch/mips/kernel/time.c b/arch/mips/kernel/time.c
index 9bbbd9b327fc..c48ebd4b495e 100644
--- a/arch/mips/kernel/time.c
+++ b/arch/mips/kernel/time.c
@@ -397,52 +397,3 @@ void __init time_init(void)
397 397
398 init_mips_clocksource(); 398 init_mips_clocksource();
399} 399}
400
401#define FEBRUARY 2
402#define STARTOFTIME 1970
403#define SECDAY 86400L
404#define SECYR (SECDAY * 365)
405#define leapyear(y) ((!((y) % 4) && ((y) % 100)) || !((y) % 400))
406#define days_in_year(y) (leapyear(y) ? 366 : 365)
407#define days_in_month(m) (month_days[(m) - 1])
408
409static int month_days[12] = {
410 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
411};
412
413void to_tm(unsigned long tim, struct rtc_time *tm)
414{
415 long hms, day, gday;
416 int i;
417
418 gday = day = tim / SECDAY;
419 hms = tim % SECDAY;
420
421 /* Hours, minutes, seconds are easy */
422 tm->tm_hour = hms / 3600;
423 tm->tm_min = (hms % 3600) / 60;
424 tm->tm_sec = (hms % 3600) % 60;
425
426 /* Number of years in days */
427 for (i = STARTOFTIME; day >= days_in_year(i); i++)
428 day -= days_in_year(i);
429 tm->tm_year = i;
430
431 /* Number of months in days left */
432 if (leapyear(tm->tm_year))
433 days_in_month(FEBRUARY) = 29;
434 for (i = 1; day >= days_in_month(i); i++)
435 day -= days_in_month(i);
436 days_in_month(FEBRUARY) = 28;
437 tm->tm_mon = i - 1; /* tm_mon starts from 0 to 11 */
438
439 /* Days are what is left over (+1) from all that. */
440 tm->tm_mday = day + 1;
441
442 /*
443 * Determine the day of week
444 */
445 tm->tm_wday = (gday + 4) % 7; /* 1970/1/1 was Thursday */
446}
447
448EXPORT_SYMBOL(to_tm);
diff --git a/arch/mips/pmc-sierra/yosemite/setup.c b/arch/mips/pmc-sierra/yosemite/setup.c
index 56bf69595da8..015fcc363dc0 100644
--- a/arch/mips/pmc-sierra/yosemite/setup.c
+++ b/arch/mips/pmc-sierra/yosemite/setup.c
@@ -100,8 +100,12 @@ int rtc_mips_set_time(unsigned long tim)
100 struct rtc_time tm; 100 struct rtc_time tm;
101 unsigned long flags; 101 unsigned long flags;
102 102
103 /* convert to a more useful format -- note months count from 0 */ 103 /*
104 to_tm(sec, &tm); 104 * Convert to a more useful format -- note months count from 0
105 * and years from 1900
106 */
107 rtc_time_to_tm(tim, &tm);
108 tm.tm_year += 1900;
105 tm.tm_mon += 1; 109 tm.tm_mon += 1;
106 110
107 spin_lock_irqsave(&rtc_lock, flags); 111 spin_lock_irqsave(&rtc_lock, flags);
diff --git a/arch/mips/sgi-ip22/ip22-time.c b/arch/mips/sgi-ip22/ip22-time.c
index 0387c385b4b2..c49418067f93 100644
--- a/arch/mips/sgi-ip22/ip22-time.c
+++ b/arch/mips/sgi-ip22/ip22-time.c
@@ -29,7 +29,7 @@
29#include <asm/sgi/ip22.h> 29#include <asm/sgi/ip22.h>
30 30
31/* 31/*
32 * note that mktime uses month from 1 to 12 while to_tm 32 * Note that mktime uses month from 1 to 12 while rtc_time_to_tm
33 * uses 0 to 11. 33 * uses 0 to 11.
34 */ 34 */
35unsigned long read_persistent_clock(void) 35unsigned long read_persistent_clock(void)
@@ -66,10 +66,10 @@ int rtc_mips_set_time(unsigned long tim)
66 unsigned int save_control; 66 unsigned int save_control;
67 unsigned long flags; 67 unsigned long flags;
68 68
69 to_tm(tim, &tm); 69 rtc_time_to_tm(tim, &tm);
70 70
71 tm.tm_mon += 1; /* tm_mon starts at zero */ 71 tm.tm_mon += 1; /* tm_mon starts at zero */
72 tm.tm_year -= 1940; 72 tm.tm_year -= 40;
73 if (tm.tm_year >= 100) 73 if (tm.tm_year >= 100)
74 tm.tm_year -= 100; 74 tm.tm_year -= 100;
75 75
diff --git a/arch/mips/sibyte/swarm/rtc_m41t81.c b/arch/mips/sibyte/swarm/rtc_m41t81.c
index c13914bdda59..26fbff4c15b1 100644
--- a/arch/mips/sibyte/swarm/rtc_m41t81.c
+++ b/arch/mips/sibyte/swarm/rtc_m41t81.c
@@ -146,7 +146,8 @@ int m41t81_set_time(unsigned long t)
146 struct rtc_time tm; 146 struct rtc_time tm;
147 unsigned long flags; 147 unsigned long flags;
148 148
149 to_tm(t, &tm); 149 /* Note we don't care about the century */
150 rtc_time_to_tm(t, &tm);
150 151
151 /* 152 /*
152 * Note the write order matters as it ensures the correctness. 153 * Note the write order matters as it ensures the correctness.
diff --git a/arch/mips/sibyte/swarm/rtc_xicor1241.c b/arch/mips/sibyte/swarm/rtc_xicor1241.c
index f4a178836415..ff3e5dabb348 100644
--- a/arch/mips/sibyte/swarm/rtc_xicor1241.c
+++ b/arch/mips/sibyte/swarm/rtc_xicor1241.c
@@ -115,7 +115,8 @@ int xicor_set_time(unsigned long t)
115 int tmp; 115 int tmp;
116 unsigned long flags; 116 unsigned long flags;
117 117
118 to_tm(t, &tm); 118 rtc_time_to_tm(t, &tm);
119 tm.tm_year += 1900;
119 120
120 spin_lock_irqsave(&rtc_lock, flags); 121 spin_lock_irqsave(&rtc_lock, flags);
121 /* unlock writes to the CCR */ 122 /* unlock writes to the CCR */
diff --git a/include/asm-mips/time.h b/include/asm-mips/time.h
index 74ab33157d69..963507d33f69 100644
--- a/include/asm-mips/time.h
+++ b/include/asm-mips/time.h
@@ -49,13 +49,6 @@ extern void (*mips_timer_ack)(void);
49extern struct clocksource clocksource_mips; 49extern struct clocksource clocksource_mips;
50 50
51/* 51/*
52 * to_tm() converts system time back to (year, mon, day, hour, min, sec).
53 * It is intended to help implement rtc_set_time() functions.
54 * Copied from PPC implementation.
55 */
56extern void to_tm(unsigned long tim, struct rtc_time *tm);
57
58/*
59 * high-level timer interrupt routines. 52 * high-level timer interrupt routines.
60 */ 53 */
61extern irqreturn_t timer_interrupt(int irq, void *dev_id); 54extern irqreturn_t timer_interrupt(int irq, void *dev_id);