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 <zippel@xxxxxxxxxxxxxx> 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 -- geert@xxxxxxxxxxxxxx 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html