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