diff -c -r linux.orig/drivers/char/rtc.c linux/drivers/char/rtc.c *** linux.orig/drivers/char/rtc.c Fri Jan 15 01:58:47 1999 --- linux/drivers/char/rtc.c Wed Jul 26 14:54:46 2000 *************** *** 98,103 **** --- 98,105 ---- #define RTC_IS_OPEN 0x01 /* means /dev/rtc is in use */ #define RTC_TIMER_ON 0x02 /* missed irq timer active */ + #define RTC_PERSIST 0x04 /* Tells us whether RTC wishes + to keep its alarm setup */ unsigned char rtc_status = 0; /* bitmapped status byte. */ unsigned long rtc_freq = 0; /* Current periodic IRQ rate */ *************** *** 413,418 **** --- 415,440 ---- restore_flags(flags); return 0; } + case RTC_PERSIST_READ: + { + unsigned long persist = 0; + persist = (rtc_status & RTC_PERSIST) == RTC_PERSIST; + return put_user(persist, (unsigned long*) arg); + } + case RTC_PERSIST_SET: + { + if (!capable(CAP_SYS_TIME)) + return -EACCES; + + if (arg) + rtc_status |= RTC_PERSIST; + else + rtc_status &= ~RTC_PERSIST; + + return 0; + } + + #ifdef __alpha__ case RTC_EPOCH_READ: /* Read the epoch. */ { *************** *** 469,475 **** cli(); tmp = CMOS_READ(RTC_CONTROL); tmp &= ~RTC_PIE; ! tmp &= ~RTC_AIE; tmp &= ~RTC_UIE; CMOS_WRITE(tmp, RTC_CONTROL); CMOS_READ(RTC_INTR_FLAGS); --- 491,505 ---- cli(); tmp = CMOS_READ(RTC_CONTROL); tmp &= ~RTC_PIE; ! ! /* If persist flag is set, we dont want to clear out the ! * alarm on close. Also note that we dont want to ! * clear RTC_PERSIST on close either! We want it preserved ! * across open/close once its set. ! */ ! if ((rtc_status & RTC_PERSIST) != RTC_PERSIST) ! tmp &= ~RTC_AIE; ! tmp &= ~RTC_UIE; CMOS_WRITE(tmp, RTC_CONTROL); CMOS_READ(RTC_INTR_FLAGS); *************** *** 668,674 **** "update_IRQ\t: %s\n" "periodic_IRQ\t: %s\n" "periodic_freq\t: %ld\n" ! "batt_status\t: %s\n", (ctrl & RTC_DST_EN) ? "yes" : "no", (ctrl & RTC_DM_BINARY) ? "no" : "yes", (ctrl & RTC_24H) ? "yes" : "no", --- 698,705 ---- "update_IRQ\t: %s\n" "periodic_IRQ\t: %s\n" "periodic_freq\t: %ld\n" ! "batt_status\t: %s\n" ! "persist\t\t: %s\n", (ctrl & RTC_DST_EN) ? "yes" : "no", (ctrl & RTC_DM_BINARY) ? "no" : "yes", (ctrl & RTC_24H) ? "yes" : "no", *************** *** 677,683 **** (ctrl & RTC_UIE) ? "yes" : "no", (ctrl & RTC_PIE) ? "yes" : "no", rtc_freq, ! batt ? "okay" : "dead"); return p - buf; } --- 708,715 ---- (ctrl & RTC_UIE) ? "yes" : "no", (ctrl & RTC_PIE) ? "yes" : "no", rtc_freq, ! batt ? "okay" : "dead", ! (rtc_status & RTC_PERSIST) ? "yes" : "no"); return p - buf; } diff -c -r linux.orig/include/linux/mc146818rtc.h linux/include/linux/mc146818rtc.h *** linux.orig/include/linux/mc146818rtc.h Tue May 11 13:37:15 1999 --- linux/include/linux/mc146818rtc.h Wed Jul 26 13:35:53 2000 *************** *** 144,149 **** --- 144,151 ---- #define RTC_IRQP_SET _IOW('p', 0x0c, unsigned long) /* Set IRQ rate */ #define RTC_EPOCH_READ _IOR('p', 0x0d, unsigned long) /* Read epoch */ #define RTC_EPOCH_SET _IOW('p', 0x0e, unsigned long) /* Set epoch */ + #define RTC_PERSIST_READ _IOR('p', 0x0f, unsigned long) /* get persist flag*/ + #define RTC_PERSIST_SET _IOW('p', 0x10, unsigned long) /* set persist flag*/ #endif /* _MC146818RTC_H */