diff options
| author | Finn Thain <fthain@telegraphics.com.au> | 2018-03-11 23:38:28 -0400 |
|---|---|---|
| committer | Geert Uytterhoeven <geert@linux-m68k.org> | 2018-03-26 08:10:22 -0400 |
| commit | 6df2afba7a87afa71d4baf9875ec846d3040f9bb (patch) | |
| tree | c1bbc6bc28e0094fe0a1af8ec32018ba2fdec657 | |
| parent | 31b1c780177d02d470109bdcf9899a3433c9fa93 (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.c | 70 |
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 |
| 94 | static long pmu_read_time(void) | 89 | static 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; |
