mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-20 19:23:57 +08:00
[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: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
4b550488f8
commit
90b02340dc
@ -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)
|
|||||||
|
|
||||||
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)
|
|||||||
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 @@
|
|||||||
#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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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);
|
|||||||
*/
|
*/
|
||||||
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.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user