diff options
Diffstat (limited to 'arch/m68k/mac/misc.c')
-rw-r--r-- | arch/m68k/mac/misc.c | 134 |
1 files changed, 76 insertions, 58 deletions
diff --git a/arch/m68k/mac/misc.c b/arch/m68k/mac/misc.c index 4956edaac926..c68054361615 100644 --- a/arch/m68k/mac/misc.c +++ b/arch/m68k/mac/misc.c @@ -43,18 +43,19 @@ static long cuda_read_time(void) while (!req.complete) cuda_poll(); - time = (req.reply[3] << 24) | (req.reply[4] << 16) - | (req.reply[5] << 8) | req.reply[6]; + time = (req.reply[3] << 24) | (req.reply[4] << 16) | + (req.reply[5] << 8) | req.reply[6]; return time - RTC_OFFSET; } static void cuda_write_time(long data) { struct adb_request req; + data += RTC_OFFSET; if (cuda_request(&req, NULL, 6, CUDA_PACKET, CUDA_SET_TIME, - (data >> 24) & 0xFF, (data >> 16) & 0xFF, - (data >> 8) & 0xFF, data & 0xFF) < 0) + (data >> 24) & 0xFF, (data >> 16) & 0xFF, + (data >> 8) & 0xFF, data & 0xFF) < 0) return; while (!req.complete) cuda_poll(); @@ -63,8 +64,9 @@ static void cuda_write_time(long data) static __u8 cuda_read_pram(int offset) { struct adb_request req; + if (cuda_request(&req, NULL, 4, CUDA_PACKET, CUDA_GET_PRAM, - (offset >> 8) & 0xFF, offset & 0xFF) < 0) + (offset >> 8) & 0xFF, offset & 0xFF) < 0) return 0; while (!req.complete) cuda_poll(); @@ -74,18 +76,14 @@ static __u8 cuda_read_pram(int offset) static void cuda_write_pram(int offset, __u8 data) { struct adb_request req; + if (cuda_request(&req, NULL, 5, CUDA_PACKET, CUDA_SET_PRAM, - (offset >> 8) & 0xFF, offset & 0xFF, data) < 0) + (offset >> 8) & 0xFF, offset & 0xFF, data) < 0) return; while (!req.complete) cuda_poll(); } -#else -#define cuda_read_time() 0 -#define cuda_write_time(n) -#define cuda_read_pram NULL -#define cuda_write_pram NULL -#endif +#endif /* CONFIG_ADB_CUDA */ #ifdef CONFIG_ADB_PMU68K static long pmu_read_time(void) @@ -98,14 +96,15 @@ static long pmu_read_time(void) while (!req.complete) pmu_poll(); - time = (req.reply[1] << 24) | (req.reply[2] << 16) - | (req.reply[3] << 8) | req.reply[4]; + time = (req.reply[1] << 24) | (req.reply[2] << 16) | + (req.reply[3] << 8) | req.reply[4]; return time - RTC_OFFSET; } static void pmu_write_time(long data) { struct adb_request req; + data += RTC_OFFSET; if (pmu_request(&req, NULL, 5, PMU_SET_RTC, (data >> 24) & 0xFF, (data >> 16) & 0xFF, @@ -118,6 +117,7 @@ static void pmu_write_time(long data) static __u8 pmu_read_pram(int offset) { struct adb_request req; + if (pmu_request(&req, NULL, 3, PMU_READ_NVRAM, (offset >> 8) & 0xFF, offset & 0xFF) < 0) return 0; @@ -129,18 +129,14 @@ static __u8 pmu_read_pram(int offset) static void pmu_write_pram(int offset, __u8 data) { struct adb_request req; + if (pmu_request(&req, NULL, 4, PMU_WRITE_NVRAM, (offset >> 8) & 0xFF, offset & 0xFF, data) < 0) return; while (!req.complete) pmu_poll(); } -#else -#define pmu_read_time() 0 -#define pmu_write_time(n) -#define pmu_read_pram NULL -#define pmu_write_pram NULL -#endif +#endif /* CONFIG_ADB_PMU68K */ /* * VIA PRAM/RTC access routines @@ -151,8 +147,8 @@ static void pmu_write_pram(int offset, __u8 data) static __u8 via_pram_readbyte(void) { - int i,reg; - __u8 data; + int i, reg; + __u8 data; reg = via1[vBufB] & ~VIA1B_vRTCClk; @@ -178,7 +174,7 @@ static __u8 via_pram_readbyte(void) static void via_pram_writebyte(__u8 data) { - int i,reg,bit; + int i, reg, bit; reg = via1[vBufB] & ~(VIA1B_vRTCClk | VIA1B_vRTCData); @@ -204,7 +200,7 @@ static void via_pram_writebyte(__u8 data) static void via_pram_command(int command, __u8 *data) { unsigned long flags; - int is_read; + int is_read; local_irq_save(flags); @@ -298,10 +294,10 @@ static long via_read_time(void) static void via_write_time(long time) { union { - __u8 cdata[4]; - long idata; + __u8 cdata[4]; + long idata; } data; - __u8 temp; + __u8 temp; /* Clear the write protect bit */ @@ -333,20 +329,16 @@ static void via_shutdown(void) } } -/* - * FIXME: not sure how this is supposed to work exactly... - */ - static void oss_shutdown(void) { oss->rom_ctrl = OSS_POWEROFF; } #ifdef CONFIG_ADB_CUDA - static void cuda_restart(void) { struct adb_request req; + if (cuda_request(&req, NULL, 2, CUDA_PACKET, CUDA_RESET_SYSTEM) < 0) return; while (!req.complete) @@ -356,6 +348,7 @@ static void cuda_restart(void) static void cuda_shutdown(void) { struct adb_request req; + if (cuda_request(&req, NULL, 2, CUDA_PACKET, CUDA_POWERDOWN) < 0) return; @@ -372,7 +365,6 @@ static void cuda_shutdown(void) while (!req.complete) cuda_poll(); } - #endif /* CONFIG_ADB_CUDA */ #ifdef CONFIG_ADB_PMU68K @@ -419,18 +411,26 @@ void mac_pram_read(int offset, __u8 *buffer, int len) __u8 (*func)(int); 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_PB2: - func = pmu_read_pram; break; + func = via_read_pram; + break; +#ifdef CONFIG_ADB_CUDA case MAC_ADB_EGRET: case MAC_ADB_CUDA: - func = cuda_read_pram; break; + func = cuda_read_pram; + break; +#endif +#ifdef CONFIG_ADB_PMU68K + case MAC_ADB_PB2: + func = pmu_read_pram; + break; +#endif default: - func = via_read_pram; - } - if (!func) return; + } for (i = 0 ; i < len ; i++) { buffer[i] = (*func)(offset++); } @@ -441,18 +441,26 @@ void mac_pram_write(int offset, __u8 *buffer, int len) void (*func)(int, __u8); 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_PB2: - func = pmu_write_pram; break; + func = via_write_pram; + break; +#ifdef CONFIG_ADB_CUDA case MAC_ADB_EGRET: case MAC_ADB_CUDA: - func = cuda_write_pram; break; + func = cuda_write_pram; + break; +#endif +#ifdef CONFIG_ADB_PMU68K + case MAC_ADB_PB2: + func = pmu_write_pram; + break; +#endif default: - func = via_write_pram; - } - if (!func) return; + } for (i = 0 ; i < len ; i++) { (*func)(offset++, buffer[i]); } @@ -531,6 +539,7 @@ void mac_reset(void) unsigned long phys = virt_to_phys(mac_reset); unsigned long addr = (phys&0xFF000000)|0x8777; unsigned long offset = phys-virt; + local_irq_disable(); /* lets not screw this up, ok? */ __asm__ __volatile__(".chip 68030\n\t" "pmove %0,%/tt0\n\t" @@ -538,7 +547,7 @@ void mac_reset(void) : : "m" (addr)); /* Now jump to physical address so we can disable MMU */ __asm__ __volatile__( - ".chip 68030\n\t" + ".chip 68030\n\t" "lea %/pc@(1f),%/a0\n\t" "addl %0,%/a0\n\t"/* fixup target address and stack ptr */ "addl %0,%/sp\n\t" @@ -627,9 +636,8 @@ static void unmktime(unsigned long time, long offset, long int yg = y + days / 365 - (days % 365 < 0); /* Adjust DAYS and Y to match the guessed year. */ - days -= ((yg - y) * 365 - + LEAPS_THRU_END_OF (yg - 1) - - LEAPS_THRU_END_OF (y - 1)); + days -= (yg - y) * 365 + + LEAPS_THRU_END_OF(yg - 1) - LEAPS_THRU_END_OF(y - 1); y = yg; } *yearp = y - 1900; @@ -653,18 +661,22 @@ int mac_hwclk(int op, struct rtc_time *t) if (!op) { /* read */ switch (macintosh_config->adb_type) { - case MAC_ADB_II: case MAC_ADB_IOP: - now = via_read_time(); - break; + case MAC_ADB_II: case MAC_ADB_PB1: - case MAC_ADB_PB2: - now = pmu_read_time(); + now = via_read_time(); break; +#ifdef CONFIG_ADB_CUDA case MAC_ADB_EGRET: case MAC_ADB_CUDA: now = cuda_read_time(); break; +#endif +#ifdef CONFIG_ADB_PMU68K + case MAC_ADB_PB2: + now = pmu_read_time(); + break; +#endif default: now = 0; } @@ -685,18 +697,24 @@ int mac_hwclk(int op, struct rtc_time *t) t->tm_hour, t->tm_min, t->tm_sec); switch (macintosh_config->adb_type) { - case MAC_ADB_II: case MAC_ADB_IOP: + case MAC_ADB_II: + case MAC_ADB_PB1: via_write_time(now); break; +#ifdef CONFIG_ADB_CUDA case MAC_ADB_EGRET: case MAC_ADB_CUDA: cuda_write_time(now); break; - case MAC_ADB_PB1: +#endif +#ifdef CONFIG_ADB_PMU68K case MAC_ADB_PB2: pmu_write_time(now); break; +#endif + default: + return -ENODEV; } } return 0; |