at v2.6.14-rc2 1887 lines 47 kB view raw
1/* 2 * mcfserial.c -- serial driver for ColdFire internal UARTS. 3 * 4 * Copyright (C) 1999-2003 Greg Ungerer <gerg@snapgear.com> 5 * Copyright (c) 2000-2001 Lineo, Inc. <www.lineo.com> 6 * Copyright (C) 2001-2002 SnapGear Inc. <www.snapgear.com> 7 * 8 * Based on code from 68332serial.c which was: 9 * 10 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 11 * Copyright (C) 1998 TSHG 12 * Copyright (c) 1999 Rt-Control Inc. <jeff@uclinux.org> 13 * 14 * Changes: 15 * 08/07/2003 Daniele Bellucci <bellucda@tiscali.it> 16 * some cleanups in mcfrs_write. 17 * 18 */ 19 20#include <linux/module.h> 21#include <linux/errno.h> 22#include <linux/signal.h> 23#include <linux/sched.h> 24#include <linux/timer.h> 25#include <linux/wait.h> 26#include <linux/interrupt.h> 27#include <linux/tty.h> 28#include <linux/tty_flip.h> 29#include <linux/string.h> 30#include <linux/fcntl.h> 31#include <linux/mm.h> 32#include <linux/kernel.h> 33#include <linux/serial.h> 34#include <linux/serialP.h> 35#include <linux/console.h> 36#include <linux/init.h> 37#include <linux/bitops.h> 38#include <linux/delay.h> 39 40#include <asm/io.h> 41#include <asm/irq.h> 42#include <asm/system.h> 43#include <asm/semaphore.h> 44#include <asm/delay.h> 45#include <asm/coldfire.h> 46#include <asm/mcfsim.h> 47#include <asm/mcfuart.h> 48#include <asm/nettel.h> 49#include <asm/uaccess.h> 50#include "mcfserial.h" 51 52struct timer_list mcfrs_timer_struct; 53 54/* 55 * Default console baud rate, we use this as the default 56 * for all ports so init can just open /dev/console and 57 * keep going. Perhaps one day the cflag settings for the 58 * console can be used instead. 59 */ 60#if defined(CONFIG_ARNEWSH) || defined(CONFIG_MOTOROLA) || defined(CONFIG_senTec) || defined(CONFIG_SNEHA) 61#define CONSOLE_BAUD_RATE 19200 62#define DEFAULT_CBAUD B19200 63#endif 64 65#if defined(CONFIG_HW_FEITH) 66#define CONSOLE_BAUD_RATE 38400 67#define DEFAULT_CBAUD B38400 68#endif 69 70#if defined(CONFIG_MOD5272) 71#define CONSOLE_BAUD_RATE 115200 72#define DEFAULT_CBAUD B115200 73#endif 74 75#ifndef CONSOLE_BAUD_RATE 76#define CONSOLE_BAUD_RATE 9600 77#define DEFAULT_CBAUD B9600 78#endif 79 80int mcfrs_console_inited = 0; 81int mcfrs_console_port = -1; 82int mcfrs_console_baud = CONSOLE_BAUD_RATE; 83int mcfrs_console_cbaud = DEFAULT_CBAUD; 84 85/* 86 * Driver data structures. 87 */ 88static struct tty_driver *mcfrs_serial_driver; 89 90/* number of characters left in xmit buffer before we ask for more */ 91#define WAKEUP_CHARS 256 92 93/* Debugging... 94 */ 95#undef SERIAL_DEBUG_OPEN 96#undef SERIAL_DEBUG_FLOW 97 98#if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) 99#define IRQBASE (MCFINT_VECBASE+MCFINT_UART0) 100#else 101#define IRQBASE 73 102#endif 103 104/* 105 * Configuration table, UARTs to look for at startup. 106 */ 107static struct mcf_serial mcfrs_table[] = { 108 { /* ttyS0 */ 109 .magic = 0, 110 .addr = (volatile unsigned char *) (MCF_MBAR+MCFUART_BASE1), 111 .irq = IRQBASE, 112 .flags = ASYNC_BOOT_AUTOCONF, 113 }, 114 { /* ttyS1 */ 115 .magic = 0, 116 .addr = (volatile unsigned char *) (MCF_MBAR+MCFUART_BASE2), 117 .irq = IRQBASE+1, 118 .flags = ASYNC_BOOT_AUTOCONF, 119 }, 120}; 121 122 123#define NR_PORTS (sizeof(mcfrs_table) / sizeof(struct mcf_serial)) 124 125/* 126 * This is used to figure out the divisor speeds and the timeouts. 127 */ 128static int mcfrs_baud_table[] = { 129 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 130 9600, 19200, 38400, 57600, 115200, 230400, 460800, 0 131}; 132#define MCFRS_BAUD_TABLE_SIZE \ 133 (sizeof(mcfrs_baud_table)/sizeof(mcfrs_baud_table[0])) 134 135 136#ifdef CONFIG_MAGIC_SYSRQ 137/* 138 * Magic system request keys. Used for debugging... 139 */ 140extern int magic_sysrq_key(int ch); 141#endif 142 143 144/* 145 * Forware declarations... 146 */ 147static void mcfrs_change_speed(struct mcf_serial *info); 148static void mcfrs_wait_until_sent(struct tty_struct *tty, int timeout); 149 150 151static inline int serial_paranoia_check(struct mcf_serial *info, 152 char *name, const char *routine) 153{ 154#ifdef SERIAL_PARANOIA_CHECK 155 static const char badmagic[] = 156 "MCFRS(warning): bad magic number for serial struct %s in %s\n"; 157 static const char badinfo[] = 158 "MCFRS(warning): null mcf_serial for %s in %s\n"; 159 160 if (!info) { 161 printk(badinfo, name, routine); 162 return 1; 163 } 164 if (info->magic != SERIAL_MAGIC) { 165 printk(badmagic, name, routine); 166 return 1; 167 } 168#endif 169 return 0; 170} 171 172/* 173 * Sets or clears DTR and RTS on the requested line. 174 */ 175static void mcfrs_setsignals(struct mcf_serial *info, int dtr, int rts) 176{ 177 volatile unsigned char *uartp; 178 unsigned long flags; 179 180#if 0 181 printk("%s(%d): mcfrs_setsignals(info=%x,dtr=%d,rts=%d)\n", 182 __FILE__, __LINE__, info, dtr, rts); 183#endif 184 185 local_irq_save(flags); 186 if (dtr >= 0) { 187#ifdef MCFPP_DTR0 188 if (info->line) 189 mcf_setppdata(MCFPP_DTR1, (dtr ? 0 : MCFPP_DTR1)); 190 else 191 mcf_setppdata(MCFPP_DTR0, (dtr ? 0 : MCFPP_DTR0)); 192#endif 193 } 194 if (rts >= 0) { 195 uartp = info->addr; 196 if (rts) { 197 info->sigs |= TIOCM_RTS; 198 uartp[MCFUART_UOP1] = MCFUART_UOP_RTS; 199 } else { 200 info->sigs &= ~TIOCM_RTS; 201 uartp[MCFUART_UOP0] = MCFUART_UOP_RTS; 202 } 203 } 204 local_irq_restore(flags); 205 return; 206} 207 208/* 209 * Gets values of serial signals. 210 */ 211static int mcfrs_getsignals(struct mcf_serial *info) 212{ 213 volatile unsigned char *uartp; 214 unsigned long flags; 215 int sigs; 216#if defined(CONFIG_NETtel) && defined(CONFIG_M5307) 217 unsigned short ppdata; 218#endif 219 220#if 0 221 printk("%s(%d): mcfrs_getsignals(info=%x)\n", __FILE__, __LINE__); 222#endif 223 224 local_irq_save(flags); 225 uartp = info->addr; 226 sigs = (uartp[MCFUART_UIPR] & MCFUART_UIPR_CTS) ? 0 : TIOCM_CTS; 227 sigs |= (info->sigs & TIOCM_RTS); 228 229#ifdef MCFPP_DCD0 230{ 231 unsigned int ppdata; 232 ppdata = mcf_getppdata(); 233 if (info->line == 0) { 234 sigs |= (ppdata & MCFPP_DCD0) ? 0 : TIOCM_CD; 235 sigs |= (ppdata & MCFPP_DTR0) ? 0 : TIOCM_DTR; 236 } else if (info->line == 1) { 237 sigs |= (ppdata & MCFPP_DCD1) ? 0 : TIOCM_CD; 238 sigs |= (ppdata & MCFPP_DTR1) ? 0 : TIOCM_DTR; 239 } 240} 241#endif 242 243 local_irq_restore(flags); 244 return(sigs); 245} 246 247/* 248 * ------------------------------------------------------------ 249 * mcfrs_stop() and mcfrs_start() 250 * 251 * This routines are called before setting or resetting tty->stopped. 252 * They enable or disable transmitter interrupts, as necessary. 253 * ------------------------------------------------------------ 254 */ 255static void mcfrs_stop(struct tty_struct *tty) 256{ 257 volatile unsigned char *uartp; 258 struct mcf_serial *info = (struct mcf_serial *)tty->driver_data; 259 unsigned long flags; 260 261 if (serial_paranoia_check(info, tty->name, "mcfrs_stop")) 262 return; 263 264 local_irq_save(flags); 265 uartp = info->addr; 266 info->imr &= ~MCFUART_UIR_TXREADY; 267 uartp[MCFUART_UIMR] = info->imr; 268 local_irq_restore(flags); 269} 270 271static void mcfrs_start(struct tty_struct *tty) 272{ 273 volatile unsigned char *uartp; 274 struct mcf_serial *info = (struct mcf_serial *)tty->driver_data; 275 unsigned long flags; 276 277 if (serial_paranoia_check(info, tty->name, "mcfrs_start")) 278 return; 279 280 local_irq_save(flags); 281 if (info->xmit_cnt && info->xmit_buf) { 282 uartp = info->addr; 283 info->imr |= MCFUART_UIR_TXREADY; 284 uartp[MCFUART_UIMR] = info->imr; 285 } 286 local_irq_restore(flags); 287} 288 289/* 290 * ---------------------------------------------------------------------- 291 * 292 * Here starts the interrupt handling routines. All of the following 293 * subroutines are declared as inline and are folded into 294 * mcfrs_interrupt(). They were separated out for readability's sake. 295 * 296 * Note: mcfrs_interrupt() is a "fast" interrupt, which means that it 297 * runs with interrupts turned off. People who may want to modify 298 * mcfrs_interrupt() should try to keep the interrupt handler as fast as 299 * possible. After you are done making modifications, it is not a bad 300 * idea to do: 301 * 302 * gcc -S -DKERNEL -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer serial.c 303 * 304 * and look at the resulting assemble code in serial.s. 305 * 306 * - Ted Ts'o (tytso@mit.edu), 7-Mar-93 307 * ----------------------------------------------------------------------- 308 */ 309 310static inline void receive_chars(struct mcf_serial *info) 311{ 312 volatile unsigned char *uartp; 313 struct tty_struct *tty = info->tty; 314 unsigned char status, ch; 315 316 if (!tty) 317 return; 318 319 uartp = info->addr; 320 321 while ((status = uartp[MCFUART_USR]) & MCFUART_USR_RXREADY) { 322 323 if (tty->flip.count >= TTY_FLIPBUF_SIZE) 324 break; 325 326 ch = uartp[MCFUART_URB]; 327 info->stats.rx++; 328 329#ifdef CONFIG_MAGIC_SYSRQ 330 if (mcfrs_console_inited && (info->line == mcfrs_console_port)) { 331 if (magic_sysrq_key(ch)) 332 continue; 333 } 334#endif 335 336 tty->flip.count++; 337 if (status & MCFUART_USR_RXERR) { 338 uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETERR; 339 if (status & MCFUART_USR_RXBREAK) { 340 info->stats.rxbreak++; 341 *tty->flip.flag_buf_ptr++ = TTY_BREAK; 342 } else if (status & MCFUART_USR_RXPARITY) { 343 info->stats.rxparity++; 344 *tty->flip.flag_buf_ptr++ = TTY_PARITY; 345 } else if (status & MCFUART_USR_RXOVERRUN) { 346 info->stats.rxoverrun++; 347 *tty->flip.flag_buf_ptr++ = TTY_OVERRUN; 348 } else if (status & MCFUART_USR_RXFRAMING) { 349 info->stats.rxframing++; 350 *tty->flip.flag_buf_ptr++ = TTY_FRAME; 351 } else { 352 /* This should never happen... */ 353 *tty->flip.flag_buf_ptr++ = 0; 354 } 355 } else { 356 *tty->flip.flag_buf_ptr++ = 0; 357 } 358 *tty->flip.char_buf_ptr++ = ch; 359 } 360 361 schedule_work(&tty->flip.work); 362 return; 363} 364 365static inline void transmit_chars(struct mcf_serial *info) 366{ 367 volatile unsigned char *uartp; 368 369 uartp = info->addr; 370 371 if (info->x_char) { 372 /* Send special char - probably flow control */ 373 uartp[MCFUART_UTB] = info->x_char; 374 info->x_char = 0; 375 info->stats.tx++; 376 } 377 378 if ((info->xmit_cnt <= 0) || info->tty->stopped) { 379 info->imr &= ~MCFUART_UIR_TXREADY; 380 uartp[MCFUART_UIMR] = info->imr; 381 return; 382 } 383 384 while (uartp[MCFUART_USR] & MCFUART_USR_TXREADY) { 385 uartp[MCFUART_UTB] = info->xmit_buf[info->xmit_tail++]; 386 info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1); 387 info->stats.tx++; 388 if (--info->xmit_cnt <= 0) 389 break; 390 } 391 392 if (info->xmit_cnt < WAKEUP_CHARS) 393 schedule_work(&info->tqueue); 394 return; 395} 396 397/* 398 * This is the serial driver's generic interrupt routine 399 */ 400irqreturn_t mcfrs_interrupt(int irq, void *dev_id, struct pt_regs *regs) 401{ 402 struct mcf_serial *info; 403 unsigned char isr; 404 405 info = &mcfrs_table[(irq - IRQBASE)]; 406 isr = info->addr[MCFUART_UISR] & info->imr; 407 408 if (isr & MCFUART_UIR_RXREADY) 409 receive_chars(info); 410 if (isr & MCFUART_UIR_TXREADY) 411 transmit_chars(info); 412 return IRQ_HANDLED; 413} 414 415/* 416 * ------------------------------------------------------------------- 417 * Here ends the serial interrupt routines. 418 * ------------------------------------------------------------------- 419 */ 420 421static void mcfrs_offintr(void *private) 422{ 423 struct mcf_serial *info = (struct mcf_serial *) private; 424 struct tty_struct *tty; 425 426 tty = info->tty; 427 if (!tty) 428 return; 429 tty_wakeup(tty); 430} 431 432 433/* 434 * Change of state on a DCD line. 435 */ 436void mcfrs_modem_change(struct mcf_serial *info, int dcd) 437{ 438 if (info->count == 0) 439 return; 440 441 if (info->flags & ASYNC_CHECK_CD) { 442 if (dcd) 443 wake_up_interruptible(&info->open_wait); 444 else 445 schedule_work(&info->tqueue_hangup); 446 } 447} 448 449 450#ifdef MCFPP_DCD0 451 452unsigned short mcfrs_ppstatus; 453 454/* 455 * This subroutine is called when the RS_TIMER goes off. It is used 456 * to monitor the state of the DCD lines - since they have no edge 457 * sensors and interrupt generators. 458 */ 459static void mcfrs_timer(void) 460{ 461 unsigned int ppstatus, dcdval, i; 462 463 ppstatus = mcf_getppdata() & (MCFPP_DCD0 | MCFPP_DCD1); 464 465 if (ppstatus != mcfrs_ppstatus) { 466 for (i = 0; (i < 2); i++) { 467 dcdval = (i ? MCFPP_DCD1 : MCFPP_DCD0); 468 if ((ppstatus & dcdval) != (mcfrs_ppstatus & dcdval)) { 469 mcfrs_modem_change(&mcfrs_table[i], 470 ((ppstatus & dcdval) ? 0 : 1)); 471 } 472 } 473 } 474 mcfrs_ppstatus = ppstatus; 475 476 /* Re-arm timer */ 477 mcfrs_timer_struct.expires = jiffies + HZ/25; 478 add_timer(&mcfrs_timer_struct); 479} 480 481#endif /* MCFPP_DCD0 */ 482 483 484/* 485 * This routine is called from the scheduler tqueue when the interrupt 486 * routine has signalled that a hangup has occurred. The path of 487 * hangup processing is: 488 * 489 * serial interrupt routine -> (scheduler tqueue) -> 490 * do_serial_hangup() -> tty->hangup() -> mcfrs_hangup() 491 * 492 */ 493static void do_serial_hangup(void *private) 494{ 495 struct mcf_serial *info = (struct mcf_serial *) private; 496 struct tty_struct *tty; 497 498 tty = info->tty; 499 if (!tty) 500 return; 501 502 tty_hangup(tty); 503} 504 505static int startup(struct mcf_serial * info) 506{ 507 volatile unsigned char *uartp; 508 unsigned long flags; 509 510 if (info->flags & ASYNC_INITIALIZED) 511 return 0; 512 513 if (!info->xmit_buf) { 514 info->xmit_buf = (unsigned char *) __get_free_page(GFP_KERNEL); 515 if (!info->xmit_buf) 516 return -ENOMEM; 517 } 518 519 local_irq_save(flags); 520 521#ifdef SERIAL_DEBUG_OPEN 522 printk("starting up ttyS%d (irq %d)...\n", info->line, info->irq); 523#endif 524 525 /* 526 * Reset UART, get it into known state... 527 */ 528 uartp = info->addr; 529 uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX; /* reset RX */ 530 uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETTX; /* reset TX */ 531 mcfrs_setsignals(info, 1, 1); 532 533 if (info->tty) 534 clear_bit(TTY_IO_ERROR, &info->tty->flags); 535 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; 536 537 /* 538 * and set the speed of the serial port 539 */ 540 mcfrs_change_speed(info); 541 542 /* 543 * Lastly enable the UART transmitter and receiver, and 544 * interrupt enables. 545 */ 546 info->imr = MCFUART_UIR_RXREADY; 547 uartp[MCFUART_UCR] = MCFUART_UCR_RXENABLE | MCFUART_UCR_TXENABLE; 548 uartp[MCFUART_UIMR] = info->imr; 549 550 info->flags |= ASYNC_INITIALIZED; 551 local_irq_restore(flags); 552 return 0; 553} 554 555/* 556 * This routine will shutdown a serial port; interrupts are disabled, and 557 * DTR is dropped if the hangup on close termio flag is on. 558 */ 559static void shutdown(struct mcf_serial * info) 560{ 561 volatile unsigned char *uartp; 562 unsigned long flags; 563 564 if (!(info->flags & ASYNC_INITIALIZED)) 565 return; 566 567#ifdef SERIAL_DEBUG_OPEN 568 printk("Shutting down serial port %d (irq %d)....\n", info->line, 569 info->irq); 570#endif 571 572 local_irq_save(flags); 573 574 uartp = info->addr; 575 uartp[MCFUART_UIMR] = 0; /* mask all interrupts */ 576 uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX; /* reset RX */ 577 uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETTX; /* reset TX */ 578 579 if (!info->tty || (info->tty->termios->c_cflag & HUPCL)) 580 mcfrs_setsignals(info, 0, 0); 581 582 if (info->xmit_buf) { 583 free_page((unsigned long) info->xmit_buf); 584 info->xmit_buf = 0; 585 } 586 587 if (info->tty) 588 set_bit(TTY_IO_ERROR, &info->tty->flags); 589 590 info->flags &= ~ASYNC_INITIALIZED; 591 local_irq_restore(flags); 592} 593 594 595/* 596 * This routine is called to set the UART divisor registers to match 597 * the specified baud rate for a serial port. 598 */ 599static void mcfrs_change_speed(struct mcf_serial *info) 600{ 601 volatile unsigned char *uartp; 602 unsigned int baudclk, cflag; 603 unsigned long flags; 604 unsigned char mr1, mr2; 605 int i; 606#ifdef CONFIG_M5272 607 unsigned int fraction; 608#endif 609 610 if (!info->tty || !info->tty->termios) 611 return; 612 cflag = info->tty->termios->c_cflag; 613 if (info->addr == 0) 614 return; 615 616#if 0 617 printk("%s(%d): mcfrs_change_speed()\n", __FILE__, __LINE__); 618#endif 619 620 i = cflag & CBAUD; 621 if (i & CBAUDEX) { 622 i &= ~CBAUDEX; 623 if (i < 1 || i > 4) 624 info->tty->termios->c_cflag &= ~CBAUDEX; 625 else 626 i += 15; 627 } 628 if (i == 0) { 629 mcfrs_setsignals(info, 0, -1); 630 return; 631 } 632 633 /* compute the baudrate clock */ 634#ifdef CONFIG_M5272 635 /* 636 * For the MCF5272, also compute the baudrate fraction. 637 */ 638 baudclk = (MCF_BUSCLK / mcfrs_baud_table[i]) / 32; 639 fraction = MCF_BUSCLK - (baudclk * 32 * mcfrs_baud_table[i]); 640 fraction *= 16; 641 fraction /= (32 * mcfrs_baud_table[i]); 642#else 643 baudclk = ((MCF_BUSCLK / mcfrs_baud_table[i]) + 16) / 32; 644#endif 645 646 info->baud = mcfrs_baud_table[i]; 647 648 mr1 = MCFUART_MR1_RXIRQRDY | MCFUART_MR1_RXERRCHAR; 649 mr2 = 0; 650 651 switch (cflag & CSIZE) { 652 case CS5: mr1 |= MCFUART_MR1_CS5; break; 653 case CS6: mr1 |= MCFUART_MR1_CS6; break; 654 case CS7: mr1 |= MCFUART_MR1_CS7; break; 655 case CS8: 656 default: mr1 |= MCFUART_MR1_CS8; break; 657 } 658 659 if (cflag & PARENB) { 660 if (cflag & CMSPAR) { 661 if (cflag & PARODD) 662 mr1 |= MCFUART_MR1_PARITYMARK; 663 else 664 mr1 |= MCFUART_MR1_PARITYSPACE; 665 } else { 666 if (cflag & PARODD) 667 mr1 |= MCFUART_MR1_PARITYODD; 668 else 669 mr1 |= MCFUART_MR1_PARITYEVEN; 670 } 671 } else { 672 mr1 |= MCFUART_MR1_PARITYNONE; 673 } 674 675 if (cflag & CSTOPB) 676 mr2 |= MCFUART_MR2_STOP2; 677 else 678 mr2 |= MCFUART_MR2_STOP1; 679 680 if (cflag & CRTSCTS) { 681 mr1 |= MCFUART_MR1_RXRTS; 682 mr2 |= MCFUART_MR2_TXCTS; 683 } 684 685 if (cflag & CLOCAL) 686 info->flags &= ~ASYNC_CHECK_CD; 687 else 688 info->flags |= ASYNC_CHECK_CD; 689 690 uartp = info->addr; 691 692 local_irq_save(flags); 693#if 0 694 printk("%s(%d): mr1=%x mr2=%x baudclk=%x\n", __FILE__, __LINE__, 695 mr1, mr2, baudclk); 696#endif 697 /* 698 Note: pg 12-16 of MCF5206e User's Manual states that a 699 software reset should be performed prior to changing 700 UMR1,2, UCSR, UACR, bit 7 701 */ 702 uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX; /* reset RX */ 703 uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETTX; /* reset TX */ 704 uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETMRPTR; /* reset MR pointer */ 705 uartp[MCFUART_UMR] = mr1; 706 uartp[MCFUART_UMR] = mr2; 707 uartp[MCFUART_UBG1] = (baudclk & 0xff00) >> 8; /* set msb byte */ 708 uartp[MCFUART_UBG2] = (baudclk & 0xff); /* set lsb byte */ 709#ifdef CONFIG_M5272 710 uartp[MCFUART_UFPD] = (fraction & 0xf); /* set fraction */ 711#endif 712 uartp[MCFUART_UCSR] = MCFUART_UCSR_RXCLKTIMER | MCFUART_UCSR_TXCLKTIMER; 713 uartp[MCFUART_UCR] = MCFUART_UCR_RXENABLE | MCFUART_UCR_TXENABLE; 714 mcfrs_setsignals(info, 1, -1); 715 local_irq_restore(flags); 716 return; 717} 718 719static void mcfrs_flush_chars(struct tty_struct *tty) 720{ 721 volatile unsigned char *uartp; 722 struct mcf_serial *info = (struct mcf_serial *)tty->driver_data; 723 unsigned long flags; 724 725 if (serial_paranoia_check(info, tty->name, "mcfrs_flush_chars")) 726 return; 727 728 uartp = (volatile unsigned char *) info->addr; 729 730 /* 731 * re-enable receiver interrupt 732 */ 733 local_irq_save(flags); 734 if ((!(info->imr & MCFUART_UIR_RXREADY)) && 735 (info->flags & ASYNC_INITIALIZED) ) { 736 info->imr |= MCFUART_UIR_RXREADY; 737 uartp[MCFUART_UIMR] = info->imr; 738 } 739 local_irq_restore(flags); 740 741 if (info->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped || 742 !info->xmit_buf) 743 return; 744 745 /* Enable transmitter */ 746 local_irq_save(flags); 747 info->imr |= MCFUART_UIR_TXREADY; 748 uartp[MCFUART_UIMR] = info->imr; 749 local_irq_restore(flags); 750} 751 752static int mcfrs_write(struct tty_struct * tty, 753 const unsigned char *buf, int count) 754{ 755 volatile unsigned char *uartp; 756 struct mcf_serial *info = (struct mcf_serial *)tty->driver_data; 757 unsigned long flags; 758 int c, total = 0; 759 760#if 0 761 printk("%s(%d): mcfrs_write(tty=%x,buf=%x,count=%d)\n", 762 __FILE__, __LINE__, (int)tty, (int)buf, count); 763#endif 764 765 if (serial_paranoia_check(info, tty->name, "mcfrs_write")) 766 return 0; 767 768 if (!tty || !info->xmit_buf) 769 return 0; 770 771 local_save_flags(flags); 772 while (1) { 773 local_irq_disable(); 774 c = min(count, (int) min(((int)SERIAL_XMIT_SIZE) - info->xmit_cnt - 1, 775 ((int)SERIAL_XMIT_SIZE) - info->xmit_head)); 776 local_irq_restore(flags); 777 778 if (c <= 0) 779 break; 780 781 memcpy(info->xmit_buf + info->xmit_head, buf, c); 782 783 local_irq_disable(); 784 info->xmit_head = (info->xmit_head + c) & (SERIAL_XMIT_SIZE-1); 785 info->xmit_cnt += c; 786 local_irq_restore(flags); 787 788 buf += c; 789 count -= c; 790 total += c; 791 } 792 793 local_irq_disable(); 794 uartp = info->addr; 795 info->imr |= MCFUART_UIR_TXREADY; 796 uartp[MCFUART_UIMR] = info->imr; 797 local_irq_restore(flags); 798 799 return total; 800} 801 802static int mcfrs_write_room(struct tty_struct *tty) 803{ 804 struct mcf_serial *info = (struct mcf_serial *)tty->driver_data; 805 int ret; 806 807 if (serial_paranoia_check(info, tty->name, "mcfrs_write_room")) 808 return 0; 809 ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1; 810 if (ret < 0) 811 ret = 0; 812 return ret; 813} 814 815static int mcfrs_chars_in_buffer(struct tty_struct *tty) 816{ 817 struct mcf_serial *info = (struct mcf_serial *)tty->driver_data; 818 819 if (serial_paranoia_check(info, tty->name, "mcfrs_chars_in_buffer")) 820 return 0; 821 return info->xmit_cnt; 822} 823 824static void mcfrs_flush_buffer(struct tty_struct *tty) 825{ 826 struct mcf_serial *info = (struct mcf_serial *)tty->driver_data; 827 unsigned long flags; 828 829 if (serial_paranoia_check(info, tty->name, "mcfrs_flush_buffer")) 830 return; 831 832 local_irq_save(flags); 833 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; 834 local_irq_restore(flags); 835 836 tty_wakeup(tty); 837} 838 839/* 840 * ------------------------------------------------------------ 841 * mcfrs_throttle() 842 * 843 * This routine is called by the upper-layer tty layer to signal that 844 * incoming characters should be throttled. 845 * ------------------------------------------------------------ 846 */ 847static void mcfrs_throttle(struct tty_struct * tty) 848{ 849 struct mcf_serial *info = (struct mcf_serial *)tty->driver_data; 850#ifdef SERIAL_DEBUG_THROTTLE 851 char buf[64]; 852 853 printk("throttle %s: %d....\n", _tty_name(tty, buf), 854 tty->ldisc.chars_in_buffer(tty)); 855#endif 856 857 if (serial_paranoia_check(info, tty->name, "mcfrs_throttle")) 858 return; 859 860 if (I_IXOFF(tty)) 861 info->x_char = STOP_CHAR(tty); 862 863 /* Turn off RTS line (do this atomic) */ 864} 865 866static void mcfrs_unthrottle(struct tty_struct * tty) 867{ 868 struct mcf_serial *info = (struct mcf_serial *)tty->driver_data; 869#ifdef SERIAL_DEBUG_THROTTLE 870 char buf[64]; 871 872 printk("unthrottle %s: %d....\n", _tty_name(tty, buf), 873 tty->ldisc.chars_in_buffer(tty)); 874#endif 875 876 if (serial_paranoia_check(info, tty->name, "mcfrs_unthrottle")) 877 return; 878 879 if (I_IXOFF(tty)) { 880 if (info->x_char) 881 info->x_char = 0; 882 else 883 info->x_char = START_CHAR(tty); 884 } 885 886 /* Assert RTS line (do this atomic) */ 887} 888 889/* 890 * ------------------------------------------------------------ 891 * mcfrs_ioctl() and friends 892 * ------------------------------------------------------------ 893 */ 894 895static int get_serial_info(struct mcf_serial * info, 896 struct serial_struct * retinfo) 897{ 898 struct serial_struct tmp; 899 900 if (!retinfo) 901 return -EFAULT; 902 memset(&tmp, 0, sizeof(tmp)); 903 tmp.type = info->type; 904 tmp.line = info->line; 905 tmp.port = (unsigned int) info->addr; 906 tmp.irq = info->irq; 907 tmp.flags = info->flags; 908 tmp.baud_base = info->baud_base; 909 tmp.close_delay = info->close_delay; 910 tmp.closing_wait = info->closing_wait; 911 tmp.custom_divisor = info->custom_divisor; 912 return copy_to_user(retinfo,&tmp,sizeof(*retinfo)) ? -EFAULT : 0; 913} 914 915static int set_serial_info(struct mcf_serial * info, 916 struct serial_struct * new_info) 917{ 918 struct serial_struct new_serial; 919 struct mcf_serial old_info; 920 int retval = 0; 921 922 if (!new_info) 923 return -EFAULT; 924 if (copy_from_user(&new_serial,new_info,sizeof(new_serial))) 925 return -EFAULT; 926 old_info = *info; 927 928 if (!capable(CAP_SYS_ADMIN)) { 929 if ((new_serial.baud_base != info->baud_base) || 930 (new_serial.type != info->type) || 931 (new_serial.close_delay != info->close_delay) || 932 ((new_serial.flags & ~ASYNC_USR_MASK) != 933 (info->flags & ~ASYNC_USR_MASK))) 934 return -EPERM; 935 info->flags = ((info->flags & ~ASYNC_USR_MASK) | 936 (new_serial.flags & ASYNC_USR_MASK)); 937 info->custom_divisor = new_serial.custom_divisor; 938 goto check_and_exit; 939 } 940 941 if (info->count > 1) 942 return -EBUSY; 943 944 /* 945 * OK, past this point, all the error checking has been done. 946 * At this point, we start making changes..... 947 */ 948 949 info->baud_base = new_serial.baud_base; 950 info->flags = ((info->flags & ~ASYNC_FLAGS) | 951 (new_serial.flags & ASYNC_FLAGS)); 952 info->type = new_serial.type; 953 info->close_delay = new_serial.close_delay; 954 info->closing_wait = new_serial.closing_wait; 955 956check_and_exit: 957 retval = startup(info); 958 return retval; 959} 960 961/* 962 * get_lsr_info - get line status register info 963 * 964 * Purpose: Let user call ioctl() to get info when the UART physically 965 * is emptied. On bus types like RS485, the transmitter must 966 * release the bus after transmitting. This must be done when 967 * the transmit shift register is empty, not be done when the 968 * transmit holding register is empty. This functionality 969 * allows an RS485 driver to be written in user space. 970 */ 971static int get_lsr_info(struct mcf_serial * info, unsigned int *value) 972{ 973 volatile unsigned char *uartp; 974 unsigned long flags; 975 unsigned char status; 976 977 local_irq_save(flags); 978 uartp = info->addr; 979 status = (uartp[MCFUART_USR] & MCFUART_USR_TXEMPTY) ? TIOCSER_TEMT : 0; 980 local_irq_restore(flags); 981 982 return put_user(status,value); 983} 984 985/* 986 * This routine sends a break character out the serial port. 987 */ 988static void send_break( struct mcf_serial * info, int duration) 989{ 990 volatile unsigned char *uartp; 991 unsigned long flags; 992 993 if (!info->addr) 994 return; 995 set_current_state(TASK_INTERRUPTIBLE); 996 uartp = info->addr; 997 998 local_irq_save(flags); 999 uartp[MCFUART_UCR] = MCFUART_UCR_CMDBREAKSTART; 1000 schedule_timeout(duration); 1001 uartp[MCFUART_UCR] = MCFUART_UCR_CMDBREAKSTOP; 1002 local_irq_restore(flags); 1003} 1004 1005static int mcfrs_tiocmget(struct tty_struct *tty, struct file *file) 1006{ 1007 struct mcf_serial * info = (struct mcf_serial *)tty->driver_data; 1008 1009 if (serial_paranoia_check(info, tty->name, "mcfrs_ioctl")) 1010 return -ENODEV; 1011 if (tty->flags & (1 << TTY_IO_ERROR)) 1012 return -EIO; 1013 1014 return mcfrs_getsignals(info); 1015} 1016 1017static int mcfrs_tiocmset(struct tty_struct *tty, struct file *file, 1018 unsigned int set, unsigned int clear) 1019{ 1020 struct mcf_serial * info = (struct mcf_serial *)tty->driver_data; 1021 int rts = -1, dtr = -1; 1022 1023 if (serial_paranoia_check(info, tty->name, "mcfrs_ioctl")) 1024 return -ENODEV; 1025 if (tty->flags & (1 << TTY_IO_ERROR)) 1026 return -EIO; 1027 1028 if (set & TIOCM_RTS) 1029 rts = 1; 1030 if (set & TIOCM_DTR) 1031 dtr = 1; 1032 if (clear & TIOCM_RTS) 1033 rts = 0; 1034 if (clear & TIOCM_DTR) 1035 dtr = 0; 1036 1037 mcfrs_setsignals(info, dtr, rts); 1038 1039 return 0; 1040} 1041 1042static int mcfrs_ioctl(struct tty_struct *tty, struct file * file, 1043 unsigned int cmd, unsigned long arg) 1044{ 1045 struct mcf_serial * info = (struct mcf_serial *)tty->driver_data; 1046 int retval, error; 1047 1048 if (serial_paranoia_check(info, tty->name, "mcfrs_ioctl")) 1049 return -ENODEV; 1050 1051 if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) && 1052 (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGWILD) && 1053 (cmd != TIOCSERSWILD) && (cmd != TIOCSERGSTRUCT)) { 1054 if (tty->flags & (1 << TTY_IO_ERROR)) 1055 return -EIO; 1056 } 1057 1058 switch (cmd) { 1059 case TCSBRK: /* SVID version: non-zero arg --> no break */ 1060 retval = tty_check_change(tty); 1061 if (retval) 1062 return retval; 1063 tty_wait_until_sent(tty, 0); 1064 if (!arg) 1065 send_break(info, HZ/4); /* 1/4 second */ 1066 return 0; 1067 case TCSBRKP: /* support for POSIX tcsendbreak() */ 1068 retval = tty_check_change(tty); 1069 if (retval) 1070 return retval; 1071 tty_wait_until_sent(tty, 0); 1072 send_break(info, arg ? arg*(HZ/10) : HZ/4); 1073 return 0; 1074 case TIOCGSOFTCAR: 1075 error = put_user(C_CLOCAL(tty) ? 1 : 0, 1076 (unsigned long *) arg); 1077 if (error) 1078 return error; 1079 return 0; 1080 case TIOCSSOFTCAR: 1081 get_user(arg, (unsigned long *) arg); 1082 tty->termios->c_cflag = 1083 ((tty->termios->c_cflag & ~CLOCAL) | 1084 (arg ? CLOCAL : 0)); 1085 return 0; 1086 case TIOCGSERIAL: 1087 if (access_ok(VERIFY_WRITE, (void *) arg, 1088 sizeof(struct serial_struct))) 1089 return get_serial_info(info, 1090 (struct serial_struct *) arg); 1091 return -EFAULT; 1092 case TIOCSSERIAL: 1093 return set_serial_info(info, 1094 (struct serial_struct *) arg); 1095 case TIOCSERGETLSR: /* Get line status register */ 1096 if (access_ok(VERIFY_WRITE, (void *) arg, 1097 sizeof(unsigned int))) 1098 return get_lsr_info(info, (unsigned int *) arg); 1099 return -EFAULT; 1100 case TIOCSERGSTRUCT: 1101 error = copy_to_user((struct mcf_serial *) arg, 1102 info, sizeof(struct mcf_serial)); 1103 if (error) 1104 return -EFAULT; 1105 return 0; 1106 1107#ifdef TIOCSET422 1108 case TIOCSET422: { 1109 unsigned int val; 1110 get_user(val, (unsigned int *) arg); 1111 mcf_setpa(MCFPP_PA11, (val ? 0 : MCFPP_PA11)); 1112 break; 1113 } 1114 case TIOCGET422: { 1115 unsigned int val; 1116 val = (mcf_getpa() & MCFPP_PA11) ? 0 : 1; 1117 put_user(val, (unsigned int *) arg); 1118 break; 1119 } 1120#endif 1121 1122 default: 1123 return -ENOIOCTLCMD; 1124 } 1125 return 0; 1126} 1127 1128static void mcfrs_set_termios(struct tty_struct *tty, struct termios *old_termios) 1129{ 1130 struct mcf_serial *info = (struct mcf_serial *)tty->driver_data; 1131 1132 if (tty->termios->c_cflag == old_termios->c_cflag) 1133 return; 1134 1135 mcfrs_change_speed(info); 1136 1137 if ((old_termios->c_cflag & CRTSCTS) && 1138 !(tty->termios->c_cflag & CRTSCTS)) { 1139 tty->hw_stopped = 0; 1140 mcfrs_setsignals(info, -1, 1); 1141#if 0 1142 mcfrs_start(tty); 1143#endif 1144 } 1145} 1146 1147/* 1148 * ------------------------------------------------------------ 1149 * mcfrs_close() 1150 * 1151 * This routine is called when the serial port gets closed. First, we 1152 * wait for the last remaining data to be sent. Then, we unlink its 1153 * S structure from the interrupt chain if necessary, and we free 1154 * that IRQ if nothing is left in the chain. 1155 * ------------------------------------------------------------ 1156 */ 1157static void mcfrs_close(struct tty_struct *tty, struct file * filp) 1158{ 1159 volatile unsigned char *uartp; 1160 struct mcf_serial *info = (struct mcf_serial *)tty->driver_data; 1161 unsigned long flags; 1162 1163 if (!info || serial_paranoia_check(info, tty->name, "mcfrs_close")) 1164 return; 1165 1166 local_irq_save(flags); 1167 1168 if (tty_hung_up_p(filp)) { 1169 local_irq_restore(flags); 1170 return; 1171 } 1172 1173#ifdef SERIAL_DEBUG_OPEN 1174 printk("mcfrs_close ttyS%d, count = %d\n", info->line, info->count); 1175#endif 1176 if ((tty->count == 1) && (info->count != 1)) { 1177 /* 1178 * Uh, oh. tty->count is 1, which means that the tty 1179 * structure will be freed. Info->count should always 1180 * be one in these conditions. If it's greater than 1181 * one, we've got real problems, since it means the 1182 * serial port won't be shutdown. 1183 */ 1184 printk("MCFRS: bad serial port count; tty->count is 1, " 1185 "info->count is %d\n", info->count); 1186 info->count = 1; 1187 } 1188 if (--info->count < 0) { 1189 printk("MCFRS: bad serial port count for ttyS%d: %d\n", 1190 info->line, info->count); 1191 info->count = 0; 1192 } 1193 if (info->count) { 1194 local_irq_restore(flags); 1195 return; 1196 } 1197 info->flags |= ASYNC_CLOSING; 1198 1199 /* 1200 * Now we wait for the transmit buffer to clear; and we notify 1201 * the line discipline to only process XON/XOFF characters. 1202 */ 1203 tty->closing = 1; 1204 if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE) 1205 tty_wait_until_sent(tty, info->closing_wait); 1206 1207 /* 1208 * At this point we stop accepting input. To do this, we 1209 * disable the receive line status interrupts, and tell the 1210 * interrupt driver to stop checking the data ready bit in the 1211 * line status register. 1212 */ 1213 info->imr &= ~MCFUART_UIR_RXREADY; 1214 uartp = info->addr; 1215 uartp[MCFUART_UIMR] = info->imr; 1216 1217#if 0 1218 /* FIXME: do we need to keep this enabled for console?? */ 1219 if (mcfrs_console_inited && (mcfrs_console_port == info->line)) { 1220 /* Do not disable the UART */ ; 1221 } else 1222#endif 1223 shutdown(info); 1224 if (tty->driver->flush_buffer) 1225 tty->driver->flush_buffer(tty); 1226 tty_ldisc_flush(tty); 1227 1228 tty->closing = 0; 1229 info->event = 0; 1230 info->tty = 0; 1231#if 0 1232 if (tty->ldisc.num != ldiscs[N_TTY].num) { 1233 if (tty->ldisc.close) 1234 (tty->ldisc.close)(tty); 1235 tty->ldisc = ldiscs[N_TTY]; 1236 tty->termios->c_line = N_TTY; 1237 if (tty->ldisc.open) 1238 (tty->ldisc.open)(tty); 1239 } 1240#endif 1241 if (info->blocked_open) { 1242 if (info->close_delay) { 1243 msleep_interruptible(jiffies_to_msecs(info->close_delay)); 1244 } 1245 wake_up_interruptible(&info->open_wait); 1246 } 1247 info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING); 1248 wake_up_interruptible(&info->close_wait); 1249 local_irq_restore(flags); 1250} 1251 1252/* 1253 * mcfrs_wait_until_sent() --- wait until the transmitter is empty 1254 */ 1255static void 1256mcfrs_wait_until_sent(struct tty_struct *tty, int timeout) 1257{ 1258#ifdef CONFIG_M5272 1259#define MCF5272_FIFO_SIZE 25 /* fifo size + shift reg */ 1260 1261 struct mcf_serial * info = (struct mcf_serial *)tty->driver_data; 1262 volatile unsigned char *uartp; 1263 unsigned long orig_jiffies, fifo_time, char_time, fifo_cnt; 1264 1265 if (serial_paranoia_check(info, tty->name, "mcfrs_wait_until_sent")) 1266 return; 1267 1268 orig_jiffies = jiffies; 1269 1270 /* 1271 * Set the check interval to be 1/5 of the approximate time 1272 * to send the entire fifo, and make it at least 1. The check 1273 * interval should also be less than the timeout. 1274 * 1275 * Note: we have to use pretty tight timings here to satisfy 1276 * the NIST-PCTS. 1277 */ 1278 fifo_time = (MCF5272_FIFO_SIZE * HZ * 10) / info->baud; 1279 char_time = fifo_time / 5; 1280 if (char_time == 0) 1281 char_time = 1; 1282 if (timeout && timeout < char_time) 1283 char_time = timeout; 1284 1285 /* 1286 * Clamp the timeout period at 2 * the time to empty the 1287 * fifo. Just to be safe, set the minimum at .5 seconds. 1288 */ 1289 fifo_time *= 2; 1290 if (fifo_time < (HZ/2)) 1291 fifo_time = HZ/2; 1292 if (!timeout || timeout > fifo_time) 1293 timeout = fifo_time; 1294 1295 /* 1296 * Account for the number of bytes in the UART 1297 * transmitter FIFO plus any byte being shifted out. 1298 */ 1299 uartp = (volatile unsigned char *) info->addr; 1300 for (;;) { 1301 fifo_cnt = (uartp[MCFUART_UTF] & MCFUART_UTF_TXB); 1302 if ((uartp[MCFUART_USR] & (MCFUART_USR_TXREADY| 1303 MCFUART_USR_TXEMPTY)) == 1304 MCFUART_USR_TXREADY) 1305 fifo_cnt++; 1306 if (fifo_cnt == 0) 1307 break; 1308 msleep_interruptible(jiffies_to_msecs(char_time)); 1309 if (signal_pending(current)) 1310 break; 1311 if (timeout && time_after(jiffies, orig_jiffies + timeout)) 1312 break; 1313 } 1314#else 1315 /* 1316 * For the other coldfire models, assume all data has been sent 1317 */ 1318#endif 1319} 1320 1321/* 1322 * mcfrs_hangup() --- called by tty_hangup() when a hangup is signaled. 1323 */ 1324void mcfrs_hangup(struct tty_struct *tty) 1325{ 1326 struct mcf_serial * info = (struct mcf_serial *)tty->driver_data; 1327 1328 if (serial_paranoia_check(info, tty->name, "mcfrs_hangup")) 1329 return; 1330 1331 mcfrs_flush_buffer(tty); 1332 shutdown(info); 1333 info->event = 0; 1334 info->count = 0; 1335 info->flags &= ~ASYNC_NORMAL_ACTIVE; 1336 info->tty = 0; 1337 wake_up_interruptible(&info->open_wait); 1338} 1339 1340/* 1341 * ------------------------------------------------------------ 1342 * mcfrs_open() and friends 1343 * ------------------------------------------------------------ 1344 */ 1345static int block_til_ready(struct tty_struct *tty, struct file * filp, 1346 struct mcf_serial *info) 1347{ 1348 DECLARE_WAITQUEUE(wait, current); 1349 int retval; 1350 int do_clocal = 0; 1351 1352 /* 1353 * If the device is in the middle of being closed, then block 1354 * until it's done, and then try again. 1355 */ 1356 if (info->flags & ASYNC_CLOSING) { 1357 interruptible_sleep_on(&info->close_wait); 1358#ifdef SERIAL_DO_RESTART 1359 if (info->flags & ASYNC_HUP_NOTIFY) 1360 return -EAGAIN; 1361 else 1362 return -ERESTARTSYS; 1363#else 1364 return -EAGAIN; 1365#endif 1366 } 1367 1368 /* 1369 * If non-blocking mode is set, or the port is not enabled, 1370 * then make the check up front and then exit. 1371 */ 1372 if ((filp->f_flags & O_NONBLOCK) || 1373 (tty->flags & (1 << TTY_IO_ERROR))) { 1374 info->flags |= ASYNC_NORMAL_ACTIVE; 1375 return 0; 1376 } 1377 1378 if (tty->termios->c_cflag & CLOCAL) 1379 do_clocal = 1; 1380 1381 /* 1382 * Block waiting for the carrier detect and the line to become 1383 * free (i.e., not in use by the callout). While we are in 1384 * this loop, info->count is dropped by one, so that 1385 * mcfrs_close() knows when to free things. We restore it upon 1386 * exit, either normal or abnormal. 1387 */ 1388 retval = 0; 1389 add_wait_queue(&info->open_wait, &wait); 1390#ifdef SERIAL_DEBUG_OPEN 1391 printk("block_til_ready before block: ttyS%d, count = %d\n", 1392 info->line, info->count); 1393#endif 1394 info->count--; 1395 info->blocked_open++; 1396 while (1) { 1397 local_irq_disable(); 1398 mcfrs_setsignals(info, 1, 1); 1399 local_irq_enable(); 1400 current->state = TASK_INTERRUPTIBLE; 1401 if (tty_hung_up_p(filp) || 1402 !(info->flags & ASYNC_INITIALIZED)) { 1403#ifdef SERIAL_DO_RESTART 1404 if (info->flags & ASYNC_HUP_NOTIFY) 1405 retval = -EAGAIN; 1406 else 1407 retval = -ERESTARTSYS; 1408#else 1409 retval = -EAGAIN; 1410#endif 1411 break; 1412 } 1413 if (!(info->flags & ASYNC_CLOSING) && 1414 (do_clocal || (mcfrs_getsignals(info) & TIOCM_CD))) 1415 break; 1416 if (signal_pending(current)) { 1417 retval = -ERESTARTSYS; 1418 break; 1419 } 1420#ifdef SERIAL_DEBUG_OPEN 1421 printk("block_til_ready blocking: ttyS%d, count = %d\n", 1422 info->line, info->count); 1423#endif 1424 schedule(); 1425 } 1426 current->state = TASK_RUNNING; 1427 remove_wait_queue(&info->open_wait, &wait); 1428 if (!tty_hung_up_p(filp)) 1429 info->count++; 1430 info->blocked_open--; 1431#ifdef SERIAL_DEBUG_OPEN 1432 printk("block_til_ready after blocking: ttyS%d, count = %d\n", 1433 info->line, info->count); 1434#endif 1435 if (retval) 1436 return retval; 1437 info->flags |= ASYNC_NORMAL_ACTIVE; 1438 return 0; 1439} 1440 1441/* 1442 * This routine is called whenever a serial port is opened. It 1443 * enables interrupts for a serial port, linking in its structure into 1444 * the IRQ chain. It also performs the serial-specific 1445 * initialization for the tty structure. 1446 */ 1447int mcfrs_open(struct tty_struct *tty, struct file * filp) 1448{ 1449 struct mcf_serial *info; 1450 int retval, line; 1451 1452 line = tty->index; 1453 if ((line < 0) || (line >= NR_PORTS)) 1454 return -ENODEV; 1455 info = mcfrs_table + line; 1456 if (serial_paranoia_check(info, tty->name, "mcfrs_open")) 1457 return -ENODEV; 1458#ifdef SERIAL_DEBUG_OPEN 1459 printk("mcfrs_open %s, count = %d\n", tty->name, info->count); 1460#endif 1461 info->count++; 1462 tty->driver_data = info; 1463 info->tty = tty; 1464 1465 /* 1466 * Start up serial port 1467 */ 1468 retval = startup(info); 1469 if (retval) 1470 return retval; 1471 1472 retval = block_til_ready(tty, filp, info); 1473 if (retval) { 1474#ifdef SERIAL_DEBUG_OPEN 1475 printk("mcfrs_open returning after block_til_ready with %d\n", 1476 retval); 1477#endif 1478 return retval; 1479 } 1480 1481#ifdef SERIAL_DEBUG_OPEN 1482 printk("mcfrs_open %s successful...\n", tty->name); 1483#endif 1484 return 0; 1485} 1486 1487/* 1488 * Based on the line number set up the internal interrupt stuff. 1489 */ 1490static void mcfrs_irqinit(struct mcf_serial *info) 1491{ 1492#if defined(CONFIG_M5272) 1493 volatile unsigned long *icrp; 1494 volatile unsigned long *portp; 1495 volatile unsigned char *uartp; 1496 1497 uartp = info->addr; 1498 icrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_ICR2); 1499 1500 switch (info->line) { 1501 case 0: 1502 *icrp = 0xe0000000; 1503 break; 1504 case 1: 1505 *icrp = 0x0e000000; 1506 break; 1507 default: 1508 printk("MCFRS: don't know how to handle UART %d interrupt?\n", 1509 info->line); 1510 return; 1511 } 1512 1513 /* Enable the output lines for the serial ports */ 1514 portp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_PBCNT); 1515 *portp = (*portp & ~0x000000ff) | 0x00000055; 1516 portp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_PDCNT); 1517 *portp = (*portp & ~0x000003fc) | 0x000002a8; 1518#elif defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) 1519 volatile unsigned char *icrp, *uartp; 1520 volatile unsigned long *imrp; 1521 1522 uartp = info->addr; 1523 1524 icrp = (volatile unsigned char *) (MCF_MBAR + MCFICM_INTC0 + 1525 MCFINTC_ICR0 + MCFINT_UART0 + info->line); 1526 *icrp = 0x33; /* UART0 with level 6, priority 3 */ 1527 1528 imrp = (volatile unsigned long *) (MCF_MBAR + MCFICM_INTC0 + 1529 MCFINTC_IMRL); 1530 *imrp &= ~((1 << (info->irq - MCFINT_VECBASE)) | 1); 1531#else 1532 volatile unsigned char *icrp, *uartp; 1533 1534 switch (info->line) { 1535 case 0: 1536 icrp = (volatile unsigned char *) (MCF_MBAR + MCFSIM_UART1ICR); 1537 *icrp = /*MCFSIM_ICR_AUTOVEC |*/ MCFSIM_ICR_LEVEL6 | 1538 MCFSIM_ICR_PRI1; 1539 mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_UART1); 1540 break; 1541 case 1: 1542 icrp = (volatile unsigned char *) (MCF_MBAR + MCFSIM_UART2ICR); 1543 *icrp = /*MCFSIM_ICR_AUTOVEC |*/ MCFSIM_ICR_LEVEL6 | 1544 MCFSIM_ICR_PRI2; 1545 mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_UART2); 1546 break; 1547 default: 1548 printk("MCFRS: don't know how to handle UART %d interrupt?\n", 1549 info->line); 1550 return; 1551 } 1552 1553 uartp = info->addr; 1554 uartp[MCFUART_UIVR] = info->irq; 1555#endif 1556 1557 /* Clear mask, so no surprise interrupts. */ 1558 uartp[MCFUART_UIMR] = 0; 1559 1560 if (request_irq(info->irq, mcfrs_interrupt, SA_INTERRUPT, 1561 "ColdFire UART", NULL)) { 1562 printk("MCFRS: Unable to attach ColdFire UART %d interrupt " 1563 "vector=%d\n", info->line, info->irq); 1564 } 1565 1566 return; 1567} 1568 1569 1570char *mcfrs_drivername = "ColdFire internal UART serial driver version 1.00\n"; 1571 1572 1573/* 1574 * Serial stats reporting... 1575 */ 1576int mcfrs_readproc(char *page, char **start, off_t off, int count, 1577 int *eof, void *data) 1578{ 1579 struct mcf_serial *info; 1580 char str[20]; 1581 int len, sigs, i; 1582 1583 len = sprintf(page, mcfrs_drivername); 1584 for (i = 0; (i < NR_PORTS); i++) { 1585 info = &mcfrs_table[i]; 1586 len += sprintf((page + len), "%d: port:%x irq=%d baud:%d ", 1587 i, (unsigned int) info->addr, info->irq, info->baud); 1588 if (info->stats.rx || info->stats.tx) 1589 len += sprintf((page + len), "tx:%d rx:%d ", 1590 info->stats.tx, info->stats.rx); 1591 if (info->stats.rxframing) 1592 len += sprintf((page + len), "fe:%d ", 1593 info->stats.rxframing); 1594 if (info->stats.rxparity) 1595 len += sprintf((page + len), "pe:%d ", 1596 info->stats.rxparity); 1597 if (info->stats.rxbreak) 1598 len += sprintf((page + len), "brk:%d ", 1599 info->stats.rxbreak); 1600 if (info->stats.rxoverrun) 1601 len += sprintf((page + len), "oe:%d ", 1602 info->stats.rxoverrun); 1603 1604 str[0] = str[1] = 0; 1605 if ((sigs = mcfrs_getsignals(info))) { 1606 if (sigs & TIOCM_RTS) 1607 strcat(str, "|RTS"); 1608 if (sigs & TIOCM_CTS) 1609 strcat(str, "|CTS"); 1610 if (sigs & TIOCM_DTR) 1611 strcat(str, "|DTR"); 1612 if (sigs & TIOCM_CD) 1613 strcat(str, "|CD"); 1614 } 1615 1616 len += sprintf((page + len), "%s\n", &str[1]); 1617 } 1618 1619 return(len); 1620} 1621 1622 1623/* Finally, routines used to initialize the serial driver. */ 1624 1625static void show_serial_version(void) 1626{ 1627 printk(mcfrs_drivername); 1628} 1629 1630static struct tty_operations mcfrs_ops = { 1631 .open = mcfrs_open, 1632 .close = mcfrs_close, 1633 .write = mcfrs_write, 1634 .flush_chars = mcfrs_flush_chars, 1635 .write_room = mcfrs_write_room, 1636 .chars_in_buffer = mcfrs_chars_in_buffer, 1637 .flush_buffer = mcfrs_flush_buffer, 1638 .ioctl = mcfrs_ioctl, 1639 .throttle = mcfrs_throttle, 1640 .unthrottle = mcfrs_unthrottle, 1641 .set_termios = mcfrs_set_termios, 1642 .stop = mcfrs_stop, 1643 .start = mcfrs_start, 1644 .hangup = mcfrs_hangup, 1645 .read_proc = mcfrs_readproc, 1646 .wait_until_sent = mcfrs_wait_until_sent, 1647 .tiocmget = mcfrs_tiocmget, 1648 .tiocmset = mcfrs_tiocmset, 1649}; 1650 1651/* mcfrs_init inits the driver */ 1652static int __init 1653mcfrs_init(void) 1654{ 1655 struct mcf_serial *info; 1656 unsigned long flags; 1657 int i; 1658 1659 /* Setup base handler, and timer table. */ 1660#ifdef MCFPP_DCD0 1661 init_timer(&mcfrs_timer_struct); 1662 mcfrs_timer_struct.function = mcfrs_timer; 1663 mcfrs_timer_struct.data = 0; 1664 mcfrs_timer_struct.expires = jiffies + HZ/25; 1665 add_timer(&mcfrs_timer_struct); 1666 mcfrs_ppstatus = mcf_getppdata() & (MCFPP_DCD0 | MCFPP_DCD1); 1667#endif 1668 mcfrs_serial_driver = alloc_tty_driver(NR_PORTS); 1669 if (!mcfrs_serial_driver) 1670 return -ENOMEM; 1671 1672 show_serial_version(); 1673 1674 /* Initialize the tty_driver structure */ 1675 mcfrs_serial_driver->owner = THIS_MODULE; 1676 mcfrs_serial_driver->name = "ttyS"; 1677 mcfrs_serial_driver->devfs_name = "ttys/"; 1678 mcfrs_serial_driver->driver_name = "serial"; 1679 mcfrs_serial_driver->major = TTY_MAJOR; 1680 mcfrs_serial_driver->minor_start = 64; 1681 mcfrs_serial_driver->type = TTY_DRIVER_TYPE_SERIAL; 1682 mcfrs_serial_driver->subtype = SERIAL_TYPE_NORMAL; 1683 mcfrs_serial_driver->init_termios = tty_std_termios; 1684 1685 mcfrs_serial_driver->init_termios.c_cflag = 1686 mcfrs_console_cbaud | CS8 | CREAD | HUPCL | CLOCAL; 1687 mcfrs_serial_driver->flags = TTY_DRIVER_REAL_RAW; 1688 1689 tty_set_operations(mcfrs_serial_driver, &mcfrs_ops); 1690 1691 if (tty_register_driver(mcfrs_serial_driver)) { 1692 printk("MCFRS: Couldn't register serial driver\n"); 1693 put_tty_driver(mcfrs_serial_driver); 1694 return(-EBUSY); 1695 } 1696 1697 local_irq_save(flags); 1698 1699 /* 1700 * Configure all the attached serial ports. 1701 */ 1702 for (i = 0, info = mcfrs_table; (i < NR_PORTS); i++, info++) { 1703 info->magic = SERIAL_MAGIC; 1704 info->line = i; 1705 info->tty = 0; 1706 info->custom_divisor = 16; 1707 info->close_delay = 50; 1708 info->closing_wait = 3000; 1709 info->x_char = 0; 1710 info->event = 0; 1711 info->count = 0; 1712 info->blocked_open = 0; 1713 INIT_WORK(&info->tqueue, mcfrs_offintr, info); 1714 INIT_WORK(&info->tqueue_hangup, do_serial_hangup, info); 1715 init_waitqueue_head(&info->open_wait); 1716 init_waitqueue_head(&info->close_wait); 1717 1718 info->imr = 0; 1719 mcfrs_setsignals(info, 0, 0); 1720 mcfrs_irqinit(info); 1721 1722 printk("ttyS%d at 0x%04x (irq = %d)", info->line, 1723 (unsigned int) info->addr, info->irq); 1724 printk(" is a builtin ColdFire UART\n"); 1725 } 1726 1727 local_irq_restore(flags); 1728 return 0; 1729} 1730 1731module_init(mcfrs_init); 1732 1733/****************************************************************************/ 1734/* Serial Console */ 1735/****************************************************************************/ 1736 1737/* 1738 * Quick and dirty UART initialization, for console output. 1739 */ 1740 1741void mcfrs_init_console(void) 1742{ 1743 volatile unsigned char *uartp; 1744 unsigned int clk; 1745 1746 /* 1747 * Reset UART, get it into known state... 1748 */ 1749 uartp = (volatile unsigned char *) (MCF_MBAR + 1750 (mcfrs_console_port ? MCFUART_BASE2 : MCFUART_BASE1)); 1751 1752 uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX; /* reset RX */ 1753 uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETTX; /* reset TX */ 1754 uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETMRPTR; /* reset MR pointer */ 1755 1756 /* 1757 * Set port for defined baud , 8 data bits, 1 stop bit, no parity. 1758 */ 1759 uartp[MCFUART_UMR] = MCFUART_MR1_PARITYNONE | MCFUART_MR1_CS8; 1760 uartp[MCFUART_UMR] = MCFUART_MR2_STOP1; 1761 1762 clk = ((MCF_BUSCLK / mcfrs_console_baud) + 16) / 32; /* set baud */ 1763 uartp[MCFUART_UBG1] = (clk & 0xff00) >> 8; /* set msb baud */ 1764 uartp[MCFUART_UBG2] = (clk & 0xff); /* set lsb baud */ 1765 1766 uartp[MCFUART_UCSR] = MCFUART_UCSR_RXCLKTIMER | MCFUART_UCSR_TXCLKTIMER; 1767 uartp[MCFUART_UCR] = MCFUART_UCR_RXENABLE | MCFUART_UCR_TXENABLE; 1768 1769 mcfrs_console_inited++; 1770 return; 1771} 1772 1773 1774/* 1775 * Setup for console. Argument comes from the boot command line. 1776 */ 1777 1778int mcfrs_console_setup(struct console *cp, char *arg) 1779{ 1780 int i, n = CONSOLE_BAUD_RATE; 1781 1782 if (!cp) 1783 return(-1); 1784 1785 if (!strncmp(cp->name, "ttyS", 4)) 1786 mcfrs_console_port = cp->index; 1787 else if (!strncmp(cp->name, "cua", 3)) 1788 mcfrs_console_port = cp->index; 1789 else 1790 return(-1); 1791 1792 if (arg) 1793 n = simple_strtoul(arg,NULL,0); 1794 for (i = 0; i < MCFRS_BAUD_TABLE_SIZE; i++) 1795 if (mcfrs_baud_table[i] == n) 1796 break; 1797 if (i < MCFRS_BAUD_TABLE_SIZE) { 1798 mcfrs_console_baud = n; 1799 mcfrs_console_cbaud = 0; 1800 if (i > 15) { 1801 mcfrs_console_cbaud |= CBAUDEX; 1802 i -= 15; 1803 } 1804 mcfrs_console_cbaud |= i; 1805 } 1806 mcfrs_init_console(); /* make sure baud rate changes */ 1807 return(0); 1808} 1809 1810 1811static struct tty_driver *mcfrs_console_device(struct console *c, int *index) 1812{ 1813 *index = c->index; 1814 return mcfrs_serial_driver; 1815} 1816 1817 1818/* 1819 * Output a single character, using UART polled mode. 1820 * This is used for console output. 1821 */ 1822 1823void mcfrs_put_char(char ch) 1824{ 1825 volatile unsigned char *uartp; 1826 unsigned long flags; 1827 int i; 1828 1829 uartp = (volatile unsigned char *) (MCF_MBAR + 1830 (mcfrs_console_port ? MCFUART_BASE2 : MCFUART_BASE1)); 1831 1832 local_irq_save(flags); 1833 for (i = 0; (i < 0x10000); i++) { 1834 if (uartp[MCFUART_USR] & MCFUART_USR_TXREADY) 1835 break; 1836 } 1837 if (i < 0x10000) { 1838 uartp[MCFUART_UTB] = ch; 1839 for (i = 0; (i < 0x10000); i++) 1840 if (uartp[MCFUART_USR] & MCFUART_USR_TXEMPTY) 1841 break; 1842 } 1843 if (i >= 0x10000) 1844 mcfrs_init_console(); /* try and get it back */ 1845 local_irq_restore(flags); 1846 1847 return; 1848} 1849 1850 1851/* 1852 * rs_console_write is registered for printk output. 1853 */ 1854 1855void mcfrs_console_write(struct console *cp, const char *p, unsigned len) 1856{ 1857 if (!mcfrs_console_inited) 1858 mcfrs_init_console(); 1859 while (len-- > 0) { 1860 if (*p == '\n') 1861 mcfrs_put_char('\r'); 1862 mcfrs_put_char(*p++); 1863 } 1864} 1865 1866/* 1867 * declare our consoles 1868 */ 1869 1870struct console mcfrs_console = { 1871 .name = "ttyS", 1872 .write = mcfrs_console_write, 1873 .device = mcfrs_console_device, 1874 .setup = mcfrs_console_setup, 1875 .flags = CON_PRINTBUFFER, 1876 .index = -1, 1877}; 1878 1879static int __init mcfrs_console_init(void) 1880{ 1881 register_console(&mcfrs_console); 1882 return 0; 1883} 1884 1885console_initcall(mcfrs_console_init); 1886 1887/****************************************************************************/