powerpc: time-of-day fixes for 32-bit CHRP systems
This makes 32-bit CHRP systems use the RTAS time-of-day routines if available. It fixes a bug in the RTAS time-of-day routines where they were storing a 64-bit timebase value in an unsigned long by making those variables u64. Also, the direct-access time-of-day routines had the wrong convention for the month and year in the struct rtc_time. Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
@@ -15,7 +15,7 @@ unsigned long __init rtas_get_boot_time(void)
|
|||||||
{
|
{
|
||||||
int ret[8];
|
int ret[8];
|
||||||
int error, wait_time;
|
int error, wait_time;
|
||||||
unsigned long max_wait_tb;
|
u64 max_wait_tb;
|
||||||
|
|
||||||
max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
|
max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
|
||||||
do {
|
do {
|
||||||
@@ -45,7 +45,7 @@ void rtas_get_rtc_time(struct rtc_time *rtc_tm)
|
|||||||
{
|
{
|
||||||
int ret[8];
|
int ret[8];
|
||||||
int error, wait_time;
|
int error, wait_time;
|
||||||
unsigned long max_wait_tb;
|
u64 max_wait_tb;
|
||||||
|
|
||||||
max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
|
max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
|
||||||
do {
|
do {
|
||||||
@@ -80,7 +80,7 @@ void rtas_get_rtc_time(struct rtc_time *rtc_tm)
|
|||||||
int rtas_set_rtc_time(struct rtc_time *tm)
|
int rtas_set_rtc_time(struct rtc_time *tm)
|
||||||
{
|
{
|
||||||
int error, wait_time;
|
int error, wait_time;
|
||||||
unsigned long max_wait_tb;
|
u64 max_wait_tb;
|
||||||
|
|
||||||
max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
|
max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
|
||||||
do {
|
do {
|
||||||
|
@@ -257,6 +257,13 @@ void __init chrp_setup_arch(void)
|
|||||||
if (rtas_token("display-character") >= 0)
|
if (rtas_token("display-character") >= 0)
|
||||||
ppc_md.progress = rtas_progress;
|
ppc_md.progress = rtas_progress;
|
||||||
|
|
||||||
|
/* use RTAS time-of-day routines if available */
|
||||||
|
if (rtas_token("get-time-of-day") != RTAS_UNKNOWN_SERVICE) {
|
||||||
|
ppc_md.get_boot_time = rtas_get_boot_time;
|
||||||
|
ppc_md.get_rtc_time = rtas_get_rtc_time;
|
||||||
|
ppc_md.set_rtc_time = rtas_set_rtc_time;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_BOOTX_TEXT
|
#ifdef CONFIG_BOOTX_TEXT
|
||||||
if (ppc_md.progress == NULL && boot_text_mapped)
|
if (ppc_md.progress == NULL && boot_text_mapped)
|
||||||
ppc_md.progress = btext_progress;
|
ppc_md.progress = btext_progress;
|
||||||
@@ -505,9 +512,11 @@ void __init chrp_init(void)
|
|||||||
ppc_md.halt = rtas_halt;
|
ppc_md.halt = rtas_halt;
|
||||||
|
|
||||||
ppc_md.time_init = chrp_time_init;
|
ppc_md.time_init = chrp_time_init;
|
||||||
|
ppc_md.calibrate_decr = chrp_calibrate_decr;
|
||||||
|
|
||||||
|
/* this may get overridden with rtas routines later... */
|
||||||
ppc_md.set_rtc_time = chrp_set_rtc_time;
|
ppc_md.set_rtc_time = chrp_set_rtc_time;
|
||||||
ppc_md.get_rtc_time = chrp_get_rtc_time;
|
ppc_md.get_rtc_time = chrp_get_rtc_time;
|
||||||
ppc_md.calibrate_decr = chrp_calibrate_decr;
|
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
smp_ops = &chrp_smp_ops;
|
smp_ops = &chrp_smp_ops;
|
||||||
|
@@ -87,7 +87,6 @@ int chrp_set_rtc_time(struct rtc_time *tmarg)
|
|||||||
|
|
||||||
chrp_cmos_clock_write((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT);
|
chrp_cmos_clock_write((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT);
|
||||||
|
|
||||||
tm.tm_year -= 1900;
|
|
||||||
if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
|
if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
|
||||||
BIN_TO_BCD(tm.tm_sec);
|
BIN_TO_BCD(tm.tm_sec);
|
||||||
BIN_TO_BCD(tm.tm_min);
|
BIN_TO_BCD(tm.tm_min);
|
||||||
@@ -156,7 +155,7 @@ void chrp_get_rtc_time(struct rtc_time *tm)
|
|||||||
BCD_TO_BIN(mon);
|
BCD_TO_BIN(mon);
|
||||||
BCD_TO_BIN(year);
|
BCD_TO_BIN(year);
|
||||||
}
|
}
|
||||||
if ((year += 1900) < 1970)
|
if (year < 70)
|
||||||
year += 100;
|
year += 100;
|
||||||
tm->tm_sec = sec;
|
tm->tm_sec = sec;
|
||||||
tm->tm_min = min;
|
tm->tm_min = min;
|
||||||
|
Reference in New Issue
Block a user