Commit d7b98e3d authored by Geoff Levand's avatar Geoff Levand Committed by Paul Mackerras

[POWERPC] PS3: Add os-area rtc_diff set/get routines

Updates for PS3 os-area rtc_diff set/get routines
o Add a new routine ps3_os_area_set_rtc_diff().
o Rename ps3_os_area_rtc_diff() to ps3_os_area_get_rtc_diff().
o Remove static variable rtc_shift with calls to ps3_os_area_get_rtc_diff().
Signed-off-by: default avatarGeoff Levand <geoffrey.levand@am.sony.com>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 418ef209
...@@ -261,15 +261,30 @@ void __init ps3_os_area_save_params(void) ...@@ -261,15 +261,30 @@ void __init ps3_os_area_save_params(void)
} }
/** /**
* ps3_os_area_rtc_diff - Returns the rtc diff value. * ps3_os_area_get_rtc_diff - Returns the rtc diff value.
*/ */
u64 ps3_os_area_rtc_diff(void) u64 ps3_os_area_get_rtc_diff(void)
{ {
return saved_params.rtc_diff ? saved_params.rtc_diff return saved_params.rtc_diff ? saved_params.rtc_diff
: SECONDS_FROM_1970_TO_2000; : SECONDS_FROM_1970_TO_2000;
} }
/**
* ps3_os_area_set_rtc_diff - Set the rtc diff value.
*
* An asynchronous write is needed to support writing updates from
* the timer interrupt context.
*/
void ps3_os_area_set_rtc_diff(u64 rtc_diff)
{
if (saved_params.rtc_diff != rtc_diff) {
saved_params.rtc_diff = rtc_diff;
os_area_queue_work();
}
}
/** /**
* ps3_os_area_get_av_multi_out - Returns the default video mode. * ps3_os_area_get_av_multi_out - Returns the default video mode.
*/ */
......
...@@ -63,7 +63,8 @@ int ps3_set_rtc_time(struct rtc_time *time); ...@@ -63,7 +63,8 @@ int ps3_set_rtc_time(struct rtc_time *time);
/* os area */ /* os area */
void __init ps3_os_area_save_params(void); void __init ps3_os_area_save_params(void);
u64 ps3_os_area_rtc_diff(void); u64 ps3_os_area_get_rtc_diff(void);
void ps3_os_area_set_rtc_diff(u64 rtc_diff);
/* spu */ /* spu */
......
...@@ -50,12 +50,6 @@ static void __maybe_unused _dump_time(int time, const char *func, ...@@ -50,12 +50,6 @@ static void __maybe_unused _dump_time(int time, const char *func,
_dump_tm(&tm, func, line); _dump_tm(&tm, func, line);
} }
/**
* rtc_shift - Difference in seconds between 1970 and the ps3 rtc value.
*/
static s64 rtc_shift;
void __init ps3_calibrate_decr(void) void __init ps3_calibrate_decr(void)
{ {
int result; int result;
...@@ -66,8 +60,6 @@ void __init ps3_calibrate_decr(void) ...@@ -66,8 +60,6 @@ void __init ps3_calibrate_decr(void)
ppc_tb_freq = tmp; ppc_tb_freq = tmp;
ppc_proc_freq = ppc_tb_freq * 40; ppc_proc_freq = ppc_tb_freq * 40;
rtc_shift = ps3_os_area_rtc_diff();
} }
static u64 read_rtc(void) static u64 read_rtc(void)
...@@ -87,18 +79,18 @@ int ps3_set_rtc_time(struct rtc_time *tm) ...@@ -87,18 +79,18 @@ int ps3_set_rtc_time(struct rtc_time *tm)
u64 now = mktime(tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, u64 now = mktime(tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec); tm->tm_hour, tm->tm_min, tm->tm_sec);
rtc_shift = now - read_rtc(); ps3_os_area_set_rtc_diff(now - read_rtc());
return 0; return 0;
} }
void ps3_get_rtc_time(struct rtc_time *tm) void ps3_get_rtc_time(struct rtc_time *tm)
{ {
to_tm(read_rtc() + rtc_shift, tm); to_tm(read_rtc() + ps3_os_area_get_rtc_diff(), tm);
tm->tm_year -= 1900; tm->tm_year -= 1900;
tm->tm_mon -= 1; tm->tm_mon -= 1;
} }
unsigned long __init ps3_get_boot_time(void) unsigned long __init ps3_get_boot_time(void)
{ {
return read_rtc() + rtc_shift; return read_rtc() + ps3_os_area_get_rtc_diff();
} }
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