Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ config MIPS
	default y
	# Horrible source of confusion.  Die, die, die ...
	select EMBEDDED
	select RTC_LIB

mainmenu "Linux/MIPS Kernel Configuration"

+0 −49
Original line number Diff line number Diff line
@@ -397,52 +397,3 @@ void __init time_init(void)

	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);
+6 −2
Original line number Diff line number Diff line
@@ -100,8 +100,12 @@ int rtc_mips_set_time(unsigned long tim)
	struct rtc_time tm;
	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;

	spin_lock_irqsave(&rtc_lock, flags);
+3 −3
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@
#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.
 */
unsigned long read_persistent_clock(void)
@@ -66,10 +66,10 @@ int rtc_mips_set_time(unsigned long tim)
	unsigned int save_control;
	unsigned long flags;

	to_tm(tim, &tm);
	rtc_time_to_tm(tim, &tm);

	tm.tm_mon += 1;		/* tm_mon starts at zero */
	tm.tm_year -= 1940;
	tm.tm_year -= 40;
	if (tm.tm_year >= 100)
		tm.tm_year -= 100;

+2 −1
Original line number Diff line number Diff line
@@ -146,7 +146,8 @@ int m41t81_set_time(unsigned long t)
	struct rtc_time tm;
	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.
Loading