cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

amiserial.c (41260B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Serial driver for the amiga builtin port.
      4 *
      5 * This code was created by taking serial.c version 4.30 from kernel
      6 * release 2.3.22, replacing all hardware related stuff with the
      7 * corresponding amiga hardware actions, and removing all irrelevant
      8 * code. As a consequence, it uses many of the constants and names
      9 * associated with the registers and bits of 16550 compatible UARTS -
     10 * but only to keep track of status, etc in the state variables. It
     11 * was done this was to make it easier to keep the code in line with
     12 * (non hardware specific) changes to serial.c.
     13 *
     14 * The port is registered with the tty driver as minor device 64, and
     15 * therefore other ports should should only use 65 upwards.
     16 *
     17 * Richard Lucock 28/12/99
     18 *
     19 *  Copyright (C) 1991, 1992  Linus Torvalds
     20 *  Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 
     21 * 		1998, 1999  Theodore Ts'o
     22 *
     23 */
     24
     25/* Set of debugging defines */
     26
     27#undef SERIAL_DEBUG_INTR
     28#undef SERIAL_DEBUG_OPEN
     29#undef SERIAL_DEBUG_FLOW
     30#undef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
     31
     32/*
     33 * End of serial driver configuration section.
     34 */
     35
     36#include <linux/bitops.h>
     37#include <linux/circ_buf.h>
     38#include <linux/console.h>
     39#include <linux/delay.h>
     40#include <linux/errno.h>
     41#include <linux/fcntl.h>
     42#include <linux/init.h>
     43#include <linux/interrupt.h>
     44#include <linux/ioport.h>
     45#include <linux/kernel.h>
     46#include <linux/major.h>
     47#include <linux/mm.h>
     48#include <linux/module.h>
     49#include <linux/platform_device.h>
     50#include <linux/ptrace.h>
     51#include <linux/seq_file.h>
     52#include <linux/serial.h>
     53#include <linux/serial_reg.h>
     54#include <linux/sched.h>
     55#include <linux/signal.h>
     56#include <linux/slab.h>
     57#include <linux/string.h>
     58#include <linux/timer.h>
     59#include <linux/tty_flip.h>
     60#include <linux/tty.h>
     61#include <linux/types.h>
     62#include <linux/uaccess.h>
     63
     64#include <asm/amigahw.h>
     65#include <asm/amigaints.h>
     66#include <asm/irq.h>
     67#include <asm/setup.h>
     68
     69struct serial_state {
     70	struct tty_port		tport;
     71	struct circ_buf		xmit;
     72	struct async_icount	icount;
     73
     74	unsigned long		port;
     75	int			baud_base;
     76	int			custom_divisor;
     77	int			read_status_mask;
     78	int			ignore_status_mask;
     79	int			timeout;
     80	int			quot;
     81	int			IER; 	/* Interrupt Enable Register */
     82	int			MCR; 	/* Modem control register */
     83	int			x_char;	/* xon/xoff character */
     84};
     85
     86static struct tty_driver *serial_driver;
     87
     88/* number of characters left in xmit buffer before we ask for more */
     89#define WAKEUP_CHARS 256
     90
     91#define XMIT_FIFO_SIZE 1
     92
     93static unsigned char current_ctl_bits;
     94
     95static void change_speed(struct tty_struct *tty, struct serial_state *info,
     96		struct ktermios *old);
     97static void rs_wait_until_sent(struct tty_struct *tty, int timeout);
     98
     99
    100static struct serial_state serial_state;
    101
    102/* some serial hardware definitions */
    103#define SDR_OVRUN   (1<<15)
    104#define SDR_RBF     (1<<14)
    105#define SDR_TBE     (1<<13)
    106#define SDR_TSRE    (1<<12)
    107
    108#define SERPER_PARENB    (1<<15)
    109
    110#define AC_SETCLR   (1<<15)
    111#define AC_UARTBRK  (1<<11)
    112
    113#define SER_DTR     (1<<7)
    114#define SER_RTS     (1<<6)
    115#define SER_DCD     (1<<5)
    116#define SER_CTS     (1<<4)
    117#define SER_DSR     (1<<3)
    118
    119static __inline__ void rtsdtr_ctrl(int bits)
    120{
    121    ciab.pra = ((bits & (SER_RTS | SER_DTR)) ^ (SER_RTS | SER_DTR)) | (ciab.pra & ~(SER_RTS | SER_DTR));
    122}
    123
    124/*
    125 * ------------------------------------------------------------
    126 * rs_stop() and rs_start()
    127 *
    128 * This routines are called before setting or resetting tty->flow.stopped.
    129 * They enable or disable transmitter interrupts, as necessary.
    130 * ------------------------------------------------------------
    131 */
    132static void rs_stop(struct tty_struct *tty)
    133{
    134	struct serial_state *info = tty->driver_data;
    135	unsigned long flags;
    136
    137	local_irq_save(flags);
    138	if (info->IER & UART_IER_THRI) {
    139		info->IER &= ~UART_IER_THRI;
    140		/* disable Tx interrupt and remove any pending interrupts */
    141		amiga_custom.intena = IF_TBE;
    142		mb();
    143		amiga_custom.intreq = IF_TBE;
    144		mb();
    145	}
    146	local_irq_restore(flags);
    147}
    148
    149static void rs_start(struct tty_struct *tty)
    150{
    151	struct serial_state *info = tty->driver_data;
    152	unsigned long flags;
    153
    154	local_irq_save(flags);
    155	if (info->xmit.head != info->xmit.tail
    156	    && info->xmit.buf
    157	    && !(info->IER & UART_IER_THRI)) {
    158		info->IER |= UART_IER_THRI;
    159		amiga_custom.intena = IF_SETCLR | IF_TBE;
    160		mb();
    161		/* set a pending Tx Interrupt, transmitter should restart now */
    162		amiga_custom.intreq = IF_SETCLR | IF_TBE;
    163		mb();
    164	}
    165	local_irq_restore(flags);
    166}
    167
    168/*
    169 * ----------------------------------------------------------------------
    170 *
    171 * Here start the interrupt handling routines.
    172 *
    173 * -----------------------------------------------------------------------
    174 */
    175
    176static void receive_chars(struct serial_state *info)
    177{
    178        int status;
    179	int serdatr;
    180	unsigned char ch, flag;
    181	struct	async_icount *icount;
    182	int oe = 0;
    183
    184	icount = &info->icount;
    185
    186	status = UART_LSR_DR; /* We obviously have a character! */
    187	serdatr = amiga_custom.serdatr;
    188	mb();
    189	amiga_custom.intreq = IF_RBF;
    190	mb();
    191
    192	if((serdatr & 0x1ff) == 0)
    193	    status |= UART_LSR_BI;
    194	if(serdatr & SDR_OVRUN)
    195	    status |= UART_LSR_OE;
    196
    197	ch = serdatr & 0xff;
    198	icount->rx++;
    199
    200#ifdef SERIAL_DEBUG_INTR
    201	printk("DR%02x:%02x...", ch, status);
    202#endif
    203	flag = TTY_NORMAL;
    204
    205	/*
    206	 * We don't handle parity or frame errors - but I have left
    207	 * the code in, since I'm not sure that the errors can't be
    208	 * detected.
    209	 */
    210
    211	if (status & (UART_LSR_BI | UART_LSR_PE |
    212		      UART_LSR_FE | UART_LSR_OE)) {
    213	  /*
    214	   * For statistics only
    215	   */
    216	  if (status & UART_LSR_BI) {
    217	    status &= ~(UART_LSR_FE | UART_LSR_PE);
    218	    icount->brk++;
    219	  } else if (status & UART_LSR_PE)
    220	    icount->parity++;
    221	  else if (status & UART_LSR_FE)
    222	    icount->frame++;
    223	  if (status & UART_LSR_OE)
    224	    icount->overrun++;
    225
    226	  /*
    227	   * Now check to see if character should be
    228	   * ignored, and mask off conditions which
    229	   * should be ignored.
    230	   */
    231	  if (status & info->ignore_status_mask)
    232	    goto out;
    233
    234	  status &= info->read_status_mask;
    235
    236	  if (status & (UART_LSR_BI)) {
    237#ifdef SERIAL_DEBUG_INTR
    238	    printk("handling break....");
    239#endif
    240	    flag = TTY_BREAK;
    241	    if (info->tport.flags & ASYNC_SAK)
    242	      do_SAK(info->tport.tty);
    243	  } else if (status & UART_LSR_PE)
    244	    flag = TTY_PARITY;
    245	  else if (status & UART_LSR_FE)
    246	    flag = TTY_FRAME;
    247	  if (status & UART_LSR_OE) {
    248	    /*
    249	     * Overrun is special, since it's
    250	     * reported immediately, and doesn't
    251	     * affect the current character
    252	     */
    253	     oe = 1;
    254	  }
    255	}
    256	tty_insert_flip_char(&info->tport, ch, flag);
    257	if (oe == 1)
    258		tty_insert_flip_char(&info->tport, 0, TTY_OVERRUN);
    259	tty_flip_buffer_push(&info->tport);
    260out:
    261	return;
    262}
    263
    264static void transmit_chars(struct serial_state *info)
    265{
    266	amiga_custom.intreq = IF_TBE;
    267	mb();
    268	if (info->x_char) {
    269	        amiga_custom.serdat = info->x_char | 0x100;
    270		mb();
    271		info->icount.tx++;
    272		info->x_char = 0;
    273		return;
    274	}
    275	if (info->xmit.head == info->xmit.tail
    276	    || info->tport.tty->flow.stopped
    277	    || info->tport.tty->hw_stopped) {
    278		info->IER &= ~UART_IER_THRI;
    279	        amiga_custom.intena = IF_TBE;
    280		mb();
    281		return;
    282	}
    283
    284	amiga_custom.serdat = info->xmit.buf[info->xmit.tail++] | 0x100;
    285	mb();
    286	info->xmit.tail = info->xmit.tail & (SERIAL_XMIT_SIZE-1);
    287	info->icount.tx++;
    288
    289	if (CIRC_CNT(info->xmit.head,
    290		     info->xmit.tail,
    291		     SERIAL_XMIT_SIZE) < WAKEUP_CHARS)
    292		tty_wakeup(info->tport.tty);
    293
    294#ifdef SERIAL_DEBUG_INTR
    295	printk("THRE...");
    296#endif
    297	if (info->xmit.head == info->xmit.tail) {
    298	        amiga_custom.intena = IF_TBE;
    299		mb();
    300		info->IER &= ~UART_IER_THRI;
    301	}
    302}
    303
    304static void check_modem_status(struct serial_state *info)
    305{
    306	struct tty_port *port = &info->tport;
    307	unsigned char status = ciab.pra & (SER_DCD | SER_CTS | SER_DSR);
    308	unsigned char dstatus;
    309	struct	async_icount *icount;
    310
    311	/* Determine bits that have changed */
    312	dstatus = status ^ current_ctl_bits;
    313	current_ctl_bits = status;
    314
    315	if (dstatus) {
    316		icount = &info->icount;
    317		/* update input line counters */
    318		if (dstatus & SER_DSR)
    319			icount->dsr++;
    320		if (dstatus & SER_DCD) {
    321			icount->dcd++;
    322		}
    323		if (dstatus & SER_CTS)
    324			icount->cts++;
    325		wake_up_interruptible(&port->delta_msr_wait);
    326	}
    327
    328	if (tty_port_check_carrier(port) && (dstatus & SER_DCD)) {
    329#if (defined(SERIAL_DEBUG_OPEN) || defined(SERIAL_DEBUG_INTR))
    330		printk("ttyS%d CD now %s...", info->line,
    331		       (!(status & SER_DCD)) ? "on" : "off");
    332#endif
    333		if (!(status & SER_DCD))
    334			wake_up_interruptible(&port->open_wait);
    335		else {
    336#ifdef SERIAL_DEBUG_OPEN
    337			printk("doing serial hangup...");
    338#endif
    339			if (port->tty)
    340				tty_hangup(port->tty);
    341		}
    342	}
    343	if (tty_port_cts_enabled(port)) {
    344		if (port->tty->hw_stopped) {
    345			if (!(status & SER_CTS)) {
    346#if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
    347				printk("CTS tx start...");
    348#endif
    349				port->tty->hw_stopped = 0;
    350				info->IER |= UART_IER_THRI;
    351				amiga_custom.intena = IF_SETCLR | IF_TBE;
    352				mb();
    353				/* set a pending Tx Interrupt, transmitter should restart now */
    354				amiga_custom.intreq = IF_SETCLR | IF_TBE;
    355				mb();
    356				tty_wakeup(port->tty);
    357				return;
    358			}
    359		} else {
    360			if ((status & SER_CTS)) {
    361#if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
    362				printk("CTS tx stop...");
    363#endif
    364				port->tty->hw_stopped = 1;
    365				info->IER &= ~UART_IER_THRI;
    366				/* disable Tx interrupt and remove any pending interrupts */
    367				amiga_custom.intena = IF_TBE;
    368				mb();
    369				amiga_custom.intreq = IF_TBE;
    370				mb();
    371			}
    372		}
    373	}
    374}
    375
    376static irqreturn_t ser_vbl_int( int irq, void *data)
    377{
    378        /* vbl is just a periodic interrupt we tie into to update modem status */
    379	struct serial_state *info = data;
    380	/*
    381	 * TBD - is it better to unregister from this interrupt or to
    382	 * ignore it if MSI is clear ?
    383	 */
    384	if(info->IER & UART_IER_MSI)
    385	  check_modem_status(info);
    386	return IRQ_HANDLED;
    387}
    388
    389static irqreturn_t ser_rx_int(int irq, void *dev_id)
    390{
    391	struct serial_state *info = dev_id;
    392
    393#ifdef SERIAL_DEBUG_INTR
    394	printk("ser_rx_int...");
    395#endif
    396
    397	if (!info->tport.tty)
    398		return IRQ_NONE;
    399
    400	receive_chars(info);
    401#ifdef SERIAL_DEBUG_INTR
    402	printk("end.\n");
    403#endif
    404	return IRQ_HANDLED;
    405}
    406
    407static irqreturn_t ser_tx_int(int irq, void *dev_id)
    408{
    409	struct serial_state *info = dev_id;
    410
    411	if (amiga_custom.serdatr & SDR_TBE) {
    412#ifdef SERIAL_DEBUG_INTR
    413	  printk("ser_tx_int...");
    414#endif
    415
    416	  if (!info->tport.tty)
    417		return IRQ_NONE;
    418
    419	  transmit_chars(info);
    420#ifdef SERIAL_DEBUG_INTR
    421	  printk("end.\n");
    422#endif
    423	}
    424	return IRQ_HANDLED;
    425}
    426
    427/*
    428 * -------------------------------------------------------------------
    429 * Here ends the serial interrupt routines.
    430 * -------------------------------------------------------------------
    431 */
    432
    433/*
    434 * ---------------------------------------------------------------
    435 * Low level utility subroutines for the serial driver:  routines to
    436 * figure out the appropriate timeout for an interrupt chain, routines
    437 * to initialize and startup a serial port, and routines to shutdown a
    438 * serial port.  Useful stuff like that.
    439 * ---------------------------------------------------------------
    440 */
    441
    442static int startup(struct tty_struct *tty, struct serial_state *info)
    443{
    444	struct tty_port *port = &info->tport;
    445	unsigned long flags;
    446	int	retval=0;
    447	unsigned long page;
    448
    449	page = get_zeroed_page(GFP_KERNEL);
    450	if (!page)
    451		return -ENOMEM;
    452
    453	local_irq_save(flags);
    454
    455	if (tty_port_initialized(port)) {
    456		free_page(page);
    457		goto errout;
    458	}
    459
    460	if (info->xmit.buf)
    461		free_page(page);
    462	else
    463		info->xmit.buf = (unsigned char *) page;
    464
    465#ifdef SERIAL_DEBUG_OPEN
    466	printk("starting up ttys%d ...", info->line);
    467#endif
    468
    469	/* Clear anything in the input buffer */
    470
    471	amiga_custom.intreq = IF_RBF;
    472	mb();
    473
    474	retval = request_irq(IRQ_AMIGA_VERTB, ser_vbl_int, 0, "serial status", info);
    475	if (retval) {
    476		if (capable(CAP_SYS_ADMIN)) {
    477			set_bit(TTY_IO_ERROR, &tty->flags);
    478			retval = 0;
    479		}
    480		goto errout;
    481	}
    482
    483	/* enable both Rx and Tx interrupts */
    484	amiga_custom.intena = IF_SETCLR | IF_RBF | IF_TBE;
    485	mb();
    486	info->IER = UART_IER_MSI;
    487
    488	/* remember current state of the DCD and CTS bits */
    489	current_ctl_bits = ciab.pra & (SER_DCD | SER_CTS | SER_DSR);
    490
    491	info->MCR = 0;
    492	if (C_BAUD(tty))
    493	  info->MCR = SER_DTR | SER_RTS;
    494	rtsdtr_ctrl(info->MCR);
    495
    496	clear_bit(TTY_IO_ERROR, &tty->flags);
    497	info->xmit.head = info->xmit.tail = 0;
    498
    499	/*
    500	 * and set the speed of the serial port
    501	 */
    502	change_speed(tty, info, NULL);
    503
    504	tty_port_set_initialized(port, 1);
    505	local_irq_restore(flags);
    506	return 0;
    507
    508errout:
    509	local_irq_restore(flags);
    510	return retval;
    511}
    512
    513/*
    514 * This routine will shutdown a serial port; interrupts are disabled, and
    515 * DTR is dropped if the hangup on close termio flag is on.
    516 */
    517static void shutdown(struct tty_struct *tty, struct serial_state *info)
    518{
    519	unsigned long	flags;
    520
    521	if (!tty_port_initialized(&info->tport))
    522		return;
    523
    524#ifdef SERIAL_DEBUG_OPEN
    525	printk("Shutting down serial port %d ....\n", info->line);
    526#endif
    527
    528	local_irq_save(flags); /* Disable interrupts */
    529
    530	/*
    531	 * clear delta_msr_wait queue to avoid mem leaks: we may free the irq
    532	 * here so the queue might never be waken up
    533	 */
    534	wake_up_interruptible(&info->tport.delta_msr_wait);
    535
    536	/*
    537	 * Free the IRQ, if necessary
    538	 */
    539	free_irq(IRQ_AMIGA_VERTB, info);
    540
    541	free_page((unsigned long)info->xmit.buf);
    542	info->xmit.buf = NULL;
    543
    544	info->IER = 0;
    545	amiga_custom.intena = IF_RBF | IF_TBE;
    546	mb();
    547
    548	/* disable break condition */
    549	amiga_custom.adkcon = AC_UARTBRK;
    550	mb();
    551
    552	if (C_HUPCL(tty))
    553		info->MCR &= ~(SER_DTR|SER_RTS);
    554	rtsdtr_ctrl(info->MCR);
    555
    556	set_bit(TTY_IO_ERROR, &tty->flags);
    557
    558	tty_port_set_initialized(&info->tport, 0);
    559	local_irq_restore(flags);
    560}
    561
    562
    563/*
    564 * This routine is called to set the UART divisor registers to match
    565 * the specified baud rate for a serial port.
    566 */
    567static void change_speed(struct tty_struct *tty, struct serial_state *info,
    568			 struct ktermios *old_termios)
    569{
    570	struct tty_port *port = &info->tport;
    571	int	quot = 0, baud_base, baud;
    572	unsigned cflag, cval = 0;
    573	int	bits;
    574	unsigned long	flags;
    575
    576	cflag = tty->termios.c_cflag;
    577
    578	/* Byte size is always 8 bits plus parity bit if requested */
    579
    580	cval = 3; bits = 10;
    581	if (cflag & CSTOPB) {
    582		cval |= 0x04;
    583		bits++;
    584	}
    585	if (cflag & PARENB) {
    586		cval |= UART_LCR_PARITY;
    587		bits++;
    588	}
    589	if (!(cflag & PARODD))
    590		cval |= UART_LCR_EPAR;
    591	if (cflag & CMSPAR)
    592		cval |= UART_LCR_SPAR;
    593
    594	/* Determine divisor based on baud rate */
    595	baud = tty_get_baud_rate(tty);
    596	if (!baud)
    597		baud = 9600;	/* B0 transition handled in rs_set_termios */
    598	baud_base = info->baud_base;
    599	if (baud == 38400 && (port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
    600		quot = info->custom_divisor;
    601	else {
    602		if (baud == 134)
    603			/* Special case since 134 is really 134.5 */
    604			quot = (2*baud_base / 269);
    605		else if (baud)
    606			quot = baud_base / baud;
    607	}
    608	/* If the quotient is zero refuse the change */
    609	if (!quot && old_termios) {
    610		/* FIXME: Will need updating for new tty in the end */
    611		tty->termios.c_cflag &= ~CBAUD;
    612		tty->termios.c_cflag |= (old_termios->c_cflag & CBAUD);
    613		baud = tty_get_baud_rate(tty);
    614		if (!baud)
    615			baud = 9600;
    616		if (baud == 38400 &&
    617		    (port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
    618			quot = info->custom_divisor;
    619		else {
    620			if (baud == 134)
    621				/* Special case since 134 is really 134.5 */
    622				quot = (2*baud_base / 269);
    623			else if (baud)
    624				quot = baud_base / baud;
    625		}
    626	}
    627	/* As a last resort, if the quotient is zero, default to 9600 bps */
    628	if (!quot)
    629		quot = baud_base / 9600;
    630	info->quot = quot;
    631	info->timeout = (XMIT_FIFO_SIZE*HZ*bits*quot) / baud_base;
    632	info->timeout += HZ/50;		/* Add .02 seconds of slop */
    633
    634	/* CTS flow control flag and modem status interrupts */
    635	info->IER &= ~UART_IER_MSI;
    636	if (port->flags & ASYNC_HARDPPS_CD)
    637		info->IER |= UART_IER_MSI;
    638	tty_port_set_cts_flow(port, cflag & CRTSCTS);
    639	if (cflag & CRTSCTS)
    640		info->IER |= UART_IER_MSI;
    641	tty_port_set_check_carrier(port, ~cflag & CLOCAL);
    642	if (~cflag & CLOCAL)
    643		info->IER |= UART_IER_MSI;
    644	/* TBD:
    645	 * Does clearing IER_MSI imply that we should disable the VBL interrupt ?
    646	 */
    647
    648	/*
    649	 * Set up parity check flag
    650	 */
    651
    652	info->read_status_mask = UART_LSR_OE | UART_LSR_DR;
    653	if (I_INPCK(tty))
    654		info->read_status_mask |= UART_LSR_FE | UART_LSR_PE;
    655	if (I_BRKINT(tty) || I_PARMRK(tty))
    656		info->read_status_mask |= UART_LSR_BI;
    657
    658	/*
    659	 * Characters to ignore
    660	 */
    661	info->ignore_status_mask = 0;
    662	if (I_IGNPAR(tty))
    663		info->ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
    664	if (I_IGNBRK(tty)) {
    665		info->ignore_status_mask |= UART_LSR_BI;
    666		/*
    667		 * If we're ignore parity and break indicators, ignore 
    668		 * overruns too.  (For real raw support).
    669		 */
    670		if (I_IGNPAR(tty))
    671			info->ignore_status_mask |= UART_LSR_OE;
    672	}
    673	/*
    674	 * !!! ignore all characters if CREAD is not set
    675	 */
    676	if ((cflag & CREAD) == 0)
    677		info->ignore_status_mask |= UART_LSR_DR;
    678	local_irq_save(flags);
    679
    680	{
    681	  short serper;
    682
    683	/* Set up the baud rate */
    684	  serper = quot - 1;
    685
    686	/* Enable or disable parity bit */
    687
    688	if(cval & UART_LCR_PARITY)
    689	  serper |= (SERPER_PARENB);
    690
    691	amiga_custom.serper = serper;
    692	mb();
    693	}
    694
    695	local_irq_restore(flags);
    696}
    697
    698static int rs_put_char(struct tty_struct *tty, unsigned char ch)
    699{
    700	struct serial_state *info;
    701	unsigned long flags;
    702
    703	info = tty->driver_data;
    704
    705	if (!info->xmit.buf)
    706		return 0;
    707
    708	local_irq_save(flags);
    709	if (CIRC_SPACE(info->xmit.head,
    710		       info->xmit.tail,
    711		       SERIAL_XMIT_SIZE) == 0) {
    712		local_irq_restore(flags);
    713		return 0;
    714	}
    715
    716	info->xmit.buf[info->xmit.head++] = ch;
    717	info->xmit.head &= SERIAL_XMIT_SIZE-1;
    718	local_irq_restore(flags);
    719	return 1;
    720}
    721
    722static void rs_flush_chars(struct tty_struct *tty)
    723{
    724	struct serial_state *info = tty->driver_data;
    725	unsigned long flags;
    726
    727	if (info->xmit.head == info->xmit.tail
    728	    || tty->flow.stopped
    729	    || tty->hw_stopped
    730	    || !info->xmit.buf)
    731		return;
    732
    733	local_irq_save(flags);
    734	info->IER |= UART_IER_THRI;
    735	amiga_custom.intena = IF_SETCLR | IF_TBE;
    736	mb();
    737	/* set a pending Tx Interrupt, transmitter should restart now */
    738	amiga_custom.intreq = IF_SETCLR | IF_TBE;
    739	mb();
    740	local_irq_restore(flags);
    741}
    742
    743static int rs_write(struct tty_struct * tty, const unsigned char *buf, int count)
    744{
    745	int	c, ret = 0;
    746	struct serial_state *info = tty->driver_data;
    747	unsigned long flags;
    748
    749	if (!info->xmit.buf)
    750		return 0;
    751
    752	local_irq_save(flags);
    753	while (1) {
    754		c = CIRC_SPACE_TO_END(info->xmit.head,
    755				      info->xmit.tail,
    756				      SERIAL_XMIT_SIZE);
    757		if (count < c)
    758			c = count;
    759		if (c <= 0) {
    760			break;
    761		}
    762		memcpy(info->xmit.buf + info->xmit.head, buf, c);
    763		info->xmit.head = ((info->xmit.head + c) &
    764				   (SERIAL_XMIT_SIZE-1));
    765		buf += c;
    766		count -= c;
    767		ret += c;
    768	}
    769	local_irq_restore(flags);
    770
    771	if (info->xmit.head != info->xmit.tail
    772	    && !tty->flow.stopped
    773	    && !tty->hw_stopped
    774	    && !(info->IER & UART_IER_THRI)) {
    775		info->IER |= UART_IER_THRI;
    776		local_irq_disable();
    777		amiga_custom.intena = IF_SETCLR | IF_TBE;
    778		mb();
    779		/* set a pending Tx Interrupt, transmitter should restart now */
    780		amiga_custom.intreq = IF_SETCLR | IF_TBE;
    781		mb();
    782		local_irq_restore(flags);
    783	}
    784	return ret;
    785}
    786
    787static unsigned int rs_write_room(struct tty_struct *tty)
    788{
    789	struct serial_state *info = tty->driver_data;
    790
    791	return CIRC_SPACE(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE);
    792}
    793
    794static unsigned int rs_chars_in_buffer(struct tty_struct *tty)
    795{
    796	struct serial_state *info = tty->driver_data;
    797
    798	return CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE);
    799}
    800
    801static void rs_flush_buffer(struct tty_struct *tty)
    802{
    803	struct serial_state *info = tty->driver_data;
    804	unsigned long flags;
    805
    806	local_irq_save(flags);
    807	info->xmit.head = info->xmit.tail = 0;
    808	local_irq_restore(flags);
    809	tty_wakeup(tty);
    810}
    811
    812/*
    813 * This function is used to send a high-priority XON/XOFF character to
    814 * the device
    815 */
    816static void rs_send_xchar(struct tty_struct *tty, char ch)
    817{
    818	struct serial_state *info = tty->driver_data;
    819        unsigned long flags;
    820
    821	info->x_char = ch;
    822	if (ch) {
    823		/* Make sure transmit interrupts are on */
    824
    825	        /* Check this ! */
    826	        local_irq_save(flags);
    827		if(!(amiga_custom.intenar & IF_TBE)) {
    828		    amiga_custom.intena = IF_SETCLR | IF_TBE;
    829		    mb();
    830		    /* set a pending Tx Interrupt, transmitter should restart now */
    831		    amiga_custom.intreq = IF_SETCLR | IF_TBE;
    832		    mb();
    833		}
    834		local_irq_restore(flags);
    835
    836		info->IER |= UART_IER_THRI;
    837	}
    838}
    839
    840/*
    841 * ------------------------------------------------------------
    842 * rs_throttle()
    843 * 
    844 * This routine is called by the upper-layer tty layer to signal that
    845 * incoming characters should be throttled.
    846 * ------------------------------------------------------------
    847 */
    848static void rs_throttle(struct tty_struct * tty)
    849{
    850	struct serial_state *info = tty->driver_data;
    851	unsigned long flags;
    852#ifdef SERIAL_DEBUG_THROTTLE
    853	printk("throttle %s ....\n", tty_name(tty));
    854#endif
    855
    856	if (I_IXOFF(tty))
    857		rs_send_xchar(tty, STOP_CHAR(tty));
    858
    859	if (C_CRTSCTS(tty))
    860		info->MCR &= ~SER_RTS;
    861
    862	local_irq_save(flags);
    863	rtsdtr_ctrl(info->MCR);
    864	local_irq_restore(flags);
    865}
    866
    867static void rs_unthrottle(struct tty_struct * tty)
    868{
    869	struct serial_state *info = tty->driver_data;
    870	unsigned long flags;
    871#ifdef SERIAL_DEBUG_THROTTLE
    872	printk("unthrottle %s ....\n", tty_name(tty));
    873#endif
    874
    875	if (I_IXOFF(tty)) {
    876		if (info->x_char)
    877			info->x_char = 0;
    878		else
    879			rs_send_xchar(tty, START_CHAR(tty));
    880	}
    881	if (C_CRTSCTS(tty))
    882		info->MCR |= SER_RTS;
    883	local_irq_save(flags);
    884	rtsdtr_ctrl(info->MCR);
    885	local_irq_restore(flags);
    886}
    887
    888/*
    889 * ------------------------------------------------------------
    890 * rs_ioctl() and friends
    891 * ------------------------------------------------------------
    892 */
    893
    894static int get_serial_info(struct tty_struct *tty, struct serial_struct *ss)
    895{
    896	struct serial_state *state = tty->driver_data;
    897	unsigned int close_delay, closing_wait;
    898
    899	tty_lock(tty);
    900	close_delay = jiffies_to_msecs(state->tport.close_delay) / 10;
    901	closing_wait = state->tport.closing_wait;
    902	if (closing_wait != ASYNC_CLOSING_WAIT_NONE)
    903		closing_wait = jiffies_to_msecs(closing_wait) / 10;
    904
    905	ss->line = tty->index;
    906	ss->port = state->port;
    907	ss->flags = state->tport.flags;
    908	ss->xmit_fifo_size = XMIT_FIFO_SIZE;
    909	ss->baud_base = state->baud_base;
    910	ss->close_delay = close_delay;
    911	ss->closing_wait = closing_wait;
    912	ss->custom_divisor = state->custom_divisor;
    913	tty_unlock(tty);
    914	return 0;
    915}
    916
    917static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss)
    918{
    919	struct serial_state *state = tty->driver_data;
    920	struct tty_port *port = &state->tport;
    921	bool change_spd;
    922	int 			retval = 0;
    923	unsigned int close_delay, closing_wait;
    924
    925	tty_lock(tty);
    926	change_spd = ((ss->flags ^ port->flags) & ASYNC_SPD_MASK) ||
    927		ss->custom_divisor != state->custom_divisor;
    928	if (ss->irq || ss->port != state->port ||
    929			ss->xmit_fifo_size != XMIT_FIFO_SIZE) {
    930		tty_unlock(tty);
    931		return -EINVAL;
    932	}
    933
    934	close_delay = msecs_to_jiffies(ss->close_delay * 10);
    935	closing_wait = ss->closing_wait;
    936	if (closing_wait != ASYNC_CLOSING_WAIT_NONE)
    937		closing_wait = msecs_to_jiffies(closing_wait * 10);
    938
    939	if (!capable(CAP_SYS_ADMIN)) {
    940		if ((ss->baud_base != state->baud_base) ||
    941		    (close_delay != port->close_delay) ||
    942		    (closing_wait != port->closing_wait) ||
    943		    ((ss->flags & ~ASYNC_USR_MASK) !=
    944		     (port->flags & ~ASYNC_USR_MASK))) {
    945			tty_unlock(tty);
    946			return -EPERM;
    947		}
    948		port->flags = ((port->flags & ~ASYNC_USR_MASK) |
    949			       (ss->flags & ASYNC_USR_MASK));
    950		state->custom_divisor = ss->custom_divisor;
    951		goto check_and_exit;
    952	}
    953
    954	if (ss->baud_base < 9600) {
    955		tty_unlock(tty);
    956		return -EINVAL;
    957	}
    958
    959	/*
    960	 * OK, past this point, all the error checking has been done.
    961	 * At this point, we start making changes.....
    962	 */
    963
    964	state->baud_base = ss->baud_base;
    965	port->flags = ((port->flags & ~ASYNC_FLAGS) |
    966			(ss->flags & ASYNC_FLAGS));
    967	state->custom_divisor = ss->custom_divisor;
    968	port->close_delay = close_delay;
    969	port->closing_wait = closing_wait;
    970
    971check_and_exit:
    972	if (tty_port_initialized(port)) {
    973		if (change_spd) {
    974			/* warn about deprecation unless clearing */
    975			if (ss->flags & ASYNC_SPD_MASK)
    976				dev_warn_ratelimited(tty->dev, "use of SPD flags is deprecated\n");
    977			change_speed(tty, state, NULL);
    978		}
    979	} else
    980		retval = startup(tty, state);
    981	tty_unlock(tty);
    982	return retval;
    983}
    984
    985/*
    986 * get_lsr_info - get line status register info
    987 *
    988 * Purpose: Let user call ioctl() to get info when the UART physically
    989 * 	    is emptied.  On bus types like RS485, the transmitter must
    990 * 	    release the bus after transmitting. This must be done when
    991 * 	    the transmit shift register is empty, not be done when the
    992 * 	    transmit holding register is empty.  This functionality
    993 * 	    allows an RS485 driver to be written in user space. 
    994 */
    995static int get_lsr_info(struct serial_state *info, unsigned int __user *value)
    996{
    997	unsigned char status;
    998	unsigned int result;
    999	unsigned long flags;
   1000
   1001	local_irq_save(flags);
   1002	status = amiga_custom.serdatr;
   1003	mb();
   1004	local_irq_restore(flags);
   1005	result = ((status & SDR_TSRE) ? TIOCSER_TEMT : 0);
   1006	if (copy_to_user(value, &result, sizeof(int)))
   1007		return -EFAULT;
   1008	return 0;
   1009}
   1010
   1011
   1012static int rs_tiocmget(struct tty_struct *tty)
   1013{
   1014	struct serial_state *info = tty->driver_data;
   1015	unsigned char control, status;
   1016	unsigned long flags;
   1017
   1018	if (tty_io_error(tty))
   1019		return -EIO;
   1020
   1021	control = info->MCR;
   1022	local_irq_save(flags);
   1023	status = ciab.pra;
   1024	local_irq_restore(flags);
   1025	return    ((control & SER_RTS) ? TIOCM_RTS : 0)
   1026		| ((control & SER_DTR) ? TIOCM_DTR : 0)
   1027		| (!(status  & SER_DCD) ? TIOCM_CAR : 0)
   1028		| (!(status  & SER_DSR) ? TIOCM_DSR : 0)
   1029		| (!(status  & SER_CTS) ? TIOCM_CTS : 0);
   1030}
   1031
   1032static int rs_tiocmset(struct tty_struct *tty, unsigned int set,
   1033						unsigned int clear)
   1034{
   1035	struct serial_state *info = tty->driver_data;
   1036	unsigned long flags;
   1037
   1038	if (tty_io_error(tty))
   1039		return -EIO;
   1040
   1041	local_irq_save(flags);
   1042	if (set & TIOCM_RTS)
   1043		info->MCR |= SER_RTS;
   1044	if (set & TIOCM_DTR)
   1045		info->MCR |= SER_DTR;
   1046	if (clear & TIOCM_RTS)
   1047		info->MCR &= ~SER_RTS;
   1048	if (clear & TIOCM_DTR)
   1049		info->MCR &= ~SER_DTR;
   1050	rtsdtr_ctrl(info->MCR);
   1051	local_irq_restore(flags);
   1052	return 0;
   1053}
   1054
   1055/*
   1056 * rs_break() --- routine which turns the break handling on or off
   1057 */
   1058static int rs_break(struct tty_struct *tty, int break_state)
   1059{
   1060	unsigned long flags;
   1061
   1062	local_irq_save(flags);
   1063	if (break_state == -1)
   1064	  amiga_custom.adkcon = AC_SETCLR | AC_UARTBRK;
   1065	else
   1066	  amiga_custom.adkcon = AC_UARTBRK;
   1067	mb();
   1068	local_irq_restore(flags);
   1069	return 0;
   1070}
   1071
   1072/*
   1073 * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
   1074 * Return: write counters to the user passed counter struct
   1075 * NB: both 1->0 and 0->1 transitions are counted except for
   1076 *     RI where only 0->1 is counted.
   1077 */
   1078static int rs_get_icount(struct tty_struct *tty,
   1079				struct serial_icounter_struct *icount)
   1080{
   1081	struct serial_state *info = tty->driver_data;
   1082	struct async_icount cnow;
   1083	unsigned long flags;
   1084
   1085	local_irq_save(flags);
   1086	cnow = info->icount;
   1087	local_irq_restore(flags);
   1088	icount->cts = cnow.cts;
   1089	icount->dsr = cnow.dsr;
   1090	icount->rng = cnow.rng;
   1091	icount->dcd = cnow.dcd;
   1092	icount->rx = cnow.rx;
   1093	icount->tx = cnow.tx;
   1094	icount->frame = cnow.frame;
   1095	icount->overrun = cnow.overrun;
   1096	icount->parity = cnow.parity;
   1097	icount->brk = cnow.brk;
   1098	icount->buf_overrun = cnow.buf_overrun;
   1099
   1100	return 0;
   1101}
   1102
   1103static int rs_ioctl(struct tty_struct *tty,
   1104		    unsigned int cmd, unsigned long arg)
   1105{
   1106	struct serial_state *info = tty->driver_data;
   1107	struct async_icount cprev, cnow;	/* kernel counter temps */
   1108	void __user *argp = (void __user *)arg;
   1109	unsigned long flags;
   1110	DEFINE_WAIT(wait);
   1111	int ret;
   1112
   1113	if ((cmd != TIOCSERCONFIG) &&
   1114	    (cmd != TIOCMIWAIT) && (cmd != TIOCGICOUNT)) {
   1115		if (tty_io_error(tty))
   1116		    return -EIO;
   1117	}
   1118
   1119	switch (cmd) {
   1120		case TIOCSERCONFIG:
   1121			return 0;
   1122
   1123		case TIOCSERGETLSR: /* Get line status register */
   1124			return get_lsr_info(info, argp);
   1125
   1126		/*
   1127		 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
   1128		 * - mask passed in arg for lines of interest
   1129 		 *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
   1130		 * Caller should use TIOCGICOUNT to see which one it was
   1131		 */
   1132		case TIOCMIWAIT:
   1133			local_irq_save(flags);
   1134			/* note the counters on entry */
   1135			cprev = info->icount;
   1136			local_irq_restore(flags);
   1137			while (1) {
   1138				prepare_to_wait(&info->tport.delta_msr_wait,
   1139						&wait, TASK_INTERRUPTIBLE);
   1140				local_irq_save(flags);
   1141				cnow = info->icount; /* atomic copy */
   1142				local_irq_restore(flags);
   1143				if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && 
   1144				    cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) {
   1145					ret = -EIO; /* no change => error */
   1146					break;
   1147				}
   1148				if ( ((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
   1149				     ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
   1150				     ((arg & TIOCM_CD)  && (cnow.dcd != cprev.dcd)) ||
   1151				     ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
   1152					ret = 0;
   1153					break;
   1154				}
   1155				schedule();
   1156				/* see if a signal did it */
   1157				if (signal_pending(current)) {
   1158					ret = -ERESTARTSYS;
   1159					break;
   1160				}
   1161				cprev = cnow;
   1162			}
   1163			finish_wait(&info->tport.delta_msr_wait, &wait);
   1164			return ret;
   1165
   1166		default:
   1167			return -ENOIOCTLCMD;
   1168		}
   1169	return 0;
   1170}
   1171
   1172static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
   1173{
   1174	struct serial_state *info = tty->driver_data;
   1175	unsigned long flags;
   1176	unsigned int cflag = tty->termios.c_cflag;
   1177
   1178	change_speed(tty, info, old_termios);
   1179
   1180	/* Handle transition to B0 status */
   1181	if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD)) {
   1182		info->MCR &= ~(SER_DTR|SER_RTS);
   1183		local_irq_save(flags);
   1184		rtsdtr_ctrl(info->MCR);
   1185		local_irq_restore(flags);
   1186	}
   1187
   1188	/* Handle transition away from B0 status */
   1189	if (!(old_termios->c_cflag & CBAUD) && (cflag & CBAUD)) {
   1190		info->MCR |= SER_DTR;
   1191		if (!C_CRTSCTS(tty) || !tty_throttled(tty))
   1192			info->MCR |= SER_RTS;
   1193		local_irq_save(flags);
   1194		rtsdtr_ctrl(info->MCR);
   1195		local_irq_restore(flags);
   1196	}
   1197
   1198	/* Handle turning off CRTSCTS */
   1199	if ((old_termios->c_cflag & CRTSCTS) && !C_CRTSCTS(tty)) {
   1200		tty->hw_stopped = 0;
   1201		rs_start(tty);
   1202	}
   1203
   1204#if 0
   1205	/*
   1206	 * No need to wake up processes in open wait, since they
   1207	 * sample the CLOCAL flag once, and don't recheck it.
   1208	 * XXX  It's not clear whether the current behavior is correct
   1209	 * or not.  Hence, this may change.....
   1210	 */
   1211	if (!(old_termios->c_cflag & CLOCAL) && C_CLOCAL(tty))
   1212		wake_up_interruptible(&info->open_wait);
   1213#endif
   1214}
   1215
   1216/*
   1217 * ------------------------------------------------------------
   1218 * rs_close()
   1219 * 
   1220 * This routine is called when the serial port gets closed.  First, we
   1221 * wait for the last remaining data to be sent.  Then, we unlink its
   1222 * async structure from the interrupt chain if necessary, and we free
   1223 * that IRQ if nothing is left in the chain.
   1224 * ------------------------------------------------------------
   1225 */
   1226static void rs_close(struct tty_struct *tty, struct file * filp)
   1227{
   1228	struct serial_state *state = tty->driver_data;
   1229	struct tty_port *port = &state->tport;
   1230
   1231	if (tty_port_close_start(port, tty, filp) == 0)
   1232		return;
   1233
   1234	/*
   1235	 * At this point we stop accepting input.  To do this, we
   1236	 * disable the receive line status interrupts, and tell the
   1237	 * interrupt driver to stop checking the data ready bit in the
   1238	 * line status register.
   1239	 */
   1240	state->read_status_mask &= ~UART_LSR_DR;
   1241	if (tty_port_initialized(port)) {
   1242	        /* disable receive interrupts */
   1243	        amiga_custom.intena = IF_RBF;
   1244		mb();
   1245		/* clear any pending receive interrupt */
   1246		amiga_custom.intreq = IF_RBF;
   1247		mb();
   1248
   1249		/*
   1250		 * Before we drop DTR, make sure the UART transmitter
   1251		 * has completely drained; this is especially
   1252		 * important if there is a transmit FIFO!
   1253		 */
   1254		rs_wait_until_sent(tty, state->timeout);
   1255	}
   1256	shutdown(tty, state);
   1257	rs_flush_buffer(tty);
   1258		
   1259	tty_ldisc_flush(tty);
   1260	port->tty = NULL;
   1261
   1262	tty_port_close_end(port, tty);
   1263}
   1264
   1265/*
   1266 * rs_wait_until_sent() --- wait until the transmitter is empty
   1267 */
   1268static void rs_wait_until_sent(struct tty_struct *tty, int timeout)
   1269{
   1270	struct serial_state *info = tty->driver_data;
   1271	unsigned long orig_jiffies, char_time;
   1272	int lsr;
   1273
   1274	orig_jiffies = jiffies;
   1275
   1276	/*
   1277	 * Set the check interval to be 1/5 of the estimated time to
   1278	 * send a single character, and make it at least 1.  The check
   1279	 * interval should also be less than the timeout.
   1280	 * 
   1281	 * Note: we have to use pretty tight timings here to satisfy
   1282	 * the NIST-PCTS.
   1283	 */
   1284	char_time = (info->timeout - HZ/50) / XMIT_FIFO_SIZE;
   1285	char_time = char_time / 5;
   1286	if (char_time == 0)
   1287		char_time = 1;
   1288	if (timeout)
   1289	  char_time = min_t(unsigned long, char_time, timeout);
   1290	/*
   1291	 * If the transmitter hasn't cleared in twice the approximate
   1292	 * amount of time to send the entire FIFO, it probably won't
   1293	 * ever clear.  This assumes the UART isn't doing flow
   1294	 * control, which is currently the case.  Hence, if it ever
   1295	 * takes longer than info->timeout, this is probably due to a
   1296	 * UART bug of some kind.  So, we clamp the timeout parameter at
   1297	 * 2*info->timeout.
   1298	 */
   1299	if (!timeout || timeout > 2*info->timeout)
   1300		timeout = 2*info->timeout;
   1301#ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
   1302	printk("In rs_wait_until_sent(%d) check=%lu...", timeout, char_time);
   1303	printk("jiff=%lu...", jiffies);
   1304#endif
   1305	while(!((lsr = amiga_custom.serdatr) & SDR_TSRE)) {
   1306#ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
   1307		printk("serdatr = %d (jiff=%lu)...", lsr, jiffies);
   1308#endif
   1309		msleep_interruptible(jiffies_to_msecs(char_time));
   1310		if (signal_pending(current))
   1311			break;
   1312		if (timeout && time_after(jiffies, orig_jiffies + timeout))
   1313			break;
   1314	}
   1315	__set_current_state(TASK_RUNNING);
   1316
   1317#ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
   1318	printk("lsr = %d (jiff=%lu)...done\n", lsr, jiffies);
   1319#endif
   1320}
   1321
   1322/*
   1323 * rs_hangup() --- called by tty_hangup() when a hangup is signaled.
   1324 */
   1325static void rs_hangup(struct tty_struct *tty)
   1326{
   1327	struct serial_state *info = tty->driver_data;
   1328
   1329	rs_flush_buffer(tty);
   1330	shutdown(tty, info);
   1331	info->tport.count = 0;
   1332	tty_port_set_active(&info->tport, 0);
   1333	info->tport.tty = NULL;
   1334	wake_up_interruptible(&info->tport.open_wait);
   1335}
   1336
   1337/*
   1338 * This routine is called whenever a serial port is opened.  It
   1339 * enables interrupts for a serial port, linking in its async structure into
   1340 * the IRQ chain.   It also performs the serial-specific
   1341 * initialization for the tty structure.
   1342 */
   1343static int rs_open(struct tty_struct *tty, struct file * filp)
   1344{
   1345	struct tty_port *port = tty->port;
   1346	struct serial_state *info = container_of(port, struct serial_state,
   1347			tport);
   1348	int retval;
   1349
   1350	port->count++;
   1351	port->tty = tty;
   1352	tty->driver_data = info;
   1353
   1354	retval = startup(tty, info);
   1355	if (retval) {
   1356		return retval;
   1357	}
   1358
   1359	return tty_port_block_til_ready(port, tty, filp);
   1360}
   1361
   1362/*
   1363 * /proc fs routines....
   1364 */
   1365
   1366static inline void line_info(struct seq_file *m, int line,
   1367		struct serial_state *state)
   1368{
   1369	char	stat_buf[30], control, status;
   1370	unsigned long flags;
   1371
   1372	seq_printf(m, "%d: uart:amiga_builtin", line);
   1373
   1374	local_irq_save(flags);
   1375	status = ciab.pra;
   1376	control = tty_port_initialized(&state->tport) ? state->MCR : status;
   1377	local_irq_restore(flags);
   1378
   1379	stat_buf[0] = 0;
   1380	stat_buf[1] = 0;
   1381	if(!(control & SER_RTS))
   1382		strcat(stat_buf, "|RTS");
   1383	if(!(status & SER_CTS))
   1384		strcat(stat_buf, "|CTS");
   1385	if(!(control & SER_DTR))
   1386		strcat(stat_buf, "|DTR");
   1387	if(!(status & SER_DSR))
   1388		strcat(stat_buf, "|DSR");
   1389	if(!(status & SER_DCD))
   1390		strcat(stat_buf, "|CD");
   1391
   1392	if (state->quot)
   1393		seq_printf(m, " baud:%d", state->baud_base / state->quot);
   1394
   1395	seq_printf(m, " tx:%d rx:%d", state->icount.tx, state->icount.rx);
   1396
   1397	if (state->icount.frame)
   1398		seq_printf(m, " fe:%d", state->icount.frame);
   1399
   1400	if (state->icount.parity)
   1401		seq_printf(m, " pe:%d", state->icount.parity);
   1402
   1403	if (state->icount.brk)
   1404		seq_printf(m, " brk:%d", state->icount.brk);
   1405
   1406	if (state->icount.overrun)
   1407		seq_printf(m, " oe:%d", state->icount.overrun);
   1408
   1409	/*
   1410	 * Last thing is the RS-232 status lines
   1411	 */
   1412	seq_printf(m, " %s\n", stat_buf+1);
   1413}
   1414
   1415static int rs_proc_show(struct seq_file *m, void *v)
   1416{
   1417	seq_printf(m, "serinfo:1.0 driver:4.30\n");
   1418	line_info(m, 0, &serial_state);
   1419	return 0;
   1420}
   1421
   1422/*
   1423 * ---------------------------------------------------------------------
   1424 * rs_init() and friends
   1425 *
   1426 * rs_init() is called at boot-time to initialize the serial driver.
   1427 * ---------------------------------------------------------------------
   1428 */
   1429
   1430static const struct tty_operations serial_ops = {
   1431	.open = rs_open,
   1432	.close = rs_close,
   1433	.write = rs_write,
   1434	.put_char = rs_put_char,
   1435	.flush_chars = rs_flush_chars,
   1436	.write_room = rs_write_room,
   1437	.chars_in_buffer = rs_chars_in_buffer,
   1438	.flush_buffer = rs_flush_buffer,
   1439	.ioctl = rs_ioctl,
   1440	.throttle = rs_throttle,
   1441	.unthrottle = rs_unthrottle,
   1442	.set_termios = rs_set_termios,
   1443	.stop = rs_stop,
   1444	.start = rs_start,
   1445	.hangup = rs_hangup,
   1446	.break_ctl = rs_break,
   1447	.send_xchar = rs_send_xchar,
   1448	.wait_until_sent = rs_wait_until_sent,
   1449	.tiocmget = rs_tiocmget,
   1450	.tiocmset = rs_tiocmset,
   1451	.get_icount = rs_get_icount,
   1452	.set_serial = set_serial_info,
   1453	.get_serial = get_serial_info,
   1454	.proc_show = rs_proc_show,
   1455};
   1456
   1457static int amiga_carrier_raised(struct tty_port *port)
   1458{
   1459	return !(ciab.pra & SER_DCD);
   1460}
   1461
   1462static void amiga_dtr_rts(struct tty_port *port, int raise)
   1463{
   1464	struct serial_state *info = container_of(port, struct serial_state,
   1465			tport);
   1466	unsigned long flags;
   1467
   1468	if (raise)
   1469		info->MCR |= SER_DTR|SER_RTS;
   1470	else
   1471		info->MCR &= ~(SER_DTR|SER_RTS);
   1472
   1473	local_irq_save(flags);
   1474	rtsdtr_ctrl(info->MCR);
   1475	local_irq_restore(flags);
   1476}
   1477
   1478static const struct tty_port_operations amiga_port_ops = {
   1479	.carrier_raised = amiga_carrier_raised,
   1480	.dtr_rts = amiga_dtr_rts,
   1481};
   1482
   1483/*
   1484 * The serial driver boot-time initialization code!
   1485 */
   1486static int __init amiga_serial_probe(struct platform_device *pdev)
   1487{
   1488	struct serial_state *state = &serial_state;
   1489	struct tty_driver *driver;
   1490	unsigned long flags;
   1491	int error;
   1492
   1493	driver = tty_alloc_driver(1, TTY_DRIVER_REAL_RAW);
   1494	if (IS_ERR(driver))
   1495		return PTR_ERR(driver);
   1496
   1497	/* Initialize the tty_driver structure */
   1498
   1499	driver->driver_name = "amiserial";
   1500	driver->name = "ttyS";
   1501	driver->major = TTY_MAJOR;
   1502	driver->minor_start = 64;
   1503	driver->type = TTY_DRIVER_TYPE_SERIAL;
   1504	driver->subtype = SERIAL_TYPE_NORMAL;
   1505	driver->init_termios = tty_std_termios;
   1506	driver->init_termios.c_cflag =
   1507		B9600 | CS8 | CREAD | HUPCL | CLOCAL;
   1508	tty_set_operations(driver, &serial_ops);
   1509
   1510	memset(state, 0, sizeof(*state));
   1511	state->port = (int)&amiga_custom.serdatr; /* Just to give it a value */
   1512	tty_port_init(&state->tport);
   1513	state->tport.ops = &amiga_port_ops;
   1514	tty_port_link_device(&state->tport, driver, 0);
   1515
   1516	error = tty_register_driver(driver);
   1517	if (error)
   1518		goto fail_tty_driver_kref_put;
   1519
   1520	printk(KERN_INFO "ttyS0 is the amiga builtin serial port\n");
   1521
   1522	/* Hardware set up */
   1523
   1524	state->baud_base = amiga_colorclock;
   1525
   1526	/* set ISRs, and then disable the rx interrupts */
   1527	error = request_irq(IRQ_AMIGA_TBE, ser_tx_int, 0, "serial TX", state);
   1528	if (error)
   1529		goto fail_unregister;
   1530
   1531	error = request_irq(IRQ_AMIGA_RBF, ser_rx_int, 0,
   1532			    "serial RX", state);
   1533	if (error)
   1534		goto fail_free_irq;
   1535
   1536	local_irq_save(flags);
   1537
   1538	/* turn off Rx and Tx interrupts */
   1539	amiga_custom.intena = IF_RBF | IF_TBE;
   1540	mb();
   1541
   1542	/* clear any pending interrupt */
   1543	amiga_custom.intreq = IF_RBF | IF_TBE;
   1544	mb();
   1545
   1546	local_irq_restore(flags);
   1547
   1548	/*
   1549	 * set the appropriate directions for the modem control flags,
   1550	 * and clear RTS and DTR
   1551	 */
   1552	ciab.ddra |= (SER_DTR | SER_RTS);   /* outputs */
   1553	ciab.ddra &= ~(SER_DCD | SER_CTS | SER_DSR);  /* inputs */
   1554
   1555	platform_set_drvdata(pdev, state);
   1556
   1557	serial_driver = driver;
   1558
   1559	return 0;
   1560
   1561fail_free_irq:
   1562	free_irq(IRQ_AMIGA_TBE, state);
   1563fail_unregister:
   1564	tty_unregister_driver(driver);
   1565fail_tty_driver_kref_put:
   1566	tty_port_destroy(&state->tport);
   1567	tty_driver_kref_put(driver);
   1568	return error;
   1569}
   1570
   1571static int __exit amiga_serial_remove(struct platform_device *pdev)
   1572{
   1573	struct serial_state *state = platform_get_drvdata(pdev);
   1574
   1575	tty_unregister_driver(serial_driver);
   1576	tty_driver_kref_put(serial_driver);
   1577	tty_port_destroy(&state->tport);
   1578
   1579	free_irq(IRQ_AMIGA_TBE, state);
   1580	free_irq(IRQ_AMIGA_RBF, state);
   1581
   1582	return 0;
   1583}
   1584
   1585static struct platform_driver amiga_serial_driver = {
   1586	.remove = __exit_p(amiga_serial_remove),
   1587	.driver   = {
   1588		.name	= "amiga-serial",
   1589	},
   1590};
   1591
   1592module_platform_driver_probe(amiga_serial_driver, amiga_serial_probe);
   1593
   1594
   1595#if defined(CONFIG_SERIAL_CONSOLE) && !defined(MODULE)
   1596
   1597/*
   1598 * ------------------------------------------------------------
   1599 * Serial console driver
   1600 * ------------------------------------------------------------
   1601 */
   1602
   1603static void amiga_serial_putc(char c)
   1604{
   1605	amiga_custom.serdat = (unsigned char)c | 0x100;
   1606	while (!(amiga_custom.serdatr & 0x2000))
   1607		barrier();
   1608}
   1609
   1610/*
   1611 *	Print a string to the serial port trying not to disturb
   1612 *	any possible real use of the port...
   1613 *
   1614 *	The console must be locked when we get here.
   1615 */
   1616static void serial_console_write(struct console *co, const char *s,
   1617				unsigned count)
   1618{
   1619	unsigned short intena = amiga_custom.intenar;
   1620
   1621	amiga_custom.intena = IF_TBE;
   1622
   1623	while (count--) {
   1624		if (*s == '\n')
   1625			amiga_serial_putc('\r');
   1626		amiga_serial_putc(*s++);
   1627	}
   1628
   1629	amiga_custom.intena = IF_SETCLR | (intena & IF_TBE);
   1630}
   1631
   1632static struct tty_driver *serial_console_device(struct console *c, int *index)
   1633{
   1634	*index = 0;
   1635	return serial_driver;
   1636}
   1637
   1638static struct console sercons = {
   1639	.name =		"ttyS",
   1640	.write =	serial_console_write,
   1641	.device =	serial_console_device,
   1642	.flags =	CON_PRINTBUFFER,
   1643	.index =	-1,
   1644};
   1645
   1646/*
   1647 *	Register console.
   1648 */
   1649static int __init amiserial_console_init(void)
   1650{
   1651	if (!MACH_IS_AMIGA)
   1652		return -ENODEV;
   1653
   1654	register_console(&sercons);
   1655	return 0;
   1656}
   1657console_initcall(amiserial_console_init);
   1658
   1659#endif /* CONFIG_SERIAL_CONSOLE && !MODULE */
   1660
   1661MODULE_LICENSE("GPL");
   1662MODULE_ALIAS("platform:amiga-serial");