Commit 6df2afba authored by Finn Thain's avatar Finn Thain Committed by Geert Uytterhoeven

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: default avatarStan Johnson <userm57@yahoo.com>
Signed-off-by: default avatarFinn Thain <fthain@telegraphics.com.au>
Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
parent 31b1c780
...@@ -83,12 +83,7 @@ static void cuda_write_pram(int offset, __u8 data) ...@@ -83,12 +83,7 @@ static void cuda_write_pram(int offset, __u8 data)
while (!req.complete) while (!req.complete)
cuda_poll(); cuda_poll();
} }
#else #endif /* CONFIG_ADB_CUDA */
#define cuda_read_time() 0
#define cuda_write_time(n)
#define cuda_read_pram NULL
#define cuda_write_pram NULL
#endif
#ifdef CONFIG_ADB_PMU68K #ifdef CONFIG_ADB_PMU68K
static long pmu_read_time(void) static long pmu_read_time(void)
...@@ -141,12 +136,7 @@ static void pmu_write_pram(int offset, __u8 data) ...@@ -141,12 +136,7 @@ static void pmu_write_pram(int offset, __u8 data)
while (!req.complete) while (!req.complete)
pmu_poll(); pmu_poll();
} }
#else #endif /* CONFIG_ADB_PMU68K */
#define pmu_read_time() 0
#define pmu_write_time(n)
#define pmu_read_pram NULL
#define pmu_write_pram NULL
#endif
/* /*
* VIA PRAM/RTC access routines * VIA PRAM/RTC access routines
...@@ -426,19 +416,25 @@ void mac_pram_read(int offset, __u8 *buffer, int len) ...@@ -426,19 +416,25 @@ void mac_pram_read(int offset, __u8 *buffer, int len)
int i; int i;
switch (macintosh_config->adb_type) { switch (macintosh_config->adb_type) {
case MAC_ADB_IOP:
case MAC_ADB_II:
case MAC_ADB_PB1: case MAC_ADB_PB1:
case MAC_ADB_PB2: func = via_read_pram;
func = pmu_read_pram;
break; break;
#ifdef CONFIG_ADB_CUDA
case MAC_ADB_EGRET: case MAC_ADB_EGRET:
case MAC_ADB_CUDA: case MAC_ADB_CUDA:
func = cuda_read_pram; func = cuda_read_pram;
break; break;
#endif
#ifdef CONFIG_ADB_PMU68K
case MAC_ADB_PB2:
func = pmu_read_pram;
break;
#endif
default: default:
func = via_read_pram;
}
if (!func)
return; return;
}
for (i = 0 ; i < len ; i++) { for (i = 0 ; i < len ; i++) {
buffer[i] = (*func)(offset++); buffer[i] = (*func)(offset++);
} }
...@@ -450,19 +446,25 @@ void mac_pram_write(int offset, __u8 *buffer, int len) ...@@ -450,19 +446,25 @@ void mac_pram_write(int offset, __u8 *buffer, int len)
int i; int i;
switch (macintosh_config->adb_type) { switch (macintosh_config->adb_type) {
case MAC_ADB_IOP:
case MAC_ADB_II:
case MAC_ADB_PB1: case MAC_ADB_PB1:
case MAC_ADB_PB2: func = via_write_pram;
func = pmu_write_pram;
break; break;
#ifdef CONFIG_ADB_CUDA
case MAC_ADB_EGRET: case MAC_ADB_EGRET:
case MAC_ADB_CUDA: case MAC_ADB_CUDA:
func = cuda_write_pram; func = cuda_write_pram;
break; break;
#endif
#ifdef CONFIG_ADB_PMU68K
case MAC_ADB_PB2:
func = pmu_write_pram;
break;
#endif
default: default:
func = via_write_pram;
}
if (!func)
return; return;
}
for (i = 0 ; i < len ; i++) { for (i = 0 ; i < len ; i++) {
(*func)(offset++, buffer[i]); (*func)(offset++, buffer[i]);
} }
...@@ -663,18 +665,22 @@ int mac_hwclk(int op, struct rtc_time *t) ...@@ -663,18 +665,22 @@ int mac_hwclk(int op, struct rtc_time *t)
if (!op) { /* read */ if (!op) { /* read */
switch (macintosh_config->adb_type) { switch (macintosh_config->adb_type) {
case MAC_ADB_II:
case MAC_ADB_IOP: case MAC_ADB_IOP:
now = via_read_time(); case MAC_ADB_II:
break;
case MAC_ADB_PB1: case MAC_ADB_PB1:
case MAC_ADB_PB2: now = via_read_time();
now = pmu_read_time();
break; break;
#ifdef CONFIG_ADB_CUDA
case MAC_ADB_EGRET: case MAC_ADB_EGRET:
case MAC_ADB_CUDA: case MAC_ADB_CUDA:
now = cuda_read_time(); now = cuda_read_time();
break; break;
#endif
#ifdef CONFIG_ADB_PMU68K
case MAC_ADB_PB2:
now = pmu_read_time();
break;
#endif
default: default:
now = 0; now = 0;
} }
...@@ -695,18 +701,24 @@ int mac_hwclk(int op, struct rtc_time *t) ...@@ -695,18 +701,24 @@ int mac_hwclk(int op, struct rtc_time *t)
t->tm_hour, t->tm_min, t->tm_sec); t->tm_hour, t->tm_min, t->tm_sec);
switch (macintosh_config->adb_type) { switch (macintosh_config->adb_type) {
case MAC_ADB_II:
case MAC_ADB_IOP: case MAC_ADB_IOP:
case MAC_ADB_II:
case MAC_ADB_PB1:
via_write_time(now); via_write_time(now);
break; break;
#ifdef CONFIG_ADB_CUDA
case MAC_ADB_EGRET: case MAC_ADB_EGRET:
case MAC_ADB_CUDA: case MAC_ADB_CUDA:
cuda_write_time(now); cuda_write_time(now);
break; break;
case MAC_ADB_PB1: #endif
#ifdef CONFIG_ADB_PMU68K
case MAC_ADB_PB2: case MAC_ADB_PB2:
pmu_write_time(now); pmu_write_time(now);
break; break;
#endif
default:
return -ENODEV;
} }
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment