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