1 /* 68328serial.c: Serial port driver for 68328 microcontroller
 
   3  * Copyright (C) 1995       David S. Miller    <davem@caip.rutgers.edu>
 
   4  * Copyright (C) 1998       Kenneth Albanowski <kjahds@kjahds.com>
 
   5  * Copyright (C) 1998, 1999 D. Jeff Dionne     <jeff@uclinux.org>
 
   6  * Copyright (C) 1999       Vladimir Gurevich  <vgurevic@cisco.com>
 
   7  * Copyright (C) 2002-2003  David McCullough   <davidm@snapgear.com>
 
   8  * Copyright (C) 2002       Greg Ungerer       <gerg@snapgear.com>
 
  10  * VZ Support/Fixes             Evan Stawnyczy <e@lineo.ca>
 
  11  * Multiple UART support        Daniel Potts <danielp@cse.unsw.edu.au>
 
  12  * Power management support     Daniel Potts <danielp@cse.unsw.edu.au>
 
  13  * VZ Second Serial Port enable Phil Wilshire
 
  14  * 2.4/2.5 port                 David McCullough
 
  18 #include <linux/module.h>
 
  19 #include <linux/errno.h>
 
  20 #include <linux/signal.h>
 
  21 #include <linux/sched.h>
 
  22 #include <linux/timer.h>
 
  23 #include <linux/interrupt.h>
 
  24 #include <linux/tty.h>
 
  25 #include <linux/tty_flip.h>
 
  26 #include <linux/major.h>
 
  27 #include <linux/string.h>
 
  28 #include <linux/fcntl.h>
 
  30 #include <linux/kernel.h>
 
  31 #include <linux/console.h>
 
  32 #include <linux/reboot.h>
 
  33 #include <linux/keyboard.h>
 
  34 #include <linux/init.h>
 
  36 #include <linux/bitops.h>
 
  37 #include <linux/delay.h>
 
  41 #include <asm/system.h>
 
  42 #include <asm/delay.h>
 
  43 #include <asm/uaccess.h>
 
  46 /* note: perhaps we can murge these files, so that you can just
 
  47  *       define 1 of them, and they can sort that out for themselves
 
  49 #if defined(CONFIG_M68EZ328)
 
  50 #include <asm/MC68EZ328.h>
 
  52 #if defined(CONFIG_M68VZ328)
 
  53 #include <asm/MC68VZ328.h>
 
  55 #include <asm/MC68328.h>
 
  56 #endif /* CONFIG_M68VZ328 */
 
  57 #endif /* CONFIG_M68EZ328 */
 
  59 #include "68328serial.h"
 
  61 /* Turn off usage of real serial interrupt code, to "support" Copilot */
 
  62 #ifdef CONFIG_XCOPILOT_BUGS
 
  68 static struct m68k_serial m68k_soft[NR_PORTS];
 
  70 static unsigned int uart_irqs[NR_PORTS] = UART_IRQ_DEFNS;
 
  72 /* multiple ports are contiguous in memory */
 
  73 m68328_uart *uart_addr = (m68328_uart *)USTCNT_ADDR;
 
  75 struct tty_struct m68k_ttys;
 
  76 struct m68k_serial *m68k_consinfo = 0;
 
  78 #define M68K_CLOCK (16667000) /* FIXME: 16MHz is likely wrong */
 
  81 extern wait_queue_head_t keypress_wait; 
 
  84 struct tty_driver *serial_driver;
 
  86 /* number of characters left in xmit buffer before we ask for more */
 
  87 #define WAKEUP_CHARS 256
 
  89 /* Debugging... DEBUG_INTR is bad to use when one of the zs
 
  90  * lines is your console ;(
 
  92 #undef SERIAL_DEBUG_INTR
 
  93 #undef SERIAL_DEBUG_OPEN
 
  94 #undef SERIAL_DEBUG_FLOW
 
  96 #define RS_ISR_PASS_LIMIT 256
 
  98 static void change_speed(struct m68k_serial *info);
 
 101  *      Setup for console. Argument comes from the boot command line.
 
 104 #if defined(CONFIG_M68EZ328ADS) || defined(CONFIG_ALMA_ANS) || defined(CONFIG_DRAGONIXVZ)
 
 105 #define CONSOLE_BAUD_RATE       115200
 
 106 #define DEFAULT_CBAUD           B115200
 
 109         /* note: this is messy, but it works, again, perhaps defined somewhere else?*/
 
 110         #ifdef CONFIG_M68VZ328
 
 111         #define CONSOLE_BAUD_RATE       19200
 
 112         #define DEFAULT_CBAUD           B19200
 
 117 #ifndef CONSOLE_BAUD_RATE
 
 118 #define CONSOLE_BAUD_RATE       9600
 
 119 #define DEFAULT_CBAUD           B9600
 
 123 static int m68328_console_initted = 0;
 
 124 static int m68328_console_baud    = CONSOLE_BAUD_RATE;
 
 125 static int m68328_console_cbaud   = DEFAULT_CBAUD;
 
 128 static inline int serial_paranoia_check(struct m68k_serial *info,
 
 129                                         char *name, const char *routine)
 
 131 #ifdef SERIAL_PARANOIA_CHECK
 
 132         static const char *badmagic =
 
 133                 "Warning: bad magic number for serial struct %s in %s\n";
 
 134         static const char *badinfo =
 
 135                 "Warning: null m68k_serial for %s in %s\n";
 
 138                 printk(badinfo, name, routine);
 
 141         if (info->magic != SERIAL_MAGIC) {
 
 142                 printk(badmagic, name, routine);
 
 150  * This is used to figure out the divisor speeds and the timeouts
 
 152 static int baud_table[] = {
 
 153         0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
 
 154         9600, 19200, 38400, 57600, 115200, 0 };
 
 156 #define BAUD_TABLE_SIZE (sizeof(baud_table)/sizeof(baud_table[0]))
 
 158 /* Sets or clears DTR/RTS on the requested line */
 
 159 static inline void m68k_rtsdtr(struct m68k_serial *ss, int set)
 
 162                 /* set the RTS/CTS line */
 
 169 /* Utility routines */
 
 170 static inline int get_baud(struct m68k_serial *ss)
 
 172         unsigned long result = 115200;
 
 173         unsigned short int baud = uart_addr[ss->line].ubaud;
 
 174         if (GET_FIELD(baud, UBAUD_PRESCALER) == 0x38) result = 38400;
 
 175         result >>= GET_FIELD(baud, UBAUD_DIVIDE);
 
 181  * ------------------------------------------------------------
 
 182  * rs_stop() and rs_start()
 
 184  * This routines are called before setting or resetting tty->stopped.
 
 185  * They enable or disable transmitter interrupts, as necessary.
 
 186  * ------------------------------------------------------------
 
 188 static void rs_stop(struct tty_struct *tty)
 
 190         struct m68k_serial *info = (struct m68k_serial *)tty->driver_data;
 
 191         m68328_uart *uart = &uart_addr[info->line];
 
 194         if (serial_paranoia_check(info, tty->name, "rs_stop"))
 
 197         local_irq_save(flags);
 
 198         uart->ustcnt &= ~USTCNT_TXEN;
 
 199         local_irq_restore(flags);
 
 202 static int rs_put_char(char ch)
 
 204         int flags, loops = 0;
 
 206         local_irq_save(flags);
 
 208         while (!(UTX & UTX_TX_AVAIL) && (loops < 1000)) {
 
 215         local_irq_restore(flags);
 
 219 static void rs_start(struct tty_struct *tty)
 
 221         struct m68k_serial *info = (struct m68k_serial *)tty->driver_data;
 
 222         m68328_uart *uart = &uart_addr[info->line];
 
 225         if (serial_paranoia_check(info, tty->name, "rs_start"))
 
 228         local_irq_save(flags);
 
 229         if (info->xmit_cnt && info->xmit_buf && !(uart->ustcnt & USTCNT_TXEN)) {
 
 231                 uart->ustcnt |= USTCNT_TXEN | USTCNT_TX_INTR_MASK;
 
 233                 uart->ustcnt |= USTCNT_TXEN;
 
 236         local_irq_restore(flags);
 
 239 /* Drop into either the boot monitor or kadb upon receiving a break
 
 240  * from keyboard/console input.
 
 242 static void batten_down_hatches(void)
 
 244         /* Drop into the debugger */
 
 247 static void status_handle(struct m68k_serial *info, unsigned short status)
 
 251                 if((info->port.tty->termios->c_cflag & CRTSCTS) &&
 
 252                    ((info->curregs[3] & AUTO_ENAB)==0)) {
 
 253                         info->curregs[3] |= AUTO_ENAB;
 
 254                         info->pendregs[3] |= AUTO_ENAB;
 
 255                         write_zsreg(info->m68k_channel, 3, info->curregs[3]);
 
 258                 if((info->curregs[3] & AUTO_ENAB)) {
 
 259                         info->curregs[3] &= ~AUTO_ENAB;
 
 260                         info->pendregs[3] &= ~AUTO_ENAB;
 
 261                         write_zsreg(info->m68k_channel, 3, info->curregs[3]);
 
 265         /* If this is console input and this is a
 
 266          * 'break asserted' status change interrupt
 
 267          * see if we can drop into the debugger
 
 269         if((status & URX_BREAK) && info->break_abort)
 
 270                 batten_down_hatches();
 
 274 static void receive_chars(struct m68k_serial *info, unsigned short rx)
 
 276         struct tty_struct *tty = info->port.tty;
 
 277         m68328_uart *uart = &uart_addr[info->line];
 
 278         unsigned char ch, flag;
 
 281          * This do { } while() loop will get ALL chars out of Rx FIFO 
 
 283 #ifndef CONFIG_XCOPILOT_BUGS
 
 286                 ch = GET_FIELD(rx, URX_RXDATA);
 
 289                         if(URX_BREAK & rx) { /* whee, break received */
 
 290                                 status_handle(info, rx);
 
 292 #ifdef CONFIG_MAGIC_SYSRQ
 
 293                         } else if (ch == 0x10) { /* ^P */
 
 297 /*                              show_net_buffers(); */
 
 299                         } else if (ch == 0x12) { /* ^R */
 
 302 #endif /* CONFIG_MAGIC_SYSRQ */
 
 304                         /* It is a 'keyboard interrupt' ;-) */
 
 305 #ifdef CONFIG_CONSOLE
 
 306                         wake_up(&keypress_wait);
 
 315                 if(rx & URX_PARITY_ERROR) {
 
 317                         status_handle(info, rx);
 
 318                 } else if(rx & URX_OVRUN) {
 
 320                         status_handle(info, rx);
 
 321                 } else if(rx & URX_FRAME_ERROR) {
 
 323                         status_handle(info, rx);
 
 325                 tty_insert_flip_char(tty, ch, flag);
 
 326 #ifndef CONFIG_XCOPILOT_BUGS
 
 327         } while((rx = uart->urx.w) & URX_DATA_READY);
 
 330         tty_schedule_flip(tty);
 
 336 static void transmit_chars(struct m68k_serial *info)
 
 338         m68328_uart *uart = &uart_addr[info->line];
 
 342                 uart->utx.b.txdata = info->x_char;
 
 344                 goto clear_and_return;
 
 347         if((info->xmit_cnt <= 0) || info->port.tty->stopped) {
 
 348                 /* That's peculiar... TX ints off */
 
 349                 uart->ustcnt &= ~USTCNT_TX_INTR_MASK;
 
 350                 goto clear_and_return;
 
 354         uart->utx.b.txdata = info->xmit_buf[info->xmit_tail++];
 
 355         info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1);
 
 358         if (info->xmit_cnt < WAKEUP_CHARS)
 
 359                 schedule_work(&info->tqueue);
 
 361         if(info->xmit_cnt <= 0) {
 
 362                 /* All done for now... TX ints off */
 
 363                 uart->ustcnt &= ~USTCNT_TX_INTR_MASK;
 
 364                 goto clear_and_return;
 
 368         /* Clear interrupt (should be auto)*/
 
 373  * This is the serial driver's generic interrupt routine
 
 375 irqreturn_t rs_interrupt(int irq, void *dev_id)
 
 377         struct m68k_serial *info = dev_id;
 
 382         uart = &uart_addr[info->line];
 
 388         if (rx & URX_DATA_READY) receive_chars(info, rx);
 
 389         if (tx & UTX_TX_AVAIL)   transmit_chars(info);
 
 391         receive_chars(info, rx);                
 
 396 static void do_softint(struct work_struct *work)
 
 398         struct m68k_serial      *info = container_of(work, struct m68k_serial, tqueue);
 
 399         struct tty_struct       *tty;
 
 401         tty = info->port.tty;
 
 405         if (clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) {
 
 412  * This routine is called from the scheduler tqueue when the interrupt
 
 413  * routine has signalled that a hangup has occurred.  The path of
 
 414  * hangup processing is:
 
 416  *      serial interrupt routine -> (scheduler tqueue) ->
 
 417  *      do_serial_hangup() -> tty->hangup() -> rs_hangup()
 
 420 static void do_serial_hangup(struct work_struct *work)
 
 422         struct m68k_serial      *info = container_of(work, struct m68k_serial, tqueue_hangup);
 
 423         struct tty_struct       *tty;
 
 425         tty = info->port.tty;
 
 433 static int startup(struct m68k_serial * info)
 
 435         m68328_uart *uart = &uart_addr[info->line];
 
 438         if (info->flags & S_INITIALIZED)
 
 441         if (!info->xmit_buf) {
 
 442                 info->xmit_buf = (unsigned char *) __get_free_page(GFP_KERNEL);
 
 447         local_irq_save(flags);
 
 450          * Clear the FIFO buffers and disable them
 
 451          * (they will be reenabled in change_speed())
 
 454         uart->ustcnt = USTCNT_UEN;
 
 455         info->xmit_fifo_size = 1;
 
 456         uart->ustcnt = USTCNT_UEN | USTCNT_RXEN | USTCNT_TXEN;
 
 460          * Finally, enable sequencing and interrupts
 
 463         uart->ustcnt = USTCNT_UEN | USTCNT_RXEN | 
 
 464                  USTCNT_RX_INTR_MASK | USTCNT_TX_INTR_MASK;
 
 466         uart->ustcnt = USTCNT_UEN | USTCNT_RXEN | USTCNT_RX_INTR_MASK;
 
 470                 clear_bit(TTY_IO_ERROR, &info->port.tty->flags);
 
 471         info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
 
 474          * and set the speed of the serial port
 
 479         info->flags |= S_INITIALIZED;
 
 480         local_irq_restore(flags);
 
 485  * This routine will shutdown a serial port; interrupts are disabled, and
 
 486  * DTR is dropped if the hangup on close termio flag is on.
 
 488 static void shutdown(struct m68k_serial * info)
 
 490         m68328_uart *uart = &uart_addr[info->line];
 
 493         uart->ustcnt = 0; /* All off! */
 
 494         if (!(info->flags & S_INITIALIZED))
 
 497         local_irq_save(flags);
 
 499         if (info->xmit_buf) {
 
 500                 free_page((unsigned long) info->xmit_buf);
 
 505                 set_bit(TTY_IO_ERROR, &info->port.tty->flags);
 
 507         info->flags &= ~S_INITIALIZED;
 
 508         local_irq_restore(flags);
 
 512         int divisor, prescale;
 
 514 #ifndef CONFIG_M68VZ328
 
 515  hw_baud_table[18] = {
 
 530         {1,0x26}, /* 19200 */
 
 531         {0,0x26}, /* 38400 */
 
 532         {1,0x38}, /* 57600 */
 
 533         {0,0x38}, /* 115200 */
 
 536  hw_baud_table[18] = {
 
 551                  {2,0x26}, /* 19200 */
 
 552                  {1,0x26}, /* 38400 */
 
 553                  {0,0x26}, /* 57600 */
 
 554                  {1,0x38}, /* 115200 */
 
 557 /* rate = 1036800 / ((65 - prescale) * (1<<divider)) */
 
 560  * This routine is called to set the UART divisor registers to match
 
 561  * the specified baud rate for a serial port.
 
 563 static void change_speed(struct m68k_serial *info)
 
 565         m68328_uart *uart = &uart_addr[info->line];
 
 567         unsigned short ustcnt;
 
 571         if (!info->port.tty || !info->port.tty->termios)
 
 573         cflag = info->port.tty->termios->c_cflag;
 
 574         if (!(port = info->port))
 
 577         ustcnt = uart->ustcnt;
 
 578         uart->ustcnt = ustcnt & ~USTCNT_TXEN;
 
 582                 i = (i & ~CBAUDEX) + B38400;
 
 585         info->baud = baud_table[i];
 
 586         uart->ubaud = PUT_FIELD(UBAUD_DIVIDE,    hw_baud_table[i].divisor) | 
 
 587                 PUT_FIELD(UBAUD_PRESCALER, hw_baud_table[i].prescale);
 
 589         ustcnt &= ~(USTCNT_PARITYEN | USTCNT_ODD_EVEN | USTCNT_STOP | USTCNT_8_7);
 
 591         if ((cflag & CSIZE) == CS8)
 
 592                 ustcnt |= USTCNT_8_7;
 
 595                 ustcnt |= USTCNT_STOP;
 
 598                 ustcnt |= USTCNT_PARITYEN;
 
 600                 ustcnt |= USTCNT_ODD_EVEN;
 
 602 #ifdef CONFIG_SERIAL_68328_RTS_CTS
 
 603         if (cflag & CRTSCTS) {
 
 604                 uart->utx.w &= ~ UTX_NOCTS;
 
 606                 uart->utx.w |= UTX_NOCTS;
 
 610         ustcnt |= USTCNT_TXEN;
 
 612         uart->ustcnt = ustcnt;
 
 617  * Fair output driver allows a process to speak.
 
 619 static void rs_fair_output(void)
 
 621         int left;               /* Output no more than that */
 
 623         struct m68k_serial *info = &m68k_soft[0];
 
 626         if (info == 0) return;
 
 627         if (info->xmit_buf == 0) return;
 
 629         local_irq_save(flags);
 
 630         left = info->xmit_cnt;
 
 632                 c = info->xmit_buf[info->xmit_tail];
 
 633                 info->xmit_tail = (info->xmit_tail+1) & (SERIAL_XMIT_SIZE-1);
 
 635                 local_irq_restore(flags);
 
 639                 local_irq_save(flags);
 
 640                 left = min(info->xmit_cnt, left-1);
 
 643         /* Last character is being transmitted now (hopefully). */
 
 646         local_irq_restore(flags);
 
 651  * m68k_console_print is registered for printk.
 
 653 void console_print_68328(const char *p)
 
 657         while((c=*(p++)) != 0) {
 
 663         /* Comment this if you want to have a strict interrupt-driven output */
 
 669 static void rs_set_ldisc(struct tty_struct *tty)
 
 671         struct m68k_serial *info = (struct m68k_serial *)tty->driver_data;
 
 673         if (serial_paranoia_check(info, tty->name, "rs_set_ldisc"))
 
 676         info->is_cons = (tty->termios->c_line == N_TTY);
 
 678         printk("ttyS%d console mode %s\n", info->line, info->is_cons ? "on" : "off");
 
 681 static void rs_flush_chars(struct tty_struct *tty)
 
 683         struct m68k_serial *info = (struct m68k_serial *)tty->driver_data;
 
 684         m68328_uart *uart = &uart_addr[info->line];
 
 687         if (serial_paranoia_check(info, tty->name, "rs_flush_chars"))
 
 693         /* Enable transmitter */
 
 694         local_irq_save(flags);
 
 696         if (info->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped ||
 
 698                 local_irq_restore(flags);
 
 703         uart->ustcnt |= USTCNT_TXEN | USTCNT_TX_INTR_MASK;
 
 705         uart->ustcnt |= USTCNT_TXEN;
 
 709         if (uart->utx.w & UTX_TX_AVAIL) {
 
 714                 uart->utx.b.txdata = info->xmit_buf[info->xmit_tail++];
 
 715                 info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1);
 
 720         while (!(uart->utx.w & UTX_TX_AVAIL)) udelay(5);
 
 723         local_irq_restore(flags);
 
 726 extern void console_printn(const char * b, int count);
 
 728 static int rs_write(struct tty_struct * tty,
 
 729                     const unsigned char *buf, int count)
 
 732         struct m68k_serial *info = (struct m68k_serial *)tty->driver_data;
 
 733         m68328_uart *uart = &uart_addr[info->line];
 
 736         if (serial_paranoia_check(info, tty->name, "rs_write"))
 
 739         if (!tty || !info->xmit_buf)
 
 742         local_save_flags(flags);
 
 745                 c = min_t(int, count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
 
 746                                    SERIAL_XMIT_SIZE - info->xmit_head));
 
 747                 local_irq_restore(flags);
 
 752                 memcpy(info->xmit_buf + info->xmit_head, buf, c);
 
 755                 info->xmit_head = (info->xmit_head + c) & (SERIAL_XMIT_SIZE-1);
 
 757                 local_irq_restore(flags);
 
 763         if (info->xmit_cnt && !tty->stopped && !tty->hw_stopped) {
 
 764                 /* Enable transmitter */
 
 767                 while(info->xmit_cnt) {
 
 770                 uart->ustcnt |= USTCNT_TXEN;
 
 772                 uart->ustcnt |= USTCNT_TX_INTR_MASK;
 
 774                 while (!(uart->utx.w & UTX_TX_AVAIL)) udelay(5);
 
 776                 if (uart->utx.w & UTX_TX_AVAIL) {
 
 777                         uart->utx.b.txdata = info->xmit_buf[info->xmit_tail++];
 
 778                         info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1);
 
 785                 local_irq_restore(flags);
 
 791 static int rs_write_room(struct tty_struct *tty)
 
 793         struct m68k_serial *info = (struct m68k_serial *)tty->driver_data;
 
 796         if (serial_paranoia_check(info, tty->name, "rs_write_room"))
 
 798         ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1;
 
 804 static int rs_chars_in_buffer(struct tty_struct *tty)
 
 806         struct m68k_serial *info = (struct m68k_serial *)tty->driver_data;
 
 808         if (serial_paranoia_check(info, tty->name, "rs_chars_in_buffer"))
 
 810         return info->xmit_cnt;
 
 813 static void rs_flush_buffer(struct tty_struct *tty)
 
 815         struct m68k_serial *info = (struct m68k_serial *)tty->driver_data;
 
 818         if (serial_paranoia_check(info, tty->name, "rs_flush_buffer"))
 
 820         local_irq_save(flags);
 
 821         info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
 
 822         local_irq_restore(flags);
 
 827  * ------------------------------------------------------------
 
 830  * This routine is called by the upper-layer tty layer to signal that
 
 831  * incoming characters should be throttled.
 
 832  * ------------------------------------------------------------
 
 834 static void rs_throttle(struct tty_struct * tty)
 
 836         struct m68k_serial *info = (struct m68k_serial *)tty->driver_data;
 
 838         if (serial_paranoia_check(info, tty->name, "rs_throttle"))
 
 842                 info->x_char = STOP_CHAR(tty);
 
 844         /* Turn off RTS line (do this atomic) */
 
 847 static void rs_unthrottle(struct tty_struct * tty)
 
 849         struct m68k_serial *info = (struct m68k_serial *)tty->driver_data;
 
 851         if (serial_paranoia_check(info, tty->name, "rs_unthrottle"))
 
 858                         info->x_char = START_CHAR(tty);
 
 861         /* Assert RTS line (do this atomic) */
 
 865  * ------------------------------------------------------------
 
 866  * rs_ioctl() and friends
 
 867  * ------------------------------------------------------------
 
 870 static int get_serial_info(struct m68k_serial * info,
 
 871                            struct serial_struct * retinfo)
 
 873         struct serial_struct tmp;
 
 877         memset(&tmp, 0, sizeof(tmp));
 
 878         tmp.type = info->type;
 
 879         tmp.line = info->line;
 
 880         tmp.port = info->port;
 
 882         tmp.flags = info->flags;
 
 883         tmp.baud_base = info->baud_base;
 
 884         tmp.close_delay = info->close_delay;
 
 885         tmp.closing_wait = info->closing_wait;
 
 886         tmp.custom_divisor = info->custom_divisor;
 
 887         copy_to_user(retinfo,&tmp,sizeof(*retinfo));
 
 891 static int set_serial_info(struct m68k_serial * info,
 
 892                            struct serial_struct * new_info)
 
 894         struct serial_struct new_serial;
 
 895         struct m68k_serial old_info;
 
 900         copy_from_user(&new_serial,new_info,sizeof(new_serial));
 
 903         if (!capable(CAP_SYS_ADMIN)) {
 
 904                 if ((new_serial.baud_base != info->baud_base) ||
 
 905                     (new_serial.type != info->type) ||
 
 906                     (new_serial.close_delay != info->close_delay) ||
 
 907                     ((new_serial.flags & ~S_USR_MASK) !=
 
 908                      (info->flags & ~S_USR_MASK)))
 
 910                 info->flags = ((info->flags & ~S_USR_MASK) |
 
 911                                (new_serial.flags & S_USR_MASK));
 
 912                 info->custom_divisor = new_serial.custom_divisor;
 
 920          * OK, past this point, all the error checking has been done.
 
 921          * At this point, we start making changes.....
 
 924         info->baud_base = new_serial.baud_base;
 
 925         info->flags = ((info->flags & ~S_FLAGS) |
 
 926                         (new_serial.flags & S_FLAGS));
 
 927         info->type = new_serial.type;
 
 928         info->close_delay = new_serial.close_delay;
 
 929         info->closing_wait = new_serial.closing_wait;
 
 932         retval = startup(info);
 
 937  * get_lsr_info - get line status register info
 
 939  * Purpose: Let user call ioctl() to get info when the UART physically
 
 940  *          is emptied.  On bus types like RS485, the transmitter must
 
 941  *          release the bus after transmitting. This must be done when
 
 942  *          the transmit shift register is empty, not be done when the
 
 943  *          transmit holding register is empty.  This functionality
 
 944  *          allows an RS485 driver to be written in user space. 
 
 946 static int get_lsr_info(struct m68k_serial * info, unsigned int *value)
 
 948 #ifdef CONFIG_SERIAL_68328_RTS_CTS
 
 949         m68328_uart *uart = &uart_addr[info->line];
 
 951         unsigned char status;
 
 954         local_irq_save(flags);
 
 955 #ifdef CONFIG_SERIAL_68328_RTS_CTS
 
 956         status = (uart->utx.w & UTX_CTS_STAT) ? 1 : 0;
 
 960         local_irq_restore(flags);
 
 961         put_user(status,value);
 
 966  * This routine sends a break character out the serial port.
 
 968 static void send_break(struct m68k_serial * info, unsigned int duration)
 
 970         m68328_uart *uart = &uart_addr[info->line];
 
 974         local_irq_save(flags);
 
 976         uart->utx.w |= UTX_SEND_BREAK;
 
 977         msleep_interruptible(duration);
 
 978         uart->utx.w &= ~UTX_SEND_BREAK;
 
 980         local_irq_restore(flags);
 
 983 static int rs_ioctl(struct tty_struct *tty, struct file * file,
 
 984                     unsigned int cmd, unsigned long arg)
 
 987         struct m68k_serial * info = (struct m68k_serial *)tty->driver_data;
 
 990         if (serial_paranoia_check(info, tty->name, "rs_ioctl"))
 
 993         if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
 
 994             (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGWILD)  &&
 
 995             (cmd != TIOCSERSWILD) && (cmd != TIOCSERGSTRUCT)) {
 
 996                 if (tty->flags & (1 << TTY_IO_ERROR))
 
1001                 case TCSBRK:    /* SVID version: non-zero arg --> no break */
 
1002                         retval = tty_check_change(tty);
 
1005                         tty_wait_until_sent(tty, 0);
 
1007                                 send_break(info, 250);  /* 1/4 second */
 
1009                 case TCSBRKP:   /* support for POSIX tcsendbreak() */
 
1010                         retval = tty_check_change(tty);
 
1013                         tty_wait_until_sent(tty, 0);
 
1014                         send_break(info, arg ? arg*(100) : 250);
 
1017                         if (access_ok(VERIFY_WRITE, (void *) arg,
 
1018                                                 sizeof(struct serial_struct)))
 
1019                                 return get_serial_info(info,
 
1020                                                (struct serial_struct *) arg);
 
1023                         return set_serial_info(info,
 
1024                                                (struct serial_struct *) arg);
 
1025                 case TIOCSERGETLSR: /* Get line status register */
 
1026                         if (access_ok(VERIFY_WRITE, (void *) arg,
 
1027                                                 sizeof(unsigned int)))
 
1028                                 return get_lsr_info(info, (unsigned int *) arg);
 
1030                 case TIOCSERGSTRUCT:
 
1031                         if (!access_ok(VERIFY_WRITE, (void *) arg,
 
1032                                                 sizeof(struct m68k_serial)))
 
1034                         copy_to_user((struct m68k_serial *) arg,
 
1035                                     info, sizeof(struct m68k_serial));
 
1039                         return -ENOIOCTLCMD;
 
1044 static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
 
1046         struct m68k_serial *info = (struct m68k_serial *)tty->driver_data;
 
1050         if ((old_termios->c_cflag & CRTSCTS) &&
 
1051             !(tty->termios->c_cflag & CRTSCTS)) {
 
1052                 tty->hw_stopped = 0;
 
1059  * ------------------------------------------------------------
 
1062  * This routine is called when the serial port gets closed.  First, we
 
1063  * wait for the last remaining data to be sent.  Then, we unlink its
 
1064  * S structure from the interrupt chain if necessary, and we free
 
1065  * that IRQ if nothing is left in the chain.
 
1066  * ------------------------------------------------------------
 
1068 static void rs_close(struct tty_struct *tty, struct file * filp)
 
1070         struct m68k_serial * info = (struct m68k_serial *)tty->driver_data;
 
1071         m68328_uart *uart = &uart_addr[info->line];
 
1072         unsigned long flags;
 
1074         if (!info || serial_paranoia_check(info, tty->name, "rs_close"))
 
1077         local_irq_save(flags);
 
1079         if (tty_hung_up_p(filp)) {
 
1080                 local_irq_restore(flags);
 
1084         if ((tty->count == 1) && (info->count != 1)) {
 
1086                  * Uh, oh.  tty->count is 1, which means that the tty
 
1087                  * structure will be freed.  Info->count should always
 
1088                  * be one in these conditions.  If it's greater than
 
1089                  * one, we've got real problems, since it means the
 
1090                  * serial port won't be shutdown.
 
1092                 printk("rs_close: bad serial port count; tty->count is 1, "
 
1093                        "info->count is %d\n", info->count);
 
1096         if (--info->count < 0) {
 
1097                 printk("rs_close: bad serial port count for ttyS%d: %d\n",
 
1098                        info->line, info->count);
 
1102                 local_irq_restore(flags);
 
1105         info->flags |= S_CLOSING;
 
1107          * Now we wait for the transmit buffer to clear; and we notify 
 
1108          * the line discipline to only process XON/XOFF characters.
 
1111         if (info->closing_wait != S_CLOSING_WAIT_NONE)
 
1112                 tty_wait_until_sent(tty, info->closing_wait);
 
1114          * At this point we stop accepting input.  To do this, we
 
1115          * disable the receive line status interrupts, and tell the
 
1116          * interrupt driver to stop checking the data ready bit in the
 
1117          * line status register.
 
1120         uart->ustcnt &= ~USTCNT_RXEN;
 
1121         uart->ustcnt &= ~(USTCNT_RXEN | USTCNT_RX_INTR_MASK);
 
1124         rs_flush_buffer(tty);
 
1126         tty_ldisc_flush(tty);
 
1129         info->port.tty = NULL;
 
1130 #warning "This is not and has never been valid so fix it"       
 
1132         if (tty->ldisc.num != ldiscs[N_TTY].num) {
 
1133                 if (tty->ldisc.close)
 
1134                         (tty->ldisc.close)(tty);
 
1135                 tty->ldisc = ldiscs[N_TTY];
 
1136                 tty->termios->c_line = N_TTY;
 
1137                 if (tty->ldisc.open)
 
1138                         (tty->ldisc.open)(tty);
 
1141         if (info->blocked_open) {
 
1142                 if (info->close_delay) {
 
1143                         msleep_interruptible(jiffies_to_msecs(info->close_delay));
 
1145                 wake_up_interruptible(&info->open_wait);
 
1147         info->flags &= ~(S_NORMAL_ACTIVE|S_CLOSING);
 
1148         wake_up_interruptible(&info->close_wait);
 
1149         local_irq_restore(flags);
 
1153  * rs_hangup() --- called by tty_hangup() when a hangup is signaled.
 
1155 void rs_hangup(struct tty_struct *tty)
 
1157         struct m68k_serial * info = (struct m68k_serial *)tty->driver_data;
 
1159         if (serial_paranoia_check(info, tty->name, "rs_hangup"))
 
1162         rs_flush_buffer(tty);
 
1166         info->flags &= ~S_NORMAL_ACTIVE;
 
1167         info->port.tty = NULL;
 
1168         wake_up_interruptible(&info->open_wait);
 
1172  * ------------------------------------------------------------
 
1173  * rs_open() and friends
 
1174  * ------------------------------------------------------------
 
1176 static int block_til_ready(struct tty_struct *tty, struct file * filp,
 
1177                            struct m68k_serial *info)
 
1179         DECLARE_WAITQUEUE(wait, current);
 
1184          * If the device is in the middle of being closed, then block
 
1185          * until it's done, and then try again.
 
1187         if (info->flags & S_CLOSING) {
 
1188                 interruptible_sleep_on(&info->close_wait);
 
1189 #ifdef SERIAL_DO_RESTART
 
1190                 if (info->flags & S_HUP_NOTIFY)
 
1193                         return -ERESTARTSYS;
 
1200          * If non-blocking mode is set, or the port is not enabled,
 
1201          * then make the check up front and then exit.
 
1203         if ((filp->f_flags & O_NONBLOCK) ||
 
1204             (tty->flags & (1 << TTY_IO_ERROR))) {
 
1205                 info->flags |= S_NORMAL_ACTIVE;
 
1209         if (tty->termios->c_cflag & CLOCAL)
 
1213          * Block waiting for the carrier detect and the line to become
 
1214          * free (i.e., not in use by the callout).  While we are in
 
1215          * this loop, info->count is dropped by one, so that
 
1216          * rs_close() knows when to free things.  We restore it upon
 
1217          * exit, either normal or abnormal.
 
1220         add_wait_queue(&info->open_wait, &wait);
 
1223         info->blocked_open++;
 
1225                 local_irq_disable();
 
1226                 m68k_rtsdtr(info, 1);
 
1228                 current->state = TASK_INTERRUPTIBLE;
 
1229                 if (tty_hung_up_p(filp) ||
 
1230                     !(info->flags & S_INITIALIZED)) {
 
1231 #ifdef SERIAL_DO_RESTART
 
1232                         if (info->flags & S_HUP_NOTIFY)
 
1235                                 retval = -ERESTARTSYS;  
 
1241                 if (!(info->flags & S_CLOSING) && do_clocal)
 
1243                 if (signal_pending(current)) {
 
1244                         retval = -ERESTARTSYS;
 
1249         current->state = TASK_RUNNING;
 
1250         remove_wait_queue(&info->open_wait, &wait);
 
1251         if (!tty_hung_up_p(filp))
 
1253         info->blocked_open--;
 
1257         info->flags |= S_NORMAL_ACTIVE;
 
1262  * This routine is called whenever a serial port is opened.  It
 
1263  * enables interrupts for a serial port, linking in its S structure into
 
1264  * the IRQ chain.   It also performs the serial-specific
 
1265  * initialization for the tty structure.
 
1267 int rs_open(struct tty_struct *tty, struct file * filp)
 
1269         struct m68k_serial      *info;
 
1274         if (line >= NR_PORTS || line < 0) /* we have exactly one */
 
1277         info = &m68k_soft[line];
 
1279         if (serial_paranoia_check(info, tty->name, "rs_open"))
 
1283         tty->driver_data = info;
 
1284         info->port.tty = tty;
 
1287          * Start up serial port
 
1289         retval = startup(info);
 
1293         return block_til_ready(tty, filp, info);
 
1296 /* Finally, routines used to initialize the serial driver. */
 
1298 static void show_serial_version(void)
 
1300         printk("MC68328 serial driver version 1.00\n");
 
1303 static const struct tty_operations rs_ops = {
 
1307         .flush_chars = rs_flush_chars,
 
1308         .write_room = rs_write_room,
 
1309         .chars_in_buffer = rs_chars_in_buffer,
 
1310         .flush_buffer = rs_flush_buffer,
 
1312         .throttle = rs_throttle,
 
1313         .unthrottle = rs_unthrottle,
 
1314         .set_termios = rs_set_termios,
 
1317         .hangup = rs_hangup,
 
1318         .set_ldisc = rs_set_ldisc,
 
1321 /* rs_init inits the driver */
 
1326         struct m68k_serial *info;
 
1328         serial_driver = alloc_tty_driver(NR_PORTS);
 
1332         show_serial_version();
 
1334         /* Initialize the tty_driver structure */
 
1335         /* SPARC: Not all of this is exactly right for us. */
 
1337         serial_driver->name = "ttyS";
 
1338         serial_driver->major = TTY_MAJOR;
 
1339         serial_driver->minor_start = 64;
 
1340         serial_driver->type = TTY_DRIVER_TYPE_SERIAL;
 
1341         serial_driver->subtype = SERIAL_TYPE_NORMAL;
 
1342         serial_driver->init_termios = tty_std_termios;
 
1343         serial_driver->init_termios.c_cflag = 
 
1344                         m68328_console_cbaud | CS8 | CREAD | HUPCL | CLOCAL;
 
1345         serial_driver->flags = TTY_DRIVER_REAL_RAW;
 
1346         tty_set_operations(serial_driver, &rs_ops);
 
1348         if (tty_register_driver(serial_driver)) {
 
1349                 put_tty_driver(serial_driver);
 
1350                 printk(KERN_ERR "Couldn't register serial driver\n");
 
1354         local_irq_save(flags);
 
1356         for(i=0;i<NR_PORTS;i++) {
 
1358             info = &m68k_soft[i];
 
1359             info->magic = SERIAL_MAGIC;
 
1360             info->port = (int) &uart_addr[i];
 
1361             info->port.tty = NULL;
 
1362             info->irq = uart_irqs[i];
 
1363             info->custom_divisor = 16;
 
1364             info->close_delay = 50;
 
1365             info->closing_wait = 3000;
 
1369             info->blocked_open = 0;
 
1370             INIT_WORK(&info->tqueue, do_softint);
 
1371             INIT_WORK(&info->tqueue_hangup, do_serial_hangup);
 
1372             init_waitqueue_head(&info->open_wait);
 
1373             init_waitqueue_head(&info->close_wait);
 
1375             info->is_cons = 1; /* Means shortcuts work */
 
1377             printk("%s%d at 0x%08x (irq = %d)", serial_driver->name, info->line, 
 
1378                    info->port, info->irq);
 
1379             printk(" is a builtin MC68328 UART\n");
 
1381 #ifdef CONFIG_M68VZ328
 
1383                         PJSEL &= 0xCF;  /* PSW enable second port output */
 
1386             if (request_irq(uart_irqs[i],
 
1389                             "M68328_UART", info))
 
1390                 panic("Unable to attach 68328 serial interrupt\n");
 
1392         local_irq_restore(flags);
 
1396 module_init(rs68328_init);
 
1400 static void m68328_set_baud(void)
 
1402         unsigned short ustcnt;
 
1406         USTCNT = ustcnt & ~USTCNT_TXEN;
 
1409         for (i = 0; i < sizeof(baud_table) / sizeof(baud_table[0]); i++)
 
1410                 if (baud_table[i] == m68328_console_baud)
 
1412         if (i >= sizeof(baud_table) / sizeof(baud_table[0])) {
 
1413                 m68328_console_baud = 9600;
 
1417         UBAUD = PUT_FIELD(UBAUD_DIVIDE,    hw_baud_table[i].divisor) | 
 
1418                 PUT_FIELD(UBAUD_PRESCALER, hw_baud_table[i].prescale);
 
1419         ustcnt &= ~(USTCNT_PARITYEN | USTCNT_ODD_EVEN | USTCNT_STOP | USTCNT_8_7);
 
1420         ustcnt |= USTCNT_8_7;
 
1421         ustcnt |= USTCNT_TXEN;
 
1423         m68328_console_initted = 1;
 
1428 int m68328_console_setup(struct console *cp, char *arg)
 
1430         int             i, n = CONSOLE_BAUD_RATE;
 
1436                 n = simple_strtoul(arg,NULL,0);
 
1438         for (i = 0; i < BAUD_TABLE_SIZE; i++)
 
1439                 if (baud_table[i] == n)
 
1441         if (i < BAUD_TABLE_SIZE) {
 
1442                 m68328_console_baud = n;
 
1443                 m68328_console_cbaud = 0;
 
1445                         m68328_console_cbaud |= CBAUDEX;
 
1448                 m68328_console_cbaud |= i;
 
1451         m68328_set_baud(); /* make sure baud rate changes */
 
1456 static struct tty_driver *m68328_console_device(struct console *c, int *index)
 
1459         return serial_driver;
 
1463 void m68328_console_write (struct console *co, const char *str,
 
1466         if (!m68328_console_initted)
 
1471         rs_put_char( *str++ );
 
1476 static struct console m68328_driver = {
 
1478         .write          = m68328_console_write,
 
1479         .device         = m68328_console_device,
 
1480         .setup          = m68328_console_setup,
 
1481         .flags          = CON_PRINTBUFFER,
 
1486 static int __init m68328_console_init(void)
 
1488         register_console(&m68328_driver);
 
1492 console_initcall(m68328_console_init);