提交 6ff5801a 编写于 作者: R Roman Zippel 提交者: Linus Torvalds

m68k: reformat various m68k files

Reformat various m68k files, so they actually look like Linux sources.
Signed-off-by: NRoman Zippel <zippel@linux-m68k.org>
Signed-off-by: NGeert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 b3e2fd9c
此差异已折叠。
此差异已折叠。
...@@ -30,317 +30,311 @@ int atari_SCC_init_done; ...@@ -30,317 +30,311 @@ int atari_SCC_init_done;
int atari_SCC_reset_done; int atari_SCC_reset_done;
static struct console atari_console_driver = { static struct console atari_console_driver = {
.name = "debug", .name = "debug",
.flags = CON_PRINTBUFFER, .flags = CON_PRINTBUFFER,
.index = -1, .index = -1,
}; };
static inline void ata_mfp_out (char c) static inline void ata_mfp_out(char c)
{ {
while (!(mfp.trn_stat & 0x80)) /* wait for tx buf empty */ while (!(mfp.trn_stat & 0x80)) /* wait for tx buf empty */
barrier (); barrier();
mfp.usart_dta = c; mfp.usart_dta = c;
} }
void atari_mfp_console_write (struct console *co, const char *str, void atari_mfp_console_write(struct console *co, const char *str,
unsigned int count) unsigned int count)
{ {
while (count--) { while (count--) {
if (*str == '\n') if (*str == '\n')
ata_mfp_out( '\r' ); ata_mfp_out('\r');
ata_mfp_out( *str++ ); ata_mfp_out(*str++);
} }
} }
static inline void ata_scc_out (char c) static inline void ata_scc_out(char c)
{ {
do { do {
MFPDELAY();
} while (!(scc.cha_b_ctrl & 0x04)); /* wait for tx buf empty */
MFPDELAY(); MFPDELAY();
} while (!(scc.cha_b_ctrl & 0x04)); /* wait for tx buf empty */ scc.cha_b_data = c;
MFPDELAY();
scc.cha_b_data = c;
} }
void atari_scc_console_write (struct console *co, const char *str, void atari_scc_console_write(struct console *co, const char *str,
unsigned int count) unsigned int count)
{ {
while (count--) { while (count--) {
if (*str == '\n') if (*str == '\n')
ata_scc_out( '\r' ); ata_scc_out('\r');
ata_scc_out( *str++ ); ata_scc_out(*str++);
} }
} }
static inline void ata_midi_out (char c) static inline void ata_midi_out(char c)
{ {
while (!(acia.mid_ctrl & ACIA_TDRE)) /* wait for tx buf empty */ while (!(acia.mid_ctrl & ACIA_TDRE)) /* wait for tx buf empty */
barrier (); barrier();
acia.mid_data = c; acia.mid_data = c;
} }
void atari_midi_console_write (struct console *co, const char *str, void atari_midi_console_write(struct console *co, const char *str,
unsigned int count) unsigned int count)
{ {
while (count--) { while (count--) {
if (*str == '\n') if (*str == '\n')
ata_midi_out( '\r' ); ata_midi_out('\r');
ata_midi_out( *str++ ); ata_midi_out(*str++);
} }
} }
static int ata_par_out (char c) static int ata_par_out(char c)
{ {
unsigned char tmp; unsigned char tmp;
/* This a some-seconds timeout in case no printer is connected */ /* This a some-seconds timeout in case no printer is connected */
unsigned long i = loops_per_jiffy > 1 ? loops_per_jiffy : 10000000/HZ; unsigned long i = loops_per_jiffy > 1 ? loops_per_jiffy : 10000000/HZ;
while( (mfp.par_dt_reg & 1) && --i ) /* wait for BUSY == L */ while ((mfp.par_dt_reg & 1) && --i) /* wait for BUSY == L */
; ;
if (!i) return( 0 ); if (!i)
return 0;
sound_ym.rd_data_reg_sel = 15; /* select port B */
sound_ym.wd_data = c; /* put char onto port */ sound_ym.rd_data_reg_sel = 15; /* select port B */
sound_ym.rd_data_reg_sel = 14; /* select port A */ sound_ym.wd_data = c; /* put char onto port */
tmp = sound_ym.rd_data_reg_sel; sound_ym.rd_data_reg_sel = 14; /* select port A */
sound_ym.wd_data = tmp & ~0x20; /* set strobe L */ tmp = sound_ym.rd_data_reg_sel;
MFPDELAY(); /* wait a bit */ sound_ym.wd_data = tmp & ~0x20; /* set strobe L */
sound_ym.wd_data = tmp | 0x20; /* set strobe H */ MFPDELAY(); /* wait a bit */
return( 1 ); sound_ym.wd_data = tmp | 0x20; /* set strobe H */
return 1;
} }
static void atari_par_console_write (struct console *co, const char *str, static void atari_par_console_write(struct console *co, const char *str,
unsigned int count) unsigned int count)
{ {
static int printer_present = 1; static int printer_present = 1;
if (!printer_present)
return;
while (count--) { if (!printer_present)
if (*str == '\n')
if (!ata_par_out( '\r' )) {
printer_present = 0;
return; return;
}
if (!ata_par_out( *str++ )) { while (count--) {
printer_present = 0; if (*str == '\n') {
return; if (!ata_par_out('\r')) {
printer_present = 0;
return;
}
}
if (!ata_par_out(*str++)) {
printer_present = 0;
return;
}
} }
}
} }
#ifdef CONFIG_SERIAL_CONSOLE #ifdef CONFIG_SERIAL_CONSOLE
int atari_mfp_console_wait_key(struct console *co) int atari_mfp_console_wait_key(struct console *co)
{ {
while( !(mfp.rcv_stat & 0x80) ) /* wait for rx buf filled */ while (!(mfp.rcv_stat & 0x80)) /* wait for rx buf filled */
barrier(); barrier();
return( mfp.usart_dta ); return mfp.usart_dta;
} }
int atari_scc_console_wait_key(struct console *co) int atari_scc_console_wait_key(struct console *co)
{ {
do { do {
MFPDELAY();
} while (!(scc.cha_b_ctrl & 0x01)); /* wait for rx buf filled */
MFPDELAY(); MFPDELAY();
} while( !(scc.cha_b_ctrl & 0x01) ); /* wait for rx buf filled */ return scc.cha_b_data;
MFPDELAY();
return( scc.cha_b_data );
} }
int atari_midi_console_wait_key(struct console *co) int atari_midi_console_wait_key(struct console *co)
{ {
while( !(acia.mid_ctrl & ACIA_RDRF) ) /* wait for rx buf filled */ while (!(acia.mid_ctrl & ACIA_RDRF)) /* wait for rx buf filled */
barrier(); barrier();
return( acia.mid_data ); return acia.mid_data;
} }
#endif #endif
/* The following two functions do a quick'n'dirty initialization of the MFP or /*
* The following two functions do a quick'n'dirty initialization of the MFP or
* SCC serial ports. They're used by the debugging interface, kgdb, and the * SCC serial ports. They're used by the debugging interface, kgdb, and the
* serial console code. */ * serial console code.
*/
#ifndef CONFIG_SERIAL_CONSOLE #ifndef CONFIG_SERIAL_CONSOLE
static void __init atari_init_mfp_port( int cflag ) static void __init atari_init_mfp_port(int cflag)
#else #else
void atari_init_mfp_port( int cflag ) void atari_init_mfp_port(int cflag)
#endif #endif
{ {
/* timer values for 1200...115200 bps; > 38400 select 110, 134, or 150 /*
* bps, resp., and work only correct if there's a RSVE or RSSPEED */ * timer values for 1200...115200 bps; > 38400 select 110, 134, or 150
static int baud_table[9] = { 16, 11, 8, 4, 2, 1, 175, 143, 128 }; * bps, resp., and work only correct if there's a RSVE or RSSPEED
int baud = cflag & CBAUD; */
int parity = (cflag & PARENB) ? ((cflag & PARODD) ? 0x04 : 0x06) : 0; static int baud_table[9] = { 16, 11, 8, 4, 2, 1, 175, 143, 128 };
int csize = ((cflag & CSIZE) == CS7) ? 0x20 : 0x00; int baud = cflag & CBAUD;
int parity = (cflag & PARENB) ? ((cflag & PARODD) ? 0x04 : 0x06) : 0;
if (cflag & CBAUDEX) int csize = ((cflag & CSIZE) == CS7) ? 0x20 : 0x00;
baud += B38400;
if (baud < B1200 || baud > B38400+2) if (cflag & CBAUDEX)
baud = B9600; /* use default 9600bps for non-implemented rates */ baud += B38400;
baud -= B1200; /* baud_table[] starts at 1200bps */ if (baud < B1200 || baud > B38400+2)
baud = B9600; /* use default 9600bps for non-implemented rates */
mfp.trn_stat &= ~0x01; /* disable TX */ baud -= B1200; /* baud_table[] starts at 1200bps */
mfp.usart_ctr = parity | csize | 0x88; /* 1:16 clk mode, 1 stop bit */
mfp.tim_ct_cd &= 0x70; /* stop timer D */ mfp.trn_stat &= ~0x01; /* disable TX */
mfp.tim_dt_d = baud_table[baud]; mfp.usart_ctr = parity | csize | 0x88; /* 1:16 clk mode, 1 stop bit */
mfp.tim_ct_cd |= 0x01; /* start timer D, 1:4 */ mfp.tim_ct_cd &= 0x70; /* stop timer D */
mfp.trn_stat |= 0x01; /* enable TX */ mfp.tim_dt_d = baud_table[baud];
mfp.tim_ct_cd |= 0x01; /* start timer D, 1:4 */
atari_MFP_init_done = 1; mfp.trn_stat |= 0x01; /* enable TX */
atari_MFP_init_done = 1;
} }
#define SCC_WRITE(reg,val) \ #define SCC_WRITE(reg, val) \
do { \ do { \
scc.cha_b_ctrl = (reg); \ scc.cha_b_ctrl = (reg); \
MFPDELAY(); \ MFPDELAY(); \
scc.cha_b_ctrl = (val); \ scc.cha_b_ctrl = (val); \
MFPDELAY(); \ MFPDELAY(); \
} while(0) } while (0)
/* loops_per_jiffy isn't initialized yet, so we can't use udelay(). This does a /* loops_per_jiffy isn't initialized yet, so we can't use udelay(). This does a
* delay of ~ 60us. */ * delay of ~ 60us. */
#define LONG_DELAY() \ #define LONG_DELAY() \
do { \ do { \
int i; \ int i; \
for( i = 100; i > 0; --i ) \ for (i = 100; i > 0; --i) \
MFPDELAY(); \ MFPDELAY(); \
} while(0) } while (0)
#ifndef CONFIG_SERIAL_CONSOLE #ifndef CONFIG_SERIAL_CONSOLE
static void __init atari_init_scc_port( int cflag ) static void __init atari_init_scc_port(int cflag)
#else #else
void atari_init_scc_port( int cflag ) void atari_init_scc_port(int cflag)
#endif #endif
{ {
extern int atari_SCC_reset_done; extern int atari_SCC_reset_done;
static int clksrc_table[9] = static int clksrc_table[9] =
/* reg 11: 0x50 = BRG, 0x00 = RTxC, 0x28 = TRxC */ /* reg 11: 0x50 = BRG, 0x00 = RTxC, 0x28 = TRxC */
{ 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00 }; { 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00 };
static int brgsrc_table[9] = static int brgsrc_table[9] =
/* reg 14: 0 = RTxC, 2 = PCLK */ /* reg 14: 0 = RTxC, 2 = PCLK */
{ 2, 2, 2, 2, 2, 2, 0, 2, 2 }; { 2, 2, 2, 2, 2, 2, 0, 2, 2 };
static int clkmode_table[9] = static int clkmode_table[9] =
/* reg 4: 0x40 = x16, 0x80 = x32, 0xc0 = x64 */ /* reg 4: 0x40 = x16, 0x80 = x32, 0xc0 = x64 */
{ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x80 }; { 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x80 };
static int div_table[9] = static int div_table[9] =
/* reg12 (BRG low) */ /* reg12 (BRG low) */
{ 208, 138, 103, 50, 24, 11, 1, 0, 0 }; { 208, 138, 103, 50, 24, 11, 1, 0, 0 };
int baud = cflag & CBAUD; int baud = cflag & CBAUD;
int clksrc, clkmode, div, reg3, reg5; int clksrc, clkmode, div, reg3, reg5;
if (cflag & CBAUDEX) if (cflag & CBAUDEX)
baud += B38400; baud += B38400;
if (baud < B1200 || baud > B38400+2) if (baud < B1200 || baud > B38400+2)
baud = B9600; /* use default 9600bps for non-implemented rates */ baud = B9600; /* use default 9600bps for non-implemented rates */
baud -= B1200; /* tables starts at 1200bps */ baud -= B1200; /* tables starts at 1200bps */
clksrc = clksrc_table[baud]; clksrc = clksrc_table[baud];
clkmode = clkmode_table[baud]; clkmode = clkmode_table[baud];
div = div_table[baud]; div = div_table[baud];
if (ATARIHW_PRESENT(TT_MFP) && baud >= 6) { if (ATARIHW_PRESENT(TT_MFP) && baud >= 6) {
/* special treatment for TT, where rates >= 38400 are done via TRxC */ /* special treatment for TT, where rates >= 38400 are done via TRxC */
clksrc = 0x28; /* TRxC */ clksrc = 0x28; /* TRxC */
clkmode = baud == 6 ? 0xc0 : clkmode = baud == 6 ? 0xc0 :
baud == 7 ? 0x80 : /* really 76800bps */ baud == 7 ? 0x80 : /* really 76800bps */
0x40; /* really 153600bps */ 0x40; /* really 153600bps */
div = 0; div = 0;
} }
reg3 = (cflag & CSIZE) == CS8 ? 0xc0 : 0x40; reg3 = (cflag & CSIZE) == CS8 ? 0xc0 : 0x40;
reg5 = (cflag & CSIZE) == CS8 ? 0x60 : 0x20 | 0x82 /* assert DTR/RTS */; reg5 = (cflag & CSIZE) == CS8 ? 0x60 : 0x20 | 0x82 /* assert DTR/RTS */;
(void)scc.cha_b_ctrl; /* reset reg pointer */ (void)scc.cha_b_ctrl; /* reset reg pointer */
SCC_WRITE( 9, 0xc0 ); /* reset */ SCC_WRITE(9, 0xc0); /* reset */
LONG_DELAY(); /* extra delay after WR9 access */ LONG_DELAY(); /* extra delay after WR9 access */
SCC_WRITE( 4, (cflag & PARENB) ? ((cflag & PARODD) ? 0x01 : 0x03) : 0 | SCC_WRITE(4, (cflag & PARENB) ? ((cflag & PARODD) ? 0x01 : 0x03)
0x04 /* 1 stopbit */ | : 0 | 0x04 /* 1 stopbit */ | clkmode);
clkmode ); SCC_WRITE(3, reg3);
SCC_WRITE( 3, reg3 ); SCC_WRITE(5, reg5);
SCC_WRITE( 5, reg5 ); SCC_WRITE(9, 0); /* no interrupts */
SCC_WRITE( 9, 0 ); /* no interrupts */ LONG_DELAY(); /* extra delay after WR9 access */
LONG_DELAY(); /* extra delay after WR9 access */ SCC_WRITE(10, 0); /* NRZ mode */
SCC_WRITE( 10, 0 ); /* NRZ mode */ SCC_WRITE(11, clksrc); /* main clock source */
SCC_WRITE( 11, clksrc ); /* main clock source */ SCC_WRITE(12, div); /* BRG value */
SCC_WRITE( 12, div ); /* BRG value */ SCC_WRITE(13, 0); /* BRG high byte */
SCC_WRITE( 13, 0 ); /* BRG high byte */ SCC_WRITE(14, brgsrc_table[baud]);
SCC_WRITE( 14, brgsrc_table[baud] ); SCC_WRITE(14, brgsrc_table[baud] | (div ? 1 : 0));
SCC_WRITE( 14, brgsrc_table[baud] | (div ? 1 : 0) ); SCC_WRITE(3, reg3 | 1);
SCC_WRITE( 3, reg3 | 1 ); SCC_WRITE(5, reg5 | 8);
SCC_WRITE( 5, reg5 | 8 );
atari_SCC_reset_done = 1;
atari_SCC_reset_done = 1; atari_SCC_init_done = 1;
atari_SCC_init_done = 1;
} }
#ifndef CONFIG_SERIAL_CONSOLE #ifndef CONFIG_SERIAL_CONSOLE
static void __init atari_init_midi_port( int cflag ) static void __init atari_init_midi_port(int cflag)
#else #else
void atari_init_midi_port( int cflag ) void atari_init_midi_port(int cflag)
#endif #endif
{ {
int baud = cflag & CBAUD; int baud = cflag & CBAUD;
int csize = ((cflag & CSIZE) == CS8) ? 0x10 : 0x00; int csize = ((cflag & CSIZE) == CS8) ? 0x10 : 0x00;
/* warning 7N1 isn't possible! (instead 7O2 is used...) */ /* warning 7N1 isn't possible! (instead 7O2 is used...) */
int parity = (cflag & PARENB) ? ((cflag & PARODD) ? 0x0c : 0x08) : 0x04; int parity = (cflag & PARENB) ? ((cflag & PARODD) ? 0x0c : 0x08) : 0x04;
int div; int div;
/* 4800 selects 7812.5, 115200 selects 500000, all other (incl. 9600 as /* 4800 selects 7812.5, 115200 selects 500000, all other (incl. 9600 as
* default) the standard MIDI speed 31250. */ * default) the standard MIDI speed 31250. */
if (cflag & CBAUDEX) if (cflag & CBAUDEX)
baud += B38400; baud += B38400;
if (baud == B4800) if (baud == B4800)
div = ACIA_DIV64; /* really 7812.5 bps */ div = ACIA_DIV64; /* really 7812.5 bps */
else if (baud == B38400+2 /* 115200 */) else if (baud == B38400+2 /* 115200 */)
div = ACIA_DIV1; /* really 500 kbps (does that work??) */ div = ACIA_DIV1; /* really 500 kbps (does that work??) */
else else
div = ACIA_DIV16; /* 31250 bps, standard for MIDI */ div = ACIA_DIV16; /* 31250 bps, standard for MIDI */
/* RTS low, ints disabled */ /* RTS low, ints disabled */
acia.mid_ctrl = div | csize | parity | acia.mid_ctrl = div | csize | parity |
((atari_switches & ATARI_SWITCH_MIDI) ? ((atari_switches & ATARI_SWITCH_MIDI) ?
ACIA_RHTID : ACIA_RLTID); ACIA_RHTID : ACIA_RLTID);
} }
void __init atari_debug_init(void) void __init atari_debug_init(void)
{ {
if (!strcmp( m68k_debug_device, "ser" )) { if (!strcmp(m68k_debug_device, "ser")) {
/* defaults to ser2 for a Falcon and ser1 otherwise */ /* defaults to ser2 for a Falcon and ser1 otherwise */
strcpy( m68k_debug_device, MACH_IS_FALCON ? "ser2" : "ser1" ); strcpy(m68k_debug_device, MACH_IS_FALCON ? "ser2" : "ser1");
}
}
if (!strcmp( m68k_debug_device, "ser1" )) {
/* ST-MFP Modem1 serial port */
atari_init_mfp_port( B9600|CS8 );
atari_console_driver.write = atari_mfp_console_write;
}
else if (!strcmp( m68k_debug_device, "ser2" )) {
/* SCC Modem2 serial port */
atari_init_scc_port( B9600|CS8 );
atari_console_driver.write = atari_scc_console_write;
}
else if (!strcmp( m68k_debug_device, "midi" )) {
/* MIDI port */
atari_init_midi_port( B9600|CS8 );
atari_console_driver.write = atari_midi_console_write;
}
else if (!strcmp( m68k_debug_device, "par" )) {
/* parallel printer */
atari_turnoff_irq( IRQ_MFP_BUSY ); /* avoid ints */
sound_ym.rd_data_reg_sel = 7; /* select mixer control */
sound_ym.wd_data = 0xff; /* sound off, ports are output */
sound_ym.rd_data_reg_sel = 15; /* select port B */
sound_ym.wd_data = 0; /* no char */
sound_ym.rd_data_reg_sel = 14; /* select port A */
sound_ym.wd_data = sound_ym.rd_data_reg_sel | 0x20; /* strobe H */
atari_console_driver.write = atari_par_console_write;
}
if (atari_console_driver.write)
register_console(&atari_console_driver);
}
/* if (!strcmp(m68k_debug_device, "ser1")) {
* Local variables: /* ST-MFP Modem1 serial port */
* c-indent-level: 4 atari_init_mfp_port(B9600|CS8);
* tab-width: 8 atari_console_driver.write = atari_mfp_console_write;
* End: } else if (!strcmp(m68k_debug_device, "ser2")) {
*/ /* SCC Modem2 serial port */
atari_init_scc_port(B9600|CS8);
atari_console_driver.write = atari_scc_console_write;
} else if (!strcmp(m68k_debug_device, "midi")) {
/* MIDI port */
atari_init_midi_port(B9600|CS8);
atari_console_driver.write = atari_midi_console_write;
} else if (!strcmp(m68k_debug_device, "par")) {
/* parallel printer */
atari_turnoff_irq(IRQ_MFP_BUSY); /* avoid ints */
sound_ym.rd_data_reg_sel = 7; /* select mixer control */
sound_ym.wd_data = 0xff; /* sound off, ports are output */
sound_ym.rd_data_reg_sel = 15; /* select port B */
sound_ym.wd_data = 0; /* no char */
sound_ym.rd_data_reg_sel = 14; /* select port A */
sound_ym.wd_data = sound_ym.rd_data_reg_sel | 0x20; /* strobe H */
atari_console_driver.write = atari_par_console_write;
}
if (atari_console_driver.write)
register_console(&atari_console_driver);
}
...@@ -692,7 +692,7 @@ sys_call_table: ...@@ -692,7 +692,7 @@ sys_call_table:
.long sys_tgkill /* 265 */ .long sys_tgkill /* 265 */
.long sys_utimes .long sys_utimes
.long sys_fadvise64_64 .long sys_fadvise64_64
.long sys_mbind .long sys_mbind
.long sys_get_mempolicy .long sys_get_mempolicy
.long sys_set_mempolicy /* 270 */ .long sys_set_mempolicy /* 270 */
.long sys_mq_open .long sys_mq_open
......
...@@ -3195,7 +3195,7 @@ func_start serial_putc,%d0/%d1/%a0/%a1 ...@@ -3195,7 +3195,7 @@ func_start serial_putc,%d0/%d1/%a0/%a1
jbra L(serial_putc_done) jbra L(serial_putc_done)
3: 3:
#endif #endif
L(serial_putc_done): L(serial_putc_done):
func_return serial_putc func_return serial_putc
......
...@@ -133,78 +133,78 @@ extern void config_hp300(void); ...@@ -133,78 +133,78 @@ extern void config_hp300(void);
extern void config_q40(void); extern void config_q40(void);
extern void config_sun3x(void); extern void config_sun3x(void);
extern void mac_debugging_short (int, short);
extern void mac_debugging_long (int, long);
#define MASK_256K 0xfffc0000 #define MASK_256K 0xfffc0000
extern void paging_init(void); extern void paging_init(void);
static void __init m68k_parse_bootinfo(const struct bi_record *record) static void __init m68k_parse_bootinfo(const struct bi_record *record)
{ {
while (record->tag != BI_LAST) { while (record->tag != BI_LAST) {
int unknown = 0; int unknown = 0;
const unsigned long *data = record->data; const unsigned long *data = record->data;
switch (record->tag) {
case BI_MACHTYPE: switch (record->tag) {
case BI_CPUTYPE: case BI_MACHTYPE:
case BI_FPUTYPE: case BI_CPUTYPE:
case BI_MMUTYPE: case BI_FPUTYPE:
/* Already set up by head.S */ case BI_MMUTYPE:
break; /* Already set up by head.S */
break;
case BI_MEMCHUNK:
if (m68k_num_memory < NUM_MEMINFO) { case BI_MEMCHUNK:
m68k_memory[m68k_num_memory].addr = data[0]; if (m68k_num_memory < NUM_MEMINFO) {
m68k_memory[m68k_num_memory].size = data[1]; m68k_memory[m68k_num_memory].addr = data[0];
m68k_num_memory++; m68k_memory[m68k_num_memory].size = data[1];
} else m68k_num_memory++;
printk("m68k_parse_bootinfo: too many memory chunks\n"); } else
break; printk("m68k_parse_bootinfo: too many memory chunks\n");
break;
case BI_RAMDISK:
m68k_ramdisk.addr = data[0]; case BI_RAMDISK:
m68k_ramdisk.size = data[1]; m68k_ramdisk.addr = data[0];
break; m68k_ramdisk.size = data[1];
break;
case BI_COMMAND_LINE:
strlcpy(m68k_command_line, (const char *)data, sizeof(m68k_command_line)); case BI_COMMAND_LINE:
break; strlcpy(m68k_command_line, (const char *)data,
sizeof(m68k_command_line));
default: break;
if (MACH_IS_AMIGA)
unknown = amiga_parse_bootinfo(record); default:
else if (MACH_IS_ATARI) if (MACH_IS_AMIGA)
unknown = atari_parse_bootinfo(record); unknown = amiga_parse_bootinfo(record);
else if (MACH_IS_MAC) else if (MACH_IS_ATARI)
unknown = mac_parse_bootinfo(record); unknown = atari_parse_bootinfo(record);
else if (MACH_IS_Q40) else if (MACH_IS_MAC)
unknown = q40_parse_bootinfo(record); unknown = mac_parse_bootinfo(record);
else if (MACH_IS_BVME6000) else if (MACH_IS_Q40)
unknown = bvme6000_parse_bootinfo(record); unknown = q40_parse_bootinfo(record);
else if (MACH_IS_MVME16x) else if (MACH_IS_BVME6000)
unknown = mvme16x_parse_bootinfo(record); unknown = bvme6000_parse_bootinfo(record);
else if (MACH_IS_MVME147) else if (MACH_IS_MVME16x)
unknown = mvme147_parse_bootinfo(record); unknown = mvme16x_parse_bootinfo(record);
else if (MACH_IS_HP300) else if (MACH_IS_MVME147)
unknown = hp300_parse_bootinfo(record); unknown = mvme147_parse_bootinfo(record);
else else if (MACH_IS_HP300)
unknown = 1; unknown = hp300_parse_bootinfo(record);
else
unknown = 1;
}
if (unknown)
printk("m68k_parse_bootinfo: unknown tag 0x%04x ignored\n",
record->tag);
record = (struct bi_record *)((unsigned long)record +
record->size);
} }
if (unknown)
printk("m68k_parse_bootinfo: unknown tag 0x%04x ignored\n",
record->tag);
record = (struct bi_record *)((unsigned long)record+record->size);
}
m68k_realnum_memory = m68k_num_memory; m68k_realnum_memory = m68k_num_memory;
#ifdef CONFIG_SINGLE_MEMORY_CHUNK #ifdef CONFIG_SINGLE_MEMORY_CHUNK
if (m68k_num_memory > 1) { if (m68k_num_memory > 1) {
printk("Ignoring last %i chunks of physical memory\n", printk("Ignoring last %i chunks of physical memory\n",
(m68k_num_memory - 1)); (m68k_num_memory - 1));
m68k_num_memory = 1; m68k_num_memory = 1;
} }
m68k_memoffset = m68k_memory[0].addr-PAGE_OFFSET; m68k_memoffset = m68k_memory[0].addr-PAGE_OFFSET;
#endif #endif
} }
...@@ -234,7 +234,7 @@ void __init setup_arch(char **cmdline_p) ...@@ -234,7 +234,7 @@ void __init setup_arch(char **cmdline_p)
/* clear the fpu if we have one */ /* clear the fpu if we have one */
if (m68k_fputype & (FPU_68881|FPU_68882|FPU_68040|FPU_68060)) { if (m68k_fputype & (FPU_68881|FPU_68882|FPU_68040|FPU_68060)) {
volatile int zero = 0; volatile int zero = 0;
asm __volatile__ ("frestore %0" : : "m" (zero)); asm volatile ("frestore %0" : : "m" (zero));
} }
#endif #endif
...@@ -262,32 +262,35 @@ void __init setup_arch(char **cmdline_p) ...@@ -262,32 +262,35 @@ void __init setup_arch(char **cmdline_p)
* For the m68k, this is currently only "debug=xxx" to enable printing * For the m68k, this is currently only "debug=xxx" to enable printing
* certain kernel messages to some machine-specific device. * certain kernel messages to some machine-specific device.
*/ */
for( p = *cmdline_p; p && *p; ) { for (p = *cmdline_p; p && *p;) {
i = 0; i = 0;
if (!strncmp( p, "debug=", 6 )) { if (!strncmp(p, "debug=", 6)) {
strlcpy( m68k_debug_device, p+6, sizeof(m68k_debug_device) ); strlcpy(m68k_debug_device, p+6, sizeof(m68k_debug_device));
if ((q = strchr( m68k_debug_device, ' ' ))) *q = 0; q = strchr(m68k_debug_device, ' ');
i = 1; if (q)
} *q = 0;
i = 1;
}
#ifdef CONFIG_ATARI #ifdef CONFIG_ATARI
/* This option must be parsed very early */ /* This option must be parsed very early */
if (!strncmp( p, "switches=", 9 )) { if (!strncmp(p, "switches=", 9)) {
extern void atari_switches_setup( const char *, int ); extern void atari_switches_setup(const char *, int);
atari_switches_setup( p+9, (q = strchr( p+9, ' ' )) ? q = strchr(p + 9, ' ');
(q - (p+9)) : strlen(p+9) ); atari_switches_setup(p + 9, q ? (q - (p + 9)) : strlen(p + 9));
i = 1; i = 1;
} }
#endif #endif
if (i) { if (i) {
/* option processed, delete it */ /* option processed, delete it */
if ((q = strchr( p, ' ' ))) if ((q = strchr(p, ' ')))
strcpy( p, q+1 ); strcpy(p, q + 1);
else else
*p = 0; *p = 0;
} else { } else {
if ((p = strchr( p, ' ' ))) ++p; if ((p = strchr(p, ' ')))
} ++p;
}
} }
#ifdef CONFIG_DUMMY_CONSOLE #ifdef CONFIG_DUMMY_CONSOLE
...@@ -296,62 +299,62 @@ void __init setup_arch(char **cmdline_p) ...@@ -296,62 +299,62 @@ void __init setup_arch(char **cmdline_p)
switch (m68k_machtype) { switch (m68k_machtype) {
#ifdef CONFIG_AMIGA #ifdef CONFIG_AMIGA
case MACH_AMIGA: case MACH_AMIGA:
config_amiga(); config_amiga();
break; break;
#endif #endif
#ifdef CONFIG_ATARI #ifdef CONFIG_ATARI
case MACH_ATARI: case MACH_ATARI:
config_atari(); config_atari();
break; break;
#endif #endif
#ifdef CONFIG_MAC #ifdef CONFIG_MAC
case MACH_MAC: case MACH_MAC:
config_mac(); config_mac();
break; break;
#endif #endif
#ifdef CONFIG_SUN3 #ifdef CONFIG_SUN3
case MACH_SUN3: case MACH_SUN3:
config_sun3(); config_sun3();
break; break;
#endif #endif
#ifdef CONFIG_APOLLO #ifdef CONFIG_APOLLO
case MACH_APOLLO: case MACH_APOLLO:
config_apollo(); config_apollo();
break; break;
#endif #endif
#ifdef CONFIG_MVME147 #ifdef CONFIG_MVME147
case MACH_MVME147: case MACH_MVME147:
config_mvme147(); config_mvme147();
break; break;
#endif #endif
#ifdef CONFIG_MVME16x #ifdef CONFIG_MVME16x
case MACH_MVME16x: case MACH_MVME16x:
config_mvme16x(); config_mvme16x();
break; break;
#endif #endif
#ifdef CONFIG_BVME6000 #ifdef CONFIG_BVME6000
case MACH_BVME6000: case MACH_BVME6000:
config_bvme6000(); config_bvme6000();
break; break;
#endif #endif
#ifdef CONFIG_HP300 #ifdef CONFIG_HP300
case MACH_HP300: case MACH_HP300:
config_hp300(); config_hp300();
break; break;
#endif #endif
#ifdef CONFIG_Q40 #ifdef CONFIG_Q40
case MACH_Q40: case MACH_Q40:
config_q40(); config_q40();
break; break;
#endif #endif
#ifdef CONFIG_SUN3X #ifdef CONFIG_SUN3X
case MACH_SUN3X: case MACH_SUN3X:
config_sun3x(); config_sun3x();
break; break;
#endif #endif
default: default:
panic ("No configuration setup"); panic("No configuration setup");
} }
#ifndef CONFIG_SUN3 #ifndef CONFIG_SUN3
...@@ -380,7 +383,7 @@ void __init setup_arch(char **cmdline_p) ...@@ -380,7 +383,7 @@ void __init setup_arch(char **cmdline_p)
reserve_bootmem(m68k_ramdisk.addr, m68k_ramdisk.size); reserve_bootmem(m68k_ramdisk.addr, m68k_ramdisk.size);
initrd_start = (unsigned long)phys_to_virt(m68k_ramdisk.addr); initrd_start = (unsigned long)phys_to_virt(m68k_ramdisk.addr);
initrd_end = initrd_start + m68k_ramdisk.size; initrd_end = initrd_start + m68k_ramdisk.size;
printk ("initrd: %08lx - %08lx\n", initrd_start, initrd_end); printk("initrd: %08lx - %08lx\n", initrd_start, initrd_end);
} }
#endif #endif
...@@ -402,18 +405,18 @@ void __init setup_arch(char **cmdline_p) ...@@ -402,18 +405,18 @@ void __init setup_arch(char **cmdline_p)
#if defined(CONFIG_ISA) && defined(MULTI_ISA) #if defined(CONFIG_ISA) && defined(MULTI_ISA)
#if defined(CONFIG_Q40) #if defined(CONFIG_Q40)
if (MACH_IS_Q40) { if (MACH_IS_Q40) {
isa_type = Q40_ISA; isa_type = Q40_ISA;
isa_sex = 0; isa_sex = 0;
} }
#elif defined(CONFIG_GG2) #elif defined(CONFIG_GG2)
if (MACH_IS_AMIGA && AMIGAHW_PRESENT(GG2_ISA)){ if (MACH_IS_AMIGA && AMIGAHW_PRESENT(GG2_ISA)) {
isa_type = GG2_ISA; isa_type = GG2_ISA;
isa_sex = 0; isa_sex = 0;
} }
#elif defined(CONFIG_AMIGA_PCMCIA) #elif defined(CONFIG_AMIGA_PCMCIA)
if (MACH_IS_AMIGA && AMIGAHW_PRESENT(PCMCIA)){ if (MACH_IS_AMIGA && AMIGAHW_PRESENT(PCMCIA)) {
isa_type = AG_ISA; isa_type = AG_ISA;
isa_sex = 1; isa_sex = 1;
} }
#endif #endif
#endif #endif
...@@ -421,66 +424,66 @@ void __init setup_arch(char **cmdline_p) ...@@ -421,66 +424,66 @@ void __init setup_arch(char **cmdline_p)
static int show_cpuinfo(struct seq_file *m, void *v) static int show_cpuinfo(struct seq_file *m, void *v)
{ {
const char *cpu, *mmu, *fpu; const char *cpu, *mmu, *fpu;
unsigned long clockfreq, clockfactor; unsigned long clockfreq, clockfactor;
#define LOOP_CYCLES_68020 (8) #define LOOP_CYCLES_68020 (8)
#define LOOP_CYCLES_68030 (8) #define LOOP_CYCLES_68030 (8)
#define LOOP_CYCLES_68040 (3) #define LOOP_CYCLES_68040 (3)
#define LOOP_CYCLES_68060 (1) #define LOOP_CYCLES_68060 (1)
if (CPU_IS_020) { if (CPU_IS_020) {
cpu = "68020"; cpu = "68020";
clockfactor = LOOP_CYCLES_68020; clockfactor = LOOP_CYCLES_68020;
} else if (CPU_IS_030) { } else if (CPU_IS_030) {
cpu = "68030"; cpu = "68030";
clockfactor = LOOP_CYCLES_68030; clockfactor = LOOP_CYCLES_68030;
} else if (CPU_IS_040) { } else if (CPU_IS_040) {
cpu = "68040"; cpu = "68040";
clockfactor = LOOP_CYCLES_68040; clockfactor = LOOP_CYCLES_68040;
} else if (CPU_IS_060) { } else if (CPU_IS_060) {
cpu = "68060"; cpu = "68060";
clockfactor = LOOP_CYCLES_68060; clockfactor = LOOP_CYCLES_68060;
} else { } else {
cpu = "680x0"; cpu = "680x0";
clockfactor = 0; clockfactor = 0;
} }
#ifdef CONFIG_M68KFPU_EMU_ONLY #ifdef CONFIG_M68KFPU_EMU_ONLY
fpu="none(soft float)"; fpu = "none(soft float)";
#else #else
if (m68k_fputype & FPU_68881) if (m68k_fputype & FPU_68881)
fpu = "68881"; fpu = "68881";
else if (m68k_fputype & FPU_68882) else if (m68k_fputype & FPU_68882)
fpu = "68882"; fpu = "68882";
else if (m68k_fputype & FPU_68040) else if (m68k_fputype & FPU_68040)
fpu = "68040"; fpu = "68040";
else if (m68k_fputype & FPU_68060) else if (m68k_fputype & FPU_68060)
fpu = "68060"; fpu = "68060";
else if (m68k_fputype & FPU_SUNFPA) else if (m68k_fputype & FPU_SUNFPA)
fpu = "Sun FPA"; fpu = "Sun FPA";
else else
fpu = "none"; fpu = "none";
#endif #endif
if (m68k_mmutype & MMU_68851) if (m68k_mmutype & MMU_68851)
mmu = "68851"; mmu = "68851";
else if (m68k_mmutype & MMU_68030) else if (m68k_mmutype & MMU_68030)
mmu = "68030"; mmu = "68030";
else if (m68k_mmutype & MMU_68040) else if (m68k_mmutype & MMU_68040)
mmu = "68040"; mmu = "68040";
else if (m68k_mmutype & MMU_68060) else if (m68k_mmutype & MMU_68060)
mmu = "68060"; mmu = "68060";
else if (m68k_mmutype & MMU_SUN3) else if (m68k_mmutype & MMU_SUN3)
mmu = "Sun-3"; mmu = "Sun-3";
else if (m68k_mmutype & MMU_APOLLO) else if (m68k_mmutype & MMU_APOLLO)
mmu = "Apollo"; mmu = "Apollo";
else else
mmu = "unknown"; mmu = "unknown";
clockfreq = loops_per_jiffy*HZ*clockfactor; clockfreq = loops_per_jiffy * HZ * clockfactor;
seq_printf(m, "CPU:\t\t%s\n" seq_printf(m, "CPU:\t\t%s\n"
"MMU:\t\t%s\n" "MMU:\t\t%s\n"
"FPU:\t\t%s\n" "FPU:\t\t%s\n"
"Clocking:\t%lu.%1luMHz\n" "Clocking:\t%lu.%1luMHz\n"
...@@ -490,7 +493,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) ...@@ -490,7 +493,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
clockfreq/1000000,(clockfreq/100000)%10, clockfreq/1000000,(clockfreq/100000)%10,
loops_per_jiffy/(500000/HZ),(loops_per_jiffy/(5000/HZ))%100, loops_per_jiffy/(500000/HZ),(loops_per_jiffy/(5000/HZ))%100,
loops_per_jiffy); loops_per_jiffy);
return 0; return 0;
} }
static void *c_start(struct seq_file *m, loff_t *pos) static void *c_start(struct seq_file *m, loff_t *pos)
...@@ -506,44 +509,44 @@ static void c_stop(struct seq_file *m, void *v) ...@@ -506,44 +509,44 @@ static void c_stop(struct seq_file *m, void *v)
{ {
} }
struct seq_operations cpuinfo_op = { struct seq_operations cpuinfo_op = {
.start = c_start, .start = c_start,
.next = c_next, .next = c_next,
.stop = c_stop, .stop = c_stop,
.show = show_cpuinfo, .show = show_cpuinfo,
}; };
int get_hardware_list(char *buffer) int get_hardware_list(char *buffer)
{ {
int len = 0; int len = 0;
char model[80]; char model[80];
unsigned long mem; unsigned long mem;
int i; int i;
if (mach_get_model) if (mach_get_model)
mach_get_model(model); mach_get_model(model);
else else
strcpy(model, "Unknown m68k"); strcpy(model, "Unknown m68k");
len += sprintf(buffer+len, "Model:\t\t%s\n", model); len += sprintf(buffer + len, "Model:\t\t%s\n", model);
for (mem = 0, i = 0; i < m68k_num_memory; i++) for (mem = 0, i = 0; i < m68k_num_memory; i++)
mem += m68k_memory[i].size; mem += m68k_memory[i].size;
len += sprintf(buffer+len, "System Memory:\t%ldK\n", mem>>10); len += sprintf(buffer + len, "System Memory:\t%ldK\n", mem >> 10);
if (mach_get_hardware_list) if (mach_get_hardware_list)
len += mach_get_hardware_list(buffer+len); len += mach_get_hardware_list(buffer + len);
return(len); return len;
} }
void check_bugs(void) void check_bugs(void)
{ {
#ifndef CONFIG_M68KFPU_EMU #ifndef CONFIG_M68KFPU_EMU
if (m68k_fputype == 0) { if (m68k_fputype == 0) {
printk( KERN_EMERG "*** YOU DO NOT HAVE A FLOATING POINT UNIT, " printk(KERN_EMERG "*** YOU DO NOT HAVE A FLOATING POINT UNIT, "
"WHICH IS REQUIRED BY LINUX/M68K ***\n" ); "WHICH IS REQUIRED BY LINUX/M68K ***\n");
printk( KERN_EMERG "Upgrade your hardware or join the FPU " printk(KERN_EMERG "Upgrade your hardware or join the FPU "
"emulation project\n" ); "emulation project\n");
panic( "no FPU" ); panic("no FPU");
} }
#endif /* !CONFIG_M68KFPU_EMU */ #endif /* !CONFIG_M68KFPU_EMU */
} }
...@@ -59,15 +59,15 @@ extern struct mem_info m68k_ramdisk; ...@@ -59,15 +59,15 @@ extern struct mem_info m68k_ramdisk;
extern char m68k_command_line[CL_SIZE]; extern char m68k_command_line[CL_SIZE];
void *mac_env; /* Loaded by the boot asm */ void *mac_env; /* Loaded by the boot asm */
/* The phys. video addr. - might be bogus on some machines */ /* The phys. video addr. - might be bogus on some machines */
unsigned long mac_orig_videoaddr; unsigned long mac_orig_videoaddr;
/* Mac specific timer functions */ /* Mac specific timer functions */
extern unsigned long mac_gettimeoffset (void); extern unsigned long mac_gettimeoffset(void);
extern int mac_hwclk (int, struct rtc_time *); extern int mac_hwclk(int, struct rtc_time *);
extern int mac_set_clock_mmss (unsigned long); extern int mac_set_clock_mmss(unsigned long);
extern int show_mac_interrupts(struct seq_file *, void *); extern int show_mac_interrupts(struct seq_file *, void *);
extern void iop_preinit(void); extern void iop_preinit(void);
extern void iop_init(void); extern void iop_init(void);
...@@ -99,51 +99,52 @@ static void mac_sched_init(irq_handler_t vector) ...@@ -99,51 +99,52 @@ static void mac_sched_init(irq_handler_t vector)
int __init mac_parse_bootinfo(const struct bi_record *record) int __init mac_parse_bootinfo(const struct bi_record *record)
{ {
int unknown = 0; int unknown = 0;
const u_long *data = record->data; const u_long *data = record->data;
switch (record->tag) { switch (record->tag) {
case BI_MAC_MODEL: case BI_MAC_MODEL:
mac_bi_data.id = *data; mac_bi_data.id = *data;
break; break;
case BI_MAC_VADDR: case BI_MAC_VADDR:
mac_bi_data.videoaddr = *data; mac_bi_data.videoaddr = *data;
break; break;
case BI_MAC_VDEPTH: case BI_MAC_VDEPTH:
mac_bi_data.videodepth = *data; mac_bi_data.videodepth = *data;
break; break;
case BI_MAC_VROW: case BI_MAC_VROW:
mac_bi_data.videorow = *data; mac_bi_data.videorow = *data;
break; break;
case BI_MAC_VDIM: case BI_MAC_VDIM:
mac_bi_data.dimensions = *data; mac_bi_data.dimensions = *data;
break; break;
case BI_MAC_VLOGICAL: case BI_MAC_VLOGICAL:
mac_bi_data.videological = VIDEOMEMBASE + (*data & ~VIDEOMEMMASK); mac_bi_data.videological = VIDEOMEMBASE + (*data & ~VIDEOMEMMASK);
mac_orig_videoaddr = *data; mac_orig_videoaddr = *data;
break; break;
case BI_MAC_SCCBASE: case BI_MAC_SCCBASE:
mac_bi_data.sccbase = *data; mac_bi_data.sccbase = *data;
break; break;
case BI_MAC_BTIME: case BI_MAC_BTIME:
mac_bi_data.boottime = *data; mac_bi_data.boottime = *data;
break; break;
case BI_MAC_GMTBIAS: case BI_MAC_GMTBIAS:
mac_bi_data.gmtbias = *data; mac_bi_data.gmtbias = *data;
break; break;
case BI_MAC_MEMSIZE: case BI_MAC_MEMSIZE:
mac_bi_data.memsize = *data; mac_bi_data.memsize = *data;
break; break;
case BI_MAC_CPUID: case BI_MAC_CPUID:
mac_bi_data.cpuid = *data; mac_bi_data.cpuid = *data;
break; break;
case BI_MAC_ROMBASE: case BI_MAC_ROMBASE:
mac_bi_data.rombase = *data; mac_bi_data.rombase = *data;
break; break;
default: default:
unknown = 1; unknown = 1;
} break;
return(unknown); }
return unknown;
} }
/* /*
...@@ -155,6 +156,7 @@ int __init mac_parse_bootinfo(const struct bi_record *record) ...@@ -155,6 +156,7 @@ int __init mac_parse_bootinfo(const struct bi_record *record)
static void mac_cache_card_flush(int writeback) static void mac_cache_card_flush(int writeback)
{ {
unsigned long flags; unsigned long flags;
local_irq_save(flags); local_irq_save(flags);
via_flush_cache(); via_flush_cache();
local_irq_restore(flags); local_irq_restore(flags);
...@@ -162,28 +164,27 @@ static void mac_cache_card_flush(int writeback) ...@@ -162,28 +164,27 @@ static void mac_cache_card_flush(int writeback)
void __init config_mac(void) void __init config_mac(void)
{ {
if (!MACH_IS_MAC) { if (!MACH_IS_MAC)
printk(KERN_ERR "ERROR: no Mac, but config_mac() called!! \n"); printk(KERN_ERR "ERROR: no Mac, but config_mac() called!! \n");
}
mach_sched_init = mac_sched_init; mach_sched_init = mac_sched_init;
mach_init_IRQ = mac_init_IRQ; mach_init_IRQ = mac_init_IRQ;
mach_get_model = mac_get_model; mach_get_model = mac_get_model;
mach_gettimeoffset = mac_gettimeoffset; mach_gettimeoffset = mac_gettimeoffset;
#warning move to adb/via init #warning move to adb/via init
#if 0 #if 0
mach_hwclk = mac_hwclk; mach_hwclk = mac_hwclk;
#endif #endif
mach_set_clock_mmss = mac_set_clock_mmss; mach_set_clock_mmss = mac_set_clock_mmss;
mach_reset = mac_reset; mach_reset = mac_reset;
mach_halt = mac_poweroff; mach_halt = mac_poweroff;
mach_power_off = mac_poweroff; mach_power_off = mac_poweroff;
mach_max_dma_address = 0xffffffff; mach_max_dma_address = 0xffffffff;
#if 0 #if 0
mach_debug_init = mac_debug_init; mach_debug_init = mac_debug_init;
#endif #endif
#if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE) #if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE)
mach_beep = mac_mksound; mach_beep = mac_mksound;
#endif #endif
#ifdef CONFIG_HEARTBEAT #ifdef CONFIG_HEARTBEAT
#if 0 #if 0
...@@ -199,21 +200,22 @@ void __init config_mac(void) ...@@ -199,21 +200,22 @@ void __init config_mac(void)
mac_identify(); mac_identify();
mac_report_hardware(); mac_report_hardware();
/* AFAIK only the IIci takes a cache card. The IIfx has onboard /*
cache ... someone needs to figure out how to tell if it's on or * AFAIK only the IIci takes a cache card. The IIfx has onboard
not. */ * cache ... someone needs to figure out how to tell if it's on or
* not.
*/
if (macintosh_config->ident == MAC_MODEL_IICI if (macintosh_config->ident == MAC_MODEL_IICI
|| macintosh_config->ident == MAC_MODEL_IIFX) { || macintosh_config->ident == MAC_MODEL_IIFX)
mach_l2_flush = mac_cache_card_flush; mach_l2_flush = mac_cache_card_flush;
}
/* /*
* Check for machine specific fixups. * Check for machine specific fixups.
*/ */
#ifdef OLD_NUBUS_CODE #ifdef OLD_NUBUS_CODE
nubus_sweep_video(); nubus_sweep_video();
#endif #endif
} }
...@@ -233,8 +235,7 @@ void __init config_mac(void) ...@@ -233,8 +235,7 @@ void __init config_mac(void)
struct mac_model *macintosh_config; struct mac_model *macintosh_config;
EXPORT_SYMBOL(macintosh_config); EXPORT_SYMBOL(macintosh_config);
static struct mac_model mac_data_table[]= static struct mac_model mac_data_table[] = {
{
/* /*
* We'll pretend to be a Macintosh II, that's pretty safe. * We'll pretend to be a Macintosh II, that's pretty safe.
*/ */
...@@ -784,12 +785,12 @@ void mac_identify(void) ...@@ -784,12 +785,12 @@ void mac_identify(void)
if (!model) { if (!model) {
/* no bootinfo model id -> NetBSD booter was used! */ /* no bootinfo model id -> NetBSD booter was used! */
/* XXX FIXME: breaks for model > 31 */ /* XXX FIXME: breaks for model > 31 */
model=(mac_bi_data.cpuid>>2)&63; model = (mac_bi_data.cpuid >> 2) & 63;
printk (KERN_WARNING "No bootinfo model ID, using cpuid instead (hey, use Penguin!)\n"); printk(KERN_WARNING "No bootinfo model ID, using cpuid instead (hey, use Penguin!)\n");
} }
macintosh_config = mac_data_table; macintosh_config = mac_data_table;
for (m = macintosh_config ; m->ident != -1 ; m++) { for (m = macintosh_config; m->ident != -1; m++) {
if (m->ident == model) { if (m->ident == model) {
macintosh_config = m; macintosh_config = m;
break; break;
...@@ -803,25 +804,25 @@ void mac_identify(void) ...@@ -803,25 +804,25 @@ void mac_identify(void)
iop_preinit(); iop_preinit();
mac_debug_init(); mac_debug_init();
printk (KERN_INFO "Detected Macintosh model: %d \n", model); printk(KERN_INFO "Detected Macintosh model: %d \n", model);
/* /*
* Report booter data: * Report booter data:
*/ */
printk (KERN_DEBUG " Penguin bootinfo data:\n"); printk(KERN_DEBUG " Penguin bootinfo data:\n");
printk (KERN_DEBUG " Video: addr 0x%lx row 0x%lx depth %lx dimensions %ld x %ld\n", printk(KERN_DEBUG " Video: addr 0x%lx row 0x%lx depth %lx dimensions %ld x %ld\n",
mac_bi_data.videoaddr, mac_bi_data.videorow, mac_bi_data.videoaddr, mac_bi_data.videorow,
mac_bi_data.videodepth, mac_bi_data.dimensions & 0xFFFF, mac_bi_data.videodepth, mac_bi_data.dimensions & 0xFFFF,
mac_bi_data.dimensions >> 16); mac_bi_data.dimensions >> 16);
printk (KERN_DEBUG " Videological 0x%lx phys. 0x%lx, SCC at 0x%lx \n", printk(KERN_DEBUG " Videological 0x%lx phys. 0x%lx, SCC at 0x%lx \n",
mac_bi_data.videological, mac_orig_videoaddr, mac_bi_data.videological, mac_orig_videoaddr,
mac_bi_data.sccbase); mac_bi_data.sccbase);
printk (KERN_DEBUG " Boottime: 0x%lx GMTBias: 0x%lx \n", printk(KERN_DEBUG " Boottime: 0x%lx GMTBias: 0x%lx \n",
mac_bi_data.boottime, mac_bi_data.gmtbias); mac_bi_data.boottime, mac_bi_data.gmtbias);
printk (KERN_DEBUG " Machine ID: %ld CPUid: 0x%lx memory size: 0x%lx \n", printk(KERN_DEBUG " Machine ID: %ld CPUid: 0x%lx memory size: 0x%lx \n",
mac_bi_data.id, mac_bi_data.cpuid, mac_bi_data.memsize); mac_bi_data.id, mac_bi_data.cpuid, mac_bi_data.memsize);
#if 0 #if 0
printk ("Ramdisk: addr 0x%lx size 0x%lx\n", printk("Ramdisk: addr 0x%lx size 0x%lx\n",
m68k_ramdisk.addr, m68k_ramdisk.size); m68k_ramdisk.addr, m68k_ramdisk.size);
#endif #endif
...@@ -830,22 +831,22 @@ void mac_identify(void) ...@@ -830,22 +831,22 @@ void mac_identify(void)
*/ */
switch (macintosh_config->scsi_type) { switch (macintosh_config->scsi_type) {
case MAC_SCSI_OLD: case MAC_SCSI_OLD:
MACHW_SET(MAC_SCSI_80); MACHW_SET(MAC_SCSI_80);
break; break;
case MAC_SCSI_QUADRA: case MAC_SCSI_QUADRA:
case MAC_SCSI_QUADRA2: case MAC_SCSI_QUADRA2:
case MAC_SCSI_QUADRA3: case MAC_SCSI_QUADRA3:
MACHW_SET(MAC_SCSI_96); MACHW_SET(MAC_SCSI_96);
if ((macintosh_config->ident == MAC_MODEL_Q900) || if ((macintosh_config->ident == MAC_MODEL_Q900) ||
(macintosh_config->ident == MAC_MODEL_Q950)) (macintosh_config->ident == MAC_MODEL_Q950))
MACHW_SET(MAC_SCSI_96_2); MACHW_SET(MAC_SCSI_96_2);
break; break;
default: default:
printk(KERN_WARNING "config.c: wtf: unknown scsi, using 53c80\n"); printk(KERN_WARNING "config.c: wtf: unknown scsi, using 53c80\n");
MACHW_SET(MAC_SCSI_80); MACHW_SET(MAC_SCSI_80);
break; break;
} }
iop_init(); iop_init();
via_init(); via_init();
oss_init(); oss_init();
...@@ -860,6 +861,6 @@ void mac_report_hardware(void) ...@@ -860,6 +861,6 @@ void mac_report_hardware(void)
static void mac_get_model(char *str) static void mac_get_model(char *str)
{ {
strcpy(str,"Macintosh "); strcpy(str, "Macintosh ");
strcat(str, macintosh_config->name); strcat(str, macintosh_config->name);
} }
...@@ -52,7 +52,7 @@ extern void mac_serial_print(const char *); ...@@ -52,7 +52,7 @@ extern void mac_serial_print(const char *);
*/ */
#ifdef DEBUG_SCREEN #ifdef DEBUG_SCREEN
static int peng=0, line=0; static int peng, line;
#endif #endif
void mac_debugging_short(int pos, short num) void mac_debugging_short(int pos, short num)
...@@ -74,15 +74,14 @@ void mac_debugging_short(int pos, short num) ...@@ -74,15 +74,14 @@ void mac_debugging_short(int pos, short num)
} }
/* calculate current offset */ /* calculate current offset */
pengoffset=(unsigned char *)(mac_videobase+(150+line*2)*mac_rowbytes) pengoffset = (unsigned char *)mac_videobase +
+80*peng; (150+line*2) * mac_rowbytes) + 80 * peng;
pptr=pengoffset; pptr = pengoffset;
for(i=0;i<8*sizeof(short);i++) /* # of bits */ for (i = 0; i < 8 * sizeof(short); i++) { /* # of bits */
{
/* value mask for bit i, reverse order */ /* value mask for bit i, reverse order */
*pptr++ = (num & ( 1 << (8*sizeof(short)-i-1) ) ? 0xFF : 0x00); *pptr++ = (num & (1 << (8*sizeof(short)-i-1)) ? 0xFF : 0x00);
} }
peng++; peng++;
...@@ -115,11 +114,10 @@ void mac_debugging_long(int pos, long addr) ...@@ -115,11 +114,10 @@ void mac_debugging_long(int pos, long addr)
pengoffset=(unsigned char *)(mac_videobase+(150+line*2)*mac_rowbytes) pengoffset=(unsigned char *)(mac_videobase+(150+line*2)*mac_rowbytes)
+80*peng; +80*peng;
pptr=pengoffset; pptr = pengoffset;
for(i=0;i<8*sizeof(long);i++) /* # of bits */ for (i = 0; i < 8 * sizeof(long); i++) { /* # of bits */
{ *pptr++ = (addr & (1 << (8*sizeof(long)-i-1)) ? 0xFF : 0x00);
*pptr++ = (addr & ( 1 << (8*sizeof(long)-i-1) ) ? 0xFF : 0x00);
} }
peng++; peng++;
...@@ -136,16 +134,15 @@ void mac_debugging_long(int pos, long addr) ...@@ -136,16 +134,15 @@ void mac_debugging_long(int pos, long addr)
* TODO: serial debug code * TODO: serial debug code
*/ */
struct mac_SCC struct mac_SCC {
{ u_char cha_b_ctrl;
u_char cha_b_ctrl; u_char char_dummy1;
u_char char_dummy1; u_char cha_a_ctrl;
u_char cha_a_ctrl; u_char char_dummy2;
u_char char_dummy2; u_char cha_b_data;
u_char cha_b_data; u_char char_dummy3;
u_char char_dummy3; u_char cha_a_data;
u_char cha_a_data; };
};
# define scc (*((volatile struct mac_SCC*)mac_bi_data.sccbase)) # define scc (*((volatile struct mac_SCC*)mac_bi_data.sccbase))
...@@ -158,9 +155,9 @@ int mac_SCC_reset_done; ...@@ -158,9 +155,9 @@ int mac_SCC_reset_done;
static int scc_port = -1; static int scc_port = -1;
static struct console mac_console_driver = { static struct console mac_console_driver = {
.name = "debug", .name = "debug",
.flags = CON_PRINTBUFFER, .flags = CON_PRINTBUFFER,
.index = -1, .index = -1,
}; };
/* /*
...@@ -178,8 +175,8 @@ static struct console mac_console_driver = { ...@@ -178,8 +175,8 @@ static struct console mac_console_driver = {
* this driver if Mac. * this driver if Mac.
*/ */
void mac_debug_console_write (struct console *co, const char *str, void mac_debug_console_write(struct console *co, const char *str,
unsigned int count) unsigned int count)
{ {
mac_serial_print(str); mac_serial_print(str);
} }
...@@ -190,48 +187,50 @@ void mac_debug_console_write (struct console *co, const char *str, ...@@ -190,48 +187,50 @@ void mac_debug_console_write (struct console *co, const char *str,
#define uSEC 1 #define uSEC 1
static inline void mac_sccb_out (char c) static inline void mac_sccb_out(char c)
{ {
int i; int i;
do {
for( i = uSEC; i > 0; --i ) do {
for (i = uSEC; i > 0; --i)
barrier();
} while (!(scc.cha_b_ctrl & 0x04)); /* wait for tx buf empty */
for (i = uSEC; i > 0; --i)
barrier(); barrier();
} while (!(scc.cha_b_ctrl & 0x04)); /* wait for tx buf empty */ scc.cha_b_data = c;
for( i = uSEC; i > 0; --i )
barrier();
scc.cha_b_data = c;
} }
static inline void mac_scca_out (char c) static inline void mac_scca_out(char c)
{ {
int i; int i;
do {
for( i = uSEC; i > 0; --i ) do {
for (i = uSEC; i > 0; --i)
barrier();
} while (!(scc.cha_a_ctrl & 0x04)); /* wait for tx buf empty */
for (i = uSEC; i > 0; --i)
barrier(); barrier();
} while (!(scc.cha_a_ctrl & 0x04)); /* wait for tx buf empty */ scc.cha_a_data = c;
for( i = uSEC; i > 0; --i )
barrier();
scc.cha_a_data = c;
} }
void mac_sccb_console_write (struct console *co, const char *str, void mac_sccb_console_write(struct console *co, const char *str,
unsigned int count) unsigned int count)
{ {
while (count--) { while (count--) {
if (*str == '\n') if (*str == '\n')
mac_sccb_out( '\r' ); mac_sccb_out('\r');
mac_sccb_out( *str++ ); mac_sccb_out(*str++);
} }
} }
void mac_scca_console_write (struct console *co, const char *str, void mac_scca_console_write(struct console *co, const char *str,
unsigned int count) unsigned int count)
{ {
while (count--) { while (count--) {
if (*str == '\n') if (*str == '\n')
mac_scca_out( '\r' ); mac_scca_out('\r');
mac_scca_out( *str++ ); mac_scca_out(*str++);
} }
} }
...@@ -239,41 +238,41 @@ void mac_scca_console_write (struct console *co, const char *str, ...@@ -239,41 +238,41 @@ void mac_scca_console_write (struct console *co, const char *str,
* SCC serial ports. They're used by the debugging interface, kgdb, and the * SCC serial ports. They're used by the debugging interface, kgdb, and the
* serial console code. */ * serial console code. */
#define SCCB_WRITE(reg,val) \ #define SCCB_WRITE(reg,val) \
do { \ do { \
int i; \ int i; \
scc.cha_b_ctrl = (reg); \ scc.cha_b_ctrl = (reg); \
for( i = uSEC; i > 0; --i ) \ for (i = uSEC; i > 0; --i) \
barrier(); \ barrier(); \
scc.cha_b_ctrl = (val); \ scc.cha_b_ctrl = (val); \
for( i = uSEC; i > 0; --i ) \ for (i = uSEC; i > 0; --i) \
barrier(); \ barrier(); \
} while(0) } while(0)
#define SCCA_WRITE(reg,val) \ #define SCCA_WRITE(reg,val) \
do { \ do { \
int i; \ int i; \
scc.cha_a_ctrl = (reg); \ scc.cha_a_ctrl = (reg); \
for( i = uSEC; i > 0; --i ) \ for (i = uSEC; i > 0; --i) \
barrier(); \ barrier(); \
scc.cha_a_ctrl = (val); \ scc.cha_a_ctrl = (val); \
for( i = uSEC; i > 0; --i ) \ for (i = uSEC; i > 0; --i) \
barrier(); \ barrier(); \
} while(0) } while(0)
/* loops_per_jiffy isn't initialized yet, so we can't use udelay(). This does a /* loops_per_jiffy isn't initialized yet, so we can't use udelay(). This does a
* delay of ~ 60us. */ * delay of ~ 60us. */
/* Mac: loops_per_jiffy min. 19000 ^= .5 us; MFPDELAY was 0.6 us*/ /* Mac: loops_per_jiffy min. 19000 ^= .5 us; MFPDELAY was 0.6 us*/
#define LONG_DELAY() \ #define LONG_DELAY() \
do { \ do { \
int i; \ int i; \
for( i = 60*uSEC; i > 0; --i ) \ for (i = 60*uSEC; i > 0; --i) \
barrier(); \ barrier(); \
} while(0) } while(0)
#ifndef CONFIG_SERIAL_CONSOLE #ifndef CONFIG_SERIAL_CONSOLE
static void __init mac_init_scc_port( int cflag, int port ) static void __init mac_init_scc_port(int cflag, int port)
#else #else
void mac_init_scc_port( int cflag, int port ) void mac_init_scc_port(int cflag, int port)
#endif #endif
{ {
extern int mac_SCC_reset_done; extern int mac_SCC_reset_done;
...@@ -292,71 +291,71 @@ void mac_init_scc_port( int cflag, int port ) ...@@ -292,71 +291,71 @@ void mac_init_scc_port( int cflag, int port )
/* reg12 (BRG low) */ /* reg12 (BRG low) */
{ 94, 62, 46, 22, 10, 4, 1, 0, 0 }; { 94, 62, 46, 22, 10, 4, 1, 0, 0 };
int baud = cflag & CBAUD; int baud = cflag & CBAUD;
int clksrc, clkmode, div, reg3, reg5; int clksrc, clkmode, div, reg3, reg5;
if (cflag & CBAUDEX) if (cflag & CBAUDEX)
baud += B38400; baud += B38400;
if (baud < B1200 || baud > B38400+2) if (baud < B1200 || baud > B38400+2)
baud = B9600; /* use default 9600bps for non-implemented rates */ baud = B9600; /* use default 9600bps for non-implemented rates */
baud -= B1200; /* tables starts at 1200bps */ baud -= B1200; /* tables starts at 1200bps */
clksrc = clksrc_table[baud]; clksrc = clksrc_table[baud];
clkmode = clkmode_table[baud]; clkmode = clkmode_table[baud];
div = div_table[baud]; div = div_table[baud];
reg3 = (((cflag & CSIZE) == CS8) ? 0xc0 : 0x40); reg3 = (((cflag & CSIZE) == CS8) ? 0xc0 : 0x40);
reg5 = (((cflag & CSIZE) == CS8) ? 0x60 : 0x20) | 0x82 /* assert DTR/RTS */; reg5 = (((cflag & CSIZE) == CS8) ? 0x60 : 0x20) | 0x82 /* assert DTR/RTS */;
if (port == 1) { if (port == 1) {
(void)scc.cha_b_ctrl; /* reset reg pointer */ (void)scc.cha_b_ctrl; /* reset reg pointer */
SCCB_WRITE( 9, 0xc0 ); /* reset */ SCCB_WRITE(9, 0xc0); /* reset */
LONG_DELAY(); /* extra delay after WR9 access */ LONG_DELAY(); /* extra delay after WR9 access */
SCCB_WRITE( 4, (cflag & PARENB) ? ((cflag & PARODD) ? 0x01 : 0x03) : 0 | SCCB_WRITE(4, (cflag & PARENB) ? ((cflag & PARODD) ? 0x01 : 0x03) : 0 |
0x04 /* 1 stopbit */ | 0x04 /* 1 stopbit */ |
clkmode ); clkmode);
SCCB_WRITE( 3, reg3 ); SCCB_WRITE(3, reg3);
SCCB_WRITE( 5, reg5 ); SCCB_WRITE(5, reg5);
SCCB_WRITE( 9, 0 ); /* no interrupts */ SCCB_WRITE(9, 0); /* no interrupts */
LONG_DELAY(); /* extra delay after WR9 access */ LONG_DELAY(); /* extra delay after WR9 access */
SCCB_WRITE( 10, 0 ); /* NRZ mode */ SCCB_WRITE(10, 0); /* NRZ mode */
SCCB_WRITE( 11, clksrc ); /* main clock source */ SCCB_WRITE(11, clksrc); /* main clock source */
SCCB_WRITE( 12, div ); /* BRG value */ SCCB_WRITE(12, div); /* BRG value */
SCCB_WRITE( 13, 0 ); /* BRG high byte */ SCCB_WRITE(13, 0); /* BRG high byte */
SCCB_WRITE( 14, 1 ); SCCB_WRITE(14, 1);
SCCB_WRITE( 3, reg3 | 1 ); SCCB_WRITE(3, reg3 | 1);
SCCB_WRITE( 5, reg5 | 8 ); SCCB_WRITE(5, reg5 | 8);
} else if (port == 0) { } else if (port == 0) {
(void)scc.cha_a_ctrl; /* reset reg pointer */ (void)scc.cha_a_ctrl; /* reset reg pointer */
SCCA_WRITE( 9, 0xc0 ); /* reset */ SCCA_WRITE(9, 0xc0); /* reset */
LONG_DELAY(); /* extra delay after WR9 access */ LONG_DELAY(); /* extra delay after WR9 access */
SCCA_WRITE( 4, (cflag & PARENB) ? ((cflag & PARODD) ? 0x01 : 0x03) : 0 | SCCA_WRITE(4, (cflag & PARENB) ? ((cflag & PARODD) ? 0x01 : 0x03) : 0 |
0x04 /* 1 stopbit */ | 0x04 /* 1 stopbit */ |
clkmode ); clkmode);
SCCA_WRITE( 3, reg3 ); SCCA_WRITE(3, reg3);
SCCA_WRITE( 5, reg5 ); SCCA_WRITE(5, reg5);
SCCA_WRITE( 9, 0 ); /* no interrupts */ SCCA_WRITE(9, 0); /* no interrupts */
LONG_DELAY(); /* extra delay after WR9 access */ LONG_DELAY(); /* extra delay after WR9 access */
SCCA_WRITE( 10, 0 ); /* NRZ mode */ SCCA_WRITE(10, 0); /* NRZ mode */
SCCA_WRITE( 11, clksrc ); /* main clock source */ SCCA_WRITE(11, clksrc); /* main clock source */
SCCA_WRITE( 12, div ); /* BRG value */ SCCA_WRITE(12, div); /* BRG value */
SCCA_WRITE( 13, 0 ); /* BRG high byte */ SCCA_WRITE(13, 0); /* BRG high byte */
SCCA_WRITE( 14, 1 ); SCCA_WRITE(14, 1);
SCCA_WRITE( 3, reg3 | 1 ); SCCA_WRITE(3, reg3 | 1);
SCCA_WRITE( 5, reg5 | 8 ); SCCA_WRITE(5, reg5 | 8);
} }
mac_SCC_reset_done = 1; mac_SCC_reset_done = 1;
mac_SCC_init_done = 1; mac_SCC_init_done = 1;
} }
#endif /* DEBUG_SERIAL */ #endif /* DEBUG_SERIAL */
void mac_init_scca_port( int cflag ) void mac_init_scca_port(int cflag)
{ {
mac_init_scc_port(cflag, 0); mac_init_scc_port(cflag, 0);
} }
void mac_init_sccb_port( int cflag ) void mac_init_sccb_port(int cflag)
{ {
mac_init_scc_port(cflag, 1); mac_init_scc_port(cflag, 1);
} }
...@@ -364,34 +363,26 @@ void mac_init_sccb_port( int cflag ) ...@@ -364,34 +363,26 @@ void mac_init_sccb_port( int cflag )
void __init mac_debug_init(void) void __init mac_debug_init(void)
{ {
#ifdef DEBUG_SERIAL #ifdef DEBUG_SERIAL
if ( !strcmp( m68k_debug_device, "ser" ) if (!strcmp(m68k_debug_device, "ser") ||
|| !strcmp( m68k_debug_device, "ser1" )) { !strcmp(m68k_debug_device, "ser1")) {
/* Mac modem port */ /* Mac modem port */
mac_init_scc_port( B9600|CS8, 0 ); mac_init_scc_port(B9600|CS8, 0);
mac_console_driver.write = mac_scca_console_write; mac_console_driver.write = mac_scca_console_write;
scc_port = 0; scc_port = 0;
} } else if (!strcmp(m68k_debug_device, "ser2")) {
else if (!strcmp( m68k_debug_device, "ser2" )) { /* Mac printer port */
/* Mac printer port */ mac_init_scc_port(B9600|CS8, 1);
mac_init_scc_port( B9600|CS8, 1 ); mac_console_driver.write = mac_sccb_console_write;
mac_console_driver.write = mac_sccb_console_write; scc_port = 1;
scc_port = 1; }
}
#endif #endif
#ifdef DEBUG_HEADS #ifdef DEBUG_HEADS
if ( !strcmp( m68k_debug_device, "scn" ) if (!strcmp(m68k_debug_device, "scn") ||
|| !strcmp( m68k_debug_device, "con" )) { !strcmp(m68k_debug_device, "con")) {
/* display, using head.S console routines */ /* display, using head.S console routines */
mac_console_driver.write = mac_debug_console_write; mac_console_driver.write = mac_debug_console_write;
} }
#endif #endif
if (mac_console_driver.write) if (mac_console_driver.write)
register_console(&mac_console_driver); register_console(&mac_console_driver);
} }
/*
* Local variables:
* c-indent-level: 4
* tab-width: 8
* End:
*/
...@@ -35,35 +35,35 @@ ...@@ -35,35 +35,35 @@
#include <asm/machdep.h> #include <asm/machdep.h>
#include <asm/q40_master.h> #include <asm/q40_master.h>
extern irqreturn_t q40_process_int (int level, struct pt_regs *regs); extern irqreturn_t q40_process_int(int level, struct pt_regs *regs);
extern void q40_init_IRQ (void); extern void q40_init_IRQ(void);
static void q40_get_model(char *model); static void q40_get_model(char *model);
static int q40_get_hardware_list(char *buffer); static int q40_get_hardware_list(char *buffer);
extern void q40_sched_init(irq_handler_t handler); extern void q40_sched_init(irq_handler_t handler);
extern unsigned long q40_gettimeoffset (void); extern unsigned long q40_gettimeoffset(void);
extern int q40_hwclk (int, struct rtc_time *); extern int q40_hwclk(int, struct rtc_time *);
extern unsigned int q40_get_ss (void); extern unsigned int q40_get_ss(void);
extern int q40_set_clock_mmss (unsigned long); extern int q40_set_clock_mmss(unsigned long);
static int q40_get_rtc_pll(struct rtc_pll_info *pll); static int q40_get_rtc_pll(struct rtc_pll_info *pll);
static int q40_set_rtc_pll(struct rtc_pll_info *pll); static int q40_set_rtc_pll(struct rtc_pll_info *pll);
extern void q40_reset (void); extern void q40_reset(void);
void q40_halt(void); void q40_halt(void);
extern void q40_waitbut(void); extern void q40_waitbut(void);
void q40_set_vectors (void); void q40_set_vectors(void);
extern void q40_mksound(unsigned int /*freq*/, unsigned int /*ticks*/ ); extern void q40_mksound(unsigned int /*freq*/, unsigned int /*ticks*/);
extern char m68k_debug_device[]; extern char m68k_debug_device[];
static void q40_mem_console_write(struct console *co, const char *b, static void q40_mem_console_write(struct console *co, const char *b,
unsigned int count); unsigned int count);
extern int ql_ticks; extern int ql_ticks;
static struct console q40_console_driver = { static struct console q40_console_driver = {
.name = "debug", .name = "debug",
.flags = CON_PRINTBUFFER, .flags = CON_PRINTBUFFER,
.index = -1, .index = -1,
}; };
...@@ -74,150 +74,157 @@ static int _cpleft; ...@@ -74,150 +74,157 @@ static int _cpleft;
static void q40_mem_console_write(struct console *co, const char *s, static void q40_mem_console_write(struct console *co, const char *s,
unsigned int count) unsigned int count)
{ {
char *p=(char *)s; const char *p = s;
if (count<_cpleft) if (count < _cpleft) {
while (count-- >0){ while (count-- > 0) {
*q40_mem_cptr=*p++; *q40_mem_cptr = *p++;
q40_mem_cptr+=4; q40_mem_cptr += 4;
_cpleft--; _cpleft--;
} }
}
} }
#if 0 #if 0
void printq40(char *str) void printq40(char *str)
{ {
int l=strlen(str); int l = strlen(str);
char *p=q40_mem_cptr; char *p = q40_mem_cptr;
while (l-- >0 && _cpleft-- >0) while (l-- > 0 && _cpleft-- > 0) {
{ *p = *str++;
*p=*str++; p += 4;
p+=4; }
} q40_mem_cptr = p;
q40_mem_cptr=p;
} }
#endif #endif
static int halted=0; static int halted;
#ifdef CONFIG_HEARTBEAT #ifdef CONFIG_HEARTBEAT
static void q40_heartbeat(int on) static void q40_heartbeat(int on)
{ {
if (halted) return; if (halted)
return;
if (on) if (on)
Q40_LED_ON(); Q40_LED_ON();
else else
Q40_LED_OFF(); Q40_LED_OFF();
} }
#endif #endif
void q40_reset(void) void q40_reset(void)
{ {
halted=1; halted = 1;
printk ("\n\n*******************************************\n" printk("\n\n*******************************************\n"
"Called q40_reset : press the RESET button!! \n" "Called q40_reset : press the RESET button!! \n"
"*******************************************\n"); "*******************************************\n");
Q40_LED_ON(); Q40_LED_ON();
while(1) ; while (1)
;
} }
void q40_halt(void) void q40_halt(void)
{ {
halted=1; halted = 1;
printk ("\n\n*******************\n" printk("\n\n*******************\n"
" Called q40_halt\n" " Called q40_halt\n"
"*******************\n"); "*******************\n");
Q40_LED_ON(); Q40_LED_ON();
while(1) ; while (1)
;
} }
static void q40_get_model(char *model) static void q40_get_model(char *model)
{ {
sprintf(model, "Q40"); sprintf(model, "Q40");
} }
/* No hardware options on Q40? */ /* No hardware options on Q40? */
static int q40_get_hardware_list(char *buffer) static int q40_get_hardware_list(char *buffer)
{ {
*buffer = '\0'; *buffer = '\0';
return 0; return 0;
} }
static unsigned int serports[]={0x3f8,0x2f8,0x3e8,0x2e8,0}; static unsigned int serports[] =
{
0x3f8,0x2f8,0x3e8,0x2e8,0
};
void q40_disable_irqs(void) void q40_disable_irqs(void)
{ {
unsigned i,j; unsigned i, j;
j=0; j = 0;
while((i=serports[j++])) outb(0,i+UART_IER); while ((i = serports[j++]))
master_outb(0,EXT_ENABLE_REG); outb(0, i + UART_IER);
master_outb(0,KEY_IRQ_ENABLE_REG); master_outb(0, EXT_ENABLE_REG);
master_outb(0, KEY_IRQ_ENABLE_REG);
} }
void __init config_q40(void) void __init config_q40(void)
{ {
mach_sched_init = q40_sched_init; mach_sched_init = q40_sched_init;
mach_init_IRQ = q40_init_IRQ; mach_init_IRQ = q40_init_IRQ;
mach_gettimeoffset = q40_gettimeoffset; mach_gettimeoffset = q40_gettimeoffset;
mach_hwclk = q40_hwclk; mach_hwclk = q40_hwclk;
mach_get_ss = q40_get_ss; mach_get_ss = q40_get_ss;
mach_get_rtc_pll = q40_get_rtc_pll; mach_get_rtc_pll = q40_get_rtc_pll;
mach_set_rtc_pll = q40_set_rtc_pll; mach_set_rtc_pll = q40_set_rtc_pll;
mach_set_clock_mmss = q40_set_clock_mmss; mach_set_clock_mmss = q40_set_clock_mmss;
mach_reset = q40_reset; mach_reset = q40_reset;
mach_get_model = q40_get_model; mach_get_model = q40_get_model;
mach_get_hardware_list = q40_get_hardware_list; mach_get_hardware_list = q40_get_hardware_list;
#if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE) #if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE)
mach_beep = q40_mksound; mach_beep = q40_mksound;
#endif #endif
#ifdef CONFIG_HEARTBEAT #ifdef CONFIG_HEARTBEAT
mach_heartbeat = q40_heartbeat; mach_heartbeat = q40_heartbeat;
#endif #endif
mach_halt = q40_halt; mach_halt = q40_halt;
/* disable a few things that SMSQ might have left enabled */ /* disable a few things that SMSQ might have left enabled */
q40_disable_irqs(); q40_disable_irqs();
/* no DMA at all, but ide-scsi requires it.. make sure /* no DMA at all, but ide-scsi requires it.. make sure
* all physical RAM fits into the boundary - otherwise * all physical RAM fits into the boundary - otherwise
* allocator may play costly and useless tricks */ * allocator may play costly and useless tricks */
mach_max_dma_address = 1024*1024*1024; mach_max_dma_address = 1024*1024*1024;
/* useful for early debugging stages - writes kernel messages into SRAM */ /* useful for early debugging stages - writes kernel messages into SRAM */
if (!strncmp( m68k_debug_device,"mem",3 )) if (!strncmp( m68k_debug_device,"mem", 3)) {
{ /*printk("using NVRAM debug, q40_mem_cptr=%p\n",q40_mem_cptr);*/
/*printk("using NVRAM debug, q40_mem_cptr=%p\n",q40_mem_cptr);*/ _cpleft = 2000 - ((long)q40_mem_cptr-0xff020000) / 4;
_cpleft=2000-((long)q40_mem_cptr-0xff020000)/4; q40_console_driver.write = q40_mem_console_write;
q40_console_driver.write = q40_mem_console_write; register_console(&q40_console_driver);
register_console(&q40_console_driver); }
}
} }
int q40_parse_bootinfo(const struct bi_record *rec) int q40_parse_bootinfo(const struct bi_record *rec)
{ {
return 1; return 1;
} }
static inline unsigned char bcd2bin (unsigned char b) static inline unsigned char bcd2bin(unsigned char b)
{ {
return ((b>>4)*10 + (b&15)); return (b >> 4) * 10 + (b & 15);
} }
static inline unsigned char bin2bcd (unsigned char b) static inline unsigned char bin2bcd(unsigned char b)
{ {
return (((b/10)*16) + (b%10)); return (b / 10) * 16 + (b % 10);
} }
unsigned long q40_gettimeoffset (void) unsigned long q40_gettimeoffset(void)
{ {
return 5000*(ql_ticks!=0); return 5000 * (ql_ticks != 0);
} }
...@@ -238,9 +245,9 @@ unsigned long q40_gettimeoffset (void) ...@@ -238,9 +245,9 @@ unsigned long q40_gettimeoffset (void)
int q40_hwclk(int op, struct rtc_time *t) int q40_hwclk(int op, struct rtc_time *t)
{ {
if (op) if (op) {
{ /* Write.... */ /* Write.... */
Q40_RTC_CTRL |= Q40_RTC_WRITE; Q40_RTC_CTRL |= Q40_RTC_WRITE;
Q40_RTC_SECS = bin2bcd(t->tm_sec); Q40_RTC_SECS = bin2bcd(t->tm_sec);
Q40_RTC_MINS = bin2bcd(t->tm_min); Q40_RTC_MINS = bin2bcd(t->tm_min);
...@@ -251,25 +258,23 @@ int q40_hwclk(int op, struct rtc_time *t) ...@@ -251,25 +258,23 @@ int q40_hwclk(int op, struct rtc_time *t)
if (t->tm_wday >= 0) if (t->tm_wday >= 0)
Q40_RTC_DOW = bin2bcd(t->tm_wday+1); Q40_RTC_DOW = bin2bcd(t->tm_wday+1);
Q40_RTC_CTRL &= ~(Q40_RTC_WRITE); Q40_RTC_CTRL &= ~(Q40_RTC_WRITE);
} } else {
else /* Read.... */
{ /* Read.... */ Q40_RTC_CTRL |= Q40_RTC_READ;
Q40_RTC_CTRL |= Q40_RTC_READ;
t->tm_year = bcd2bin (Q40_RTC_YEAR);
t->tm_year = bcd2bin (Q40_RTC_YEAR); t->tm_mon = bcd2bin (Q40_RTC_MNTH)-1;
t->tm_mon = bcd2bin (Q40_RTC_MNTH)-1; t->tm_mday = bcd2bin (Q40_RTC_DATE);
t->tm_mday = bcd2bin (Q40_RTC_DATE); t->tm_hour = bcd2bin (Q40_RTC_HOUR);
t->tm_hour = bcd2bin (Q40_RTC_HOUR); t->tm_min = bcd2bin (Q40_RTC_MINS);
t->tm_min = bcd2bin (Q40_RTC_MINS); t->tm_sec = bcd2bin (Q40_RTC_SECS);
t->tm_sec = bcd2bin (Q40_RTC_SECS);
Q40_RTC_CTRL &= ~(Q40_RTC_READ);
Q40_RTC_CTRL &= ~(Q40_RTC_READ);
if (t->tm_year < 70)
if (t->tm_year < 70) t->tm_year += 100;
t->tm_year += 100; t->tm_wday = bcd2bin(Q40_RTC_DOW)-1;
t->tm_wday = bcd2bin(Q40_RTC_DOW)-1;
} }
return 0; return 0;
...@@ -285,29 +290,25 @@ unsigned int q40_get_ss(void) ...@@ -285,29 +290,25 @@ unsigned int q40_get_ss(void)
* clock is out by > 30 minutes. Logic lifted from atari code. * clock is out by > 30 minutes. Logic lifted from atari code.
*/ */
int q40_set_clock_mmss (unsigned long nowtime) int q40_set_clock_mmss(unsigned long nowtime)
{ {
int retval = 0; int retval = 0;
short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60; short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60;
int rtc_minutes; int rtc_minutes;
rtc_minutes = bcd2bin(Q40_RTC_MINS);
rtc_minutes = bcd2bin (Q40_RTC_MINS); if ((rtc_minutes < real_minutes ?
real_minutes - rtc_minutes :
if ((rtc_minutes < real_minutes rtc_minutes - real_minutes) < 30) {
? real_minutes - rtc_minutes Q40_RTC_CTRL |= Q40_RTC_WRITE;
: rtc_minutes - real_minutes) < 30)
{
Q40_RTC_CTRL |= Q40_RTC_WRITE;
Q40_RTC_MINS = bin2bcd(real_minutes); Q40_RTC_MINS = bin2bcd(real_minutes);
Q40_RTC_SECS = bin2bcd(real_seconds); Q40_RTC_SECS = bin2bcd(real_seconds);
Q40_RTC_CTRL &= ~(Q40_RTC_WRITE); Q40_RTC_CTRL &= ~(Q40_RTC_WRITE);
} } else
else
retval = -1; retval = -1;
return retval; return retval;
} }
...@@ -318,21 +319,23 @@ int q40_set_clock_mmss (unsigned long nowtime) ...@@ -318,21 +319,23 @@ int q40_set_clock_mmss (unsigned long nowtime)
static int q40_get_rtc_pll(struct rtc_pll_info *pll) static int q40_get_rtc_pll(struct rtc_pll_info *pll)
{ {
int tmp=Q40_RTC_CTRL; int tmp = Q40_RTC_CTRL;
pll->pll_value = tmp & Q40_RTC_PLL_MASK; pll->pll_value = tmp & Q40_RTC_PLL_MASK;
if (tmp & Q40_RTC_PLL_SIGN) if (tmp & Q40_RTC_PLL_SIGN)
pll->pll_value = -pll->pll_value; pll->pll_value = -pll->pll_value;
pll->pll_max=31; pll->pll_max = 31;
pll->pll_min=-31; pll->pll_min = -31;
pll->pll_posmult=512; pll->pll_posmult = 512;
pll->pll_negmult=256; pll->pll_negmult = 256;
pll->pll_clock=125829120; pll->pll_clock = 125829120;
return 0; return 0;
} }
static int q40_set_rtc_pll(struct rtc_pll_info *pll) static int q40_set_rtc_pll(struct rtc_pll_info *pll)
{ {
if (!pll->pll_ctrl){ if (!pll->pll_ctrl) {
/* the docs are a bit unclear so I am doublesetting */ /* the docs are a bit unclear so I am doublesetting */
/* RTC_WRITE here ... */ /* RTC_WRITE here ... */
int tmp = (pll->pll_value & 31) | (pll->pll_value<0 ? 32 : 0) | int tmp = (pll->pll_value & 31) | (pll->pll_value<0 ? 32 : 0) |
......
...@@ -34,43 +34,43 @@ e_vector *sun3x_prom_vbr; ...@@ -34,43 +34,43 @@ e_vector *sun3x_prom_vbr;
/* Handle returning to the prom */ /* Handle returning to the prom */
void sun3x_halt(void) void sun3x_halt(void)
{ {
unsigned long flags; unsigned long flags;
/* Disable interrupts while we mess with things */ /* Disable interrupts while we mess with things */
local_irq_save(flags); local_irq_save(flags);
/* Restore prom vbr */ /* Restore prom vbr */
__asm__ volatile ("movec %0,%%vbr" : : "r" ((void*)sun3x_prom_vbr)); asm volatile ("movec %0,%%vbr" : : "r" ((void*)sun3x_prom_vbr));
/* Restore prom NMI clock */ /* Restore prom NMI clock */
// sun3x_disable_intreg(5); // sun3x_disable_intreg(5);
sun3_enable_irq(7); sun3_enable_irq(7);
/* Let 'er rip */ /* Let 'er rip */
__asm__ volatile ("trap #14" : : ); asm volatile ("trap #14");
/* Restore everything */ /* Restore everything */
sun3_disable_irq(7); sun3_disable_irq(7);
sun3_enable_irq(5); sun3_enable_irq(5);
__asm__ volatile ("movec %0,%%vbr" : : "r" ((void*)vectors)); asm volatile ("movec %0,%%vbr" : : "r" ((void*)vectors));
local_irq_restore(flags); local_irq_restore(flags);
} }
void sun3x_reboot(void) void sun3x_reboot(void)
{ {
/* This never returns, don't bother saving things */ /* This never returns, don't bother saving things */
local_irq_disable(); local_irq_disable();
/* Restore prom vbr */ /* Restore prom vbr */
__asm__ volatile ("movec %0,%%vbr" : : "r" ((void*)sun3x_prom_vbr)); asm volatile ("movec %0,%%vbr" : : "r" ((void*)sun3x_prom_vbr));
/* Restore prom NMI clock */ /* Restore prom NMI clock */
sun3_disable_irq(5); sun3_disable_irq(5);
sun3_enable_irq(7); sun3_enable_irq(7);
/* Let 'er rip */ /* Let 'er rip */
(*romvec->pv_reboot)("vmlinux"); (*romvec->pv_reboot)("vmlinux");
} }
extern char m68k_debug_device[]; extern char m68k_debug_device[];
...@@ -78,54 +78,52 @@ extern char m68k_debug_device[]; ...@@ -78,54 +78,52 @@ extern char m68k_debug_device[];
static void sun3x_prom_write(struct console *co, const char *s, static void sun3x_prom_write(struct console *co, const char *s,
unsigned int count) unsigned int count)
{ {
while (count--) { while (count--) {
if (*s == '\n') if (*s == '\n')
sun3x_putchar('\r'); sun3x_putchar('\r');
sun3x_putchar(*s++); sun3x_putchar(*s++);
} }
} }
/* debug console - write-only */ /* debug console - write-only */
static struct console sun3x_debug = { static struct console sun3x_debug = {
.name = "debug", .name = "debug",
.write = sun3x_prom_write, .write = sun3x_prom_write,
.flags = CON_PRINTBUFFER, .flags = CON_PRINTBUFFER,
.index = -1, .index = -1,
}; };
void sun3x_prom_init(void) void sun3x_prom_init(void)
{ {
/* Read the vector table */ /* Read the vector table */
sun3x_putchar = *(void (**)(int)) (SUN3X_P_PUTCHAR); sun3x_putchar = *(void (**)(int)) (SUN3X_P_PUTCHAR);
sun3x_getchar = *(int (**)(void)) (SUN3X_P_GETCHAR); sun3x_getchar = *(int (**)(void)) (SUN3X_P_GETCHAR);
sun3x_mayget = *(int (**)(void)) (SUN3X_P_MAYGET); sun3x_mayget = *(int (**)(void)) (SUN3X_P_MAYGET);
sun3x_mayput = *(int (**)(int)) (SUN3X_P_MAYPUT); sun3x_mayput = *(int (**)(int)) (SUN3X_P_MAYPUT);
sun3x_prom_reboot = *(void (**)(void)) (SUN3X_P_REBOOT); sun3x_prom_reboot = *(void (**)(void)) (SUN3X_P_REBOOT);
sun3x_prom_abort = *(e_vector *) (SUN3X_P_ABORT); sun3x_prom_abort = *(e_vector *) (SUN3X_P_ABORT);
romvec = (struct linux_romvec *)SUN3X_PROM_BASE; romvec = (struct linux_romvec *)SUN3X_PROM_BASE;
idprom_init(); idprom_init();
if(!((idprom->id_machtype & SM_ARCH_MASK) == SM_SUN3X)) { if (!((idprom->id_machtype & SM_ARCH_MASK) == SM_SUN3X)) {
printk("Warning: machine reports strange type %02x\n", printk("Warning: machine reports strange type %02x\n",
idprom->id_machtype); idprom->id_machtype);
printk("Pretending it's a 3/80, but very afraid...\n"); printk("Pretending it's a 3/80, but very afraid...\n");
idprom->id_machtype = SM_SUN3X | SM_3_80; idprom->id_machtype = SM_SUN3X | SM_3_80;
} }
/* point trap #14 at abort. /* point trap #14 at abort.
* XXX this is futile since we restore the vbr first - oops * XXX this is futile since we restore the vbr first - oops
*/ */
vectors[VEC_TRAP14] = sun3x_prom_abort; vectors[VEC_TRAP14] = sun3x_prom_abort;
/* If debug=prom was specified, start the debug console */ /* If debug=prom was specified, start the debug console */
if (!strcmp(m68k_debug_device, "prom")) if (!strcmp(m68k_debug_device, "prom"))
register_console(&sun3x_debug); register_console(&sun3x_debug);
} }
/* some prom functions to export */ /* some prom functions to export */
...@@ -141,7 +139,6 @@ int prom_getbool (int node, char *prop) ...@@ -141,7 +139,6 @@ int prom_getbool (int node, char *prop)
void prom_printf(char *fmt, ...) void prom_printf(char *fmt, ...)
{ {
} }
void prom_halt (void) void prom_halt (void)
...@@ -159,7 +156,7 @@ prom_get_idprom(char *idbuf, int num_bytes) ...@@ -159,7 +156,7 @@ prom_get_idprom(char *idbuf, int num_bytes)
int i; int i;
/* make a copy of the idprom structure */ /* make a copy of the idprom structure */
for(i = 0; i < num_bytes; i++) for (i = 0; i < num_bytes; i++)
idbuf[i] = ((char *)SUN3X_IDPROM)[i]; idbuf[i] = ((char *)SUN3X_IDPROM)[i];
return idbuf[0]; return idbuf[0];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册