On Thu, 23 Oct 2008, Geert Uytterhoeven wrote:
> On Thu, 23 Oct 2008, Michael Schmitz wrote:
> It seems to be removed in early 2.5 (2.4 has it, my oldest 2.5 is 2.5.5
> and that one doesn't have it anymore):

> and `mach_gettod' was wired up to 'mac_gettod'.
> 
> No idea why it was removed. I should check my mail archives (2002 and
> older are on CD).

full-history-linux.git points to:

commit d5d48bb9b0d46f7eb6168a2e573fcf78d00c7244
Author: Roman Zippel <[EMAIL PROTECTED]>
Date:   Mon May 6 20:10:29 2002 -0700

    [PATCH] m68k: remove hwclk_time/gettod [9/20]
    
    - replace hwclk_time with rtc_time
    - use hwclk instead of gettod to set initial time

diff --git a/arch/m68k/amiga/config.c b/arch/m68k/amiga/config.c
index 4c8bb27..ab3d3e1 100644
--- a/arch/m68k/amiga/config.c
+++ b/arch/m68k/amiga/config.c
@@ -18,6 +18,7 @@
 #include <linux/mm.h>
 #include <linux/tty.h>
 #include <linux/console.h>
+#include <linux/rtc.h>
 #include <linux/init.h>
 #ifdef CONFIG_ZORRO
 #include <linux/zorro.h>
@@ -89,9 +90,8 @@ static int amiga_get_hardware_list(char *buffer);
 extern int show_amiga_interrupts (struct seq_file *, void *);
 /* amiga specific timer functions */
 static unsigned long amiga_gettimeoffset (void);
-static void a3000_gettod (int *, int *, int *, int *, int *, int *);
-static void a2000_gettod (int *, int *, int *, int *, int *, int *);
-static int amiga_hwclk (int, struct hwclk_time *);
+static int a3000_hwclk (int, struct rtc_time *);
+static int a2000_hwclk (int, struct rtc_time *);
 static int amiga_set_clock_mmss (unsigned long);
 extern void amiga_mksound( unsigned int count, unsigned int ticks );
 #ifdef CONFIG_AMIGA_FLOPPY
@@ -404,12 +404,12 @@ void __init config_amiga(void)
   mach_get_irq_list    = show_amiga_interrupts;
   mach_gettimeoffset   = amiga_gettimeoffset;
   if (AMIGAHW_PRESENT(A3000_CLK)){
-    mach_gettod  = a3000_gettod;
+    mach_hwclk         = a3000_hwclk;
     rtc_resource.name = "A3000 RTC";
     request_resource(&iomem_resource, &rtc_resource);
   }
   else{ /* if (AMIGAHW_PRESENT(A2000_CLK)) */
-    mach_gettod  = a2000_gettod;
+    mach_hwclk         = a2000_hwclk;
     rtc_resource.name = "A2000 RTC";
     request_resource(&iomem_resource, &rtc_resource);
   }
@@ -424,7 +424,6 @@ void __init config_amiga(void)
                                      * system.                  /Jes
                                      */
 
-  mach_hwclk           = amiga_hwclk;
   mach_set_clock_mmss  = amiga_set_clock_mmss;
 #ifdef CONFIG_AMIGA_FLOPPY
   mach_floppy_setup    = amiga_floppy_setup;
@@ -569,25 +568,47 @@ static unsigned long amiga_gettimeoffset (void)
        return ticks + offset;
 }
 
-static void a3000_gettod (int *yearp, int *monp, int *dayp,
-                         int *hourp, int *minp, int *secp)
+static int a3000_hwclk(int op, struct rtc_time *t)
 {
        volatile struct tod3000 *tod = TOD_3000;
 
        tod->cntrl1 = TOD3000_CNTRL1_HOLD;
 
-       *secp  = tod->second1 * 10 + tod->second2;
-       *minp  = tod->minute1 * 10 + tod->minute2;
-       *hourp = tod->hour1   * 10 + tod->hour2;
-       *dayp  = tod->day1    * 10 + tod->day2;
-       *monp  = tod->month1  * 10 + tod->month2;
-       *yearp = tod->year1   * 10 + tod->year2;
+       if (!op) { /* read */
+               t->tm_sec  = tod->second1 * 10 + tod->second2;
+               t->tm_min  = tod->minute1 * 10 + tod->minute2;
+               t->tm_hour = tod->hour1   * 10 + tod->hour2;
+               t->tm_mday = tod->day1    * 10 + tod->day2;
+               t->tm_wday = tod->weekday;
+               t->tm_mon  = tod->month1  * 10 + tod->month2 - 1;
+               t->tm_year = tod->year1   * 10 + tod->year2;
+               if (t->tm_year <= 69)
+                       t->tm_year += 100;
+       } else {
+               tod->second1 = t->tm_sec / 10;
+               tod->second2 = t->tm_sec % 10;
+               tod->minute1 = t->tm_min / 10;
+               tod->minute2 = t->tm_min % 10;
+               tod->hour1   = t->tm_hour / 10;
+               tod->hour2   = t->tm_hour % 10;
+               tod->day1    = t->tm_mday / 10;
+               tod->day2    = t->tm_mday % 10;
+               if (t->tm_wday != -1)
+                       tod->weekday = t->tm_wday;
+               tod->month1  = (t->tm_mon + 1) / 10;
+               tod->month2  = (t->tm_mon + 1) % 10;
+               if (t->tm_year >= 100)
+                       t->tm_year -= 100;
+               tod->year1   = t->tm_year / 10;
+               tod->year2   = t->tm_year % 10;
+       }
 
        tod->cntrl1 = TOD3000_CNTRL1_FREE;
+
+       return 0;
 }
 
-static void a2000_gettod (int *yearp, int *monp, int *dayp,
-                         int *hourp, int *minp, int *secp)
+static int a2000_hwclk(int op, struct rtc_time *t)
 {
        volatile struct tod2000 *tod = TOD_2000;
 
@@ -596,112 +617,49 @@ static void a2000_gettod (int *yearp, int *monp, int 
*dayp,
        while (tod->cntrl1 & TOD2000_CNTRL1_BUSY)
                ;
 
-       *secp  = tod->second1     * 10 + tod->second2;
-       *minp  = tod->minute1     * 10 + tod->minute2;
-       *hourp = (tod->hour1 & 3) * 10 + tod->hour2;
-       *dayp  = tod->day1        * 10 + tod->day2;
-       *monp  = tod->month1      * 10 + tod->month2;
-       *yearp = tod->year1       * 10 + tod->year2;
-
-       if (!(tod->cntrl3 & TOD2000_CNTRL3_24HMODE)){
-               if (!(tod->hour1 & TOD2000_HOUR1_PM) && *hourp == 12)
-                       *hourp = 0;
-               else if ((tod->hour1 & TOD2000_HOUR1_PM) && *hourp != 12)
-                       *hourp += 12;
+       if (!op) { /* read */
+               t->tm_sec  = tod->second1     * 10 + tod->second2;
+               t->tm_min  = tod->minute1     * 10 + tod->minute2;
+               t->tm_hour = (tod->hour1 & 3) * 10 + tod->hour2;
+               t->tm_mday = tod->day1        * 10 + tod->day2;
+               t->tm_wday = tod->weekday;
+               t->tm_mon  = tod->month1      * 10 + tod->month2 - 1;
+               t->tm_year = tod->year1       * 10 + tod->year2;
+               if (t->tm_year <= 69)
+                       t->tm_year += 100;
+
+               if (!(tod->cntrl3 & TOD2000_CNTRL3_24HMODE)){
+                       if (!(tod->hour1 & TOD2000_HOUR1_PM) && t->tm_hour == 
12)
+                               t->tm_hour = 0;
+                       else if ((tod->hour1 & TOD2000_HOUR1_PM) && t->tm_hour 
!= 12)
+                               t->tm_hour += 12;
+               }
+       } else {
+               tod->second1 = t->tm_sec / 10;
+               tod->second2 = t->tm_sec % 10;
+               tod->minute1 = t->tm_min / 10;
+               tod->minute2 = t->tm_min % 10;
+               if (tod->cntrl3 & TOD2000_CNTRL3_24HMODE)
+                       tod->hour1 = t->tm_hour / 10;
+               else if (t->tm_hour >= 12)
+                       tod->hour1 = TOD2000_HOUR1_PM +
+                               (t->tm_hour - 12) / 10;
+               else
+                       tod->hour1 = t->tm_hour / 10;
+               tod->hour2   = t->tm_hour % 10;
+               tod->day1    = t->tm_mday / 10;
+               tod->day2    = t->tm_mday % 10;
+               if (t->tm_wday != -1)
+                       tod->weekday = t->tm_wday;
+               tod->month1  = (t->tm_mon + 1) / 10;
+               tod->month2  = (t->tm_mon + 1) % 10;
+               if (t->tm_year >= 100)
+                       t->tm_year -= 100;
+               tod->year1   = t->tm_year / 10;
+               tod->year2   = t->tm_year % 10;
        }
 
        tod->cntrl1 &= ~TOD2000_CNTRL1_HOLD;
-}
-
-static int amiga_hwclk(int op, struct hwclk_time *t)
-{
-       if (AMIGAHW_PRESENT(A3000_CLK)) {
-               volatile struct tod3000 *tod = TOD_3000;
-
-               tod->cntrl1 = TOD3000_CNTRL1_HOLD;
-
-               if (!op) { /* read */
-                       t->sec  = tod->second1 * 10 + tod->second2;
-                       t->min  = tod->minute1 * 10 + tod->minute2;
-                       t->hour = tod->hour1   * 10 + tod->hour2;
-                       t->day  = tod->day1    * 10 + tod->day2;
-                       t->wday = tod->weekday;
-                       t->mon  = tod->month1  * 10 + tod->month2 - 1;
-                       t->year = tod->year1   * 10 + tod->year2;
-                       if (t->year <= 69)
-                               t->year += 100;
-               } else {
-                       tod->second1 = t->sec / 10;
-                       tod->second2 = t->sec % 10;
-                       tod->minute1 = t->min / 10;
-                       tod->minute2 = t->min % 10;
-                       tod->hour1   = t->hour / 10;
-                       tod->hour2   = t->hour % 10;
-                       tod->day1    = t->day / 10;
-                       tod->day2    = t->day % 10;
-                       if (t->wday != -1)
-                               tod->weekday = t->wday;
-                       tod->month1  = (t->mon + 1) / 10;
-                       tod->month2  = (t->mon + 1) % 10;
-                       if (t->year >= 100)
-                               t->year -= 100;
-                       tod->year1   = t->year / 10;
-                       tod->year2   = t->year % 10;
-               }
-
-               tod->cntrl1 = TOD3000_CNTRL1_FREE;
-       } else /* if (AMIGAHW_PRESENT(A2000_CLK)) */ {
-               volatile struct tod2000 *tod = TOD_2000;
-
-               tod->cntrl1 = TOD2000_CNTRL1_HOLD;
-           
-               while (tod->cntrl1 & TOD2000_CNTRL1_BUSY)
-                       ;
-
-               if (!op) { /* read */
-                       t->sec  = tod->second1     * 10 + tod->second2;
-                       t->min  = tod->minute1     * 10 + tod->minute2;
-                       t->hour = (tod->hour1 & 3) * 10 + tod->hour2;
-                       t->day  = tod->day1        * 10 + tod->day2;
-                       t->wday = tod->weekday;
-                       t->mon  = tod->month1      * 10 + tod->month2 - 1;
-                       t->year = tod->year1       * 10 + tod->year2;
-                       if (t->year <= 69)
-                               t->year += 100;
-
-                       if (!(tod->cntrl3 & TOD2000_CNTRL3_24HMODE)){
-                               if (!(tod->hour1 & TOD2000_HOUR1_PM) && t->hour 
== 12)
-                                       t->hour = 0;
-                               else if ((tod->hour1 & TOD2000_HOUR1_PM) && 
t->hour != 12)
-                                       t->hour += 12;
-                       }
-               } else {
-                       tod->second1 = t->sec / 10;
-                       tod->second2 = t->sec % 10;
-                       tod->minute1 = t->min / 10;
-                       tod->minute2 = t->min % 10;
-                       if (tod->cntrl3 & TOD2000_CNTRL3_24HMODE)
-                               tod->hour1 = t->hour / 10;
-                       else if (t->hour >= 12)
-                               tod->hour1 = TOD2000_HOUR1_PM +
-                                       (t->hour - 12) / 10;
-                       else
-                               tod->hour1 = t->hour / 10;
-                       tod->hour2   = t->hour % 10;
-                       tod->day1    = t->day / 10;
-                       tod->day2    = t->day % 10;
-                       if (t->wday != -1)
-                               tod->weekday = t->wday;
-                       tod->month1  = (t->mon + 1) / 10;
-                       tod->month2  = (t->mon + 1) % 10;
-                       if (t->year >= 100)
-                               t->year -= 100;
-                       tod->year1   = t->year / 10;
-                       tod->year2   = t->year % 10;
-               }
-
-               tod->cntrl1 &= ~TOD2000_CNTRL1_HOLD;
-       }
 
        return 0;
 }
diff --git a/arch/m68k/apollo/config.c b/arch/m68k/apollo/config.c
index 189bea1..a8ef5af 100644
--- a/arch/m68k/apollo/config.c
+++ b/arch/m68k/apollo/config.c
@@ -4,6 +4,7 @@
 #include <linux/mm.h>
 #include <linux/tty.h>
 #include <linux/console.h>
+#include <linux/rtc.h>
 
 #include <asm/setup.h>
 #include <asm/bootinfo.h>
@@ -33,8 +34,7 @@ extern void dn_enable_irq(unsigned int);
 extern void dn_disable_irq(unsigned int);
 extern int show_dn_interrupts(struct seq_file *, void *);
 extern unsigned long dn_gettimeoffset(void);
-extern void dn_gettod(int *, int *, int *, int *, int *, int *);
-extern int dn_dummy_hwclk(int, struct hwclk_time *);
+extern int dn_dummy_hwclk(int, struct rtc_time *);
 extern int dn_dummy_set_clock_mmss(unsigned long);
 extern void dn_mksound(unsigned int count, unsigned int ticks);
 extern void dn_dummy_reset(void);
@@ -175,7 +175,6 @@ void config_apollo(void) {
        disable_irq     = dn_disable_irq;
        mach_get_irq_list    = show_dn_interrupts;
        mach_gettimeoffset   = dn_gettimeoffset;
-       mach_gettod          = dn_gettod; /* */
        mach_max_dma_address = 0xffffffff;
        mach_hwclk           = dn_dummy_hwclk; /* */
        mach_set_clock_mmss  = dn_dummy_set_clock_mmss; /* */
@@ -240,40 +239,26 @@ unsigned long dn_gettimeoffset(void) {
 
 }
 
-void dn_gettod(int *yearp, int *monp, int *dayp,
-              int *hourp, int *minp, int *secp) {
-
-  *yearp=rtc->year;
-  *monp=rtc->month;
-  *dayp=rtc->day_of_month;
-  *hourp=rtc->hours;
-  *minp=rtc->minute;
-  *secp=rtc->second;
-
-printk("gettod: %d %d %d %d %d %d\n",*yearp,*monp,*dayp,*hourp,*minp,*secp);
-
-}
-
-int dn_dummy_hwclk(int op, struct hwclk_time *t) {
+int dn_dummy_hwclk(int op, struct rtc_time *t) {
 
 
   if(!op) { /* read */
-    t->sec=rtc->second;
-    t->min=rtc->minute;
-    t->hour=rtc->hours;
-    t->day=rtc->day_of_month;
-    t->wday=rtc->day_of_week;
-    t->mon=rtc->month;
-    t->year=rtc->year;
+    t->tm_sec=rtc->second;
+    t->tm_min=rtc->minute;
+    t->tm_hour=rtc->hours;
+    t->tm_mday=rtc->day_of_month;
+    t->tm_wday=rtc->day_of_week;
+    t->tm_mon=rtc->month;
+    t->tm_year=rtc->year;
   } else {
-    rtc->second=t->sec;
-    rtc->minute=t->min;
-    rtc->hours=t->hour;
-    rtc->day_of_month=t->day;
-    if(t->wday!=-1)
-      rtc->day_of_week=t->wday;
-    rtc->month=t->mon;
-    rtc->year=t->year;
+    rtc->second=t->tm_sec;
+    rtc->minute=t->tm_min;
+    rtc->hours=t->tm_hour;
+    rtc->day_of_month=t->tm_mday;
+    if(t->tm_wday!=-1)
+      rtc->day_of_week=t->tm_wday;
+    rtc->month=t->tm_mon;
+    rtc->year=t->tm_year;
   }
 
   return 0;
diff --git a/arch/m68k/atari/config.c b/arch/m68k/atari/config.c
index 6988035..1b69fa9 100644
--- a/arch/m68k/atari/config.c
+++ b/arch/m68k/atari/config.c
@@ -38,6 +38,7 @@
 #include <asm/atariints.h>
 #include <asm/atari_stram.h>
 #include <asm/system.h>
+#include <asm/keyboard.h>
 #include <asm/machdep.h>
 #include <asm/hwtest.h>
 #include <asm/io.h>
@@ -79,10 +80,8 @@ static void atari_heartbeat( int on );
 /* atari specific timer functions (in time.c) */
 extern void atari_sched_init(void (*)(int, void *, struct pt_regs *));
 extern unsigned long atari_gettimeoffset (void);
-extern void atari_mste_gettod (int *, int *, int *, int *, int *, int *);
-extern void atari_tt_gettod (int *, int *, int *, int *, int *, int *);
-extern int atari_mste_hwclk (int, struct hwclk_time *);
-extern int atari_tt_hwclk (int, struct hwclk_time *);
+extern int atari_mste_hwclk (int, struct rtc_time *);
+extern int atari_tt_hwclk (int, struct rtc_time *);
 extern int atari_mste_set_clock_mmss (unsigned long);
 extern int atari_tt_set_clock_mmss (unsigned long);
 
@@ -444,14 +443,12 @@ void __init config_atari(void)
     if (hwreg_present( &tt_rtc.regsel )) {
        ATARIHW_SET(TT_CLK);
         printk( "TT_CLK " );
-        mach_gettod = atari_tt_gettod;
         mach_hwclk = atari_tt_hwclk;
         mach_set_clock_mmss = atari_tt_set_clock_mmss;
     }
     if (!MACH_IS_HADES && hwreg_present( &mste_rtc.sec_ones)) {
        ATARIHW_SET(MSTE_CLK);
         printk( "MSTE_CLK ");
-        mach_gettod = atari_mste_gettod;
         mach_hwclk = atari_mste_hwclk;
         mach_set_clock_mmss = atari_mste_set_clock_mmss;
     }
diff --git a/arch/m68k/atari/time.c b/arch/m68k/atari/time.c
index 0d92a3b..b57a805 100644
--- a/arch/m68k/atari/time.c
+++ b/arch/m68k/atari/time.c
@@ -14,6 +14,7 @@
 #include <linux/mc146818rtc.h>
 #include <linux/interrupt.h>
 #include <linux/init.h>
+#include <linux/rtc.h>
 
 #include <asm/rtc.h>
 
@@ -83,88 +84,21 @@ static void mste_write(struct MSTE_RTC *val)
 
 #define        RTC_READ(reg)                           \
     ({ unsigned char   __val;                  \
-               (void) writeb(reg,&tt_rtc.regsel);      \
+               (void) atari_writeb(reg,&tt_rtc.regsel);        \
                __val = tt_rtc.data;            \
                __val;                          \
        })
 
 #define        RTC_WRITE(reg,val)                      \
     do {                                       \
-               writeb(reg,&tt_rtc.regsel);     \
+               atari_writeb(reg,&tt_rtc.regsel);       \
                tt_rtc.data = (val);            \
        } while(0)
 
 
-void atari_mste_gettod (int *yearp, int *monp, int *dayp,
-                       int *hourp, int *minp, int *secp)
-{
-    int hr24=0, hour;
-    struct MSTE_RTC val;
-
-    mste_rtc.mode=(mste_rtc.mode | 1);
-    hr24=mste_rtc.mon_tens & 1;
-    mste_rtc.mode=(mste_rtc.mode & ~1);
-
-    mste_read(&val);
-    *secp = val.sec_ones + val.sec_tens * 10;
-    *minp = val.min_ones + val.min_tens * 10;
-    hour = val.hr_ones + val.hr_tens * 10;
-    if (!hr24) {
-        if (hour == 12 || hour == 12 + 20)
-           hour -= 12;
-       if (hour >= 20)
-           hour += 12 - 20;
-    }
-    *hourp = hour;
-    *dayp = val.day_ones + val.day_tens * 10;
-    *monp = val.mon_ones + val.mon_tens * 10;
-    *yearp = val.year_ones + val.year_tens * 10 + 80;  
-}
-
-  
-void atari_tt_gettod (int *yearp, int *monp, int *dayp,
-                     int *hourp, int *minp, int *secp)
-{
-    unsigned char      ctrl;
-    int hour, pm;
-
-    while (!(RTC_READ(RTC_FREQ_SELECT) & RTC_UIP)) ;
-    while (RTC_READ(RTC_FREQ_SELECT) & RTC_UIP) ;
-
-    *secp  = RTC_READ(RTC_SECONDS);
-    *minp  = RTC_READ(RTC_MINUTES);
-    hour = RTC_READ(RTC_HOURS);
-    *dayp  = RTC_READ(RTC_DAY_OF_MONTH);
-    *monp  = RTC_READ(RTC_MONTH);
-    *yearp = RTC_READ(RTC_YEAR);
-    pm = hour & 0x80;
-    hour &= ~0x80;
-
-    ctrl = RTC_READ(RTC_CONTROL); 
-
-    if (!(ctrl & RTC_DM_BINARY)) {
-        BCD_TO_BIN(*secp);
-        BCD_TO_BIN(*minp);
-        BCD_TO_BIN(hour);
-        BCD_TO_BIN(*dayp);
-        BCD_TO_BIN(*monp);
-        BCD_TO_BIN(*yearp);
-    }
-    if (!(ctrl & RTC_24H)) {
-       if (!pm && hour == 12)
-           hour = 0;
-       else if (pm && hour != 12)
-            hour += 12;
-    }
-    *hourp = hour;
-
-    /* Adjust values (let the setup valid) */
-    *yearp += atari_rtc_year_offset;
-}
-
 #define HWCLK_POLL_INTERVAL    5
 
-int atari_mste_hwclk( int op, struct hwclk_time *t )
+int atari_mste_hwclk( int op, struct rtc_time *t )
 {
     int hour, year;
     int hr24=0;
@@ -177,11 +111,11 @@ int atari_mste_hwclk( int op, struct hwclk_time *t )
     if (op) {
         /* write: prepare values */
         
-        val.sec_ones = t->sec % 10;
-        val.sec_tens = t->sec / 10;
-        val.min_ones = t->min % 10;
-        val.min_tens = t->min / 10;
-        hour = t->hour;
+        val.sec_ones = t->tm_sec % 10;
+        val.sec_tens = t->tm_sec / 10;
+        val.min_ones = t->tm_min % 10;
+        val.min_tens = t->tm_min / 10;
+        hour = t->tm_hour;
         if (!hr24) {
            if (hour > 11)
                hour += 20 - 12;
@@ -190,14 +124,14 @@ int atari_mste_hwclk( int op, struct hwclk_time *t )
         }
         val.hr_ones = hour % 10;
         val.hr_tens = hour / 10;
-        val.day_ones = t->day % 10;
-        val.day_tens = t->day / 10;
-        val.mon_ones = (t->mon+1) % 10;
-        val.mon_tens = (t->mon+1) / 10;
-        year = t->year - 80;
+        val.day_ones = t->tm_mday % 10;
+        val.day_tens = t->tm_mday / 10;
+        val.mon_ones = (t->tm_mon+1) % 10;
+        val.mon_tens = (t->tm_mon+1) / 10;
+        year = t->tm_year - 80;
         val.year_ones = year % 10;
         val.year_tens = year / 10;
-        val.weekday = t->wday;
+        val.weekday = t->tm_wday;
         mste_write(&val);
         mste_rtc.mode=(mste_rtc.mode | 1);
         val.year_ones = (year % 4);    /* leap year register */
@@ -205,8 +139,8 @@ int atari_mste_hwclk( int op, struct hwclk_time *t )
     }
     else {
         mste_read(&val);
-        t->sec = val.sec_ones + val.sec_tens * 10;
-        t->min = val.min_ones + val.min_tens * 10;
+        t->tm_sec = val.sec_ones + val.sec_tens * 10;
+        t->tm_min = val.min_ones + val.min_tens * 10;
         hour = val.hr_ones + val.hr_tens * 10;
        if (!hr24) {
            if (hour == 12 || hour == 12 + 20)
@@ -214,16 +148,16 @@ int atari_mste_hwclk( int op, struct hwclk_time *t )
            if (hour >= 20)
                 hour += 12 - 20;
         }
-       t->hour = hour;
-       t->day = val.day_ones + val.day_tens * 10;
-        t->mon = val.mon_ones + val.mon_tens * 10 - 1;
-        t->year = val.year_ones + val.year_tens * 10 + 80;
-        t->wday = val.weekday;
+       t->tm_hour = hour;
+       t->tm_mday = val.day_ones + val.day_tens * 10;
+        t->tm_mon  = val.mon_ones + val.mon_tens * 10 - 1;
+        t->tm_year = val.year_ones + val.year_tens * 10 + 80;
+        t->tm_wday = val.weekday;
     }
     return 0;
 }
 
-int atari_tt_hwclk( int op, struct hwclk_time *t )
+int atari_tt_hwclk( int op, struct rtc_time *t )
 {
     int sec=0, min=0, hour=0, day=0, mon=0, year=0, wday=0; 
     unsigned long      flags;
@@ -236,13 +170,13 @@ int atari_tt_hwclk( int op, struct hwclk_time *t )
     if (op) {
         /* write: prepare values */
         
-        sec  = t->sec;
-        min  = t->min;
-        hour = t->hour;
-        day  = t->day;
-        mon  = t->mon + 1;
-        year = t->year - atari_rtc_year_offset;
-        wday = t->wday + (t->wday >= 0);
+        sec  = t->tm_sec;
+        min  = t->tm_min;
+        hour = t->tm_hour;
+        day  = t->tm_mday;
+        mon  = t->tm_mon + 1;
+        year = t->tm_year - atari_rtc_year_offset;
+        wday = t->tm_wday + (t->tm_wday >= 0);
         
         if (!(ctrl & RTC_24H)) {
            if (hour > 11) {
@@ -331,13 +265,13 @@ int atari_tt_hwclk( int op, struct hwclk_time *t )
                hour += 12;
         }
 
-        t->sec  = sec;
-        t->min  = min;
-        t->hour = hour;
-        t->day  = day;
-        t->mon  = mon - 1;
-        t->year = year + atari_rtc_year_offset;
-        t->wday = wday - 1;
+        t->tm_sec  = sec;
+        t->tm_min  = min;
+        t->tm_hour = hour;
+        t->tm_mday = day;
+        t->tm_mon  = mon - 1;
+        t->tm_year = year + atari_rtc_year_offset;
+        t->tm_wday = wday - 1;
     }
 
     return( 0 );
diff --git a/arch/m68k/bvme6000/config.c b/arch/m68k/bvme6000/config.c
index 002c9a6..2a15d06 100644
--- a/arch/m68k/bvme6000/config.c
+++ b/arch/m68k/bvme6000/config.c
@@ -22,6 +22,7 @@
 #include <linux/linkage.h>
 #include <linux/init.h>
 #include <linux/major.h>
+#include <linux/rtc.h>
 
 #include <asm/bootinfo.h>
 #include <asm/system.h>
@@ -46,9 +47,7 @@ extern void bvme6000_sched_init(void (*handler)(int, void *, 
struct pt_regs *));
 extern int  bvme6000_keyb_init(void);
 extern int  bvme6000_kbdrate (struct kbd_repeat *);
 extern unsigned long bvme6000_gettimeoffset (void);
-extern void bvme6000_gettod (int *year, int *mon, int *day, int *hour,
-                           int *min, int *sec);
-extern int bvme6000_hwclk (int, struct hwclk_time *);
+extern int bvme6000_hwclk (int, struct rtc_time *);
 extern int bvme6000_set_clock_mmss (unsigned long);
 extern void bvme6000_check_partition (struct gendisk *hd, unsigned int dev);
 extern void bvme6000_mksound( unsigned int count, unsigned int ticks );
@@ -138,7 +137,6 @@ void __init config_bvme6000(void)
     mach_kbdrate         = bvme6000_kbdrate;
     mach_init_IRQ        = bvme6000_init_IRQ;
     mach_gettimeoffset   = bvme6000_gettimeoffset;
-    mach_gettod         = bvme6000_gettod;
     mach_hwclk           = bvme6000_hwclk;
     mach_set_clock_mmss         = bvme6000_set_clock_mmss;
 /*  mach_mksound         = bvme6000_mksound; */
@@ -181,8 +179,8 @@ void bvme6000_abort_int (int irq, void *dev_id, struct 
pt_regs *fp)
         unsigned long *old = (unsigned long *)0xf8000000;
 
         /* Wait for button release */
-       while (*config_reg_ptr & BVME_ABORT_STATUS)
-               ;
+        while (*(volatile unsigned char *)BVME_LOCAL_IRQ_STAT & 
BVME_ABORT_STATUS)
+                ;
 
         *(new+4) = *(old+4);            /* Illegal instruction */
         *(new+9) = *(old+9);            /* Trace */
@@ -284,26 +282,6 @@ unsigned long bvme6000_gettimeoffset (void)
     return v;
 }
 
-extern void bvme6000_gettod (int *year, int *mon, int *day, int *hour,
-                           int *min, int *sec)
-{
-       volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE;
-       unsigned char msr = rtc->msr & 0xc0;
-
-       rtc->msr = 0;           /* Ensure clock accessible */
-
-       do {    /* Loop until we get a reading with a stable seconds field */
-               *sec = bcd2bin (rtc->bcd_sec);
-               *min = bcd2bin (rtc->bcd_min);
-               *hour = bcd2bin (rtc->bcd_hr);
-               *day = bcd2bin (rtc->bcd_dom);
-               *mon = bcd2bin (rtc->bcd_mth);
-               *year = bcd2bin (rtc->bcd_year);
-       } while (bcd2bin (rtc->bcd_sec) != *sec);
-
-       rtc->msr = msr;
-}
-
 static unsigned char bcd2bin (unsigned char b)
 {
        return ((b>>4)*10 + (b&15));
@@ -330,7 +308,7 @@ static unsigned char bin2bcd (unsigned char b)
  * };
  */
 
-int bvme6000_hwclk(int op, struct hwclk_time *t)
+int bvme6000_hwclk(int op, struct rtc_time *t)
 {
        volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE;
        unsigned char msr = rtc->msr & 0xc0;
@@ -339,31 +317,31 @@ int bvme6000_hwclk(int op, struct hwclk_time *t)
                                 * are accessible */
        if (op)
        {       /* Write.... */
-               rtc->t0cr_rtmr = t->year%4;
+               rtc->t0cr_rtmr = t->tm_year%4;
                rtc->bcd_tenms = 0;
-               rtc->bcd_sec = bin2bcd(t->sec);
-               rtc->bcd_min = bin2bcd(t->min);
-               rtc->bcd_hr  = bin2bcd(t->hour);
-               rtc->bcd_dom = bin2bcd(t->day);
-               rtc->bcd_mth = bin2bcd(t->mon + 1);
-               rtc->bcd_year = bin2bcd(t->year%100);
-               if (t->wday >= 0)
-                       rtc->bcd_dow = bin2bcd(t->wday+1);
-               rtc->t0cr_rtmr = t->year%4 | 0x08;
+               rtc->bcd_sec = bin2bcd(t->tm_sec);
+               rtc->bcd_min = bin2bcd(t->tm_min);
+               rtc->bcd_hr  = bin2bcd(t->tm_hour);
+               rtc->bcd_dom = bin2bcd(t->tm_mday);
+               rtc->bcd_mth = bin2bcd(t->tm_mon + 1);
+               rtc->bcd_year = bin2bcd(t->tm_year%100);
+               if (t->tm_wday >= 0)
+                       rtc->bcd_dow = bin2bcd(t->tm_wday+1);
+               rtc->t0cr_rtmr = t->tm_year%4 | 0x08;
        }
        else
        {       /* Read....  */
                do {
-                       t->sec =  bcd2bin(rtc->bcd_sec);
-                       t->min =  bcd2bin(rtc->bcd_min);
-                       t->hour = bcd2bin(rtc->bcd_hr);
-                       t->day =  bcd2bin(rtc->bcd_dom);
-                       t->mon =  bcd2bin(rtc->bcd_mth)-1;
-                       t->year = bcd2bin(rtc->bcd_year);
-                       if (t->year < 70)
-                               t->year += 100;
-                       t->wday = bcd2bin(rtc->bcd_dow)-1;
-               } while (t->sec != bcd2bin(rtc->bcd_sec));
+                       t->tm_sec  = bcd2bin(rtc->bcd_sec);
+                       t->tm_min  = bcd2bin(rtc->bcd_min);
+                       t->tm_hour = bcd2bin(rtc->bcd_hr);
+                       t->tm_mday = bcd2bin(rtc->bcd_dom);
+                       t->tm_mon  = bcd2bin(rtc->bcd_mth)-1;
+                       t->tm_year = bcd2bin(rtc->bcd_year);
+                       if (t->tm_year < 70)
+                               t->tm_year += 100;
+                       t->tm_wday = bcd2bin(rtc->bcd_dow)-1;
+               } while (t->tm_sec != bcd2bin(rtc->bcd_sec));
        }
 
        rtc->msr = msr;
@@ -419,55 +397,3 @@ int bvme6000_keyb_init (void)
 {
        return 0;
 }
-
-/*-------------------  Serial console stuff ------------------------*/
-
-static void bvme_scc_write(struct console *co, const char *str, unsigned cnt);
-
-
-void bvme6000_init_console_port (struct console *co, int cflag)
-{
-        co->write = bvme_scc_write;
-}
-
-
-static void scc_delay (void)
-{
-        int n;
-       volatile int trash;
-
-        for (n = 0; n < 20; n++)
-               trash = n;
-}
-
-static void scc_write (char ch)
-{
-        volatile char *p = (volatile char *)BVME_SCC_A_ADDR;
-
-        do {
-                scc_delay();
-        }
-        while (!(*p & 4));
-        scc_delay();
-        *p = 8;
-        scc_delay();
-        *p = ch;
-}
-
-
-static void bvme_scc_write (struct console *co, const char *str, unsigned 
count)
-{
-        unsigned long   flags;
-
-        save_flags(flags);
-        cli();
-
-        while (count--)
-        {
-                if (*str == '\n')
-                        scc_write ('\r');
-                scc_write (*str++);
-        }
-        restore_flags(flags);
-}
-
diff --git a/arch/m68k/bvme6000/rtc.c b/arch/m68k/bvme6000/rtc.c
index 8038337..47d77f2 100644
--- a/arch/m68k/bvme6000/rtc.c
+++ b/arch/m68k/bvme6000/rtc.c
@@ -94,7 +94,7 @@ static int rtc_ioctl(struct inode *inode, struct file *file, 
unsigned int cmd,
 
                leap_yr = ((!(yrs % 4) && (yrs % 100)) || !(yrs % 400));
 
-               if ((mon > 12) || (day == 0))
+               if ((mon > 12) || (mon < 1) || (day == 0))
                        return -EINVAL;
 
                if (day > (days_in_mo[mon] + ((mon == 2) && leap_yr)))
diff --git a/arch/m68k/hp300/config.c b/arch/m68k/hp300/config.c
index 6694c25..416d4de 100644
--- a/arch/m68k/hp300/config.c
+++ b/arch/m68k/hp300/config.c
@@ -73,9 +73,6 @@ void __init config_hp300(void)
   mach_get_irq_list    = show_hp300_interrupts;
   mach_gettimeoffset   = hp300_gettimeoffset;
   mach_default_handler = &hp300_default_handler;
-#if 0
-  mach_gettod          = hp300_gettod;
-#endif
   mach_reset           = hp300_reset;
 #ifdef CONFIG_HEARTBEAT
   mach_heartbeat       = hp300_pulse;
diff --git a/arch/m68k/kernel/setup.c b/arch/m68k/kernel/setup.c
index 57a954d..d794934 100644
--- a/arch/m68k/kernel/setup.c
+++ b/arch/m68k/kernel/setup.c
@@ -84,8 +84,7 @@ int (*mach_get_irq_list) (struct seq_file *, void *) = NULL;
 void (*mach_process_int) (int, struct pt_regs *) = NULL;
 /* machine dependent timer functions */
 unsigned long (*mach_gettimeoffset) (void);
-void (*mach_gettod) (int*, int*, int*, int*, int*, int*);
-int (*mach_hwclk) (int, struct hwclk_time*) = NULL;
+int (*mach_hwclk) (int, struct rtc_time*) = NULL;
 int (*mach_set_clock_mmss) (unsigned long) = NULL;
 void (*mach_reset)( void );
 void (*mach_halt)( void ) = NULL;
@@ -520,15 +519,6 @@ void __init kbd_reset_setup(char *str, int *ints)
 {
 }
 
-void arch_gettod(int *year, int *mon, int *day, int *hour,
-                int *min, int *sec)
-{
-       if (mach_gettod)
-               mach_gettod(year, mon, day, hour, min, sec);
-       else
-               *year = *mon = *day = *hour = *min = *sec = 0;
-}
-
 void check_bugs(void)
 {
 #ifndef CONFIG_M68KFPU_EMU
diff --git a/arch/m68k/kernel/time.c b/arch/m68k/kernel/time.c
index af22bee..a845040 100644
--- a/arch/m68k/kernel/time.c
+++ b/arch/m68k/kernel/time.c
@@ -17,6 +17,7 @@
 #include <linux/param.h>
 #include <linux/string.h>
 #include <linux/mm.h>
+#include <linux/rtc.h>
 
 #include <asm/machdep.h>
 #include <asm/io.h>
@@ -104,17 +105,17 @@ static void timer_interrupt(int irq, void *dummy, struct 
pt_regs * regs)
 
 void time_init(void)
 {
-       unsigned int year, mon, day, hour, min, sec;
+       struct rtc_time time;
 
-       extern void arch_gettod(int *year, int *mon, int *day, int *hour,
-                               int *min, int *sec);
+       if (mach_hwclk) {
+               mach_hwclk(0, &time);
 
-       arch_gettod (&year, &mon, &day, &hour, &min, &sec);
-
-       if ((year += 1900) < 1970)
-               year += 100;
-       xtime.tv_sec = mktime(year, mon, day, hour, min, sec);
-       xtime.tv_usec = 0;
+               if ((time.tm_year += 1900) < 1970)
+                       time.tm_year += 100;
+               xtime.tv_sec = mktime(time.tm_year, time.tm_mon, time.tm_mday,
+                                     time.tm_hour, time.tm_min, time.tm_sec);
+               xtime.tv_usec = 0;
+       }
 
        mach_sched_init(timer_interrupt);
 }
diff --git a/arch/m68k/mac/config.c b/arch/m68k/mac/config.c
index 02b391d..0d5eca4 100644
--- a/arch/m68k/mac/config.c
+++ b/arch/m68k/mac/config.c
@@ -62,9 +62,8 @@ void *mac_env;                /* Loaded by the boot asm */
 unsigned long mac_orig_videoaddr;
 
 /* Mac specific timer functions */
-extern void mac_gettod (int *, int *, int *, int *, int *, int *);
 extern unsigned long mac_gettimeoffset (void);
-extern int mac_hwclk (int, struct hwclk_time *);
+extern int mac_hwclk (int, struct rtc_time *);
 extern int mac_set_clock_mmss (unsigned long);
 extern int show_mac_interrupts(struct seq_file *, void *);
 extern void iop_preinit(void);
@@ -243,8 +242,10 @@ void __init config_mac(void)
        mach_default_handler = &mac_handlers;
        mach_get_irq_list    = show_mac_interrupts;
        mach_gettimeoffset   = mac_gettimeoffset;
-       mach_gettod          = mac_gettod;
+#warning move to adb/via init
+#if 0
        mach_hwclk           = mac_hwclk;
+#endif
        mach_set_clock_mmss      = mac_set_clock_mmss;
 #if 0
        mach_mksound         = mac_mksound;
diff --git a/arch/m68k/mac/misc.c b/arch/m68k/mac/misc.c
index d507bc0..a0c487c 100644
--- a/arch/m68k/mac/misc.c
+++ b/arch/m68k/mac/misc.c
@@ -11,7 +11,7 @@
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/time.h>
-
+#include <linux/rtc.h>
 #include <linux/mm.h>
 
 #include <linux/adb.h>
@@ -571,31 +571,11 @@ static void unmktime(unsigned long time, long offset,
        return;
 }
 
-/*
- * Return the boot time for use in initializing the kernel clock.
- *
- * I'd like to read the hardware clock here but many machines read
- * the PRAM through ADB, and interrupts aren't initialized when this
- * is called so ADB obviously won't work.
- */
-
-void mac_gettod(int *yearp, int *monp, int *dayp,
-              int *hourp, int *minp, int *secp)
-{
-       /* Yes the GMT bias is backwards.  It looks like Penguin is
-           screwing up the boottime it gives us... This works for me
-           in Canada/Eastern but it might be wrong everywhere else. */
-       unmktime(mac_bi_data.boottime, -mac_bi_data.gmtbias * 60,
-               yearp, monp, dayp, hourp, minp, secp);
-       /* For some reason this is off by one */
-       *monp = *monp + 1;
-}
-
 /* 
  * Read/write the hardware clock.
  */
 
-int mac_hwclk(int op, struct hwclk_time *t)
+int mac_hwclk(int op, struct rtc_time *t)
 {
        unsigned long now;
 
@@ -613,19 +593,19 @@ int mac_hwclk(int op, struct hwclk_time *t)
                        now = 0;
                }
 
-               t->wday = 0;
+               t->tm_wday = 0;
                unmktime(now, 0,
-                        &t->year, &t->mon, &t->day,
-                        &t->hour, &t->min, &t->sec);
+                        &t->tm_year, &t->tm_mon, &t->tm_mday,
+                        &t->tm_hour, &t->tm_min, &t->tm_sec);
                printk("mac_hwclk: read %04d-%02d-%-2d %02d:%02d:%02d\n",
-                       t->year + 1900, t->mon + 1, t->day, t->hour, t->min, 
t->sec);
+                       t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, 
t->tm_hour, t->tm_min, t->tm_sec);
        } else { /* write */
                printk("mac_hwclk: tried to write %04d-%02d-%-2d 
%02d:%02d:%02d\n",
-                       t->year + 1900, t->mon + 1, t->day, t->hour, t->min, 
t->sec);
+                       t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, 
t->tm_hour, t->tm_min, t->tm_sec);
 
 #if 0  /* it trashes my rtc */
-               now = mktime(t->year + 1900, t->mon + 1, t->day,
-                            t->hour, t->min, t->sec);
+               now = mktime(t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
+                            t->tm_hour, t->tm_min, t->tm_sec);
 
                if (macintosh_config->adb_type == MAC_ADB_II) {
                        via_write_time(now);
@@ -648,11 +628,11 @@ int mac_hwclk(int op, struct hwclk_time *t)
 
 int mac_set_clock_mmss (unsigned long nowtime)
 {
-       struct hwclk_time now;
+       struct rtc_time now;
 
        mac_hwclk(0, &now);
-       now.sec = nowtime % 60;
-       now.min = (nowtime / 60) % 60;
+       now.tm_sec = nowtime % 60;
+       now.tm_min = (nowtime / 60) % 60;
        mac_hwclk(1, &now);
 
        return 0;
diff --git a/arch/m68k/mvme147/config.c b/arch/m68k/mvme147/config.c
index e0fc27d..211c1e2 100644
--- a/arch/m68k/mvme147/config.c
+++ b/arch/m68k/mvme147/config.c
@@ -46,9 +46,7 @@ extern void mvme147_sched_init(void (*handler)(int, void *, 
struct pt_regs *));
 extern int mvme147_keyb_init(void);
 extern int mvme147_kbdrate (struct kbd_repeat *);
 extern unsigned long mvme147_gettimeoffset (void);
-extern void mvme147_gettod (int *year, int *mon, int *day, int *hour,
-                           int *min, int *sec);
-extern int mvme147_hwclk (int, struct hwclk_time *);
+extern int mvme147_hwclk (int, struct rtc_time *);
 extern int mvme147_set_clock_mmss (unsigned long);
 extern void mvme147_check_partition (struct gendisk *hd, unsigned int dev);
 extern void mvme147_reset (void);
@@ -107,7 +105,6 @@ void __init config_mvme147(void)
        mach_kbdrate            = mvme147_kbdrate;
        mach_init_IRQ           = mvme147_init_IRQ;
        mach_gettimeoffset      = mvme147_gettimeoffset;
-       mach_gettod             = mvme147_gettod;
        mach_hwclk              = mvme147_hwclk;
        mach_set_clock_mmss     = mvme147_set_clock_mmss;
        mach_reset              = mvme147_reset;
@@ -166,26 +163,24 @@ unsigned long mvme147_gettimeoffset (void)
        return (unsigned long)n * 25 / 4;
 }
 
-extern void mvme147_gettod (int *year, int *mon, int *day, int *hour,
-                           int *min, int *sec)
-{
-       m147_rtc->ctrl = RTC_READ;
-       *year = bcd2int (m147_rtc->bcd_year);
-       *mon = bcd2int (m147_rtc->bcd_mth);
-       *day = bcd2int (m147_rtc->bcd_dom);
-       *hour = bcd2int (m147_rtc->bcd_hr);
-       *min = bcd2int (m147_rtc->bcd_min);
-       *sec = bcd2int (m147_rtc->bcd_sec);
-       m147_rtc->ctrl = 0;
-}
-
 static int bcd2int (unsigned char b)
 {
        return ((b>>4)*10 + (b&15));
 }
 
-int mvme147_hwclk(int op, struct hwclk_time *t)
+int mvme147_hwclk(int op, struct rtc_time *t)
 {
+#warning check me!
+       if (!op) {
+               m147_rtc->ctrl = RTC_READ;
+               t->tm_year = bcd2int (m147_rtc->bcd_year);
+               t->tm_mon  = bcd2int (m147_rtc->bcd_mth);
+               t->tm_mday = bcd2int (m147_rtc->bcd_dom);
+               t->tm_hour = bcd2int (m147_rtc->bcd_hr);
+               t->tm_min  = bcd2int (m147_rtc->bcd_min);
+               t->tm_sec  = bcd2int (m147_rtc->bcd_sec);
+               m147_rtc->ctrl = 0;
+       }
        return 0;
 }
 
diff --git a/arch/m68k/mvme16x/config.c b/arch/m68k/mvme16x/config.c
index 70fa43a..528c24a 100644
--- a/arch/m68k/mvme16x/config.c
+++ b/arch/m68k/mvme16x/config.c
@@ -50,9 +50,7 @@ extern void mvme16x_sched_init(void (*handler)(int, void *, 
struct pt_regs *));
 extern int  mvme16x_keyb_init(void);
 extern int  mvme16x_kbdrate (struct kbd_repeat *);
 extern unsigned long mvme16x_gettimeoffset (void);
-extern void mvme16x_gettod (int *year, int *mon, int *day, int *hour,
-                           int *min, int *sec);
-extern int mvme16x_hwclk (int, struct hwclk_time *);
+extern int mvme16x_hwclk (int, struct rtc_time *);
 extern int mvme16x_set_clock_mmss (unsigned long);
 extern void mvme16x_check_partition (struct gendisk *hd, unsigned int dev);
 extern void mvme16x_mksound( unsigned int count, unsigned int ticks );
@@ -149,7 +147,6 @@ void __init config_mvme16x(void)
     mach_kbdrate         = mvme16x_kbdrate;
     mach_init_IRQ        = mvme16x_init_IRQ;
     mach_gettimeoffset   = mvme16x_gettimeoffset;
-    mach_gettod         = mvme16x_gettod;
     mach_hwclk           = mvme16x_hwclk;
     mach_set_clock_mmss         = mvme16x_set_clock_mmss;
 /*  kd_mksound           = mvme16x_mksound; */
@@ -273,26 +270,24 @@ unsigned long mvme16x_gettimeoffset (void)
     return (*(volatile unsigned long *)0xfff42008);
 }
 
-extern void mvme16x_gettod (int *year, int *mon, int *day, int *hour,
-                           int *min, int *sec)
-{
-       rtc->ctrl = RTC_READ;
-       *year = bcd2int (rtc->bcd_year);
-       *mon = bcd2int (rtc->bcd_mth);
-       *day = bcd2int (rtc->bcd_dom);
-       *hour = bcd2int (rtc->bcd_hr);
-       *min = bcd2int (rtc->bcd_min);
-       *sec = bcd2int (rtc->bcd_sec);
-       rtc->ctrl = 0;
-}
-
 int bcd2int (unsigned char b)
 {
        return ((b>>4)*10 + (b&15));
 }
 
-int mvme16x_hwclk(int op, struct hwclk_time *t)
+int mvme16x_hwclk(int op, struct rtc_time *t)
 {
+#warning check me!
+       if (!op) {
+               rtc->ctrl = RTC_READ;
+               t->tm_year = bcd2int (rtc->bcd_year);
+               t->tm_mon  = bcd2int (rtc->bcd_mth);
+               t->tm_mday = bcd2int (rtc->bcd_dom);
+               t->tm_hour = bcd2int (rtc->bcd_hr);
+               t->tm_min  = bcd2int (rtc->bcd_min);
+               t->tm_sec  = bcd2int (rtc->bcd_sec);
+               rtc->ctrl = 0;
+       }
        return 0;
 }
 
diff --git a/arch/m68k/q40/config.c b/arch/m68k/q40/config.c
index d361b8f..c35f214 100644
--- a/arch/m68k/q40/config.c
+++ b/arch/m68k/q40/config.c
@@ -22,6 +22,7 @@
 #include <linux/init.h>
 #include <linux/major.h>
 #include <linux/serial_reg.h>
+#include <linux/rtc.h>
 
 #include <asm/io.h>
 #include <asm/rtc.h>
@@ -53,9 +54,7 @@ extern int  q40_request_irq(unsigned int irq, void 
(*handler)(int, void *, struc
 extern void q40_sched_init(void (*handler)(int, void *, struct pt_regs *));
 
 extern unsigned long q40_gettimeoffset (void);
-extern void q40_gettod (int *year, int *mon, int *day, int *hour,
-                           int *min, int *sec);
-extern int q40_hwclk (int, struct hwclk_time *);
+extern int q40_hwclk (int, struct rtc_time *);
 extern int q40_set_clock_mmss (unsigned long);
 extern void q40_reset (void);
 void q40_halt(void);
@@ -226,7 +225,6 @@ void __init config_q40(void)
     mach_kbd_translate   = q40kbd_translate;
     mach_init_IRQ        = q40_init_IRQ;   
     mach_gettimeoffset   = q40_gettimeoffset; 
-    mach_gettod         = q40_gettod;
     mach_hwclk           = q40_hwclk; 
     mach_set_clock_mmss         = q40_set_clock_mmss;
 
@@ -292,21 +290,6 @@ unsigned long q40_gettimeoffset (void)
     return 5000*(ql_ticks!=0);
 }
 
-extern void q40_gettod (int *year, int *mon, int *day, int *hour,
-                           int *min, int *sec)
-{
-       RTC_CTRL |= RTC_READ;
-       *year = bcd2bin (RTC_YEAR);
-       *mon = bcd2bin (RTC_MNTH);
-       *day = bcd2bin (RTC_DATE);
-       *hour = bcd2bin (RTC_HOUR);
-       *min = bcd2bin (RTC_MINS);
-       *sec = bcd2bin (RTC_SECS);
-       RTC_CTRL &= ~(RTC_READ);
-
-}
-
-
 
 /*
  * Looks like op is non-zero for setting the clock, and zero for
@@ -323,39 +306,39 @@ extern void q40_gettod (int *year, int *mon, int *day, 
int *hour,
  * };
  */
 
-int q40_hwclk(int op, struct hwclk_time *t)
+int q40_hwclk(int op, struct rtc_time *t)
 {
         if (op)
        {       /* Write.... */
-               RTC_CTRL |= RTC_WRITE;
-
-               RTC_SECS = bin2bcd(t->sec);
-               RTC_MINS = bin2bcd(t->min);
-               RTC_HOUR = bin2bcd(t->hour);
-               RTC_DATE = bin2bcd(t->day);
-               RTC_MNTH = bin2bcd(t->mon + 1);
-               RTC_YEAR = bin2bcd(t->year%100);
-               if (t->wday >= 0)
-                       RTC_DOW = bin2bcd(t->wday+1);
-
-               RTC_CTRL &= ~(RTC_WRITE);
+               Q40_RTC_CTRL |= Q40_RTC_WRITE;
+
+               Q40_RTC_SECS = bin2bcd(t->tm_sec);
+               Q40_RTC_MINS = bin2bcd(t->tm_min);
+               Q40_RTC_HOUR = bin2bcd(t->tm_hour);
+               Q40_RTC_DATE = bin2bcd(t->tm_mday);
+               Q40_RTC_MNTH = bin2bcd(t->tm_mon + 1);
+               Q40_RTC_YEAR = bin2bcd(t->tm_year%100);
+               if (t->tm_wday >= 0)
+                       Q40_RTC_DOW = bin2bcd(t->tm_wday+1);
+
+               Q40_RTC_CTRL &= ~(Q40_RTC_WRITE);
        }
        else
        {       /* Read....  */
-         RTC_CTRL |= RTC_READ;
+         Q40_RTC_CTRL |= Q40_RTC_READ;
 
-         t->year = bcd2bin (RTC_YEAR);
-         t->mon  = bcd2bin (RTC_MNTH)-1;
-         t->day  = bcd2bin (RTC_DATE);
-         t->hour = bcd2bin (RTC_HOUR);
-         t->min  = bcd2bin (RTC_MINS);
-         t->sec  = bcd2bin (RTC_SECS);
+         t->tm_year = bcd2bin (Q40_RTC_YEAR);
+         t->tm_mon  = bcd2bin (Q40_RTC_MNTH)-1;
+         t->tm_mday = bcd2bin (Q40_RTC_DATE);
+         t->tm_hour = bcd2bin (Q40_RTC_HOUR);
+         t->tm_min  = bcd2bin (Q40_RTC_MINS);
+         t->tm_sec  = bcd2bin (Q40_RTC_SECS);
 
-         RTC_CTRL &= ~(RTC_READ);
+         Q40_RTC_CTRL &= ~(Q40_RTC_READ);
          
-         if (t->year < 70)
-           t->year += 100;
-         t->wday = bcd2bin(RTC_DOW)-1;
+         if (t->tm_year < 70)
+           t->tm_year += 100;
+         t->tm_wday = bcd2bin(Q40_RTC_DOW)-1;
 
        }
 
@@ -375,16 +358,16 @@ int q40_set_clock_mmss (unsigned long nowtime)
        int rtc_minutes;
 
 
-       rtc_minutes = bcd2bin (RTC_MINS);
+       rtc_minutes = bcd2bin (Q40_RTC_MINS);
 
        if ((rtc_minutes < real_minutes
                ? real_minutes - rtc_minutes
                        : rtc_minutes - real_minutes) < 30)
        {          
-               RTC_CTRL |= RTC_WRITE;
-               RTC_MINS = bin2bcd(real_minutes);
-               RTC_SECS = bin2bcd(real_seconds);
-               RTC_CTRL &= ~(RTC_WRITE);
+               Q40_RTC_CTRL |= Q40_RTC_WRITE;
+               Q40_RTC_MINS = bin2bcd(real_minutes);
+               Q40_RTC_SECS = bin2bcd(real_seconds);
+               Q40_RTC_CTRL &= ~(Q40_RTC_WRITE);
        }
        else
                retval = -1;
diff --git a/arch/m68k/sun3/config.c b/arch/m68k/sun3/config.c
index 7835991..71ebaa8 100644
--- a/arch/m68k/sun3/config.c
+++ b/arch/m68k/sun3/config.c
@@ -146,12 +146,12 @@ void __init config_sun3(void)
         disable_irq         =  sun3_disable_irq;
        mach_process_int     =  sun3_process_int;
         mach_get_irq_list    =  show_sun3_interrupts;
-        mach_gettod          =  sun3_gettod;   
         mach_reset           =  sun3_reboot;
        mach_gettimeoffset   =  sun3_gettimeoffset;
        mach_get_model       =  sun3_get_model;
        mach_hwclk           =  sun3_hwclk;
        mach_halt            =  sun3_halt;
+       mach_get_hardware_list = sun3_get_hardware_list;
 #if !defined(CONFIG_SERIAL_CONSOLE) && defined(CONFIG_FB)
        conswitchp           = &dummy_con;
 #endif
diff --git a/arch/m68k/sun3/intersil.c b/arch/m68k/sun3/intersil.c
index 52493eb..81ff083 100644
--- a/arch/m68k/sun3/intersil.c
+++ b/arch/m68k/sun3/intersil.c
@@ -11,8 +11,10 @@
  */
 
 #include <linux/kernel.h>
+#include <linux/rtc.h>
 
 #include <asm/system.h>
+#include <asm/semaphore.h>
 #include <asm/rtc.h>
 #include <asm/intersil.h>
 
@@ -27,37 +29,10 @@ unsigned long sun3_gettimeoffset(void)
   return 1;
 }
 
-void sun3_gettod (int *yearp, int *monp, int *dayp,
-                   int *hourp, int *minp, int *secp)
-{
-       unsigned char wday;
-       volatile struct intersil_dt* todintersil;
-       unsigned long flags;
-
-        todintersil = (struct intersil_dt *) &intersil_clock->counter;
-
-       save_and_cli(flags);
-
-       intersil_clock->cmd_reg = STOP_VAL;
-
-       *secp  = todintersil->csec;
-        *hourp = todintersil->hour;
-        *minp  = todintersil->minute;
-        *secp  = todintersil->second; 
-        *monp  = todintersil->month;
-        *dayp  = todintersil->day;
-        *yearp = todintersil->year+68; /* The base year for sun3 is 1968 */
-       wday = todintersil->weekday;
-
-       intersil_clock->cmd_reg = START_VAL;
-
-       restore_flags(flags);
-}
-
 
 /* get/set hwclock */
 
-int sun3_hwclk(int set, struct hwclk_time *t)
+int sun3_hwclk(int set, struct rtc_time *t)
 {
        volatile struct intersil_dt *todintersil;
        unsigned long flags;
@@ -71,23 +46,23 @@ int sun3_hwclk(int set, struct hwclk_time *t)
        /* set or read the clock */
        if(set) {
                todintersil->csec = 0;
-               todintersil->hour = t->hour;
-               todintersil->minute = t->min;
-               todintersil->second = t->sec;
-               todintersil->month = t->mon;
-               todintersil->day = t->day;
-               todintersil->year = t->year - 68;
-               todintersil->weekday = t->wday;
+               todintersil->hour = t->tm_hour;
+               todintersil->minute = t->tm_min;
+               todintersil->second = t->tm_sec;
+               todintersil->month = t->tm_mon;
+               todintersil->day = t->tm_mday;
+               todintersil->year = t->tm_year - 68;
+               todintersil->weekday = t->tm_wday;
        } else {
                /* read clock */
-               t->sec = todintersil->csec;
-               t->hour = todintersil->hour;
-               t->min = todintersil->minute;
-               t->sec = todintersil->second;
-               t->mon = todintersil->month;
-               t->day = todintersil->day;
-               t->year = todintersil->year + 68;
-               t->wday = todintersil->weekday;
+               t->tm_sec = todintersil->csec;
+               t->tm_hour = todintersil->hour;
+               t->tm_min = todintersil->minute;
+               t->tm_sec = todintersil->second;
+               t->tm_mon = todintersil->month;
+               t->tm_mday = todintersil->day;
+               t->tm_year = todintersil->year + 68;
+               t->tm_wday = todintersil->weekday;
        }
 
        intersil_clock->cmd_reg = START_VAL;
diff --git a/arch/m68k/sun3x/config.c b/arch/m68k/sun3x/config.c
index 0e5fc55..8f3a66a 100644
--- a/arch/m68k/sun3x/config.c
+++ b/arch/m68k/sun3x/config.c
@@ -77,9 +77,9 @@ void __init config_sun3x(void)
        mach_gettimeoffset   = sun3x_gettimeoffset;
        mach_reset           = sun3x_reboot;
 
-       mach_gettod          = sun3x_gettod;
        mach_hwclk           = sun3x_hwclk;
-       mach_get_model       = sun3x_get_model;
+       mach_get_model       = sun3_get_model;
+       mach_get_hardware_list = sun3x_get_hardware_list;
 
        sun3_intreg = (unsigned char *)SUN3X_INTREG;
 
diff --git a/arch/m68k/sun3x/time.c b/arch/m68k/sun3x/time.c
index 6633c1d..bd896d4 100644
--- a/arch/m68k/sun3x/time.c
+++ b/arch/m68k/sun3x/time.c
@@ -10,6 +10,7 @@
 #include <linux/sched.h>
 #include <linux/kernel_stat.h>
 #include <linux/interrupt.h>
+#include <linux/rtc.h>
 
 #include <asm/irq.h>
 #include <asm/io.h>
@@ -38,54 +39,33 @@
 #define BCD_TO_BIN(val) (((val)&15) + ((val)>>4)*10)
 #define BIN_TO_BCD(val) (((val/10) << 4) | (val % 10))
 
-/* Read the Mostek */
-void sun3x_gettod (int *yearp, int *monp, int *dayp,
-                   int *hourp, int *minp, int *secp)
-{
-    volatile unsigned char *eeprom = (unsigned char *)SUN3X_EEPROM;
-
-    /* Stop updates */
-    *(eeprom + M_CONTROL) |= C_READ;
-
-    /* Read values */
-    *yearp = BCD_TO_BIN(*(eeprom + M_YEAR));
-    *monp  = BCD_TO_BIN(*(eeprom + M_MONTH)) +1;
-    *dayp  = BCD_TO_BIN(*(eeprom + M_DATE));
-    *hourp = BCD_TO_BIN(*(eeprom + M_HOUR));
-    *minp  = BCD_TO_BIN(*(eeprom + M_MIN));
-    *secp  = BCD_TO_BIN(*(eeprom + M_SEC));
-
-    /* Restart updates */
-    *(eeprom + M_CONTROL) &= ~C_READ;
-}
-
-int sun3x_hwclk(int set, struct hwclk_time *t)
+int sun3x_hwclk(int set, struct rtc_time *t)
 {
        volatile struct mostek_dt *h = 
-               (unsigned char *)(SUN3X_EEPROM+M_CONTROL);
+               (struct mostek_dt *)(SUN3X_EEPROM+M_CONTROL);
        unsigned long flags;
 
        save_and_cli(flags);
        
        if(set) {
                h->csr |= C_WRITE;
-               h->sec = BIN_TO_BCD(t->sec);
-               h->min = BIN_TO_BCD(t->min);
-               h->hour = BIN_TO_BCD(t->hour);
-               h->wday = BIN_TO_BCD(t->wday);
-               h->mday = BIN_TO_BCD(t->day);
-               h->month = BIN_TO_BCD(t->mon);
-               h->year = BIN_TO_BCD(t->year);
+               h->sec = BIN_TO_BCD(t->tm_sec);
+               h->min = BIN_TO_BCD(t->tm_min);
+               h->hour = BIN_TO_BCD(t->tm_hour);
+               h->wday = BIN_TO_BCD(t->tm_wday);
+               h->mday = BIN_TO_BCD(t->tm_mday);
+               h->month = BIN_TO_BCD(t->tm_mon);
+               h->year = BIN_TO_BCD(t->tm_year);
                h->csr &= ~C_WRITE;
        } else {
                h->csr |= C_READ;
-               t->sec = BCD_TO_BIN(h->sec);
-               t->min = BCD_TO_BIN(h->min);
-               t->hour = BCD_TO_BIN(h->hour);
-               t->wday = BCD_TO_BIN(h->wday);
-               t->day = BCD_TO_BIN(h->mday);
-               t->mon = BCD_TO_BIN(h->month);
-               t->year = BCD_TO_BIN(h->year);
+               t->tm_sec = BCD_TO_BIN(h->sec);
+               t->tm_min = BCD_TO_BIN(h->min);
+               t->tm_hour = BCD_TO_BIN(h->hour);
+               t->tm_wday = BCD_TO_BIN(h->wday);
+               t->tm_mday = BCD_TO_BIN(h->mday);
+               t->tm_mon = BCD_TO_BIN(h->month);
+               t->tm_year = BCD_TO_BIN(h->year);
                h->csr &= ~C_READ;
        }
 
diff --git a/arch/m68k/sun3x/time.h b/arch/m68k/sun3x/time.h
index 54f5435..ad8c9fc 100644
--- a/arch/m68k/sun3x/time.h
+++ b/arch/m68k/sun3x/time.h
@@ -1,9 +1,7 @@
 #ifndef SUN3X_TIME_H
 #define SUN3X_TIME_H
 
-extern void sun3x_gettod (int *yearp, int *monp, int *dayp,
-                   int *hourp, int *minp, int *secp);
-extern int sun3x_hwclk(int set, struct hwclk_time *t);
+extern int sun3x_hwclk(int set, struct rtc_time *t);
 unsigned long sun3x_gettimeoffset (void);
 void sun3x_sched_init(void (*vector)(int, void *, struct pt_regs *));
 
diff --git a/include/asm-m68k/machdep.h b/include/asm-m68k/machdep.h
index b7c3f7a..f809c7d 100644
--- a/include/asm-m68k/machdep.h
+++ b/include/asm-m68k/machdep.h
@@ -6,7 +6,7 @@
 struct pt_regs;
 struct kbd_repeat;
 struct mktime;
-struct hwclk_time;
+struct rtc_time;
 struct buffer_head;
 
 extern void (*mach_sched_init) (void (*handler)(int, void *, struct pt_regs 
*));
@@ -27,9 +27,7 @@ extern int (*mach_get_irq_list) (struct seq_file *p, void *v);
 extern void (*mach_process_int) (int irq, struct pt_regs *fp);
 /* machine dependent timer functions */
 extern unsigned long (*mach_gettimeoffset)(void);
-extern void (*mach_gettod)(int *year, int *mon, int *day, int *hour,
-                          int *min, int *sec);
-extern int (*mach_hwclk)(int, struct hwclk_time*);
+extern int (*mach_hwclk)(int, struct rtc_time*);
 extern int (*mach_set_clock_mmss)(unsigned long);
 extern void (*mach_reset)( void );
 extern void (*mach_halt)( void );
diff --git a/include/asm-m68k/rtc.h b/include/asm-m68k/rtc.h
index 0ae2c24..b28f547 100644
--- a/include/asm-m68k/rtc.h
+++ b/include/asm-m68k/rtc.h
@@ -13,17 +13,7 @@
 
 #ifdef __KERNEL__
 
-#include <linux/config.h>
-
-struct hwclk_time {
-       unsigned        sec;    /* 0..59 */
-       unsigned        min;    /* 0..59 */
-       unsigned        hour;   /* 0..23 */
-       unsigned        day;    /* 1..31 */
-       unsigned        mon;    /* 0..11 */
-       unsigned        year;   /* 70... */
-       int             wday;   /* 0..6, 0 is Sunday, -1 means unknown/don't 
set */
-};
+#include <asm/machdep.h>
 
 /* a few implementation details for the emulation : */
 
diff --git a/include/linux/kd.h b/include/linux/kd.h
index 2461c05..986ef61 100644
--- a/include/linux/kd.h
+++ b/include/linux/kd.h
@@ -132,19 +132,6 @@ struct kbkeycode {
 
 #define KDSIGACCEPT    0x4B4E  /* accept kbd generated signals */
 
-struct hwclk_time {
-       unsigned        sec;    /* 0..59 */
-       unsigned        min;    /* 0..59 */
-       unsigned        hour;   /* 0..23 */
-       unsigned        day;    /* 1..31 */
-       unsigned        mon;    /* 0..11 */
-       unsigned        year;   /* 70... */
-       int             wday;   /* 0..6, 0 is Sunday, -1 means unknown/don't 
set */
-};
-
-#define KDGHWCLK        0x4B50 /* get hardware clock */
-#define KDSHWCLK        0x4B51  /* set hardware clock */
-
 struct kbd_repeat {
        int delay;      /* in msec; <= 0: don't change */
        int rate;       /* in msec; <= 0: don't change */

Gr{oetje,eeting}s,

                                                Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [EMAIL PROTECTED]

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                                            -- Linus Torvalds
--
To unsubscribe from this list: send the line "unsubscribe linux-m68k" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to