diff options
-rw-r--r-- | arch/powerpc/platforms/chrp/time.c | 22 |
1 files changed, 2 insertions, 20 deletions
diff --git a/arch/powerpc/platforms/chrp/time.c b/arch/powerpc/platforms/chrp/time.c index 12c6f689b1aa..7d7889026936 100644 --- a/arch/powerpc/platforms/chrp/time.c +++ b/arch/powerpc/platforms/chrp/time.c | |||
@@ -120,33 +120,15 @@ int chrp_set_rtc_time(struct rtc_time *tmarg) | |||
120 | void chrp_get_rtc_time(struct rtc_time *tm) | 120 | void chrp_get_rtc_time(struct rtc_time *tm) |
121 | { | 121 | { |
122 | unsigned int year, mon, day, hour, min, sec; | 122 | unsigned int year, mon, day, hour, min, sec; |
123 | int uip, i; | ||
124 | 123 | ||
125 | /* The Linux interpretation of the CMOS clock register contents: | 124 | do { |
126 | * When the Update-In-Progress (UIP) flag goes from 1 to 0, the | ||
127 | * RTC registers show the second which has precisely just started. | ||
128 | * Let's hope other operating systems interpret the RTC the same way. | ||
129 | */ | ||
130 | |||
131 | /* Since the UIP flag is set for about 2.2 ms and the clock | ||
132 | * is typically written with a precision of 1 jiffy, trying | ||
133 | * to obtain a precision better than a few milliseconds is | ||
134 | * an illusion. Only consistency is interesting, this also | ||
135 | * allows to use the routine for /dev/rtc without a potential | ||
136 | * 1 second kernel busy loop triggered by any reader of /dev/rtc. | ||
137 | */ | ||
138 | |||
139 | for ( i = 0; i<1000000; i++) { | ||
140 | uip = chrp_cmos_clock_read(RTC_FREQ_SELECT); | ||
141 | sec = chrp_cmos_clock_read(RTC_SECONDS); | 125 | sec = chrp_cmos_clock_read(RTC_SECONDS); |
142 | min = chrp_cmos_clock_read(RTC_MINUTES); | 126 | min = chrp_cmos_clock_read(RTC_MINUTES); |
143 | hour = chrp_cmos_clock_read(RTC_HOURS); | 127 | hour = chrp_cmos_clock_read(RTC_HOURS); |
144 | day = chrp_cmos_clock_read(RTC_DAY_OF_MONTH); | 128 | day = chrp_cmos_clock_read(RTC_DAY_OF_MONTH); |
145 | mon = chrp_cmos_clock_read(RTC_MONTH); | 129 | mon = chrp_cmos_clock_read(RTC_MONTH); |
146 | year = chrp_cmos_clock_read(RTC_YEAR); | 130 | year = chrp_cmos_clock_read(RTC_YEAR); |
147 | uip |= chrp_cmos_clock_read(RTC_FREQ_SELECT); | 131 | } while (sec != chrp_cmos_clock_read(RTC_SECONDS)); |
148 | if ((uip & RTC_UIP)==0) break; | ||
149 | } | ||
150 | 132 | ||
151 | if (!(chrp_cmos_clock_read(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD) { | 133 | if (!(chrp_cmos_clock_read(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD) { |
152 | BCD_TO_BIN(sec); | 134 | BCD_TO_BIN(sec); |