aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFinn Thain <fthain@telegraphics.com.au>2018-03-11 23:38:28 -0400
committerGeert Uytterhoeven <geert@linux-m68k.org>2018-03-26 08:10:22 -0400
commit6df2afba7a87afa71d4baf9875ec846d3040f9bb (patch)
treec1bbc6bc28e0094fe0a1af8ec32018ba2fdec657
parent31b1c780177d02d470109bdcf9899a3433c9fa93 (diff)
m68k/mac: Enable RTC for 100-series PowerBooks
According to Apple's Developer Notes, all of the early PowerBook models have their RTC connected to VIA1. Use the VIA clock ops as appropriate. This was tested on a PowerBook 170. Don't use the VIA ops when not appropriate. Calling unimplemented clock or PRAM getter or setter ops can now result in an error instead of failing silently. Tested-by: Stan Johnson <userm57@yahoo.com> Signed-off-by: Finn Thain <fthain@telegraphics.com.au> Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
-rw-r--r--arch/m68k/mac/misc.c70
1 files changed, 41 insertions, 29 deletions
diff --git a/arch/m68k/mac/misc.c b/arch/m68k/mac/misc.c
index 50387638557d..d6746cf37101 100644
--- a/arch/m68k/mac/misc.c
+++ b/arch/m68k/mac/misc.c
@@ -83,12 +83,7 @@ static void cuda_write_pram(int offset, __u8 data)
83 while (!req.complete) 83 while (!req.complete)
84 cuda_poll(); 84 cuda_poll();
85} 85}
86#else 86#endif /* CONFIG_ADB_CUDA */
87#define cuda_read_time() 0
88#define cuda_write_time(n)
89#define cuda_read_pram NULL
90#define cuda_write_pram NULL
91#endif
92 87
93#ifdef CONFIG_ADB_PMU68K 88#ifdef CONFIG_ADB_PMU68K
94static long pmu_read_time(void) 89static long pmu_read_time(void)
@@ -141,12 +136,7 @@ static void pmu_write_pram(int offset, __u8 data)
141 while (!req.complete) 136 while (!req.complete)
142 pmu_poll(); 137 pmu_poll();
143} 138}
144#else 139#endif /* CONFIG_ADB_PMU68K */
145#define pmu_read_time() 0
146#define pmu_write_time(n)
147#define pmu_read_pram NULL
148#define pmu_write_pram NULL
149#endif
150 140
151/* 141/*
152 * VIA PRAM/RTC access routines 142 * VIA PRAM/RTC access routines
@@ -426,19 +416,25 @@ void mac_pram_read(int offset, __u8 *buffer, int len)
426 int i; 416 int i;
427 417
428 switch (macintosh_config->adb_type) { 418 switch (macintosh_config->adb_type) {
419 case MAC_ADB_IOP:
420 case MAC_ADB_II:
429 case MAC_ADB_PB1: 421 case MAC_ADB_PB1:
430 case MAC_ADB_PB2: 422 func = via_read_pram;
431 func = pmu_read_pram;
432 break; 423 break;
424#ifdef CONFIG_ADB_CUDA
433 case MAC_ADB_EGRET: 425 case MAC_ADB_EGRET:
434 case MAC_ADB_CUDA: 426 case MAC_ADB_CUDA:
435 func = cuda_read_pram; 427 func = cuda_read_pram;
436 break; 428 break;
429#endif
430#ifdef CONFIG_ADB_PMU68K
431 case MAC_ADB_PB2:
432 func = pmu_read_pram;
433 break;
434#endif
437 default: 435 default:
438 func = via_read_pram;
439 }
440 if (!func)
441 return; 436 return;
437 }
442 for (i = 0 ; i < len ; i++) { 438 for (i = 0 ; i < len ; i++) {
443 buffer[i] = (*func)(offset++); 439 buffer[i] = (*func)(offset++);
444 } 440 }
@@ -450,19 +446,25 @@ void mac_pram_write(int offset, __u8 *buffer, int len)
450 int i; 446 int i;
451 447
452 switch (macintosh_config->adb_type) { 448 switch (macintosh_config->adb_type) {
449 case MAC_ADB_IOP:
450 case MAC_ADB_II:
453 case MAC_ADB_PB1: 451 case MAC_ADB_PB1:
454 case MAC_ADB_PB2: 452 func = via_write_pram;
455 func = pmu_write_pram;
456 break; 453 break;
454#ifdef CONFIG_ADB_CUDA
457 case MAC_ADB_EGRET: 455 case MAC_ADB_EGRET:
458 case MAC_ADB_CUDA: 456 case MAC_ADB_CUDA:
459 func = cuda_write_pram; 457 func = cuda_write_pram;
460 break; 458 break;
459#endif
460#ifdef CONFIG_ADB_PMU68K
461 case MAC_ADB_PB2:
462 func = pmu_write_pram;
463 break;
464#endif
461 default: 465 default:
462 func = via_write_pram;
463 }
464 if (!func)
465 return; 466 return;
467 }
466 for (i = 0 ; i < len ; i++) { 468 for (i = 0 ; i < len ; i++) {
467 (*func)(offset++, buffer[i]); 469 (*func)(offset++, buffer[i]);
468 } 470 }
@@ -663,18 +665,22 @@ int mac_hwclk(int op, struct rtc_time *t)
663 665
664 if (!op) { /* read */ 666 if (!op) { /* read */
665 switch (macintosh_config->adb_type) { 667 switch (macintosh_config->adb_type) {
666 case MAC_ADB_II:
667 case MAC_ADB_IOP: 668 case MAC_ADB_IOP:
668 now = via_read_time(); 669 case MAC_ADB_II:
669 break;
670 case MAC_ADB_PB1: 670 case MAC_ADB_PB1:
671 case MAC_ADB_PB2: 671 now = via_read_time();
672 now = pmu_read_time();
673 break; 672 break;
673#ifdef CONFIG_ADB_CUDA
674 case MAC_ADB_EGRET: 674 case MAC_ADB_EGRET:
675 case MAC_ADB_CUDA: 675 case MAC_ADB_CUDA:
676 now = cuda_read_time(); 676 now = cuda_read_time();
677 break; 677 break;
678#endif
679#ifdef CONFIG_ADB_PMU68K
680 case MAC_ADB_PB2:
681 now = pmu_read_time();
682 break;
683#endif
678 default: 684 default:
679 now = 0; 685 now = 0;
680 } 686 }
@@ -695,18 +701,24 @@ int mac_hwclk(int op, struct rtc_time *t)
695 t->tm_hour, t->tm_min, t->tm_sec); 701 t->tm_hour, t->tm_min, t->tm_sec);
696 702
697 switch (macintosh_config->adb_type) { 703 switch (macintosh_config->adb_type) {
698 case MAC_ADB_II:
699 case MAC_ADB_IOP: 704 case MAC_ADB_IOP:
705 case MAC_ADB_II:
706 case MAC_ADB_PB1:
700 via_write_time(now); 707 via_write_time(now);
701 break; 708 break;
709#ifdef CONFIG_ADB_CUDA
702 case MAC_ADB_EGRET: 710 case MAC_ADB_EGRET:
703 case MAC_ADB_CUDA: 711 case MAC_ADB_CUDA:
704 cuda_write_time(now); 712 cuda_write_time(now);
705 break; 713 break;
706 case MAC_ADB_PB1: 714#endif
715#ifdef CONFIG_ADB_PMU68K
707 case MAC_ADB_PB2: 716 case MAC_ADB_PB2:
708 pmu_write_time(now); 717 pmu_write_time(now);
709 break; 718 break;
719#endif
720 default:
721 return -ENODEV;
710 } 722 }
711 } 723 }
712 return 0; 724 return 0;