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:
Roman Zippel 2007-05-01 22:32:43 +02:00 committed by Linus Torvalds
parent b3e2fd9ceb
commit 6ff5801acb
10 changed files with 1801 additions and 1861 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -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:
*/

View file

@ -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

View file

@ -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

View file

@ -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 */
}

View file

@ -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);
}

View file

@ -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:
*/

View file

@ -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) |

View file

@ -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];