Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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