{
        int ret[8];
        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;
        do {
 {
         int ret[8];
        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;
        do {
 int rtas_set_rtc_time(struct rtc_time *tm)
 {
        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;
        do {
 
        if (rtas_token("display-character") >= 0)
                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
        if (ppc_md.progress == NULL && boot_text_mapped)
                ppc_md.progress = btext_progress;
        ppc_md.halt           = rtas_halt;
 
        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.get_rtc_time   = chrp_get_rtc_time;
-       ppc_md.calibrate_decr = chrp_calibrate_decr;
 
 #ifdef CONFIG_SMP
        smp_ops = &chrp_smp_ops;
 
 
        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) {
                BIN_TO_BCD(tm.tm_sec);
                BIN_TO_BCD(tm.tm_min);
                BCD_TO_BIN(mon);
                BCD_TO_BIN(year);
        }
-       if ((year += 1900) < 1970)
+       if (year < 70)
                year += 100;
        tm->tm_sec = sec;
        tm->tm_min = min;