Linux Audio

Check our new training course

Loading...
v5.4
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Derived from many drivers using generic_serial interface,
   4 * especially serial_tx3912.c by Steven J. Hill and r39xx_serial.c
   5 * (was in Linux/VR tree) by Jim Pick.
   6 *
   7 *  Copyright (C) 1999 Harald Koerfgen
   8 *  Copyright (C) 2000 Jim Pick <jim@jimpick.com>
   9 *  Copyright (C) 2001 Steven J. Hill (sjhill@realitydiluted.com)
  10 *  Copyright (C) 2000-2002 Toshiba Corporation
  11 *
 
 
 
 
  12 *  Serial driver for TX3927/TX4927/TX4925/TX4938 internal SIO controller
  13 */
  14
  15#if defined(CONFIG_SERIAL_TXX9_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
  16#define SUPPORT_SYSRQ
  17#endif
  18
  19#include <linux/module.h>
  20#include <linux/ioport.h>
  21#include <linux/init.h>
  22#include <linux/console.h>
  23#include <linux/delay.h>
  24#include <linux/platform_device.h>
  25#include <linux/pci.h>
  26#include <linux/serial_core.h>
  27#include <linux/serial.h>
  28#include <linux/tty.h>
  29#include <linux/tty_flip.h>
  30
  31#include <asm/io.h>
  32
  33static char *serial_version = "1.11";
  34static char *serial_name = "TX39/49 Serial driver";
  35
  36#define PASS_LIMIT	256
  37
  38#if !defined(CONFIG_SERIAL_TXX9_STDSERIAL)
  39/* "ttyS" is used for standard serial driver */
  40#define TXX9_TTY_NAME "ttyTX"
  41#define TXX9_TTY_MINOR_START	196
  42#define TXX9_TTY_MAJOR	204
  43#else
  44/* acts like standard serial driver */
  45#define TXX9_TTY_NAME "ttyS"
  46#define TXX9_TTY_MINOR_START	64
  47#define TXX9_TTY_MAJOR	TTY_MAJOR
  48#endif
  49
  50/* flag aliases */
  51#define UPF_TXX9_HAVE_CTS_LINE	UPF_BUGGY_UART
  52#define UPF_TXX9_USE_SCLK	UPF_MAGIC_MULTIPLIER
  53
  54#ifdef CONFIG_PCI
  55/* support for Toshiba TC86C001 SIO */
  56#define ENABLE_SERIAL_TXX9_PCI
  57#endif
  58
  59/*
  60 * Number of serial ports
  61 */
  62#define UART_NR  CONFIG_SERIAL_TXX9_NR_UARTS
  63
  64struct uart_txx9_port {
  65	struct uart_port	port;
  66	/* No additional info for now */
  67};
  68
  69#define TXX9_REGION_SIZE	0x24
  70
  71/* TXX9 Serial Registers */
  72#define TXX9_SILCR	0x00
  73#define TXX9_SIDICR	0x04
  74#define TXX9_SIDISR	0x08
  75#define TXX9_SICISR	0x0c
  76#define TXX9_SIFCR	0x10
  77#define TXX9_SIFLCR	0x14
  78#define TXX9_SIBGR	0x18
  79#define TXX9_SITFIFO	0x1c
  80#define TXX9_SIRFIFO	0x20
  81
  82/* SILCR : Line Control */
  83#define TXX9_SILCR_SCS_MASK	0x00000060
  84#define TXX9_SILCR_SCS_IMCLK	0x00000000
  85#define TXX9_SILCR_SCS_IMCLK_BG	0x00000020
  86#define TXX9_SILCR_SCS_SCLK	0x00000040
  87#define TXX9_SILCR_SCS_SCLK_BG	0x00000060
  88#define TXX9_SILCR_UEPS	0x00000010
  89#define TXX9_SILCR_UPEN	0x00000008
  90#define TXX9_SILCR_USBL_MASK	0x00000004
  91#define TXX9_SILCR_USBL_1BIT	0x00000000
  92#define TXX9_SILCR_USBL_2BIT	0x00000004
  93#define TXX9_SILCR_UMODE_MASK	0x00000003
  94#define TXX9_SILCR_UMODE_8BIT	0x00000000
  95#define TXX9_SILCR_UMODE_7BIT	0x00000001
  96
  97/* SIDICR : DMA/Int. Control */
  98#define TXX9_SIDICR_TDE	0x00008000
  99#define TXX9_SIDICR_RDE	0x00004000
 100#define TXX9_SIDICR_TIE	0x00002000
 101#define TXX9_SIDICR_RIE	0x00001000
 102#define TXX9_SIDICR_SPIE	0x00000800
 103#define TXX9_SIDICR_CTSAC	0x00000600
 104#define TXX9_SIDICR_STIE_MASK	0x0000003f
 105#define TXX9_SIDICR_STIE_OERS		0x00000020
 106#define TXX9_SIDICR_STIE_CTSS		0x00000010
 107#define TXX9_SIDICR_STIE_RBRKD	0x00000008
 108#define TXX9_SIDICR_STIE_TRDY		0x00000004
 109#define TXX9_SIDICR_STIE_TXALS	0x00000002
 110#define TXX9_SIDICR_STIE_UBRKD	0x00000001
 111
 112/* SIDISR : DMA/Int. Status */
 113#define TXX9_SIDISR_UBRK	0x00008000
 114#define TXX9_SIDISR_UVALID	0x00004000
 115#define TXX9_SIDISR_UFER	0x00002000
 116#define TXX9_SIDISR_UPER	0x00001000
 117#define TXX9_SIDISR_UOER	0x00000800
 118#define TXX9_SIDISR_ERI	0x00000400
 119#define TXX9_SIDISR_TOUT	0x00000200
 120#define TXX9_SIDISR_TDIS	0x00000100
 121#define TXX9_SIDISR_RDIS	0x00000080
 122#define TXX9_SIDISR_STIS	0x00000040
 123#define TXX9_SIDISR_RFDN_MASK	0x0000001f
 124
 125/* SICISR : Change Int. Status */
 126#define TXX9_SICISR_OERS	0x00000020
 127#define TXX9_SICISR_CTSS	0x00000010
 128#define TXX9_SICISR_RBRKD	0x00000008
 129#define TXX9_SICISR_TRDY	0x00000004
 130#define TXX9_SICISR_TXALS	0x00000002
 131#define TXX9_SICISR_UBRKD	0x00000001
 132
 133/* SIFCR : FIFO Control */
 134#define TXX9_SIFCR_SWRST	0x00008000
 135#define TXX9_SIFCR_RDIL_MASK	0x00000180
 136#define TXX9_SIFCR_RDIL_1	0x00000000
 137#define TXX9_SIFCR_RDIL_4	0x00000080
 138#define TXX9_SIFCR_RDIL_8	0x00000100
 139#define TXX9_SIFCR_RDIL_12	0x00000180
 140#define TXX9_SIFCR_RDIL_MAX	0x00000180
 141#define TXX9_SIFCR_TDIL_MASK	0x00000018
 
 142#define TXX9_SIFCR_TDIL_1	0x00000000
 143#define TXX9_SIFCR_TDIL_4	0x00000001
 144#define TXX9_SIFCR_TDIL_8	0x00000010
 145#define TXX9_SIFCR_TDIL_MAX	0x00000010
 146#define TXX9_SIFCR_TFRST	0x00000004
 147#define TXX9_SIFCR_RFRST	0x00000002
 148#define TXX9_SIFCR_FRSTE	0x00000001
 149#define TXX9_SIO_TX_FIFO	8
 150#define TXX9_SIO_RX_FIFO	16
 151
 152/* SIFLCR : Flow Control */
 153#define TXX9_SIFLCR_RCS	0x00001000
 154#define TXX9_SIFLCR_TES	0x00000800
 155#define TXX9_SIFLCR_RTSSC	0x00000200
 156#define TXX9_SIFLCR_RSDE	0x00000100
 157#define TXX9_SIFLCR_TSDE	0x00000080
 158#define TXX9_SIFLCR_RTSTL_MASK	0x0000001e
 159#define TXX9_SIFLCR_RTSTL_MAX	0x0000001e
 160#define TXX9_SIFLCR_TBRK	0x00000001
 161
 162/* SIBGR : Baudrate Control */
 163#define TXX9_SIBGR_BCLK_MASK	0x00000300
 164#define TXX9_SIBGR_BCLK_T0	0x00000000
 165#define TXX9_SIBGR_BCLK_T2	0x00000100
 166#define TXX9_SIBGR_BCLK_T4	0x00000200
 167#define TXX9_SIBGR_BCLK_T6	0x00000300
 168#define TXX9_SIBGR_BRD_MASK	0x000000ff
 169
 170static inline unsigned int sio_in(struct uart_txx9_port *up, int offset)
 171{
 172	switch (up->port.iotype) {
 173	default:
 174		return __raw_readl(up->port.membase + offset);
 175	case UPIO_PORT:
 176		return inl(up->port.iobase + offset);
 177	}
 178}
 179
 180static inline void
 181sio_out(struct uart_txx9_port *up, int offset, int value)
 182{
 183	switch (up->port.iotype) {
 184	default:
 185		__raw_writel(value, up->port.membase + offset);
 186		break;
 187	case UPIO_PORT:
 188		outl(value, up->port.iobase + offset);
 189		break;
 190	}
 191}
 192
 193static inline void
 194sio_mask(struct uart_txx9_port *up, int offset, unsigned int value)
 195{
 196	sio_out(up, offset, sio_in(up, offset) & ~value);
 197}
 198static inline void
 199sio_set(struct uart_txx9_port *up, int offset, unsigned int value)
 200{
 201	sio_out(up, offset, sio_in(up, offset) | value);
 202}
 203
 204static inline void
 205sio_quot_set(struct uart_txx9_port *up, int quot)
 206{
 207	quot >>= 1;
 208	if (quot < 256)
 209		sio_out(up, TXX9_SIBGR, quot | TXX9_SIBGR_BCLK_T0);
 210	else if (quot < (256 << 2))
 211		sio_out(up, TXX9_SIBGR, (quot >> 2) | TXX9_SIBGR_BCLK_T2);
 212	else if (quot < (256 << 4))
 213		sio_out(up, TXX9_SIBGR, (quot >> 4) | TXX9_SIBGR_BCLK_T4);
 214	else if (quot < (256 << 6))
 215		sio_out(up, TXX9_SIBGR, (quot >> 6) | TXX9_SIBGR_BCLK_T6);
 216	else
 217		sio_out(up, TXX9_SIBGR, 0xff | TXX9_SIBGR_BCLK_T6);
 218}
 219
 220static struct uart_txx9_port *to_uart_txx9_port(struct uart_port *port)
 221{
 222	return container_of(port, struct uart_txx9_port, port);
 223}
 224
 225static void serial_txx9_stop_tx(struct uart_port *port)
 226{
 227	struct uart_txx9_port *up = to_uart_txx9_port(port);
 228	sio_mask(up, TXX9_SIDICR, TXX9_SIDICR_TIE);
 229}
 230
 231static void serial_txx9_start_tx(struct uart_port *port)
 232{
 233	struct uart_txx9_port *up = to_uart_txx9_port(port);
 234	sio_set(up, TXX9_SIDICR, TXX9_SIDICR_TIE);
 235}
 236
 237static void serial_txx9_stop_rx(struct uart_port *port)
 238{
 239	struct uart_txx9_port *up = to_uart_txx9_port(port);
 240	up->port.read_status_mask &= ~TXX9_SIDISR_RDIS;
 241}
 242
 
 
 
 
 
 243static void serial_txx9_initialize(struct uart_port *port)
 244{
 245	struct uart_txx9_port *up = to_uart_txx9_port(port);
 246	unsigned int tmout = 10000;
 247
 248	sio_out(up, TXX9_SIFCR, TXX9_SIFCR_SWRST);
 249	/* TX4925 BUG WORKAROUND.  Accessing SIOC register
 250	 * immediately after soft reset causes bus error. */
 
 251	udelay(1);
 252	while ((sio_in(up, TXX9_SIFCR) & TXX9_SIFCR_SWRST) && --tmout)
 253		udelay(1);
 254	/* TX Int by FIFO Empty, RX Int by Receiving 1 char. */
 255	sio_set(up, TXX9_SIFCR,
 256		TXX9_SIFCR_TDIL_MAX | TXX9_SIFCR_RDIL_1);
 257	/* initial settings */
 258	sio_out(up, TXX9_SILCR,
 259		TXX9_SILCR_UMODE_8BIT | TXX9_SILCR_USBL_1BIT |
 260		((up->port.flags & UPF_TXX9_USE_SCLK) ?
 261		 TXX9_SILCR_SCS_SCLK_BG : TXX9_SILCR_SCS_IMCLK_BG));
 262	sio_quot_set(up, uart_get_divisor(port, 9600));
 263	sio_out(up, TXX9_SIFLCR, TXX9_SIFLCR_RTSTL_MAX /* 15 */);
 264	sio_out(up, TXX9_SIDICR, 0);
 265}
 266
 267static inline void
 268receive_chars(struct uart_txx9_port *up, unsigned int *status)
 269{
 270	unsigned char ch;
 271	unsigned int disr = *status;
 272	int max_count = 256;
 273	char flag;
 274	unsigned int next_ignore_status_mask;
 275
 276	do {
 277		ch = sio_in(up, TXX9_SIRFIFO);
 278		flag = TTY_NORMAL;
 279		up->port.icount.rx++;
 280
 281		/* mask out RFDN_MASK bit added by previous overrun */
 282		next_ignore_status_mask =
 283			up->port.ignore_status_mask & ~TXX9_SIDISR_RFDN_MASK;
 284		if (unlikely(disr & (TXX9_SIDISR_UBRK | TXX9_SIDISR_UPER |
 285				     TXX9_SIDISR_UFER | TXX9_SIDISR_UOER))) {
 286			/*
 287			 * For statistics only
 288			 */
 289			if (disr & TXX9_SIDISR_UBRK) {
 290				disr &= ~(TXX9_SIDISR_UFER | TXX9_SIDISR_UPER);
 291				up->port.icount.brk++;
 292				/*
 293				 * We do the SysRQ and SAK checking
 294				 * here because otherwise the break
 295				 * may get masked by ignore_status_mask
 296				 * or read_status_mask.
 297				 */
 298				if (uart_handle_break(&up->port))
 299					goto ignore_char;
 300			} else if (disr & TXX9_SIDISR_UPER)
 301				up->port.icount.parity++;
 302			else if (disr & TXX9_SIDISR_UFER)
 303				up->port.icount.frame++;
 304			if (disr & TXX9_SIDISR_UOER) {
 305				up->port.icount.overrun++;
 306				/*
 307				 * The receiver read buffer still hold
 308				 * a char which caused overrun.
 309				 * Ignore next char by adding RFDN_MASK
 310				 * to ignore_status_mask temporarily.
 311				 */
 312				next_ignore_status_mask |=
 313					TXX9_SIDISR_RFDN_MASK;
 314			}
 315
 316			/*
 317			 * Mask off conditions which should be ingored.
 318			 */
 319			disr &= up->port.read_status_mask;
 320
 321			if (disr & TXX9_SIDISR_UBRK) {
 322				flag = TTY_BREAK;
 323			} else if (disr & TXX9_SIDISR_UPER)
 324				flag = TTY_PARITY;
 325			else if (disr & TXX9_SIDISR_UFER)
 326				flag = TTY_FRAME;
 327		}
 328		if (uart_handle_sysrq_char(&up->port, ch))
 329			goto ignore_char;
 330
 331		uart_insert_char(&up->port, disr, TXX9_SIDISR_UOER, ch, flag);
 332
 333	ignore_char:
 334		up->port.ignore_status_mask = next_ignore_status_mask;
 335		disr = sio_in(up, TXX9_SIDISR);
 336	} while (!(disr & TXX9_SIDISR_UVALID) && (max_count-- > 0));
 337	spin_unlock(&up->port.lock);
 338	tty_flip_buffer_push(&up->port.state->port);
 339	spin_lock(&up->port.lock);
 340	*status = disr;
 341}
 342
 343static inline void transmit_chars(struct uart_txx9_port *up)
 344{
 345	struct circ_buf *xmit = &up->port.state->xmit;
 346	int count;
 347
 348	if (up->port.x_char) {
 349		sio_out(up, TXX9_SITFIFO, up->port.x_char);
 350		up->port.icount.tx++;
 351		up->port.x_char = 0;
 352		return;
 353	}
 354	if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) {
 355		serial_txx9_stop_tx(&up->port);
 356		return;
 357	}
 358
 359	count = TXX9_SIO_TX_FIFO;
 360	do {
 361		sio_out(up, TXX9_SITFIFO, xmit->buf[xmit->tail]);
 362		xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
 363		up->port.icount.tx++;
 364		if (uart_circ_empty(xmit))
 365			break;
 366	} while (--count > 0);
 367
 368	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
 369		uart_write_wakeup(&up->port);
 370
 371	if (uart_circ_empty(xmit))
 372		serial_txx9_stop_tx(&up->port);
 373}
 374
 375static irqreturn_t serial_txx9_interrupt(int irq, void *dev_id)
 376{
 377	int pass_counter = 0;
 378	struct uart_txx9_port *up = dev_id;
 379	unsigned int status;
 380
 381	while (1) {
 382		spin_lock(&up->port.lock);
 383		status = sio_in(up, TXX9_SIDISR);
 384		if (!(sio_in(up, TXX9_SIDICR) & TXX9_SIDICR_TIE))
 385			status &= ~TXX9_SIDISR_TDIS;
 386		if (!(status & (TXX9_SIDISR_TDIS | TXX9_SIDISR_RDIS |
 387				TXX9_SIDISR_TOUT))) {
 388			spin_unlock(&up->port.lock);
 389			break;
 390		}
 391
 392		if (status & TXX9_SIDISR_RDIS)
 393			receive_chars(up, &status);
 394		if (status & TXX9_SIDISR_TDIS)
 395			transmit_chars(up);
 396		/* Clear TX/RX Int. Status */
 397		sio_mask(up, TXX9_SIDISR,
 398			 TXX9_SIDISR_TDIS | TXX9_SIDISR_RDIS |
 399			 TXX9_SIDISR_TOUT);
 400		spin_unlock(&up->port.lock);
 401
 402		if (pass_counter++ > PASS_LIMIT)
 403			break;
 404	}
 405
 406	return pass_counter ? IRQ_HANDLED : IRQ_NONE;
 407}
 408
 409static unsigned int serial_txx9_tx_empty(struct uart_port *port)
 410{
 411	struct uart_txx9_port *up = to_uart_txx9_port(port);
 412	unsigned long flags;
 413	unsigned int ret;
 414
 415	spin_lock_irqsave(&up->port.lock, flags);
 416	ret = (sio_in(up, TXX9_SICISR) & TXX9_SICISR_TXALS) ? TIOCSER_TEMT : 0;
 417	spin_unlock_irqrestore(&up->port.lock, flags);
 418
 419	return ret;
 420}
 421
 422static unsigned int serial_txx9_get_mctrl(struct uart_port *port)
 423{
 424	struct uart_txx9_port *up = to_uart_txx9_port(port);
 425	unsigned int ret;
 426
 427	/* no modem control lines */
 428	ret = TIOCM_CAR | TIOCM_DSR;
 429	ret |= (sio_in(up, TXX9_SIFLCR) & TXX9_SIFLCR_RTSSC) ? 0 : TIOCM_RTS;
 430	ret |= (sio_in(up, TXX9_SICISR) & TXX9_SICISR_CTSS) ? 0 : TIOCM_CTS;
 431
 432	return ret;
 433}
 434
 435static void serial_txx9_set_mctrl(struct uart_port *port, unsigned int mctrl)
 436{
 437	struct uart_txx9_port *up = to_uart_txx9_port(port);
 438
 439	if (mctrl & TIOCM_RTS)
 440		sio_mask(up, TXX9_SIFLCR, TXX9_SIFLCR_RTSSC);
 441	else
 442		sio_set(up, TXX9_SIFLCR, TXX9_SIFLCR_RTSSC);
 443}
 444
 445static void serial_txx9_break_ctl(struct uart_port *port, int break_state)
 446{
 447	struct uart_txx9_port *up = to_uart_txx9_port(port);
 448	unsigned long flags;
 449
 450	spin_lock_irqsave(&up->port.lock, flags);
 451	if (break_state == -1)
 452		sio_set(up, TXX9_SIFLCR, TXX9_SIFLCR_TBRK);
 453	else
 454		sio_mask(up, TXX9_SIFLCR, TXX9_SIFLCR_TBRK);
 455	spin_unlock_irqrestore(&up->port.lock, flags);
 456}
 457
 458#if defined(CONFIG_SERIAL_TXX9_CONSOLE) || defined(CONFIG_CONSOLE_POLL)
 459/*
 460 *	Wait for transmitter & holding register to empty
 461 */
 462static void wait_for_xmitr(struct uart_txx9_port *up)
 463{
 464	unsigned int tmout = 10000;
 465
 466	/* Wait up to 10ms for the character(s) to be sent. */
 467	while (--tmout &&
 468	       !(sio_in(up, TXX9_SICISR) & TXX9_SICISR_TXALS))
 469		udelay(1);
 470
 471	/* Wait up to 1s for flow control if necessary */
 472	if (up->port.flags & UPF_CONS_FLOW) {
 473		tmout = 1000000;
 474		while (--tmout &&
 475		       (sio_in(up, TXX9_SICISR) & TXX9_SICISR_CTSS))
 476			udelay(1);
 477	}
 478}
 479#endif
 480
 481#ifdef CONFIG_CONSOLE_POLL
 482/*
 483 * Console polling routines for writing and reading from the uart while
 484 * in an interrupt or debug context.
 485 */
 486
 487static int serial_txx9_get_poll_char(struct uart_port *port)
 488{
 489	unsigned int ier;
 490	unsigned char c;
 491	struct uart_txx9_port *up = to_uart_txx9_port(port);
 492
 493	/*
 494	 *	First save the IER then disable the interrupts
 495	 */
 496	ier = sio_in(up, TXX9_SIDICR);
 497	sio_out(up, TXX9_SIDICR, 0);
 498
 499	while (sio_in(up, TXX9_SIDISR) & TXX9_SIDISR_UVALID)
 500		;
 501
 502	c = sio_in(up, TXX9_SIRFIFO);
 503
 504	/*
 505	 *	Finally, clear RX interrupt status
 506	 *	and restore the IER
 507	 */
 508	sio_mask(up, TXX9_SIDISR, TXX9_SIDISR_RDIS);
 509	sio_out(up, TXX9_SIDICR, ier);
 510	return c;
 511}
 512
 513
 514static void serial_txx9_put_poll_char(struct uart_port *port, unsigned char c)
 515{
 516	unsigned int ier;
 517	struct uart_txx9_port *up = to_uart_txx9_port(port);
 518
 519	/*
 520	 *	First save the IER then disable the interrupts
 521	 */
 522	ier = sio_in(up, TXX9_SIDICR);
 523	sio_out(up, TXX9_SIDICR, 0);
 524
 525	wait_for_xmitr(up);
 526	/*
 527	 *	Send the character out.
 
 528	 */
 529	sio_out(up, TXX9_SITFIFO, c);
 
 
 
 
 530
 531	/*
 532	 *	Finally, wait for transmitter to become empty
 533	 *	and restore the IER
 534	 */
 535	wait_for_xmitr(up);
 536	sio_out(up, TXX9_SIDICR, ier);
 537}
 538
 539#endif /* CONFIG_CONSOLE_POLL */
 540
 541static int serial_txx9_startup(struct uart_port *port)
 542{
 543	struct uart_txx9_port *up = to_uart_txx9_port(port);
 544	unsigned long flags;
 545	int retval;
 546
 547	/*
 548	 * Clear the FIFO buffers and disable them.
 549	 * (they will be reenabled in set_termios())
 550	 */
 551	sio_set(up, TXX9_SIFCR,
 552		TXX9_SIFCR_TFRST | TXX9_SIFCR_RFRST | TXX9_SIFCR_FRSTE);
 553	/* clear reset */
 554	sio_mask(up, TXX9_SIFCR,
 555		 TXX9_SIFCR_TFRST | TXX9_SIFCR_RFRST | TXX9_SIFCR_FRSTE);
 556	sio_out(up, TXX9_SIDICR, 0);
 557
 558	/*
 559	 * Clear the interrupt registers.
 560	 */
 561	sio_out(up, TXX9_SIDISR, 0);
 562
 563	retval = request_irq(up->port.irq, serial_txx9_interrupt,
 564			     IRQF_SHARED, "serial_txx9", up);
 565	if (retval)
 566		return retval;
 567
 568	/*
 569	 * Now, initialize the UART
 570	 */
 571	spin_lock_irqsave(&up->port.lock, flags);
 572	serial_txx9_set_mctrl(&up->port, up->port.mctrl);
 573	spin_unlock_irqrestore(&up->port.lock, flags);
 574
 575	/* Enable RX/TX */
 576	sio_mask(up, TXX9_SIFLCR, TXX9_SIFLCR_RSDE | TXX9_SIFLCR_TSDE);
 577
 578	/*
 579	 * Finally, enable interrupts.
 580	 */
 581	sio_set(up, TXX9_SIDICR, TXX9_SIDICR_RIE);
 582
 583	return 0;
 584}
 585
 586static void serial_txx9_shutdown(struct uart_port *port)
 587{
 588	struct uart_txx9_port *up = to_uart_txx9_port(port);
 589	unsigned long flags;
 590
 591	/*
 592	 * Disable interrupts from this port
 593	 */
 594	sio_out(up, TXX9_SIDICR, 0);	/* disable all intrs */
 595
 596	spin_lock_irqsave(&up->port.lock, flags);
 597	serial_txx9_set_mctrl(&up->port, up->port.mctrl);
 598	spin_unlock_irqrestore(&up->port.lock, flags);
 599
 600	/*
 601	 * Disable break condition
 602	 */
 603	sio_mask(up, TXX9_SIFLCR, TXX9_SIFLCR_TBRK);
 604
 605#ifdef CONFIG_SERIAL_TXX9_CONSOLE
 606	if (up->port.cons && up->port.line == up->port.cons->index) {
 607		free_irq(up->port.irq, up);
 608		return;
 609	}
 610#endif
 611	/* reset FIFOs */
 612	sio_set(up, TXX9_SIFCR,
 613		TXX9_SIFCR_TFRST | TXX9_SIFCR_RFRST | TXX9_SIFCR_FRSTE);
 614	/* clear reset */
 615	sio_mask(up, TXX9_SIFCR,
 616		 TXX9_SIFCR_TFRST | TXX9_SIFCR_RFRST | TXX9_SIFCR_FRSTE);
 617
 618	/* Disable RX/TX */
 619	sio_set(up, TXX9_SIFLCR, TXX9_SIFLCR_RSDE | TXX9_SIFLCR_TSDE);
 620
 621	free_irq(up->port.irq, up);
 622}
 623
 624static void
 625serial_txx9_set_termios(struct uart_port *port, struct ktermios *termios,
 626		       struct ktermios *old)
 627{
 628	struct uart_txx9_port *up = to_uart_txx9_port(port);
 629	unsigned int cval, fcr = 0;
 630	unsigned long flags;
 631	unsigned int baud, quot;
 632
 633	/*
 634	 * We don't support modem control lines.
 635	 */
 636	termios->c_cflag &= ~(HUPCL | CMSPAR);
 637	termios->c_cflag |= CLOCAL;
 638
 639	cval = sio_in(up, TXX9_SILCR);
 640	/* byte size and parity */
 641	cval &= ~TXX9_SILCR_UMODE_MASK;
 642	switch (termios->c_cflag & CSIZE) {
 643	case CS7:
 644		cval |= TXX9_SILCR_UMODE_7BIT;
 645		break;
 646	default:
 647	case CS5:	/* not supported */
 648	case CS6:	/* not supported */
 649	case CS8:
 650		cval |= TXX9_SILCR_UMODE_8BIT;
 651		break;
 652	}
 653
 654	cval &= ~TXX9_SILCR_USBL_MASK;
 655	if (termios->c_cflag & CSTOPB)
 656		cval |= TXX9_SILCR_USBL_2BIT;
 657	else
 658		cval |= TXX9_SILCR_USBL_1BIT;
 659	cval &= ~(TXX9_SILCR_UPEN | TXX9_SILCR_UEPS);
 660	if (termios->c_cflag & PARENB)
 661		cval |= TXX9_SILCR_UPEN;
 662	if (!(termios->c_cflag & PARODD))
 663		cval |= TXX9_SILCR_UEPS;
 664
 665	/*
 666	 * Ask the core to calculate the divisor for us.
 667	 */
 668	baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16/2);
 669	quot = uart_get_divisor(port, baud);
 670
 671	/* Set up FIFOs */
 672	/* TX Int by FIFO Empty, RX Int by Receiving 1 char. */
 673	fcr = TXX9_SIFCR_TDIL_MAX | TXX9_SIFCR_RDIL_1;
 674
 675	/*
 676	 * Ok, we're now changing the port state.  Do it with
 677	 * interrupts disabled.
 678	 */
 679	spin_lock_irqsave(&up->port.lock, flags);
 680
 681	/*
 682	 * Update the per-port timeout.
 683	 */
 684	uart_update_timeout(port, termios->c_cflag, baud);
 685
 686	up->port.read_status_mask = TXX9_SIDISR_UOER |
 687		TXX9_SIDISR_TDIS | TXX9_SIDISR_RDIS;
 688	if (termios->c_iflag & INPCK)
 689		up->port.read_status_mask |= TXX9_SIDISR_UFER | TXX9_SIDISR_UPER;
 690	if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
 691		up->port.read_status_mask |= TXX9_SIDISR_UBRK;
 692
 693	/*
 694	 * Characteres to ignore
 695	 */
 696	up->port.ignore_status_mask = 0;
 697	if (termios->c_iflag & IGNPAR)
 698		up->port.ignore_status_mask |= TXX9_SIDISR_UPER | TXX9_SIDISR_UFER;
 699	if (termios->c_iflag & IGNBRK) {
 700		up->port.ignore_status_mask |= TXX9_SIDISR_UBRK;
 701		/*
 702		 * If we're ignoring parity and break indicators,
 703		 * ignore overruns too (for real raw support).
 704		 */
 705		if (termios->c_iflag & IGNPAR)
 706			up->port.ignore_status_mask |= TXX9_SIDISR_UOER;
 707	}
 708
 709	/*
 710	 * ignore all characters if CREAD is not set
 711	 */
 712	if ((termios->c_cflag & CREAD) == 0)
 713		up->port.ignore_status_mask |= TXX9_SIDISR_RDIS;
 714
 715	/* CTS flow control flag */
 716	if ((termios->c_cflag & CRTSCTS) &&
 717	    (up->port.flags & UPF_TXX9_HAVE_CTS_LINE)) {
 718		sio_set(up, TXX9_SIFLCR,
 719			TXX9_SIFLCR_RCS | TXX9_SIFLCR_TES);
 720	} else {
 721		sio_mask(up, TXX9_SIFLCR,
 722			 TXX9_SIFLCR_RCS | TXX9_SIFLCR_TES);
 723	}
 724
 725	sio_out(up, TXX9_SILCR, cval);
 726	sio_quot_set(up, quot);
 727	sio_out(up, TXX9_SIFCR, fcr);
 728
 729	serial_txx9_set_mctrl(&up->port, up->port.mctrl);
 730	spin_unlock_irqrestore(&up->port.lock, flags);
 731}
 732
 733static void
 734serial_txx9_pm(struct uart_port *port, unsigned int state,
 735	      unsigned int oldstate)
 736{
 737	/*
 738	 * If oldstate was -1 this is called from
 739	 * uart_configure_port().  In this case do not initialize the
 740	 * port now, because the port was already initialized (for
 741	 * non-console port) or should not be initialized here (for
 742	 * console port).  If we initialized the port here we lose
 743	 * serial console settings.
 744	 */
 745	if (state == 0 && oldstate != -1)
 746		serial_txx9_initialize(port);
 747}
 748
 749static int serial_txx9_request_resource(struct uart_txx9_port *up)
 750{
 751	unsigned int size = TXX9_REGION_SIZE;
 752	int ret = 0;
 753
 754	switch (up->port.iotype) {
 755	default:
 756		if (!up->port.mapbase)
 757			break;
 758
 759		if (!request_mem_region(up->port.mapbase, size, "serial_txx9")) {
 760			ret = -EBUSY;
 761			break;
 762		}
 763
 764		if (up->port.flags & UPF_IOREMAP) {
 765			up->port.membase = ioremap(up->port.mapbase, size);
 766			if (!up->port.membase) {
 767				release_mem_region(up->port.mapbase, size);
 768				ret = -ENOMEM;
 769			}
 770		}
 771		break;
 772
 773	case UPIO_PORT:
 774		if (!request_region(up->port.iobase, size, "serial_txx9"))
 775			ret = -EBUSY;
 776		break;
 777	}
 778	return ret;
 779}
 780
 781static void serial_txx9_release_resource(struct uart_txx9_port *up)
 782{
 783	unsigned int size = TXX9_REGION_SIZE;
 784
 785	switch (up->port.iotype) {
 786	default:
 787		if (!up->port.mapbase)
 788			break;
 789
 790		if (up->port.flags & UPF_IOREMAP) {
 791			iounmap(up->port.membase);
 792			up->port.membase = NULL;
 793		}
 794
 795		release_mem_region(up->port.mapbase, size);
 796		break;
 797
 798	case UPIO_PORT:
 799		release_region(up->port.iobase, size);
 800		break;
 801	}
 802}
 803
 804static void serial_txx9_release_port(struct uart_port *port)
 805{
 806	struct uart_txx9_port *up = to_uart_txx9_port(port);
 807	serial_txx9_release_resource(up);
 808}
 809
 810static int serial_txx9_request_port(struct uart_port *port)
 811{
 812	struct uart_txx9_port *up = to_uart_txx9_port(port);
 813	return serial_txx9_request_resource(up);
 814}
 815
 816static void serial_txx9_config_port(struct uart_port *port, int uflags)
 817{
 818	struct uart_txx9_port *up = to_uart_txx9_port(port);
 819	int ret;
 820
 821	/*
 822	 * Find the region that we can probe for.  This in turn
 823	 * tells us whether we can probe for the type of port.
 824	 */
 825	ret = serial_txx9_request_resource(up);
 826	if (ret < 0)
 827		return;
 828	port->type = PORT_TXX9;
 829	up->port.fifosize = TXX9_SIO_TX_FIFO;
 830
 831#ifdef CONFIG_SERIAL_TXX9_CONSOLE
 832	if (up->port.line == up->port.cons->index)
 833		return;
 834#endif
 835	serial_txx9_initialize(port);
 836}
 837
 838static const char *
 839serial_txx9_type(struct uart_port *port)
 840{
 841	return "txx9";
 842}
 843
 844static const struct uart_ops serial_txx9_pops = {
 845	.tx_empty	= serial_txx9_tx_empty,
 846	.set_mctrl	= serial_txx9_set_mctrl,
 847	.get_mctrl	= serial_txx9_get_mctrl,
 848	.stop_tx	= serial_txx9_stop_tx,
 849	.start_tx	= serial_txx9_start_tx,
 850	.stop_rx	= serial_txx9_stop_rx,
 
 851	.break_ctl	= serial_txx9_break_ctl,
 852	.startup	= serial_txx9_startup,
 853	.shutdown	= serial_txx9_shutdown,
 854	.set_termios	= serial_txx9_set_termios,
 855	.pm		= serial_txx9_pm,
 856	.type		= serial_txx9_type,
 857	.release_port	= serial_txx9_release_port,
 858	.request_port	= serial_txx9_request_port,
 859	.config_port	= serial_txx9_config_port,
 860#ifdef CONFIG_CONSOLE_POLL
 861	.poll_get_char	= serial_txx9_get_poll_char,
 862	.poll_put_char	= serial_txx9_put_poll_char,
 863#endif
 864};
 865
 866static struct uart_txx9_port serial_txx9_ports[UART_NR];
 867
 868static void __init serial_txx9_register_ports(struct uart_driver *drv,
 869					      struct device *dev)
 870{
 871	int i;
 872
 873	for (i = 0; i < UART_NR; i++) {
 874		struct uart_txx9_port *up = &serial_txx9_ports[i];
 875
 876		up->port.line = i;
 877		up->port.ops = &serial_txx9_pops;
 878		up->port.dev = dev;
 879		if (up->port.iobase || up->port.mapbase)
 880			uart_add_one_port(drv, &up->port);
 881	}
 882}
 883
 884#ifdef CONFIG_SERIAL_TXX9_CONSOLE
 885
 886static void serial_txx9_console_putchar(struct uart_port *port, int ch)
 887{
 888	struct uart_txx9_port *up = to_uart_txx9_port(port);
 889
 890	wait_for_xmitr(up);
 891	sio_out(up, TXX9_SITFIFO, ch);
 892}
 893
 894/*
 895 *	Print a string to the serial port trying not to disturb
 896 *	any possible real use of the port...
 897 *
 898 *	The console_lock must be held when we get here.
 899 */
 900static void
 901serial_txx9_console_write(struct console *co, const char *s, unsigned int count)
 902{
 903	struct uart_txx9_port *up = &serial_txx9_ports[co->index];
 904	unsigned int ier, flcr;
 905
 906	/*
 907	 *	First save the UER then disable the interrupts
 908	 */
 909	ier = sio_in(up, TXX9_SIDICR);
 910	sio_out(up, TXX9_SIDICR, 0);
 911	/*
 912	 *	Disable flow-control if enabled (and unnecessary)
 913	 */
 914	flcr = sio_in(up, TXX9_SIFLCR);
 915	if (!(up->port.flags & UPF_CONS_FLOW) && (flcr & TXX9_SIFLCR_TES))
 916		sio_out(up, TXX9_SIFLCR, flcr & ~TXX9_SIFLCR_TES);
 917
 918	uart_console_write(&up->port, s, count, serial_txx9_console_putchar);
 919
 920	/*
 921	 *	Finally, wait for transmitter to become empty
 922	 *	and restore the IER
 923	 */
 924	wait_for_xmitr(up);
 925	sio_out(up, TXX9_SIFLCR, flcr);
 926	sio_out(up, TXX9_SIDICR, ier);
 927}
 928
 929static int __init serial_txx9_console_setup(struct console *co, char *options)
 930{
 931	struct uart_port *port;
 932	struct uart_txx9_port *up;
 933	int baud = 9600;
 934	int bits = 8;
 935	int parity = 'n';
 936	int flow = 'n';
 937
 938	/*
 939	 * Check whether an invalid uart number has been specified, and
 940	 * if so, search for the first available port that does have
 941	 * console support.
 942	 */
 943	if (co->index >= UART_NR)
 944		co->index = 0;
 945	up = &serial_txx9_ports[co->index];
 946	port = &up->port;
 947	if (!port->ops)
 948		return -ENODEV;
 949
 950	serial_txx9_initialize(&up->port);
 951
 952	if (options)
 953		uart_parse_options(options, &baud, &parity, &bits, &flow);
 954
 955	return uart_set_options(port, co, baud, parity, bits, flow);
 956}
 957
 958static struct uart_driver serial_txx9_reg;
 959static struct console serial_txx9_console = {
 960	.name		= TXX9_TTY_NAME,
 961	.write		= serial_txx9_console_write,
 962	.device		= uart_console_device,
 963	.setup		= serial_txx9_console_setup,
 964	.flags		= CON_PRINTBUFFER,
 965	.index		= -1,
 966	.data		= &serial_txx9_reg,
 967};
 968
 969static int __init serial_txx9_console_init(void)
 970{
 971	register_console(&serial_txx9_console);
 972	return 0;
 973}
 974console_initcall(serial_txx9_console_init);
 975
 976#define SERIAL_TXX9_CONSOLE	&serial_txx9_console
 977#else
 978#define SERIAL_TXX9_CONSOLE	NULL
 979#endif
 980
 981static struct uart_driver serial_txx9_reg = {
 982	.owner			= THIS_MODULE,
 983	.driver_name		= "serial_txx9",
 984	.dev_name		= TXX9_TTY_NAME,
 985	.major			= TXX9_TTY_MAJOR,
 986	.minor			= TXX9_TTY_MINOR_START,
 987	.nr			= UART_NR,
 988	.cons			= SERIAL_TXX9_CONSOLE,
 989};
 990
 991int __init early_serial_txx9_setup(struct uart_port *port)
 992{
 993	if (port->line >= ARRAY_SIZE(serial_txx9_ports))
 994		return -ENODEV;
 995
 996	serial_txx9_ports[port->line].port = *port;
 997	serial_txx9_ports[port->line].port.ops = &serial_txx9_pops;
 998	serial_txx9_ports[port->line].port.flags |=
 999		UPF_BOOT_AUTOCONF | UPF_FIXED_PORT;
1000	return 0;
1001}
1002
1003static DEFINE_MUTEX(serial_txx9_mutex);
1004
1005/**
1006 *	serial_txx9_register_port - register a serial port
1007 *	@port: serial port template
1008 *
1009 *	Configure the serial port specified by the request.
1010 *
1011 *	The port is then probed and if necessary the IRQ is autodetected
1012 *	If this fails an error is returned.
1013 *
1014 *	On success the port is ready to use and the line number is returned.
1015 */
1016static int serial_txx9_register_port(struct uart_port *port)
1017{
1018	int i;
1019	struct uart_txx9_port *uart;
1020	int ret = -ENOSPC;
1021
1022	mutex_lock(&serial_txx9_mutex);
1023	for (i = 0; i < UART_NR; i++) {
1024		uart = &serial_txx9_ports[i];
1025		if (uart_match_port(&uart->port, port)) {
1026			uart_remove_one_port(&serial_txx9_reg, &uart->port);
1027			break;
1028		}
1029	}
1030	if (i == UART_NR) {
1031		/* Find unused port */
1032		for (i = 0; i < UART_NR; i++) {
1033			uart = &serial_txx9_ports[i];
1034			if (!(uart->port.iobase || uart->port.mapbase))
1035				break;
1036		}
1037	}
1038	if (i < UART_NR) {
1039		uart->port.iobase = port->iobase;
1040		uart->port.membase = port->membase;
1041		uart->port.irq      = port->irq;
1042		uart->port.uartclk  = port->uartclk;
1043		uart->port.iotype   = port->iotype;
1044		uart->port.flags    = port->flags
1045			| UPF_BOOT_AUTOCONF | UPF_FIXED_PORT;
1046		uart->port.mapbase  = port->mapbase;
1047		if (port->dev)
1048			uart->port.dev = port->dev;
1049		ret = uart_add_one_port(&serial_txx9_reg, &uart->port);
1050		if (ret == 0)
1051			ret = uart->port.line;
1052	}
1053	mutex_unlock(&serial_txx9_mutex);
1054	return ret;
1055}
1056
1057/**
1058 *	serial_txx9_unregister_port - remove a txx9 serial port at runtime
1059 *	@line: serial line number
1060 *
1061 *	Remove one serial port.  This may not be called from interrupt
1062 *	context.  We hand the port back to the our control.
1063 */
1064static void serial_txx9_unregister_port(int line)
1065{
1066	struct uart_txx9_port *uart = &serial_txx9_ports[line];
1067
1068	mutex_lock(&serial_txx9_mutex);
1069	uart_remove_one_port(&serial_txx9_reg, &uart->port);
1070	uart->port.flags = 0;
1071	uart->port.type = PORT_UNKNOWN;
1072	uart->port.iobase = 0;
1073	uart->port.mapbase = 0;
1074	uart->port.membase = NULL;
1075	uart->port.dev = NULL;
1076	mutex_unlock(&serial_txx9_mutex);
1077}
1078
1079/*
1080 * Register a set of serial devices attached to a platform device.
1081 */
1082static int serial_txx9_probe(struct platform_device *dev)
1083{
1084	struct uart_port *p = dev_get_platdata(&dev->dev);
1085	struct uart_port port;
1086	int ret, i;
1087
1088	memset(&port, 0, sizeof(struct uart_port));
1089	for (i = 0; p && p->uartclk != 0; p++, i++) {
1090		port.iobase	= p->iobase;
1091		port.membase	= p->membase;
1092		port.irq	= p->irq;
1093		port.uartclk	= p->uartclk;
1094		port.iotype	= p->iotype;
1095		port.flags	= p->flags;
1096		port.mapbase	= p->mapbase;
1097		port.dev	= &dev->dev;
1098		ret = serial_txx9_register_port(&port);
1099		if (ret < 0) {
1100			dev_err(&dev->dev, "unable to register port at index %d "
1101				"(IO%lx MEM%llx IRQ%d): %d\n", i,
1102				p->iobase, (unsigned long long)p->mapbase,
1103				p->irq, ret);
1104		}
1105	}
1106	return 0;
1107}
1108
1109/*
1110 * Remove serial ports registered against a platform device.
1111 */
1112static int serial_txx9_remove(struct platform_device *dev)
1113{
1114	int i;
1115
1116	for (i = 0; i < UART_NR; i++) {
1117		struct uart_txx9_port *up = &serial_txx9_ports[i];
1118
1119		if (up->port.dev == &dev->dev)
1120			serial_txx9_unregister_port(i);
1121	}
1122	return 0;
1123}
1124
1125#ifdef CONFIG_PM
1126static int serial_txx9_suspend(struct platform_device *dev, pm_message_t state)
1127{
1128	int i;
1129
1130	for (i = 0; i < UART_NR; i++) {
1131		struct uart_txx9_port *up = &serial_txx9_ports[i];
1132
1133		if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
1134			uart_suspend_port(&serial_txx9_reg, &up->port);
1135	}
1136
1137	return 0;
1138}
1139
1140static int serial_txx9_resume(struct platform_device *dev)
1141{
1142	int i;
1143
1144	for (i = 0; i < UART_NR; i++) {
1145		struct uart_txx9_port *up = &serial_txx9_ports[i];
1146
1147		if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
1148			uart_resume_port(&serial_txx9_reg, &up->port);
1149	}
1150
1151	return 0;
1152}
1153#endif
1154
1155static struct platform_driver serial_txx9_plat_driver = {
1156	.probe		= serial_txx9_probe,
1157	.remove		= serial_txx9_remove,
1158#ifdef CONFIG_PM
1159	.suspend	= serial_txx9_suspend,
1160	.resume		= serial_txx9_resume,
1161#endif
1162	.driver		= {
1163		.name	= "serial_txx9",
 
1164	},
1165};
1166
1167#ifdef ENABLE_SERIAL_TXX9_PCI
1168/*
1169 * Probe one serial board.  Unfortunately, there is no rhyme nor reason
1170 * to the arrangement of serial ports on a PCI card.
1171 */
1172static int
1173pciserial_txx9_init_one(struct pci_dev *dev, const struct pci_device_id *ent)
1174{
1175	struct uart_port port;
1176	int line;
1177	int rc;
1178
1179	rc = pci_enable_device(dev);
1180	if (rc)
1181		return rc;
1182
1183	memset(&port, 0, sizeof(port));
1184	port.ops = &serial_txx9_pops;
1185	port.flags |= UPF_TXX9_HAVE_CTS_LINE;
1186	port.uartclk = 66670000;
1187	port.irq = dev->irq;
1188	port.iotype = UPIO_PORT;
1189	port.iobase = pci_resource_start(dev, 1);
1190	port.dev = &dev->dev;
1191	line = serial_txx9_register_port(&port);
1192	if (line < 0) {
1193		printk(KERN_WARNING "Couldn't register serial port %s: %d\n", pci_name(dev), line);
1194		pci_disable_device(dev);
1195		return line;
1196	}
1197	pci_set_drvdata(dev, &serial_txx9_ports[line]);
1198
1199	return 0;
1200}
1201
1202static void pciserial_txx9_remove_one(struct pci_dev *dev)
1203{
1204	struct uart_txx9_port *up = pci_get_drvdata(dev);
1205
1206	if (up) {
1207		serial_txx9_unregister_port(up->port.line);
1208		pci_disable_device(dev);
1209	}
1210}
1211
1212#ifdef CONFIG_PM
1213static int pciserial_txx9_suspend_one(struct pci_dev *dev, pm_message_t state)
1214{
1215	struct uart_txx9_port *up = pci_get_drvdata(dev);
1216
1217	if (up)
1218		uart_suspend_port(&serial_txx9_reg, &up->port);
1219	pci_save_state(dev);
1220	pci_set_power_state(dev, pci_choose_state(dev, state));
1221	return 0;
1222}
1223
1224static int pciserial_txx9_resume_one(struct pci_dev *dev)
1225{
1226	struct uart_txx9_port *up = pci_get_drvdata(dev);
1227
1228	pci_set_power_state(dev, PCI_D0);
1229	pci_restore_state(dev);
1230	if (up)
1231		uart_resume_port(&serial_txx9_reg, &up->port);
1232	return 0;
1233}
1234#endif
1235
1236static const struct pci_device_id serial_txx9_pci_tbl[] = {
1237	{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA_2, PCI_DEVICE_ID_TOSHIBA_TC86C001_MISC) },
1238	{ 0, }
1239};
1240
1241static struct pci_driver serial_txx9_pci_driver = {
1242	.name		= "serial_txx9",
1243	.probe		= pciserial_txx9_init_one,
1244	.remove		= pciserial_txx9_remove_one,
1245#ifdef CONFIG_PM
1246	.suspend	= pciserial_txx9_suspend_one,
1247	.resume		= pciserial_txx9_resume_one,
1248#endif
1249	.id_table	= serial_txx9_pci_tbl,
1250};
1251
1252MODULE_DEVICE_TABLE(pci, serial_txx9_pci_tbl);
1253#endif /* ENABLE_SERIAL_TXX9_PCI */
1254
1255static struct platform_device *serial_txx9_plat_devs;
1256
1257static int __init serial_txx9_init(void)
1258{
1259	int ret;
1260
1261 	printk(KERN_INFO "%s version %s\n", serial_name, serial_version);
1262
1263	ret = uart_register_driver(&serial_txx9_reg);
1264	if (ret)
1265		goto out;
1266
1267	serial_txx9_plat_devs = platform_device_alloc("serial_txx9", -1);
1268	if (!serial_txx9_plat_devs) {
1269		ret = -ENOMEM;
1270		goto unreg_uart_drv;
1271	}
1272
1273	ret = platform_device_add(serial_txx9_plat_devs);
1274	if (ret)
1275		goto put_dev;
1276
1277	serial_txx9_register_ports(&serial_txx9_reg,
1278				   &serial_txx9_plat_devs->dev);
1279
1280	ret = platform_driver_register(&serial_txx9_plat_driver);
1281	if (ret)
1282		goto del_dev;
1283
1284#ifdef ENABLE_SERIAL_TXX9_PCI
1285	ret = pci_register_driver(&serial_txx9_pci_driver);
1286#endif
1287	if (ret == 0)
1288		goto out;
1289
1290 del_dev:
1291	platform_device_del(serial_txx9_plat_devs);
1292 put_dev:
1293	platform_device_put(serial_txx9_plat_devs);
1294 unreg_uart_drv:
1295	uart_unregister_driver(&serial_txx9_reg);
1296 out:
1297	return ret;
1298}
1299
1300static void __exit serial_txx9_exit(void)
1301{
1302	int i;
1303
1304#ifdef ENABLE_SERIAL_TXX9_PCI
1305	pci_unregister_driver(&serial_txx9_pci_driver);
1306#endif
1307	platform_driver_unregister(&serial_txx9_plat_driver);
1308	platform_device_unregister(serial_txx9_plat_devs);
1309	for (i = 0; i < UART_NR; i++) {
1310		struct uart_txx9_port *up = &serial_txx9_ports[i];
1311		if (up->port.iobase || up->port.mapbase)
1312			uart_remove_one_port(&serial_txx9_reg, &up->port);
1313	}
1314
1315	uart_unregister_driver(&serial_txx9_reg);
1316}
1317
1318module_init(serial_txx9_init);
1319module_exit(serial_txx9_exit);
1320
1321MODULE_LICENSE("GPL");
1322MODULE_DESCRIPTION("TX39/49 serial driver");
1323
1324MODULE_ALIAS_CHARDEV_MAJOR(TXX9_TTY_MAJOR);
v3.15
 
   1/*
   2 * Derived from many drivers using generic_serial interface,
   3 * especially serial_tx3912.c by Steven J. Hill and r39xx_serial.c
   4 * (was in Linux/VR tree) by Jim Pick.
   5 *
   6 *  Copyright (C) 1999 Harald Koerfgen
   7 *  Copyright (C) 2000 Jim Pick <jim@jimpick.com>
   8 *  Copyright (C) 2001 Steven J. Hill (sjhill@realitydiluted.com)
   9 *  Copyright (C) 2000-2002 Toshiba Corporation
  10 *
  11 * This program is free software; you can redistribute it and/or modify
  12 * it under the terms of the GNU General Public License version 2 as
  13 * published by the Free Software Foundation.
  14 *
  15 *  Serial driver for TX3927/TX4927/TX4925/TX4938 internal SIO controller
  16 */
  17
  18#if defined(CONFIG_SERIAL_TXX9_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
  19#define SUPPORT_SYSRQ
  20#endif
  21
  22#include <linux/module.h>
  23#include <linux/ioport.h>
  24#include <linux/init.h>
  25#include <linux/console.h>
  26#include <linux/delay.h>
  27#include <linux/platform_device.h>
  28#include <linux/pci.h>
  29#include <linux/serial_core.h>
  30#include <linux/serial.h>
  31#include <linux/tty.h>
  32#include <linux/tty_flip.h>
  33
  34#include <asm/io.h>
  35
  36static char *serial_version = "1.11";
  37static char *serial_name = "TX39/49 Serial driver";
  38
  39#define PASS_LIMIT	256
  40
  41#if !defined(CONFIG_SERIAL_TXX9_STDSERIAL)
  42/* "ttyS" is used for standard serial driver */
  43#define TXX9_TTY_NAME "ttyTX"
  44#define TXX9_TTY_MINOR_START	196
  45#define TXX9_TTY_MAJOR	204
  46#else
  47/* acts like standard serial driver */
  48#define TXX9_TTY_NAME "ttyS"
  49#define TXX9_TTY_MINOR_START	64
  50#define TXX9_TTY_MAJOR	TTY_MAJOR
  51#endif
  52
  53/* flag aliases */
  54#define UPF_TXX9_HAVE_CTS_LINE	UPF_BUGGY_UART
  55#define UPF_TXX9_USE_SCLK	UPF_MAGIC_MULTIPLIER
  56
  57#ifdef CONFIG_PCI
  58/* support for Toshiba TC86C001 SIO */
  59#define ENABLE_SERIAL_TXX9_PCI
  60#endif
  61
  62/*
  63 * Number of serial ports
  64 */
  65#define UART_NR  CONFIG_SERIAL_TXX9_NR_UARTS
  66
  67struct uart_txx9_port {
  68	struct uart_port	port;
  69	/* No additional info for now */
  70};
  71
  72#define TXX9_REGION_SIZE	0x24
  73
  74/* TXX9 Serial Registers */
  75#define TXX9_SILCR	0x00
  76#define TXX9_SIDICR	0x04
  77#define TXX9_SIDISR	0x08
  78#define TXX9_SICISR	0x0c
  79#define TXX9_SIFCR	0x10
  80#define TXX9_SIFLCR	0x14
  81#define TXX9_SIBGR	0x18
  82#define TXX9_SITFIFO	0x1c
  83#define TXX9_SIRFIFO	0x20
  84
  85/* SILCR : Line Control */
  86#define TXX9_SILCR_SCS_MASK	0x00000060
  87#define TXX9_SILCR_SCS_IMCLK	0x00000000
  88#define TXX9_SILCR_SCS_IMCLK_BG	0x00000020
  89#define TXX9_SILCR_SCS_SCLK	0x00000040
  90#define TXX9_SILCR_SCS_SCLK_BG	0x00000060
  91#define TXX9_SILCR_UEPS	0x00000010
  92#define TXX9_SILCR_UPEN	0x00000008
  93#define TXX9_SILCR_USBL_MASK	0x00000004
  94#define TXX9_SILCR_USBL_1BIT	0x00000000
  95#define TXX9_SILCR_USBL_2BIT	0x00000004
  96#define TXX9_SILCR_UMODE_MASK	0x00000003
  97#define TXX9_SILCR_UMODE_8BIT	0x00000000
  98#define TXX9_SILCR_UMODE_7BIT	0x00000001
  99
 100/* SIDICR : DMA/Int. Control */
 101#define TXX9_SIDICR_TDE	0x00008000
 102#define TXX9_SIDICR_RDE	0x00004000
 103#define TXX9_SIDICR_TIE	0x00002000
 104#define TXX9_SIDICR_RIE	0x00001000
 105#define TXX9_SIDICR_SPIE	0x00000800
 106#define TXX9_SIDICR_CTSAC	0x00000600
 107#define TXX9_SIDICR_STIE_MASK	0x0000003f
 108#define TXX9_SIDICR_STIE_OERS		0x00000020
 109#define TXX9_SIDICR_STIE_CTSS		0x00000010
 110#define TXX9_SIDICR_STIE_RBRKD	0x00000008
 111#define TXX9_SIDICR_STIE_TRDY		0x00000004
 112#define TXX9_SIDICR_STIE_TXALS	0x00000002
 113#define TXX9_SIDICR_STIE_UBRKD	0x00000001
 114
 115/* SIDISR : DMA/Int. Status */
 116#define TXX9_SIDISR_UBRK	0x00008000
 117#define TXX9_SIDISR_UVALID	0x00004000
 118#define TXX9_SIDISR_UFER	0x00002000
 119#define TXX9_SIDISR_UPER	0x00001000
 120#define TXX9_SIDISR_UOER	0x00000800
 121#define TXX9_SIDISR_ERI	0x00000400
 122#define TXX9_SIDISR_TOUT	0x00000200
 123#define TXX9_SIDISR_TDIS	0x00000100
 124#define TXX9_SIDISR_RDIS	0x00000080
 125#define TXX9_SIDISR_STIS	0x00000040
 126#define TXX9_SIDISR_RFDN_MASK	0x0000001f
 127
 128/* SICISR : Change Int. Status */
 129#define TXX9_SICISR_OERS	0x00000020
 130#define TXX9_SICISR_CTSS	0x00000010
 131#define TXX9_SICISR_RBRKD	0x00000008
 132#define TXX9_SICISR_TRDY	0x00000004
 133#define TXX9_SICISR_TXALS	0x00000002
 134#define TXX9_SICISR_UBRKD	0x00000001
 135
 136/* SIFCR : FIFO Control */
 137#define TXX9_SIFCR_SWRST	0x00008000
 138#define TXX9_SIFCR_RDIL_MASK	0x00000180
 139#define TXX9_SIFCR_RDIL_1	0x00000000
 140#define TXX9_SIFCR_RDIL_4	0x00000080
 141#define TXX9_SIFCR_RDIL_8	0x00000100
 142#define TXX9_SIFCR_RDIL_12	0x00000180
 143#define TXX9_SIFCR_RDIL_MAX	0x00000180
 144#define TXX9_SIFCR_TDIL_MASK	0x00000018
 145#define TXX9_SIFCR_TDIL_MASK	0x00000018
 146#define TXX9_SIFCR_TDIL_1	0x00000000
 147#define TXX9_SIFCR_TDIL_4	0x00000001
 148#define TXX9_SIFCR_TDIL_8	0x00000010
 149#define TXX9_SIFCR_TDIL_MAX	0x00000010
 150#define TXX9_SIFCR_TFRST	0x00000004
 151#define TXX9_SIFCR_RFRST	0x00000002
 152#define TXX9_SIFCR_FRSTE	0x00000001
 153#define TXX9_SIO_TX_FIFO	8
 154#define TXX9_SIO_RX_FIFO	16
 155
 156/* SIFLCR : Flow Control */
 157#define TXX9_SIFLCR_RCS	0x00001000
 158#define TXX9_SIFLCR_TES	0x00000800
 159#define TXX9_SIFLCR_RTSSC	0x00000200
 160#define TXX9_SIFLCR_RSDE	0x00000100
 161#define TXX9_SIFLCR_TSDE	0x00000080
 162#define TXX9_SIFLCR_RTSTL_MASK	0x0000001e
 163#define TXX9_SIFLCR_RTSTL_MAX	0x0000001e
 164#define TXX9_SIFLCR_TBRK	0x00000001
 165
 166/* SIBGR : Baudrate Control */
 167#define TXX9_SIBGR_BCLK_MASK	0x00000300
 168#define TXX9_SIBGR_BCLK_T0	0x00000000
 169#define TXX9_SIBGR_BCLK_T2	0x00000100
 170#define TXX9_SIBGR_BCLK_T4	0x00000200
 171#define TXX9_SIBGR_BCLK_T6	0x00000300
 172#define TXX9_SIBGR_BRD_MASK	0x000000ff
 173
 174static inline unsigned int sio_in(struct uart_txx9_port *up, int offset)
 175{
 176	switch (up->port.iotype) {
 177	default:
 178		return __raw_readl(up->port.membase + offset);
 179	case UPIO_PORT:
 180		return inl(up->port.iobase + offset);
 181	}
 182}
 183
 184static inline void
 185sio_out(struct uart_txx9_port *up, int offset, int value)
 186{
 187	switch (up->port.iotype) {
 188	default:
 189		__raw_writel(value, up->port.membase + offset);
 190		break;
 191	case UPIO_PORT:
 192		outl(value, up->port.iobase + offset);
 193		break;
 194	}
 195}
 196
 197static inline void
 198sio_mask(struct uart_txx9_port *up, int offset, unsigned int value)
 199{
 200	sio_out(up, offset, sio_in(up, offset) & ~value);
 201}
 202static inline void
 203sio_set(struct uart_txx9_port *up, int offset, unsigned int value)
 204{
 205	sio_out(up, offset, sio_in(up, offset) | value);
 206}
 207
 208static inline void
 209sio_quot_set(struct uart_txx9_port *up, int quot)
 210{
 211	quot >>= 1;
 212	if (quot < 256)
 213		sio_out(up, TXX9_SIBGR, quot | TXX9_SIBGR_BCLK_T0);
 214	else if (quot < (256 << 2))
 215		sio_out(up, TXX9_SIBGR, (quot >> 2) | TXX9_SIBGR_BCLK_T2);
 216	else if (quot < (256 << 4))
 217		sio_out(up, TXX9_SIBGR, (quot >> 4) | TXX9_SIBGR_BCLK_T4);
 218	else if (quot < (256 << 6))
 219		sio_out(up, TXX9_SIBGR, (quot >> 6) | TXX9_SIBGR_BCLK_T6);
 220	else
 221		sio_out(up, TXX9_SIBGR, 0xff | TXX9_SIBGR_BCLK_T6);
 222}
 223
 224static struct uart_txx9_port *to_uart_txx9_port(struct uart_port *port)
 225{
 226	return container_of(port, struct uart_txx9_port, port);
 227}
 228
 229static void serial_txx9_stop_tx(struct uart_port *port)
 230{
 231	struct uart_txx9_port *up = to_uart_txx9_port(port);
 232	sio_mask(up, TXX9_SIDICR, TXX9_SIDICR_TIE);
 233}
 234
 235static void serial_txx9_start_tx(struct uart_port *port)
 236{
 237	struct uart_txx9_port *up = to_uart_txx9_port(port);
 238	sio_set(up, TXX9_SIDICR, TXX9_SIDICR_TIE);
 239}
 240
 241static void serial_txx9_stop_rx(struct uart_port *port)
 242{
 243	struct uart_txx9_port *up = to_uart_txx9_port(port);
 244	up->port.read_status_mask &= ~TXX9_SIDISR_RDIS;
 245}
 246
 247static void serial_txx9_enable_ms(struct uart_port *port)
 248{
 249	/* TXX9-SIO can not control DTR... */
 250}
 251
 252static void serial_txx9_initialize(struct uart_port *port)
 253{
 254	struct uart_txx9_port *up = to_uart_txx9_port(port);
 255	unsigned int tmout = 10000;
 256
 257	sio_out(up, TXX9_SIFCR, TXX9_SIFCR_SWRST);
 258	/* TX4925 BUG WORKAROUND.  Accessing SIOC register
 259	 * immediately after soft reset causes bus error. */
 260	mmiowb();
 261	udelay(1);
 262	while ((sio_in(up, TXX9_SIFCR) & TXX9_SIFCR_SWRST) && --tmout)
 263		udelay(1);
 264	/* TX Int by FIFO Empty, RX Int by Receiving 1 char. */
 265	sio_set(up, TXX9_SIFCR,
 266		TXX9_SIFCR_TDIL_MAX | TXX9_SIFCR_RDIL_1);
 267	/* initial settings */
 268	sio_out(up, TXX9_SILCR,
 269		TXX9_SILCR_UMODE_8BIT | TXX9_SILCR_USBL_1BIT |
 270		((up->port.flags & UPF_TXX9_USE_SCLK) ?
 271		 TXX9_SILCR_SCS_SCLK_BG : TXX9_SILCR_SCS_IMCLK_BG));
 272	sio_quot_set(up, uart_get_divisor(port, 9600));
 273	sio_out(up, TXX9_SIFLCR, TXX9_SIFLCR_RTSTL_MAX /* 15 */);
 274	sio_out(up, TXX9_SIDICR, 0);
 275}
 276
 277static inline void
 278receive_chars(struct uart_txx9_port *up, unsigned int *status)
 279{
 280	unsigned char ch;
 281	unsigned int disr = *status;
 282	int max_count = 256;
 283	char flag;
 284	unsigned int next_ignore_status_mask;
 285
 286	do {
 287		ch = sio_in(up, TXX9_SIRFIFO);
 288		flag = TTY_NORMAL;
 289		up->port.icount.rx++;
 290
 291		/* mask out RFDN_MASK bit added by previous overrun */
 292		next_ignore_status_mask =
 293			up->port.ignore_status_mask & ~TXX9_SIDISR_RFDN_MASK;
 294		if (unlikely(disr & (TXX9_SIDISR_UBRK | TXX9_SIDISR_UPER |
 295				     TXX9_SIDISR_UFER | TXX9_SIDISR_UOER))) {
 296			/*
 297			 * For statistics only
 298			 */
 299			if (disr & TXX9_SIDISR_UBRK) {
 300				disr &= ~(TXX9_SIDISR_UFER | TXX9_SIDISR_UPER);
 301				up->port.icount.brk++;
 302				/*
 303				 * We do the SysRQ and SAK checking
 304				 * here because otherwise the break
 305				 * may get masked by ignore_status_mask
 306				 * or read_status_mask.
 307				 */
 308				if (uart_handle_break(&up->port))
 309					goto ignore_char;
 310			} else if (disr & TXX9_SIDISR_UPER)
 311				up->port.icount.parity++;
 312			else if (disr & TXX9_SIDISR_UFER)
 313				up->port.icount.frame++;
 314			if (disr & TXX9_SIDISR_UOER) {
 315				up->port.icount.overrun++;
 316				/*
 317				 * The receiver read buffer still hold
 318				 * a char which caused overrun.
 319				 * Ignore next char by adding RFDN_MASK
 320				 * to ignore_status_mask temporarily.
 321				 */
 322				next_ignore_status_mask |=
 323					TXX9_SIDISR_RFDN_MASK;
 324			}
 325
 326			/*
 327			 * Mask off conditions which should be ingored.
 328			 */
 329			disr &= up->port.read_status_mask;
 330
 331			if (disr & TXX9_SIDISR_UBRK) {
 332				flag = TTY_BREAK;
 333			} else if (disr & TXX9_SIDISR_UPER)
 334				flag = TTY_PARITY;
 335			else if (disr & TXX9_SIDISR_UFER)
 336				flag = TTY_FRAME;
 337		}
 338		if (uart_handle_sysrq_char(&up->port, ch))
 339			goto ignore_char;
 340
 341		uart_insert_char(&up->port, disr, TXX9_SIDISR_UOER, ch, flag);
 342
 343	ignore_char:
 344		up->port.ignore_status_mask = next_ignore_status_mask;
 345		disr = sio_in(up, TXX9_SIDISR);
 346	} while (!(disr & TXX9_SIDISR_UVALID) && (max_count-- > 0));
 347	spin_unlock(&up->port.lock);
 348	tty_flip_buffer_push(&up->port.state->port);
 349	spin_lock(&up->port.lock);
 350	*status = disr;
 351}
 352
 353static inline void transmit_chars(struct uart_txx9_port *up)
 354{
 355	struct circ_buf *xmit = &up->port.state->xmit;
 356	int count;
 357
 358	if (up->port.x_char) {
 359		sio_out(up, TXX9_SITFIFO, up->port.x_char);
 360		up->port.icount.tx++;
 361		up->port.x_char = 0;
 362		return;
 363	}
 364	if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) {
 365		serial_txx9_stop_tx(&up->port);
 366		return;
 367	}
 368
 369	count = TXX9_SIO_TX_FIFO;
 370	do {
 371		sio_out(up, TXX9_SITFIFO, xmit->buf[xmit->tail]);
 372		xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
 373		up->port.icount.tx++;
 374		if (uart_circ_empty(xmit))
 375			break;
 376	} while (--count > 0);
 377
 378	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
 379		uart_write_wakeup(&up->port);
 380
 381	if (uart_circ_empty(xmit))
 382		serial_txx9_stop_tx(&up->port);
 383}
 384
 385static irqreturn_t serial_txx9_interrupt(int irq, void *dev_id)
 386{
 387	int pass_counter = 0;
 388	struct uart_txx9_port *up = dev_id;
 389	unsigned int status;
 390
 391	while (1) {
 392		spin_lock(&up->port.lock);
 393		status = sio_in(up, TXX9_SIDISR);
 394		if (!(sio_in(up, TXX9_SIDICR) & TXX9_SIDICR_TIE))
 395			status &= ~TXX9_SIDISR_TDIS;
 396		if (!(status & (TXX9_SIDISR_TDIS | TXX9_SIDISR_RDIS |
 397				TXX9_SIDISR_TOUT))) {
 398			spin_unlock(&up->port.lock);
 399			break;
 400		}
 401
 402		if (status & TXX9_SIDISR_RDIS)
 403			receive_chars(up, &status);
 404		if (status & TXX9_SIDISR_TDIS)
 405			transmit_chars(up);
 406		/* Clear TX/RX Int. Status */
 407		sio_mask(up, TXX9_SIDISR,
 408			 TXX9_SIDISR_TDIS | TXX9_SIDISR_RDIS |
 409			 TXX9_SIDISR_TOUT);
 410		spin_unlock(&up->port.lock);
 411
 412		if (pass_counter++ > PASS_LIMIT)
 413			break;
 414	}
 415
 416	return pass_counter ? IRQ_HANDLED : IRQ_NONE;
 417}
 418
 419static unsigned int serial_txx9_tx_empty(struct uart_port *port)
 420{
 421	struct uart_txx9_port *up = to_uart_txx9_port(port);
 422	unsigned long flags;
 423	unsigned int ret;
 424
 425	spin_lock_irqsave(&up->port.lock, flags);
 426	ret = (sio_in(up, TXX9_SICISR) & TXX9_SICISR_TXALS) ? TIOCSER_TEMT : 0;
 427	spin_unlock_irqrestore(&up->port.lock, flags);
 428
 429	return ret;
 430}
 431
 432static unsigned int serial_txx9_get_mctrl(struct uart_port *port)
 433{
 434	struct uart_txx9_port *up = to_uart_txx9_port(port);
 435	unsigned int ret;
 436
 437	/* no modem control lines */
 438	ret = TIOCM_CAR | TIOCM_DSR;
 439	ret |= (sio_in(up, TXX9_SIFLCR) & TXX9_SIFLCR_RTSSC) ? 0 : TIOCM_RTS;
 440	ret |= (sio_in(up, TXX9_SICISR) & TXX9_SICISR_CTSS) ? 0 : TIOCM_CTS;
 441
 442	return ret;
 443}
 444
 445static void serial_txx9_set_mctrl(struct uart_port *port, unsigned int mctrl)
 446{
 447	struct uart_txx9_port *up = to_uart_txx9_port(port);
 448
 449	if (mctrl & TIOCM_RTS)
 450		sio_mask(up, TXX9_SIFLCR, TXX9_SIFLCR_RTSSC);
 451	else
 452		sio_set(up, TXX9_SIFLCR, TXX9_SIFLCR_RTSSC);
 453}
 454
 455static void serial_txx9_break_ctl(struct uart_port *port, int break_state)
 456{
 457	struct uart_txx9_port *up = to_uart_txx9_port(port);
 458	unsigned long flags;
 459
 460	spin_lock_irqsave(&up->port.lock, flags);
 461	if (break_state == -1)
 462		sio_set(up, TXX9_SIFLCR, TXX9_SIFLCR_TBRK);
 463	else
 464		sio_mask(up, TXX9_SIFLCR, TXX9_SIFLCR_TBRK);
 465	spin_unlock_irqrestore(&up->port.lock, flags);
 466}
 467
 468#if defined(CONFIG_SERIAL_TXX9_CONSOLE) || defined(CONFIG_CONSOLE_POLL)
 469/*
 470 *	Wait for transmitter & holding register to empty
 471 */
 472static void wait_for_xmitr(struct uart_txx9_port *up)
 473{
 474	unsigned int tmout = 10000;
 475
 476	/* Wait up to 10ms for the character(s) to be sent. */
 477	while (--tmout &&
 478	       !(sio_in(up, TXX9_SICISR) & TXX9_SICISR_TXALS))
 479		udelay(1);
 480
 481	/* Wait up to 1s for flow control if necessary */
 482	if (up->port.flags & UPF_CONS_FLOW) {
 483		tmout = 1000000;
 484		while (--tmout &&
 485		       (sio_in(up, TXX9_SICISR) & TXX9_SICISR_CTSS))
 486			udelay(1);
 487	}
 488}
 489#endif
 490
 491#ifdef CONFIG_CONSOLE_POLL
 492/*
 493 * Console polling routines for writing and reading from the uart while
 494 * in an interrupt or debug context.
 495 */
 496
 497static int serial_txx9_get_poll_char(struct uart_port *port)
 498{
 499	unsigned int ier;
 500	unsigned char c;
 501	struct uart_txx9_port *up = to_uart_txx9_port(port);
 502
 503	/*
 504	 *	First save the IER then disable the interrupts
 505	 */
 506	ier = sio_in(up, TXX9_SIDICR);
 507	sio_out(up, TXX9_SIDICR, 0);
 508
 509	while (sio_in(up, TXX9_SIDISR) & TXX9_SIDISR_UVALID)
 510		;
 511
 512	c = sio_in(up, TXX9_SIRFIFO);
 513
 514	/*
 515	 *	Finally, clear RX interrupt status
 516	 *	and restore the IER
 517	 */
 518	sio_mask(up, TXX9_SIDISR, TXX9_SIDISR_RDIS);
 519	sio_out(up, TXX9_SIDICR, ier);
 520	return c;
 521}
 522
 523
 524static void serial_txx9_put_poll_char(struct uart_port *port, unsigned char c)
 525{
 526	unsigned int ier;
 527	struct uart_txx9_port *up = to_uart_txx9_port(port);
 528
 529	/*
 530	 *	First save the IER then disable the interrupts
 531	 */
 532	ier = sio_in(up, TXX9_SIDICR);
 533	sio_out(up, TXX9_SIDICR, 0);
 534
 535	wait_for_xmitr(up);
 536	/*
 537	 *	Send the character out.
 538	 *	If a LF, also do CR...
 539	 */
 540	sio_out(up, TXX9_SITFIFO, c);
 541	if (c == 10) {
 542		wait_for_xmitr(up);
 543		sio_out(up, TXX9_SITFIFO, 13);
 544	}
 545
 546	/*
 547	 *	Finally, wait for transmitter to become empty
 548	 *	and restore the IER
 549	 */
 550	wait_for_xmitr(up);
 551	sio_out(up, TXX9_SIDICR, ier);
 552}
 553
 554#endif /* CONFIG_CONSOLE_POLL */
 555
 556static int serial_txx9_startup(struct uart_port *port)
 557{
 558	struct uart_txx9_port *up = to_uart_txx9_port(port);
 559	unsigned long flags;
 560	int retval;
 561
 562	/*
 563	 * Clear the FIFO buffers and disable them.
 564	 * (they will be reenabled in set_termios())
 565	 */
 566	sio_set(up, TXX9_SIFCR,
 567		TXX9_SIFCR_TFRST | TXX9_SIFCR_RFRST | TXX9_SIFCR_FRSTE);
 568	/* clear reset */
 569	sio_mask(up, TXX9_SIFCR,
 570		 TXX9_SIFCR_TFRST | TXX9_SIFCR_RFRST | TXX9_SIFCR_FRSTE);
 571	sio_out(up, TXX9_SIDICR, 0);
 572
 573	/*
 574	 * Clear the interrupt registers.
 575	 */
 576	sio_out(up, TXX9_SIDISR, 0);
 577
 578	retval = request_irq(up->port.irq, serial_txx9_interrupt,
 579			     IRQF_SHARED, "serial_txx9", up);
 580	if (retval)
 581		return retval;
 582
 583	/*
 584	 * Now, initialize the UART
 585	 */
 586	spin_lock_irqsave(&up->port.lock, flags);
 587	serial_txx9_set_mctrl(&up->port, up->port.mctrl);
 588	spin_unlock_irqrestore(&up->port.lock, flags);
 589
 590	/* Enable RX/TX */
 591	sio_mask(up, TXX9_SIFLCR, TXX9_SIFLCR_RSDE | TXX9_SIFLCR_TSDE);
 592
 593	/*
 594	 * Finally, enable interrupts.
 595	 */
 596	sio_set(up, TXX9_SIDICR, TXX9_SIDICR_RIE);
 597
 598	return 0;
 599}
 600
 601static void serial_txx9_shutdown(struct uart_port *port)
 602{
 603	struct uart_txx9_port *up = to_uart_txx9_port(port);
 604	unsigned long flags;
 605
 606	/*
 607	 * Disable interrupts from this port
 608	 */
 609	sio_out(up, TXX9_SIDICR, 0);	/* disable all intrs */
 610
 611	spin_lock_irqsave(&up->port.lock, flags);
 612	serial_txx9_set_mctrl(&up->port, up->port.mctrl);
 613	spin_unlock_irqrestore(&up->port.lock, flags);
 614
 615	/*
 616	 * Disable break condition
 617	 */
 618	sio_mask(up, TXX9_SIFLCR, TXX9_SIFLCR_TBRK);
 619
 620#ifdef CONFIG_SERIAL_TXX9_CONSOLE
 621	if (up->port.cons && up->port.line == up->port.cons->index) {
 622		free_irq(up->port.irq, up);
 623		return;
 624	}
 625#endif
 626	/* reset FIFOs */
 627	sio_set(up, TXX9_SIFCR,
 628		TXX9_SIFCR_TFRST | TXX9_SIFCR_RFRST | TXX9_SIFCR_FRSTE);
 629	/* clear reset */
 630	sio_mask(up, TXX9_SIFCR,
 631		 TXX9_SIFCR_TFRST | TXX9_SIFCR_RFRST | TXX9_SIFCR_FRSTE);
 632
 633	/* Disable RX/TX */
 634	sio_set(up, TXX9_SIFLCR, TXX9_SIFLCR_RSDE | TXX9_SIFLCR_TSDE);
 635
 636	free_irq(up->port.irq, up);
 637}
 638
 639static void
 640serial_txx9_set_termios(struct uart_port *port, struct ktermios *termios,
 641		       struct ktermios *old)
 642{
 643	struct uart_txx9_port *up = to_uart_txx9_port(port);
 644	unsigned int cval, fcr = 0;
 645	unsigned long flags;
 646	unsigned int baud, quot;
 647
 648	/*
 649	 * We don't support modem control lines.
 650	 */
 651	termios->c_cflag &= ~(HUPCL | CMSPAR);
 652	termios->c_cflag |= CLOCAL;
 653
 654	cval = sio_in(up, TXX9_SILCR);
 655	/* byte size and parity */
 656	cval &= ~TXX9_SILCR_UMODE_MASK;
 657	switch (termios->c_cflag & CSIZE) {
 658	case CS7:
 659		cval |= TXX9_SILCR_UMODE_7BIT;
 660		break;
 661	default:
 662	case CS5:	/* not supported */
 663	case CS6:	/* not supported */
 664	case CS8:
 665		cval |= TXX9_SILCR_UMODE_8BIT;
 666		break;
 667	}
 668
 669	cval &= ~TXX9_SILCR_USBL_MASK;
 670	if (termios->c_cflag & CSTOPB)
 671		cval |= TXX9_SILCR_USBL_2BIT;
 672	else
 673		cval |= TXX9_SILCR_USBL_1BIT;
 674	cval &= ~(TXX9_SILCR_UPEN | TXX9_SILCR_UEPS);
 675	if (termios->c_cflag & PARENB)
 676		cval |= TXX9_SILCR_UPEN;
 677	if (!(termios->c_cflag & PARODD))
 678		cval |= TXX9_SILCR_UEPS;
 679
 680	/*
 681	 * Ask the core to calculate the divisor for us.
 682	 */
 683	baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16/2);
 684	quot = uart_get_divisor(port, baud);
 685
 686	/* Set up FIFOs */
 687	/* TX Int by FIFO Empty, RX Int by Receiving 1 char. */
 688	fcr = TXX9_SIFCR_TDIL_MAX | TXX9_SIFCR_RDIL_1;
 689
 690	/*
 691	 * Ok, we're now changing the port state.  Do it with
 692	 * interrupts disabled.
 693	 */
 694	spin_lock_irqsave(&up->port.lock, flags);
 695
 696	/*
 697	 * Update the per-port timeout.
 698	 */
 699	uart_update_timeout(port, termios->c_cflag, baud);
 700
 701	up->port.read_status_mask = TXX9_SIDISR_UOER |
 702		TXX9_SIDISR_TDIS | TXX9_SIDISR_RDIS;
 703	if (termios->c_iflag & INPCK)
 704		up->port.read_status_mask |= TXX9_SIDISR_UFER | TXX9_SIDISR_UPER;
 705	if (termios->c_iflag & (BRKINT | PARMRK))
 706		up->port.read_status_mask |= TXX9_SIDISR_UBRK;
 707
 708	/*
 709	 * Characteres to ignore
 710	 */
 711	up->port.ignore_status_mask = 0;
 712	if (termios->c_iflag & IGNPAR)
 713		up->port.ignore_status_mask |= TXX9_SIDISR_UPER | TXX9_SIDISR_UFER;
 714	if (termios->c_iflag & IGNBRK) {
 715		up->port.ignore_status_mask |= TXX9_SIDISR_UBRK;
 716		/*
 717		 * If we're ignoring parity and break indicators,
 718		 * ignore overruns too (for real raw support).
 719		 */
 720		if (termios->c_iflag & IGNPAR)
 721			up->port.ignore_status_mask |= TXX9_SIDISR_UOER;
 722	}
 723
 724	/*
 725	 * ignore all characters if CREAD is not set
 726	 */
 727	if ((termios->c_cflag & CREAD) == 0)
 728		up->port.ignore_status_mask |= TXX9_SIDISR_RDIS;
 729
 730	/* CTS flow control flag */
 731	if ((termios->c_cflag & CRTSCTS) &&
 732	    (up->port.flags & UPF_TXX9_HAVE_CTS_LINE)) {
 733		sio_set(up, TXX9_SIFLCR,
 734			TXX9_SIFLCR_RCS | TXX9_SIFLCR_TES);
 735	} else {
 736		sio_mask(up, TXX9_SIFLCR,
 737			 TXX9_SIFLCR_RCS | TXX9_SIFLCR_TES);
 738	}
 739
 740	sio_out(up, TXX9_SILCR, cval);
 741	sio_quot_set(up, quot);
 742	sio_out(up, TXX9_SIFCR, fcr);
 743
 744	serial_txx9_set_mctrl(&up->port, up->port.mctrl);
 745	spin_unlock_irqrestore(&up->port.lock, flags);
 746}
 747
 748static void
 749serial_txx9_pm(struct uart_port *port, unsigned int state,
 750	      unsigned int oldstate)
 751{
 752	/*
 753	 * If oldstate was -1 this is called from
 754	 * uart_configure_port().  In this case do not initialize the
 755	 * port now, because the port was already initialized (for
 756	 * non-console port) or should not be initialized here (for
 757	 * console port).  If we initialized the port here we lose
 758	 * serial console settings.
 759	 */
 760	if (state == 0 && oldstate != -1)
 761		serial_txx9_initialize(port);
 762}
 763
 764static int serial_txx9_request_resource(struct uart_txx9_port *up)
 765{
 766	unsigned int size = TXX9_REGION_SIZE;
 767	int ret = 0;
 768
 769	switch (up->port.iotype) {
 770	default:
 771		if (!up->port.mapbase)
 772			break;
 773
 774		if (!request_mem_region(up->port.mapbase, size, "serial_txx9")) {
 775			ret = -EBUSY;
 776			break;
 777		}
 778
 779		if (up->port.flags & UPF_IOREMAP) {
 780			up->port.membase = ioremap(up->port.mapbase, size);
 781			if (!up->port.membase) {
 782				release_mem_region(up->port.mapbase, size);
 783				ret = -ENOMEM;
 784			}
 785		}
 786		break;
 787
 788	case UPIO_PORT:
 789		if (!request_region(up->port.iobase, size, "serial_txx9"))
 790			ret = -EBUSY;
 791		break;
 792	}
 793	return ret;
 794}
 795
 796static void serial_txx9_release_resource(struct uart_txx9_port *up)
 797{
 798	unsigned int size = TXX9_REGION_SIZE;
 799
 800	switch (up->port.iotype) {
 801	default:
 802		if (!up->port.mapbase)
 803			break;
 804
 805		if (up->port.flags & UPF_IOREMAP) {
 806			iounmap(up->port.membase);
 807			up->port.membase = NULL;
 808		}
 809
 810		release_mem_region(up->port.mapbase, size);
 811		break;
 812
 813	case UPIO_PORT:
 814		release_region(up->port.iobase, size);
 815		break;
 816	}
 817}
 818
 819static void serial_txx9_release_port(struct uart_port *port)
 820{
 821	struct uart_txx9_port *up = to_uart_txx9_port(port);
 822	serial_txx9_release_resource(up);
 823}
 824
 825static int serial_txx9_request_port(struct uart_port *port)
 826{
 827	struct uart_txx9_port *up = to_uart_txx9_port(port);
 828	return serial_txx9_request_resource(up);
 829}
 830
 831static void serial_txx9_config_port(struct uart_port *port, int uflags)
 832{
 833	struct uart_txx9_port *up = to_uart_txx9_port(port);
 834	int ret;
 835
 836	/*
 837	 * Find the region that we can probe for.  This in turn
 838	 * tells us whether we can probe for the type of port.
 839	 */
 840	ret = serial_txx9_request_resource(up);
 841	if (ret < 0)
 842		return;
 843	port->type = PORT_TXX9;
 844	up->port.fifosize = TXX9_SIO_TX_FIFO;
 845
 846#ifdef CONFIG_SERIAL_TXX9_CONSOLE
 847	if (up->port.line == up->port.cons->index)
 848		return;
 849#endif
 850	serial_txx9_initialize(port);
 851}
 852
 853static const char *
 854serial_txx9_type(struct uart_port *port)
 855{
 856	return "txx9";
 857}
 858
 859static struct uart_ops serial_txx9_pops = {
 860	.tx_empty	= serial_txx9_tx_empty,
 861	.set_mctrl	= serial_txx9_set_mctrl,
 862	.get_mctrl	= serial_txx9_get_mctrl,
 863	.stop_tx	= serial_txx9_stop_tx,
 864	.start_tx	= serial_txx9_start_tx,
 865	.stop_rx	= serial_txx9_stop_rx,
 866	.enable_ms	= serial_txx9_enable_ms,
 867	.break_ctl	= serial_txx9_break_ctl,
 868	.startup	= serial_txx9_startup,
 869	.shutdown	= serial_txx9_shutdown,
 870	.set_termios	= serial_txx9_set_termios,
 871	.pm		= serial_txx9_pm,
 872	.type		= serial_txx9_type,
 873	.release_port	= serial_txx9_release_port,
 874	.request_port	= serial_txx9_request_port,
 875	.config_port	= serial_txx9_config_port,
 876#ifdef CONFIG_CONSOLE_POLL
 877	.poll_get_char	= serial_txx9_get_poll_char,
 878	.poll_put_char	= serial_txx9_put_poll_char,
 879#endif
 880};
 881
 882static struct uart_txx9_port serial_txx9_ports[UART_NR];
 883
 884static void __init serial_txx9_register_ports(struct uart_driver *drv,
 885					      struct device *dev)
 886{
 887	int i;
 888
 889	for (i = 0; i < UART_NR; i++) {
 890		struct uart_txx9_port *up = &serial_txx9_ports[i];
 891
 892		up->port.line = i;
 893		up->port.ops = &serial_txx9_pops;
 894		up->port.dev = dev;
 895		if (up->port.iobase || up->port.mapbase)
 896			uart_add_one_port(drv, &up->port);
 897	}
 898}
 899
 900#ifdef CONFIG_SERIAL_TXX9_CONSOLE
 901
 902static void serial_txx9_console_putchar(struct uart_port *port, int ch)
 903{
 904	struct uart_txx9_port *up = to_uart_txx9_port(port);
 905
 906	wait_for_xmitr(up);
 907	sio_out(up, TXX9_SITFIFO, ch);
 908}
 909
 910/*
 911 *	Print a string to the serial port trying not to disturb
 912 *	any possible real use of the port...
 913 *
 914 *	The console_lock must be held when we get here.
 915 */
 916static void
 917serial_txx9_console_write(struct console *co, const char *s, unsigned int count)
 918{
 919	struct uart_txx9_port *up = &serial_txx9_ports[co->index];
 920	unsigned int ier, flcr;
 921
 922	/*
 923	 *	First save the UER then disable the interrupts
 924	 */
 925	ier = sio_in(up, TXX9_SIDICR);
 926	sio_out(up, TXX9_SIDICR, 0);
 927	/*
 928	 *	Disable flow-control if enabled (and unnecessary)
 929	 */
 930	flcr = sio_in(up, TXX9_SIFLCR);
 931	if (!(up->port.flags & UPF_CONS_FLOW) && (flcr & TXX9_SIFLCR_TES))
 932		sio_out(up, TXX9_SIFLCR, flcr & ~TXX9_SIFLCR_TES);
 933
 934	uart_console_write(&up->port, s, count, serial_txx9_console_putchar);
 935
 936	/*
 937	 *	Finally, wait for transmitter to become empty
 938	 *	and restore the IER
 939	 */
 940	wait_for_xmitr(up);
 941	sio_out(up, TXX9_SIFLCR, flcr);
 942	sio_out(up, TXX9_SIDICR, ier);
 943}
 944
 945static int __init serial_txx9_console_setup(struct console *co, char *options)
 946{
 947	struct uart_port *port;
 948	struct uart_txx9_port *up;
 949	int baud = 9600;
 950	int bits = 8;
 951	int parity = 'n';
 952	int flow = 'n';
 953
 954	/*
 955	 * Check whether an invalid uart number has been specified, and
 956	 * if so, search for the first available port that does have
 957	 * console support.
 958	 */
 959	if (co->index >= UART_NR)
 960		co->index = 0;
 961	up = &serial_txx9_ports[co->index];
 962	port = &up->port;
 963	if (!port->ops)
 964		return -ENODEV;
 965
 966	serial_txx9_initialize(&up->port);
 967
 968	if (options)
 969		uart_parse_options(options, &baud, &parity, &bits, &flow);
 970
 971	return uart_set_options(port, co, baud, parity, bits, flow);
 972}
 973
 974static struct uart_driver serial_txx9_reg;
 975static struct console serial_txx9_console = {
 976	.name		= TXX9_TTY_NAME,
 977	.write		= serial_txx9_console_write,
 978	.device		= uart_console_device,
 979	.setup		= serial_txx9_console_setup,
 980	.flags		= CON_PRINTBUFFER,
 981	.index		= -1,
 982	.data		= &serial_txx9_reg,
 983};
 984
 985static int __init serial_txx9_console_init(void)
 986{
 987	register_console(&serial_txx9_console);
 988	return 0;
 989}
 990console_initcall(serial_txx9_console_init);
 991
 992#define SERIAL_TXX9_CONSOLE	&serial_txx9_console
 993#else
 994#define SERIAL_TXX9_CONSOLE	NULL
 995#endif
 996
 997static struct uart_driver serial_txx9_reg = {
 998	.owner			= THIS_MODULE,
 999	.driver_name		= "serial_txx9",
1000	.dev_name		= TXX9_TTY_NAME,
1001	.major			= TXX9_TTY_MAJOR,
1002	.minor			= TXX9_TTY_MINOR_START,
1003	.nr			= UART_NR,
1004	.cons			= SERIAL_TXX9_CONSOLE,
1005};
1006
1007int __init early_serial_txx9_setup(struct uart_port *port)
1008{
1009	if (port->line >= ARRAY_SIZE(serial_txx9_ports))
1010		return -ENODEV;
1011
1012	serial_txx9_ports[port->line].port = *port;
1013	serial_txx9_ports[port->line].port.ops = &serial_txx9_pops;
1014	serial_txx9_ports[port->line].port.flags |=
1015		UPF_BOOT_AUTOCONF | UPF_FIXED_PORT;
1016	return 0;
1017}
1018
1019static DEFINE_MUTEX(serial_txx9_mutex);
1020
1021/**
1022 *	serial_txx9_register_port - register a serial port
1023 *	@port: serial port template
1024 *
1025 *	Configure the serial port specified by the request.
1026 *
1027 *	The port is then probed and if necessary the IRQ is autodetected
1028 *	If this fails an error is returned.
1029 *
1030 *	On success the port is ready to use and the line number is returned.
1031 */
1032static int serial_txx9_register_port(struct uart_port *port)
1033{
1034	int i;
1035	struct uart_txx9_port *uart;
1036	int ret = -ENOSPC;
1037
1038	mutex_lock(&serial_txx9_mutex);
1039	for (i = 0; i < UART_NR; i++) {
1040		uart = &serial_txx9_ports[i];
1041		if (uart_match_port(&uart->port, port)) {
1042			uart_remove_one_port(&serial_txx9_reg, &uart->port);
1043			break;
1044		}
1045	}
1046	if (i == UART_NR) {
1047		/* Find unused port */
1048		for (i = 0; i < UART_NR; i++) {
1049			uart = &serial_txx9_ports[i];
1050			if (!(uart->port.iobase || uart->port.mapbase))
1051				break;
1052		}
1053	}
1054	if (i < UART_NR) {
1055		uart->port.iobase = port->iobase;
1056		uart->port.membase = port->membase;
1057		uart->port.irq      = port->irq;
1058		uart->port.uartclk  = port->uartclk;
1059		uart->port.iotype   = port->iotype;
1060		uart->port.flags    = port->flags
1061			| UPF_BOOT_AUTOCONF | UPF_FIXED_PORT;
1062		uart->port.mapbase  = port->mapbase;
1063		if (port->dev)
1064			uart->port.dev = port->dev;
1065		ret = uart_add_one_port(&serial_txx9_reg, &uart->port);
1066		if (ret == 0)
1067			ret = uart->port.line;
1068	}
1069	mutex_unlock(&serial_txx9_mutex);
1070	return ret;
1071}
1072
1073/**
1074 *	serial_txx9_unregister_port - remove a txx9 serial port at runtime
1075 *	@line: serial line number
1076 *
1077 *	Remove one serial port.  This may not be called from interrupt
1078 *	context.  We hand the port back to the our control.
1079 */
1080static void serial_txx9_unregister_port(int line)
1081{
1082	struct uart_txx9_port *uart = &serial_txx9_ports[line];
1083
1084	mutex_lock(&serial_txx9_mutex);
1085	uart_remove_one_port(&serial_txx9_reg, &uart->port);
1086	uart->port.flags = 0;
1087	uart->port.type = PORT_UNKNOWN;
1088	uart->port.iobase = 0;
1089	uart->port.mapbase = 0;
1090	uart->port.membase = NULL;
1091	uart->port.dev = NULL;
1092	mutex_unlock(&serial_txx9_mutex);
1093}
1094
1095/*
1096 * Register a set of serial devices attached to a platform device.
1097 */
1098static int serial_txx9_probe(struct platform_device *dev)
1099{
1100	struct uart_port *p = dev_get_platdata(&dev->dev);
1101	struct uart_port port;
1102	int ret, i;
1103
1104	memset(&port, 0, sizeof(struct uart_port));
1105	for (i = 0; p && p->uartclk != 0; p++, i++) {
1106		port.iobase	= p->iobase;
1107		port.membase	= p->membase;
1108		port.irq	= p->irq;
1109		port.uartclk	= p->uartclk;
1110		port.iotype	= p->iotype;
1111		port.flags	= p->flags;
1112		port.mapbase	= p->mapbase;
1113		port.dev	= &dev->dev;
1114		ret = serial_txx9_register_port(&port);
1115		if (ret < 0) {
1116			dev_err(&dev->dev, "unable to register port at index %d "
1117				"(IO%lx MEM%llx IRQ%d): %d\n", i,
1118				p->iobase, (unsigned long long)p->mapbase,
1119				p->irq, ret);
1120		}
1121	}
1122	return 0;
1123}
1124
1125/*
1126 * Remove serial ports registered against a platform device.
1127 */
1128static int serial_txx9_remove(struct platform_device *dev)
1129{
1130	int i;
1131
1132	for (i = 0; i < UART_NR; i++) {
1133		struct uart_txx9_port *up = &serial_txx9_ports[i];
1134
1135		if (up->port.dev == &dev->dev)
1136			serial_txx9_unregister_port(i);
1137	}
1138	return 0;
1139}
1140
1141#ifdef CONFIG_PM
1142static int serial_txx9_suspend(struct platform_device *dev, pm_message_t state)
1143{
1144	int i;
1145
1146	for (i = 0; i < UART_NR; i++) {
1147		struct uart_txx9_port *up = &serial_txx9_ports[i];
1148
1149		if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
1150			uart_suspend_port(&serial_txx9_reg, &up->port);
1151	}
1152
1153	return 0;
1154}
1155
1156static int serial_txx9_resume(struct platform_device *dev)
1157{
1158	int i;
1159
1160	for (i = 0; i < UART_NR; i++) {
1161		struct uart_txx9_port *up = &serial_txx9_ports[i];
1162
1163		if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
1164			uart_resume_port(&serial_txx9_reg, &up->port);
1165	}
1166
1167	return 0;
1168}
1169#endif
1170
1171static struct platform_driver serial_txx9_plat_driver = {
1172	.probe		= serial_txx9_probe,
1173	.remove		= serial_txx9_remove,
1174#ifdef CONFIG_PM
1175	.suspend	= serial_txx9_suspend,
1176	.resume		= serial_txx9_resume,
1177#endif
1178	.driver		= {
1179		.name	= "serial_txx9",
1180		.owner	= THIS_MODULE,
1181	},
1182};
1183
1184#ifdef ENABLE_SERIAL_TXX9_PCI
1185/*
1186 * Probe one serial board.  Unfortunately, there is no rhyme nor reason
1187 * to the arrangement of serial ports on a PCI card.
1188 */
1189static int
1190pciserial_txx9_init_one(struct pci_dev *dev, const struct pci_device_id *ent)
1191{
1192	struct uart_port port;
1193	int line;
1194	int rc;
1195
1196	rc = pci_enable_device(dev);
1197	if (rc)
1198		return rc;
1199
1200	memset(&port, 0, sizeof(port));
1201	port.ops = &serial_txx9_pops;
1202	port.flags |= UPF_TXX9_HAVE_CTS_LINE;
1203	port.uartclk = 66670000;
1204	port.irq = dev->irq;
1205	port.iotype = UPIO_PORT;
1206	port.iobase = pci_resource_start(dev, 1);
1207	port.dev = &dev->dev;
1208	line = serial_txx9_register_port(&port);
1209	if (line < 0) {
1210		printk(KERN_WARNING "Couldn't register serial port %s: %d\n", pci_name(dev), line);
1211		pci_disable_device(dev);
1212		return line;
1213	}
1214	pci_set_drvdata(dev, &serial_txx9_ports[line]);
1215
1216	return 0;
1217}
1218
1219static void pciserial_txx9_remove_one(struct pci_dev *dev)
1220{
1221	struct uart_txx9_port *up = pci_get_drvdata(dev);
1222
1223	if (up) {
1224		serial_txx9_unregister_port(up->port.line);
1225		pci_disable_device(dev);
1226	}
1227}
1228
1229#ifdef CONFIG_PM
1230static int pciserial_txx9_suspend_one(struct pci_dev *dev, pm_message_t state)
1231{
1232	struct uart_txx9_port *up = pci_get_drvdata(dev);
1233
1234	if (up)
1235		uart_suspend_port(&serial_txx9_reg, &up->port);
1236	pci_save_state(dev);
1237	pci_set_power_state(dev, pci_choose_state(dev, state));
1238	return 0;
1239}
1240
1241static int pciserial_txx9_resume_one(struct pci_dev *dev)
1242{
1243	struct uart_txx9_port *up = pci_get_drvdata(dev);
1244
1245	pci_set_power_state(dev, PCI_D0);
1246	pci_restore_state(dev);
1247	if (up)
1248		uart_resume_port(&serial_txx9_reg, &up->port);
1249	return 0;
1250}
1251#endif
1252
1253static const struct pci_device_id serial_txx9_pci_tbl[] = {
1254	{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA_2, PCI_DEVICE_ID_TOSHIBA_TC86C001_MISC) },
1255	{ 0, }
1256};
1257
1258static struct pci_driver serial_txx9_pci_driver = {
1259	.name		= "serial_txx9",
1260	.probe		= pciserial_txx9_init_one,
1261	.remove		= pciserial_txx9_remove_one,
1262#ifdef CONFIG_PM
1263	.suspend	= pciserial_txx9_suspend_one,
1264	.resume		= pciserial_txx9_resume_one,
1265#endif
1266	.id_table	= serial_txx9_pci_tbl,
1267};
1268
1269MODULE_DEVICE_TABLE(pci, serial_txx9_pci_tbl);
1270#endif /* ENABLE_SERIAL_TXX9_PCI */
1271
1272static struct platform_device *serial_txx9_plat_devs;
1273
1274static int __init serial_txx9_init(void)
1275{
1276	int ret;
1277
1278 	printk(KERN_INFO "%s version %s\n", serial_name, serial_version);
1279
1280	ret = uart_register_driver(&serial_txx9_reg);
1281	if (ret)
1282		goto out;
1283
1284	serial_txx9_plat_devs = platform_device_alloc("serial_txx9", -1);
1285	if (!serial_txx9_plat_devs) {
1286		ret = -ENOMEM;
1287		goto unreg_uart_drv;
1288	}
1289
1290	ret = platform_device_add(serial_txx9_plat_devs);
1291	if (ret)
1292		goto put_dev;
1293
1294	serial_txx9_register_ports(&serial_txx9_reg,
1295				   &serial_txx9_plat_devs->dev);
1296
1297	ret = platform_driver_register(&serial_txx9_plat_driver);
1298	if (ret)
1299		goto del_dev;
1300
1301#ifdef ENABLE_SERIAL_TXX9_PCI
1302	ret = pci_register_driver(&serial_txx9_pci_driver);
1303#endif
1304	if (ret == 0)
1305		goto out;
1306
1307 del_dev:
1308	platform_device_del(serial_txx9_plat_devs);
1309 put_dev:
1310	platform_device_put(serial_txx9_plat_devs);
1311 unreg_uart_drv:
1312	uart_unregister_driver(&serial_txx9_reg);
1313 out:
1314	return ret;
1315}
1316
1317static void __exit serial_txx9_exit(void)
1318{
1319	int i;
1320
1321#ifdef ENABLE_SERIAL_TXX9_PCI
1322	pci_unregister_driver(&serial_txx9_pci_driver);
1323#endif
1324	platform_driver_unregister(&serial_txx9_plat_driver);
1325	platform_device_unregister(serial_txx9_plat_devs);
1326	for (i = 0; i < UART_NR; i++) {
1327		struct uart_txx9_port *up = &serial_txx9_ports[i];
1328		if (up->port.iobase || up->port.mapbase)
1329			uart_remove_one_port(&serial_txx9_reg, &up->port);
1330	}
1331
1332	uart_unregister_driver(&serial_txx9_reg);
1333}
1334
1335module_init(serial_txx9_init);
1336module_exit(serial_txx9_exit);
1337
1338MODULE_LICENSE("GPL");
1339MODULE_DESCRIPTION("TX39/49 serial driver");
1340
1341MODULE_ALIAS_CHARDEV_MAJOR(TXX9_TTY_MAJOR);