/*
 * 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/types.h>
#include <linux/tty.h>
#include <linux/console.h>
#include <linux/init.h>
#include <linux/delay.h>

#include <asm/atarihw.h>
#include <asm/atariints.h>

/* Flag that Modem1 port is already initialized and used */
int atari_MFP_init_done;
/* Flag that Modem1 port is already initialized and used */
int atari_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 atari_SCC_reset_done;

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


static inline void ata_mfp_out(char 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)
{
	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;
}

int atari_scc_console_wait_key(struct console *co)
{
	do {
		MFPDELAY();
	} while (!(scc.cha_b_ctrl & 0x01)); /* wait for rx buf filled */
	MFPDELAY();
	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;
}
#endif

/*
 * 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.
 */
#ifndef CONFIG_SERIAL_CONSOLE
static void __init atari_init_mfp_port(int cflag)
#else
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;

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

	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)

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

#ifndef CONFIG_SERIAL_CONSOLE
static void __init atari_init_scc_port(int cflag)
#else
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 };

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

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

#ifndef CONFIG_SERIAL_CONSOLE
static void __init atari_init_midi_port(int cflag)
#else
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;

	/* 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 |
		    ((atari_switches & ATARI_SWITCH_MIDI) ?
		     ACIA_RHTID : ACIA_RLTID);
}

static int __init atari_debug_setup(char *arg)
{
	if (!MACH_IS_ATARI)
		return 0;

	if (!strcmp(arg, "ser"))
		/* defaults to ser2 for a Falcon and ser1 otherwise */
		arg = MACH_IS_FALCON ? "ser2" : "ser1";

	if (!strcmp(arg, "ser1")) {
		/* ST-MFP Modem1 serial port */
		atari_init_mfp_port(B9600|CS8);
		atari_console_driver.write = atari_mfp_console_write;
	} else if (!strcmp(arg, "ser2")) {
		/* SCC Modem2 serial port */
		atari_init_scc_port(B9600|CS8);
		atari_console_driver.write = atari_scc_console_write;
	} else if (!strcmp(arg, "midi")) {
		/* MIDI port */
		atari_init_midi_port(B9600|CS8);
		atari_console_driver.write = atari_midi_console_write;
	} else if (!strcmp(arg, "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);

	return 0;
}

early_param("debug", atari_debug_setup);
