patch-2.4.10 linux/drivers/char/rtc.c
Next file: linux/drivers/char/sbc60xxwdt.c
Previous file: linux/drivers/char/rocket.c
Back to the patch index
Back to the overall index
- Lines: 124
- Date:
Sun Sep 9 10:43:02 2001
- Orig file:
v2.4.9/linux/drivers/char/rtc.c
- Orig date:
Mon Aug 27 12:41:41 2001
diff -u --recursive --new-file v2.4.9/linux/drivers/char/rtc.c linux/drivers/char/rtc.c
@@ -40,9 +40,10 @@
* 1.10b Andrew Morton: SMP lock fix
* 1.10c Cesar Barros: SMP locking fixes and cleanup
* 1.10d Paul Gortmaker: delete paranoia check in rtc_exit
+ * 1.10e Maciej W. Rozycki: Handle DECstation's year weirdness.
*/
-#define RTC_VERSION "1.10d"
+#define RTC_VERSION "1.10e"
#define RTC_IO_EXTENT 0x10 /* Only really two ports, but... */
@@ -361,6 +362,9 @@
unsigned char mon, day, hrs, min, sec, leap_yr;
unsigned char save_control, save_freq_select;
unsigned int yrs;
+#ifdef CONFIG_DECSTATION
+ unsigned int real_yrs;
+#endif
if (!capable(CAP_SYS_TIME))
return -EACCES;
@@ -394,6 +398,20 @@
return -EINVAL;
spin_lock_irq(&rtc_lock);
+#ifdef CONFIG_DECSTATION
+ real_yrs = yrs;
+ yrs = 72;
+
+ /*
+ * We want to keep the year set to 73 until March
+ * for non-leap years, so that Feb, 29th is handled
+ * correctly.
+ */
+ if (!leap_yr && mon < 3) {
+ real_yrs--;
+ yrs = 73;
+ }
+#endif
if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY)
|| RTC_ALWAYS_BCD) {
if (yrs > 169) {
@@ -416,6 +434,9 @@
save_freq_select = CMOS_READ(RTC_FREQ_SELECT);
CMOS_WRITE((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT);
+#ifdef CONFIG_DECSTATION
+ CMOS_WRITE(real_yrs, RTC_DEC_YEAR);
+#endif
CMOS_WRITE(yrs, RTC_YEAR);
CMOS_WRITE(mon, RTC_MONTH);
CMOS_WRITE(day, RTC_DAY_OF_MONTH);
@@ -469,7 +490,7 @@
spin_unlock_irq(&rtc_lock);
return 0;
}
-#elif !defined(CONFIG_DECSTATION)
+#endif
case RTC_EPOCH_READ: /* Read the epoch. */
{
return put_user (epoch, (unsigned long *)arg);
@@ -488,7 +509,6 @@
epoch = arg;
return 0;
}
-#endif
default:
return -EINVAL;
}
@@ -709,12 +729,12 @@
} else if (year >= 20 && year < 48) {
epoch = 1980;
guess = "ARC console";
- } else if (year >= 48 && year < 70) {
+ } else if (year >= 48 && year < 72) {
epoch = 1952;
guess = "Digital UNIX";
#if defined(__mips__)
- } else if (year >= 70 && year < 100) {
- epoch = 1928;
+ } else if (year >= 72 && year < 74) {
+ epoch = 2000;
guess = "Digital DECstation";
#else
} else if (year >= 70) {
@@ -911,6 +931,9 @@
{
unsigned long uip_watchdog = jiffies;
unsigned char ctrl;
+#ifdef CONFIG_DECSTATION
+ unsigned int real_year;
+#endif
/*
* read RTC once any update in progress is done. The update
@@ -939,6 +962,9 @@
rtc_tm->tm_mday = CMOS_READ(RTC_DAY_OF_MONTH);
rtc_tm->tm_mon = CMOS_READ(RTC_MONTH);
rtc_tm->tm_year = CMOS_READ(RTC_YEAR);
+#ifdef CONFIG_DECSTATION
+ real_year = CMOS_READ(RTC_DEC_YEAR);
+#endif
ctrl = CMOS_READ(RTC_CONTROL);
spin_unlock_irq(&rtc_lock);
@@ -952,6 +978,10 @@
BCD_TO_BIN(rtc_tm->tm_year);
}
+#ifdef CONFIG_DECSTATION
+ rtc_tm->tm_year += real_year - 72;
+#endif
+
/*
* Account for differences between how the RTC uses the values
* and how they are defined in a struct rtc_time;
@@ -1024,3 +1054,6 @@
spin_unlock_irq(&rtc_lock);
}
#endif
+
+MODULE_AUTHOR("Paul Gortmaker");
+MODULE_LICENSE("GPL");
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)