aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/m68k/mac/misc.c40
1 files changed, 23 insertions, 17 deletions
diff --git a/arch/m68k/mac/misc.c b/arch/m68k/mac/misc.c
index e023fc6b37e5..eb915551de69 100644
--- a/arch/m68k/mac/misc.c
+++ b/arch/m68k/mac/misc.c
@@ -304,35 +304,41 @@ static void via_write_pram(int offset, __u8 data)
304static long via_read_time(void) 304static long via_read_time(void)
305{ 305{
306 union { 306 union {
307 __u8 cdata[4]; 307 __u8 cdata[4];
308 long idata; 308 long idata;
309 } result, last_result; 309 } result, last_result;
310 int ct; 310 int count = 1;
311
312 via_pram_command(0x81, &last_result.cdata[3]);
313 via_pram_command(0x85, &last_result.cdata[2]);
314 via_pram_command(0x89, &last_result.cdata[1]);
315 via_pram_command(0x8D, &last_result.cdata[0]);
311 316
312 /* 317 /*
313 * The NetBSD guys say to loop until you get the same reading 318 * The NetBSD guys say to loop until you get the same reading
314 * twice in a row. 319 * twice in a row.
315 */ 320 */
316 321
317 ct = 0; 322 while (1) {
318 do {
319 if (++ct > 10) {
320 printk("via_read_time: couldn't get valid time, "
321 "last read = 0x%08lx and 0x%08lx\n",
322 last_result.idata, result.idata);
323 break;
324 }
325
326 last_result.idata = result.idata;
327 result.idata = 0;
328
329 via_pram_command(0x81, &result.cdata[3]); 323 via_pram_command(0x81, &result.cdata[3]);
330 via_pram_command(0x85, &result.cdata[2]); 324 via_pram_command(0x85, &result.cdata[2]);
331 via_pram_command(0x89, &result.cdata[1]); 325 via_pram_command(0x89, &result.cdata[1]);
332 via_pram_command(0x8D, &result.cdata[0]); 326 via_pram_command(0x8D, &result.cdata[0]);
333 } while (result.idata != last_result.idata);
334 327
335 return result.idata - RTC_OFFSET; 328 if (result.idata == last_result.idata)
329 return result.idata - RTC_OFFSET;
330
331 if (++count > 10)
332 break;
333
334 last_result.idata = result.idata;
335 }
336
337 pr_err("via_read_time: failed to read a stable value; "
338 "got 0x%08lx then 0x%08lx\n",
339 last_result.idata, result.idata);
340
341 return 0;
336} 342}
337 343
338/* 344/*