Commit 90b02340 authored by Ralf Baechle's avatar Ralf Baechle

[MIPS] Switch from to_tm to rtc_time_to_tm

This replaces the MIPS-specific to_tm function with the generic
rtc_time_to_tm function.  The big difference between the two functions is
that rtc_time_to_tm uses epoch 70 while to_tm uses 1970, so the result of
rtc_time_to_tm needs to be fixed up.
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 4b550488
...@@ -3,6 +3,7 @@ config MIPS ...@@ -3,6 +3,7 @@ config MIPS
default y default y
# Horrible source of confusion. Die, die, die ... # Horrible source of confusion. Die, die, die ...
select EMBEDDED select EMBEDDED
select RTC_LIB
mainmenu "Linux/MIPS Kernel Configuration" mainmenu "Linux/MIPS Kernel Configuration"
......
...@@ -397,52 +397,3 @@ void __init time_init(void) ...@@ -397,52 +397,3 @@ void __init time_init(void)
init_mips_clocksource(); init_mips_clocksource();
} }
#define FEBRUARY 2
#define STARTOFTIME 1970
#define SECDAY 86400L
#define SECYR (SECDAY * 365)
#define leapyear(y) ((!((y) % 4) && ((y) % 100)) || !((y) % 400))
#define days_in_year(y) (leapyear(y) ? 366 : 365)
#define days_in_month(m) (month_days[(m) - 1])
static int month_days[12] = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
void to_tm(unsigned long tim, struct rtc_time *tm)
{
long hms, day, gday;
int i;
gday = day = tim / SECDAY;
hms = tim % SECDAY;
/* Hours, minutes, seconds are easy */
tm->tm_hour = hms / 3600;
tm->tm_min = (hms % 3600) / 60;
tm->tm_sec = (hms % 3600) % 60;
/* Number of years in days */
for (i = STARTOFTIME; day >= days_in_year(i); i++)
day -= days_in_year(i);
tm->tm_year = i;
/* Number of months in days left */
if (leapyear(tm->tm_year))
days_in_month(FEBRUARY) = 29;
for (i = 1; day >= days_in_month(i); i++)
day -= days_in_month(i);
days_in_month(FEBRUARY) = 28;
tm->tm_mon = i - 1; /* tm_mon starts from 0 to 11 */
/* Days are what is left over (+1) from all that. */
tm->tm_mday = day + 1;
/*
* Determine the day of week
*/
tm->tm_wday = (gday + 4) % 7; /* 1970/1/1 was Thursday */
}
EXPORT_SYMBOL(to_tm);
...@@ -100,8 +100,12 @@ int rtc_mips_set_time(unsigned long tim) ...@@ -100,8 +100,12 @@ int rtc_mips_set_time(unsigned long tim)
struct rtc_time tm; struct rtc_time tm;
unsigned long flags; unsigned long flags;
/* convert to a more useful format -- note months count from 0 */ /*
to_tm(sec, &tm); * Convert to a more useful format -- note months count from 0
* and years from 1900
*/
rtc_time_to_tm(tim, &tm);
tm.tm_year += 1900;
tm.tm_mon += 1; tm.tm_mon += 1;
spin_lock_irqsave(&rtc_lock, flags); spin_lock_irqsave(&rtc_lock, flags);
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#include <asm/sgi/ip22.h> #include <asm/sgi/ip22.h>
/* /*
* note that mktime uses month from 1 to 12 while to_tm * Note that mktime uses month from 1 to 12 while rtc_time_to_tm
* uses 0 to 11. * uses 0 to 11.
*/ */
unsigned long read_persistent_clock(void) unsigned long read_persistent_clock(void)
...@@ -66,10 +66,10 @@ int rtc_mips_set_time(unsigned long tim) ...@@ -66,10 +66,10 @@ int rtc_mips_set_time(unsigned long tim)
unsigned int save_control; unsigned int save_control;
unsigned long flags; unsigned long flags;
to_tm(tim, &tm); rtc_time_to_tm(tim, &tm);
tm.tm_mon += 1; /* tm_mon starts at zero */ tm.tm_mon += 1; /* tm_mon starts at zero */
tm.tm_year -= 1940; tm.tm_year -= 40;
if (tm.tm_year >= 100) if (tm.tm_year >= 100)
tm.tm_year -= 100; tm.tm_year -= 100;
......
...@@ -146,7 +146,8 @@ int m41t81_set_time(unsigned long t) ...@@ -146,7 +146,8 @@ int m41t81_set_time(unsigned long t)
struct rtc_time tm; struct rtc_time tm;
unsigned long flags; unsigned long flags;
to_tm(t, &tm); /* Note we don't care about the century */
rtc_time_to_tm(t, &tm);
/* /*
* Note the write order matters as it ensures the correctness. * Note the write order matters as it ensures the correctness.
......
...@@ -115,7 +115,8 @@ int xicor_set_time(unsigned long t) ...@@ -115,7 +115,8 @@ int xicor_set_time(unsigned long t)
int tmp; int tmp;
unsigned long flags; unsigned long flags;
to_tm(t, &tm); rtc_time_to_tm(t, &tm);
tm.tm_year += 1900;
spin_lock_irqsave(&rtc_lock, flags); spin_lock_irqsave(&rtc_lock, flags);
/* unlock writes to the CCR */ /* unlock writes to the CCR */
......
...@@ -48,13 +48,6 @@ extern void (*mips_timer_ack)(void); ...@@ -48,13 +48,6 @@ extern void (*mips_timer_ack)(void);
*/ */
extern struct clocksource clocksource_mips; extern struct clocksource clocksource_mips;
/*
* to_tm() converts system time back to (year, mon, day, hour, min, sec).
* It is intended to help implement rtc_set_time() functions.
* Copied from PPC implementation.
*/
extern void to_tm(unsigned long tim, struct rtc_time *tm);
/* /*
* high-level timer interrupt routines. * high-level timer interrupt routines.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment