/*
 * linux/arch/m68k/mac/debug.c
 *
 * Shamelessly stolen (SCC code and general framework) from:
 *
 * linux/arch/m68k/atari/debug.c
 *
 * Atari debugging and serial console stuff
 *
 * Assembled of parts of former atari/config.c 97-12-18 by Roman Hodek
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file COPYING in the main directory of this archive
 * for more details.
 */

#include <linux/config.h>
#include <linux/types.h>
#include <linux/sched.h>
#include <linux/tty.h>
#include <linux/console.h>
#include <linux/init.h>
#include <linux/delay.h>

#define BOOTINFO_COMPAT_1_0
#include <asm/setup.h>
#include <asm/bootinfo.h>
#include <asm/machw.h>
#include <asm/macints.h>

extern char m68k_debug_device[];

extern struct compat_bootinfo compat_boot_info;

extern unsigned long mac_videobase;
extern unsigned long mac_videodepth;
extern unsigned long mac_rowbytes;

extern void mac_serial_print(const char *);

#define DEBUG_HEADS
#undef DEBUG_SCREEN
#define DEBUG_SERIAL

/*
 * These two auxiliary debug functions should go away ASAP. Only usage:
 * before the console output is up (after head.S come some other crucial
 * setup routines :-) it permits writing 'data' to the screen as bit patterns
 * (good luck reading those). Helped to figure that the bootinfo contained
 * garbage data on the amount and size of memory chunks ...
 *
 * The 'pos' argument now simply means 'linefeed after print' ...
 */

#ifdef DEBUG_SCREEN
static int peng=0, line=0;
#endif

void mac_debugging_short(int pos, short num)
{
#ifdef DEBUG_SCREEN
	unsigned char *pengoffset;
	unsigned char *pptr;
	int i;
#endif

#ifdef DEBUG_SERIAL
	printk("debug: %d !\n", num);
#endif

#ifdef DEBUG_SCREEN
	if (!MACH_IS_MAC) {
		/* printk("debug: %d !\n", num); */
		return;
	}

	/* calculate current offset */
	pengoffset=(unsigned char *)(mac_videobase+(150+line*2)*mac_rowbytes)
		    +80*peng;

	pptr=pengoffset;

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

	peng++;

	if (pos) {
		line++;
		peng = 0;
	}
#endif
}

void mac_debugging_long(int pos, long addr)
{
#ifdef DEBUG_SCREEN
	unsigned char *pengoffset;
	unsigned char *pptr;
	int i;
#endif

#ifdef DEBUG_SERIAL
	printk("debug: #%ld !\n", addr);
#endif

#ifdef DEBUG_SCREEN
	if (!MACH_IS_MAC) {
		/* printk("debug: #%ld !\n", addr); */
		return;
	}

	pengoffset=(unsigned char *)(mac_videobase+(150+line*2)*mac_rowbytes)
		    +80*peng;

	pptr=pengoffset;

	for(i=0;i<8*sizeof(long);i++) /* # of bits */
	{
		*pptr++ = (addr & ( 1 << (8*sizeof(long)-i-1) ) ? 0xFF : 0x00);
	}

	peng++;

	if (pos) {
		line++;
		peng = 0;
	}
#endif
}

#ifdef DEBUG_SERIAL
/*
 * 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;
 };

# define scc (*((volatile struct mac_SCC*)mac_bi_data.sccbase))

/* Flag that serial port is already initialized and used */
int mac_SCC_init_done;
/* Can be set somewhere, if a SCC master reset has already be done and should
 * not be repeated; used by kgdb */
int mac_SCC_reset_done;

static int scc_port = -1;

static struct console mac_console_driver = {
	.name =		"debug",
	.flags =	CON_PRINTBUFFER,
	.index =	-1,
};

/*
 * Crude hack to get console output to the screen before the framebuffer
 * is initialized (happens a lot later in 2.1!).
 * We just use the console routines declared in head.S, this will interfere
 * with regular framebuffer console output and should be used exclusively
 * to debug kernel problems manifesting before framebuffer init (aka WSOD)
 *
 * To keep this hack from interfering with the regular console driver, either
 * deregister this driver before/on framebuffer console init, or silence this
 * function after the fbcon driver is running (will lose console messages!?).
 * To debug real early bugs, need to write a 'mac_register_console_hack()'
 * that is called from start_kernel() before setup_arch() and just registers
 * this driver if Mac.
 */

void mac_debug_console_write (struct console *co, const char *str,
			      unsigned int count)
{
	mac_serial_print(str);
}



/* Mac: loops_per_jiffy min. 19000 ^= .5 us; MFPDELAY was 0.6 us*/

#define uSEC 1

static inline void mac_sccb_out (char c)
{
    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();
    scc.cha_b_data = c;
}

static inline void mac_scca_out (char c)
{
    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();
    scc.cha_a_data = c;
}

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

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


/* 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. */
#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)

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

/* 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)

#ifndef CONFIG_SERIAL_CONSOLE
static void __init mac_init_scc_port( int cflag, int port )
#else
void mac_init_scc_port( int cflag, int port )
#endif
{
	extern int mac_SCC_reset_done;

	/*
	 * baud rates: 1200, 1800, 2400, 4800, 9600, 19.2k, 38.4k, 57.6k, 115.2k
	 */

	static int clksrc_table[9] =
		/* reg 11: 0x50 = BRG, 0x00 = RTxC, 0x28 = TRxC */
		{ 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00 };
	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) */
		{ 94, 62, 46, 22, 10, 4, 1, 0, 0 };

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

    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 */;

    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 );
	    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;
}
#endif /* DEBUG_SERIAL */

void mac_init_scca_port( int cflag )
{
	mac_init_scc_port(cflag, 0);
}

void mac_init_sccb_port( int cflag )
{
	mac_init_scc_port(cflag, 1);
}

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;
    }
#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;
    }
#endif
    if (mac_console_driver.write)
	register_console(&mac_console_driver);
}

/*
 * Local variables:
 *  c-indent-level: 4
 *  tab-width: 8
 * End:
 */
