2 * linux/drivers/char/serial167.c
4 * Driver for MVME166/7 board serial ports, which are via a CD2401.
5 * Based very much on cyclades.c.
7 * MVME166/7 work by Richard Hirst [richard@sleepie.demon.co.uk]
9 * ==============================================================
11 * static char rcsid[] =
12 * "$Revision: 1.36.1.4 $$Date: 1995/03/29 06:14:14 $";
14 * linux/kernel/cyclades.c
16 * Maintained by Marcio Saito (cyclades@netcom.com) and
17 * Randolph Bentson (bentson@grieg.seaslug.org)
19 * Much of the design and some of the code came from serial.c
20 * which was copyright (C) 1991, 1992 Linus Torvalds. It was
21 * extensively rewritten by Theodore Ts'o, 8/16/92 -- 9/14/92,
22 * and then fixed as suggested by Michael K. Johnson 12/12/92.
24 * This version does not support shared irq's.
26 * $Log: cyclades.c,v $
27 * Revision 1.36.1.4 1995/03/29 06:14:14 bentson
28 * disambiguate between Cyclom-16Y and Cyclom-32Ye;
32 * 200 lines of changes record removed - RGH 11-10-95, starting work on
33 * converting this to drive serial ports on mvme166 (cd2401).
35 * Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 2000/08/25
36 * - get rid of verify_area
37 * - use get_user to access memory from userspace in set_threshold,
38 * set_default_threshold and set_timeout
39 * - don't use the panic function in serial167_init
40 * - do resource release on failure on serial167_init
41 * - include missing restore_flags in mvme167_serial_console_setup
43 * Kars de Jong <jongk@linux-m68k.org> - 2004/09/06
44 * - replace bottom half handler with task queue handler
47 #include <linux/errno.h>
48 #include <linux/signal.h>
49 #include <linux/sched.h>
50 #include <linux/timer.h>
51 #include <linux/tty.h>
52 #include <linux/interrupt.h>
53 #include <linux/serial.h>
54 #include <linux/serialP.h>
55 #include <linux/smp_lock.h>
56 #include <linux/string.h>
57 #include <linux/fcntl.h>
58 #include <linux/ptrace.h>
59 #include <linux/serial167.h>
60 #include <linux/delay.h>
61 #include <linux/major.h>
63 #include <linux/console.h>
64 #include <linux/module.h>
65 #include <linux/bitops.h>
66 #include <linux/tty_flip.h>
68 #include <asm/system.h>
70 #include <asm/mvme16xhw.h>
71 #include <asm/bootinfo.h>
72 #include <asm/setup.h>
74 #include <linux/types.h>
75 #include <linux/kernel.h>
77 #include <asm/uaccess.h>
78 #include <linux/init.h>
80 #define SERIAL_PARANOIA_CHECK
81 #undef SERIAL_DEBUG_OPEN
82 #undef SERIAL_DEBUG_THROTTLE
83 #undef SERIAL_DEBUG_OTHER
84 #undef SERIAL_DEBUG_IO
85 #undef SERIAL_DEBUG_COUNT
86 #undef SERIAL_DEBUG_DTR
87 #undef CYCLOM_16Y_HACK
88 #define CYCLOM_ENABLE_MONITORING
90 #define WAKEUP_CHARS 256
92 #define STD_COM_FLAGS (0)
94 static struct tty_driver
*cy_serial_driver
;
95 extern int serial_console
;
96 static struct cyclades_port
*serial_console_info
= NULL
;
97 static unsigned int serial_console_cflag
= 0;
98 u_char initial_console_speed
;
100 /* Base address of cd2401 chip on mvme166/7 */
102 #define BASE_ADDR (0xfff45000)
103 #define pcc2chip ((volatile u_char *)0xfff42000)
104 #define PccSCCMICR 0x1d
105 #define PccSCCTICR 0x1e
106 #define PccSCCRICR 0x1f
107 #define PccTPIACKR 0x25
108 #define PccRPIACKR 0x27
111 /* This is the per-port data structure */
112 struct cyclades_port cy_port
[] = {
120 #define NR_PORTS ARRAY_SIZE(cy_port)
123 * This is used to look up the divisor speeds and the timeouts
124 * We're normally limited to 15 distinct baud rates. The extra
125 * are accessed via settings in info->flags.
126 * 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
127 * 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
130 static int baud_table
[] = {
131 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
132 1800, 2400, 4800, 9600, 19200, 38400, 57600, 76800, 115200, 150000,
137 static char baud_co
[] = { /* 25 MHz clock option table */
138 /* value => 00 01 02 03 04 */
139 /* divide by 8 32 128 512 2048 */
140 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x02,
141 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
144 static char baud_bpr
[] = { /* 25 MHz baud rate period table */
145 0x00, 0xf5, 0xa3, 0x6f, 0x5c, 0x51, 0xf5, 0xa3, 0x51, 0xa3,
146 0x6d, 0x51, 0xa3, 0x51, 0xa3, 0x51, 0x36, 0x29, 0x1b, 0x15
150 /* I think 166 brd clocks 2401 at 20MHz.... */
152 /* These values are written directly to tcor, and >> 5 for writing to rcor */
153 static u_char baud_co
[] = { /* 20 MHz clock option table */
154 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x60, 0x60, 0x40,
155 0x40, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
158 /* These values written directly to tbpr/rbpr */
159 static u_char baud_bpr
[] = { /* 20 MHz baud rate period table */
160 0x00, 0xc0, 0x80, 0x58, 0x6c, 0x40, 0xc0, 0x81, 0x40, 0x81,
161 0x57, 0x40, 0x81, 0x40, 0x81, 0x40, 0x2b, 0x20, 0x15, 0x10
164 static u_char baud_cor4
[] = { /* receive threshold */
165 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
166 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x07
169 static void shutdown(struct cyclades_port
*);
170 static int startup(struct cyclades_port
*);
171 static void cy_throttle(struct tty_struct
*);
172 static void cy_unthrottle(struct tty_struct
*);
173 static void config_setup(struct cyclades_port
*);
174 #ifdef CYCLOM_SHOW_STATUS
175 static void show_status(int);
178 #ifdef CONFIG_REMOTE_DEBUG
179 static void debug_setup(void);
180 void queueDebugChar(int c
);
181 int getDebugChar(void);
184 #define DEBUG_LEN 256
189 unsigned char buf
[DEBUG_LEN
];
196 * I have my own version of udelay(), as it is needed when initialising
197 * the chip, before the delay loop has been calibrated. Should probably
198 * reference one of the vmechip2 or pccchip2 counter for an accurate
199 * delay, but this wild guess will do for now.
202 void my_udelay(long us
)
205 volatile u_char
*p
= &x
;
209 for (i
= 100; i
; i
--)
213 static inline int serial_paranoia_check(struct cyclades_port
*info
, char *name
,
216 #ifdef SERIAL_PARANOIA_CHECK
218 printk("Warning: null cyclades_port for (%s) in %s\n", name
,
223 if (info
< &cy_port
[0] || info
>= &cy_port
[NR_PORTS
]) {
224 printk("Warning: cyclades_port out of range for (%s) in %s\n",
229 if (info
->magic
!= CYCLADES_MAGIC
) {
230 printk("Warning: bad magic number for serial struct (%s) in "
231 "%s\n", name
, routine
);
236 } /* serial_paranoia_check */
239 /* The following diagnostic routines allow the driver to spew
240 information on the screen, even (especially!) during interrupts.
245 local_irq_save(flags
);
246 printk(KERN_EMERG
"%s", data
);
247 local_irq_restore(flags
);
254 local_irq_save(flags
);
256 printk(KERN_EMERG
"%c", scrn
);
257 local_irq_restore(flags
);
262 (data
< 10) ? CP(data
+ '0') : CP(data
+ 'A' - 10);
266 CP1((data
>> 4) & 0x0f);
271 CP2((data
>> 8) & 0xff);
276 CP4((data
>> 16) & 0xffff);
281 /* This routine waits up to 1000 micro-seconds for the previous
282 command to the Cirrus chip to complete and then issues the
283 new command. An error is returned if the previous command
284 didn't finish within the time limit.
286 u_short
write_cy_cmd(volatile u_char
* base_addr
, u_char cmd
)
291 local_irq_save(flags
);
292 /* Check to see that the previous command has completed */
293 for (i
= 0; i
< 100; i
++) {
294 if (base_addr
[CyCCR
] == 0) {
299 /* if the CCR never cleared, the previous command
300 didn't finish within the "reasonable time" */
302 local_irq_restore(flags
);
306 /* Issue the new command */
307 base_addr
[CyCCR
] = cmd
;
308 local_irq_restore(flags
);
312 /* cy_start and cy_stop provide software output flow control as a
313 function of XON/XOFF, software CTS, and other such stuff. */
315 static void cy_stop(struct tty_struct
*tty
)
317 struct cyclades_port
*info
= tty
->driver_data
;
318 volatile unsigned char *base_addr
= (unsigned char *)BASE_ADDR
;
322 #ifdef SERIAL_DEBUG_OTHER
323 printk("cy_stop %s\n", tty
->name
); /* */
326 if (serial_paranoia_check(info
, tty
->name
, "cy_stop"))
329 channel
= info
->line
;
331 local_irq_save(flags
);
332 base_addr
[CyCAR
] = (u_char
) (channel
); /* index channel */
333 base_addr
[CyIER
] &= ~(CyTxMpty
| CyTxRdy
);
334 local_irq_restore(flags
);
337 static void cy_start(struct tty_struct
*tty
)
339 struct cyclades_port
*info
= tty
->driver_data
;
340 volatile unsigned char *base_addr
= (unsigned char *)BASE_ADDR
;
344 #ifdef SERIAL_DEBUG_OTHER
345 printk("cy_start %s\n", tty
->name
); /* */
348 if (serial_paranoia_check(info
, tty
->name
, "cy_start"))
351 channel
= info
->line
;
353 local_irq_save(flags
);
354 base_addr
[CyCAR
] = (u_char
) (channel
);
355 base_addr
[CyIER
] |= CyTxMpty
;
356 local_irq_restore(flags
);
359 /* The real interrupt service routines are called
360 whenever the card wants its hand held--chars
361 received, out buffer empty, modem change, etc.
363 static irqreturn_t
cd2401_rxerr_interrupt(int irq
, void *dev_id
)
365 struct tty_struct
*tty
;
366 struct cyclades_port
*info
;
367 volatile unsigned char *base_addr
= (unsigned char *)BASE_ADDR
;
368 unsigned char err
, rfoc
;
372 /* determine the channel and change to that context */
373 channel
= (u_short
) (base_addr
[CyLICR
] >> 2);
374 info
= &cy_port
[channel
];
375 info
->last_active
= jiffies
;
377 if ((err
= base_addr
[CyRISR
]) & CyTIMEOUT
) {
378 /* This is a receive timeout interrupt, ignore it */
379 base_addr
[CyREOIR
] = CyNOTRANS
;
383 /* Read a byte of data if there is any - assume the error
384 * is associated with this character */
386 if ((rfoc
= base_addr
[CyRFOC
]) != 0)
387 data
= base_addr
[CyRDR
];
391 /* if there is nowhere to put the data, discard it */
392 if (info
->tty
== 0) {
393 base_addr
[CyREOIR
] = rfoc
? 0 : CyNOTRANS
;
395 } else { /* there is an open port for this data */
397 if (err
& info
->ignore_status_mask
) {
398 base_addr
[CyREOIR
] = rfoc
? 0 : CyNOTRANS
;
401 if (tty_buffer_request_room(tty
, 1) != 0) {
402 if (err
& info
->read_status_mask
) {
404 tty_insert_flip_char(tty
, data
,
406 if (info
->flags
& ASYNC_SAK
) {
409 } else if (err
& CyFRAME
) {
410 tty_insert_flip_char(tty
, data
,
412 } else if (err
& CyPARITY
) {
413 tty_insert_flip_char(tty
, data
,
415 } else if (err
& CyOVERRUN
) {
416 tty_insert_flip_char(tty
, 0,
419 If the flip buffer itself is
420 overflowing, we still lose
421 the next incoming character.
423 if (tty_buffer_request_room(tty
, 1) !=
425 tty_insert_flip_char(tty
, data
,
428 /* These two conditions may imply */
429 /* a normal read should be done. */
430 /* else if(data & CyTIMEOUT) */
431 /* else if(data & CySPECHAR) */
433 tty_insert_flip_char(tty
, 0,
437 tty_insert_flip_char(tty
, data
, TTY_NORMAL
);
440 /* there was a software buffer overrun
441 and nothing could be done about it!!! */
444 tty_schedule_flip(tty
);
446 base_addr
[CyREOIR
] = rfoc
? 0 : CyNOTRANS
;
448 } /* cy_rxerr_interrupt */
450 static irqreturn_t
cd2401_modem_interrupt(int irq
, void *dev_id
)
452 struct cyclades_port
*info
;
453 volatile unsigned char *base_addr
= (unsigned char *)BASE_ADDR
;
458 /* determine the channel and change to that context */
459 channel
= (u_short
) (base_addr
[CyLICR
] >> 2);
460 info
= &cy_port
[channel
];
461 info
->last_active
= jiffies
;
463 mdm_change
= base_addr
[CyMISR
];
464 mdm_status
= base_addr
[CyMSVR1
];
466 if (info
->tty
== 0) { /* nowhere to put the data, ignore it */
469 if ((mdm_change
& CyDCD
)
470 && (info
->flags
& ASYNC_CHECK_CD
)) {
471 if (mdm_status
& CyDCD
) {
473 wake_up_interruptible(&info
->open_wait
);
476 tty_hangup(info
->tty
);
477 wake_up_interruptible(&info
->open_wait
);
478 info
->flags
&= ~ASYNC_NORMAL_ACTIVE
;
481 if ((mdm_change
& CyCTS
)
482 && (info
->flags
& ASYNC_CTS_FLOW
)) {
483 if (info
->tty
->stopped
) {
484 if (mdm_status
& CyCTS
) {
485 /* !!! cy_start isn't used because... */
486 info
->tty
->stopped
= 0;
487 base_addr
[CyIER
] |= CyTxMpty
;
488 tty_wakeup(info
->tty
);
491 if (!(mdm_status
& CyCTS
)) {
492 /* !!! cy_stop isn't used because... */
493 info
->tty
->stopped
= 1;
495 ~(CyTxMpty
| CyTxRdy
);
499 if (mdm_status
& CyDSR
) {
502 base_addr
[CyMEOIR
] = 0;
504 } /* cy_modem_interrupt */
506 static irqreturn_t
cd2401_tx_interrupt(int irq
, void *dev_id
)
508 struct cyclades_port
*info
;
509 volatile unsigned char *base_addr
= (unsigned char *)BASE_ADDR
;
511 int char_count
, saved_cnt
;
514 /* determine the channel and change to that context */
515 channel
= (u_short
) (base_addr
[CyLICR
] >> 2);
517 #ifdef CONFIG_REMOTE_DEBUG
518 if (channel
== DEBUG_PORT
) {
519 panic("TxInt on debug port!!!");
522 /* validate the port number (as configured and open) */
523 if ((channel
< 0) || (NR_PORTS
<= channel
)) {
524 base_addr
[CyIER
] &= ~(CyTxMpty
| CyTxRdy
);
525 base_addr
[CyTEOIR
] = CyNOTRANS
;
528 info
= &cy_port
[channel
];
529 info
->last_active
= jiffies
;
530 if (info
->tty
== 0) {
531 base_addr
[CyIER
] &= ~(CyTxMpty
| CyTxRdy
);
532 base_addr
[CyTEOIR
] = CyNOTRANS
;
536 /* load the on-chip space available for outbound data */
537 saved_cnt
= char_count
= base_addr
[CyTFTC
];
539 if (info
->x_char
) { /* send special char */
540 outch
= info
->x_char
;
541 base_addr
[CyTDR
] = outch
;
547 /* The Cirrus chip requires the "Embedded Transmit
548 Commands" of start break, delay, and end break
549 sequences to be sent. The duration of the
550 break is given in TICs, which runs at HZ
551 (typically 100) and the PPR runs at 200 Hz,
552 so the delay is duration * 200/HZ, and thus a
553 break can run from 1/100 sec to about 5/4 sec.
554 Need to check these values - RGH 141095.
556 base_addr
[CyTDR
] = 0; /* start break */
557 base_addr
[CyTDR
] = 0x81;
558 base_addr
[CyTDR
] = 0; /* delay a bit */
559 base_addr
[CyTDR
] = 0x82;
560 base_addr
[CyTDR
] = info
->x_break
* 200 / HZ
;
561 base_addr
[CyTDR
] = 0; /* terminate break */
562 base_addr
[CyTDR
] = 0x83;
567 while (char_count
> 0) {
568 if (!info
->xmit_cnt
) {
569 base_addr
[CyIER
] &= ~(CyTxMpty
| CyTxRdy
);
572 if (info
->xmit_buf
== 0) {
573 base_addr
[CyIER
] &= ~(CyTxMpty
| CyTxRdy
);
576 if (info
->tty
->stopped
|| info
->tty
->hw_stopped
) {
577 base_addr
[CyIER
] &= ~(CyTxMpty
| CyTxRdy
);
580 /* Because the Embedded Transmit Commands have been
581 enabled, we must check to see if the escape
582 character, NULL, is being sent. If it is, we
583 must ensure that there is room for it to be
584 doubled in the output stream. Therefore we
585 no longer advance the pointer when the character
586 is fetched, but rather wait until after the check
587 for a NULL output character. (This is necessary
588 because there may not be room for the two chars
589 needed to send a NULL.
591 outch
= info
->xmit_buf
[info
->xmit_tail
];
594 info
->xmit_tail
= (info
->xmit_tail
+ 1)
596 base_addr
[CyTDR
] = outch
;
599 if (char_count
> 1) {
601 info
->xmit_tail
= (info
->xmit_tail
+ 1)
603 base_addr
[CyTDR
] = outch
;
604 base_addr
[CyTDR
] = 0;
613 if (info
->xmit_cnt
< WAKEUP_CHARS
)
614 tty_wakeup(info
->tty
);
616 base_addr
[CyTEOIR
] = (char_count
!= saved_cnt
) ? 0 : CyNOTRANS
;
618 } /* cy_tx_interrupt */
620 static irqreturn_t
cd2401_rx_interrupt(int irq
, void *dev_id
)
622 struct tty_struct
*tty
;
623 struct cyclades_port
*info
;
624 volatile unsigned char *base_addr
= (unsigned char *)BASE_ADDR
;
631 /* determine the channel and change to that context */
632 channel
= (u_short
) (base_addr
[CyLICR
] >> 2);
633 info
= &cy_port
[channel
];
634 info
->last_active
= jiffies
;
635 save_cnt
= char_count
= base_addr
[CyRFOC
];
637 #ifdef CONFIG_REMOTE_DEBUG
638 if (channel
== DEBUG_PORT
) {
639 while (char_count
--) {
640 data
= base_addr
[CyRDR
];
641 queueDebugChar(data
);
645 /* if there is nowhere to put the data, discard it */
646 if (info
->tty
== 0) {
647 while (char_count
--) {
648 data
= base_addr
[CyRDR
];
650 } else { /* there is an open port for this data */
652 /* load # characters available from the chip */
654 #ifdef CYCLOM_ENABLE_MONITORING
655 ++info
->mon
.int_count
;
656 info
->mon
.char_count
+= char_count
;
657 if (char_count
> info
->mon
.char_max
)
658 info
->mon
.char_max
= char_count
;
659 info
->mon
.char_last
= char_count
;
661 len
= tty_buffer_request_room(tty
, char_count
);
663 data
= base_addr
[CyRDR
];
664 tty_insert_flip_char(tty
, data
, TTY_NORMAL
);
665 #ifdef CYCLOM_16Y_HACK
669 tty_schedule_flip(tty
);
672 base_addr
[CyREOIR
] = save_cnt
? 0 : CyNOTRANS
;
674 } /* cy_rx_interrupt */
676 /* This is called whenever a port becomes active;
677 interrupts are enabled and DTR & RTS are turned on.
679 static int startup(struct cyclades_port
*info
)
682 volatile unsigned char *base_addr
= (unsigned char *)BASE_ADDR
;
685 if (info
->flags
& ASYNC_INITIALIZED
) {
691 set_bit(TTY_IO_ERROR
, &info
->tty
->flags
);
695 if (!info
->xmit_buf
) {
696 info
->xmit_buf
= (unsigned char *)get_zeroed_page(GFP_KERNEL
);
697 if (!info
->xmit_buf
) {
704 channel
= info
->line
;
706 #ifdef SERIAL_DEBUG_OPEN
707 printk("startup channel %d\n", channel
);
710 local_irq_save(flags
);
711 base_addr
[CyCAR
] = (u_char
) channel
;
712 write_cy_cmd(base_addr
, CyENB_RCVR
| CyENB_XMTR
);
714 base_addr
[CyCAR
] = (u_char
) channel
; /* !!! Is this needed? */
715 base_addr
[CyMSVR1
] = CyRTS
;
716 /* CP('S');CP('1'); */
717 base_addr
[CyMSVR2
] = CyDTR
;
719 #ifdef SERIAL_DEBUG_DTR
720 printk("cyc: %d: raising DTR\n", __LINE__
);
721 printk(" status: 0x%x, 0x%x\n", base_addr
[CyMSVR1
],
725 base_addr
[CyIER
] |= CyRxData
;
726 info
->flags
|= ASYNC_INITIALIZED
;
729 clear_bit(TTY_IO_ERROR
, &info
->tty
->flags
);
731 info
->xmit_cnt
= info
->xmit_head
= info
->xmit_tail
= 0;
733 local_irq_restore(flags
);
735 #ifdef SERIAL_DEBUG_OPEN
741 void start_xmit(struct cyclades_port
*info
)
744 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
747 channel
= info
->line
;
748 local_irq_save(flags
);
749 base_addr
[CyCAR
] = channel
;
750 base_addr
[CyIER
] |= CyTxMpty
;
751 local_irq_restore(flags
);
755 * This routine shuts down a serial port; interrupts are disabled,
756 * and DTR is dropped if the hangup on close termio flag is on.
758 static void shutdown(struct cyclades_port
*info
)
761 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
764 if (!(info
->flags
& ASYNC_INITIALIZED
)) {
769 channel
= info
->line
;
771 #ifdef SERIAL_DEBUG_OPEN
772 printk("shutdown channel %d\n", channel
);
775 /* !!! REALLY MUST WAIT FOR LAST CHARACTER TO BE
776 SENT BEFORE DROPPING THE LINE !!! (Perhaps
777 set some flag that is read when XMTY happens.)
778 Other choices are to delay some fixed interval
779 or schedule some later processing.
781 local_irq_save(flags
);
782 if (info
->xmit_buf
) {
783 free_page((unsigned long)info
->xmit_buf
);
784 info
->xmit_buf
= NULL
;
787 base_addr
[CyCAR
] = (u_char
) channel
;
788 if (!info
->tty
|| (info
->tty
->termios
->c_cflag
& HUPCL
)) {
789 base_addr
[CyMSVR1
] = 0;
790 /* CP('C');CP('1'); */
791 base_addr
[CyMSVR2
] = 0;
792 #ifdef SERIAL_DEBUG_DTR
793 printk("cyc: %d: dropping DTR\n", __LINE__
);
794 printk(" status: 0x%x, 0x%x\n", base_addr
[CyMSVR1
],
798 write_cy_cmd(base_addr
, CyDIS_RCVR
);
799 /* it may be appropriate to clear _XMIT at
800 some later date (after testing)!!! */
803 set_bit(TTY_IO_ERROR
, &info
->tty
->flags
);
805 info
->flags
&= ~ASYNC_INITIALIZED
;
806 local_irq_restore(flags
);
808 #ifdef SERIAL_DEBUG_OPEN
814 * This routine finds or computes the various line characteristics.
816 static void config_setup(struct cyclades_port
*info
)
819 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
823 unsigned char ti
, need_init_chan
= 0;
825 if (!info
->tty
|| !info
->tty
->termios
) {
828 if (info
->line
== -1) {
831 cflag
= info
->tty
->termios
->c_cflag
;
836 /* Starting with kernel 1.1.65, there is direct support for
837 higher baud rates. The following code supports those
838 changes. The conditional aspect allows this driver to be
839 used for earlier as well as later kernel versions. (The
840 mapping is slightly different from serial.c because there
841 is still the possibility of supporting 75 kbit/sec with
847 else if (i
== B115200
)
850 else if (i
== B78600
)
854 info
->tty
->termios
->c_cflag
&= ~CBAUDEX
;
858 if ((info
->flags
& ASYNC_SPD_MASK
) == ASYNC_SPD_HI
)
860 if ((info
->flags
& ASYNC_SPD_MASK
) == ASYNC_SPD_VHI
)
863 /* Don't ever change the speed of the console port. It will
864 * run at the speed specified in bootinfo, or at 19.2K */
865 /* Actually, it should run at whatever speed 166Bug was using */
866 /* Note info->timeout isn't used at present */
867 if (info
!= serial_console_info
) {
868 info
->tbpr
= baud_bpr
[i
]; /* Tx BPR */
869 info
->tco
= baud_co
[i
]; /* Tx CO */
870 info
->rbpr
= baud_bpr
[i
]; /* Rx BPR */
871 info
->rco
= baud_co
[i
] >> 5; /* Rx CO */
872 if (baud_table
[i
] == 134) {
874 (info
->xmit_fifo_size
* HZ
* 30 / 269) + 2;
875 /* get it right for 134.5 baud */
876 } else if (baud_table
[i
]) {
878 (info
->xmit_fifo_size
* HZ
* 15 / baud_table
[i
]) +
880 /* this needs to be propagated into the card info */
885 /* By tradition (is it a standard?) a baud rate of zero
886 implies the line should be/has been closed. A bit
887 later in this routine such a test is performed. */
889 /* byte size and parity */
893 info
->cor4
= (info
->default_threshold
? info
->default_threshold
: baud_cor4
[i
]); /* receive threshold */
894 /* Following two lines added 101295, RGH. */
895 /* It is obviously wrong to access CyCORx, and not info->corx here,
896 * try and remember to fix it later! */
897 channel
= info
->line
;
898 base_addr
[CyCAR
] = (u_char
) channel
;
899 if (C_CLOCAL(info
->tty
)) {
900 if (base_addr
[CyIER
] & CyMdmCh
)
901 base_addr
[CyIER
] &= ~CyMdmCh
; /* without modem intr */
902 /* ignore 1->0 modem transitions */
903 if (base_addr
[CyCOR4
] & (CyDSR
| CyCTS
| CyDCD
))
904 base_addr
[CyCOR4
] &= ~(CyDSR
| CyCTS
| CyDCD
);
905 /* ignore 0->1 modem transitions */
906 if (base_addr
[CyCOR5
] & (CyDSR
| CyCTS
| CyDCD
))
907 base_addr
[CyCOR5
] &= ~(CyDSR
| CyCTS
| CyDCD
);
909 if ((base_addr
[CyIER
] & CyMdmCh
) != CyMdmCh
)
910 base_addr
[CyIER
] |= CyMdmCh
; /* with modem intr */
911 /* act on 1->0 modem transitions */
912 if ((base_addr
[CyCOR4
] & (CyDSR
| CyCTS
| CyDCD
)) !=
913 (CyDSR
| CyCTS
| CyDCD
))
914 base_addr
[CyCOR4
] |= CyDSR
| CyCTS
| CyDCD
;
915 /* act on 0->1 modem transitions */
916 if ((base_addr
[CyCOR5
] & (CyDSR
| CyCTS
| CyDCD
)) !=
917 (CyDSR
| CyCTS
| CyDCD
))
918 base_addr
[CyCOR5
] |= CyDSR
| CyCTS
| CyDCD
;
920 info
->cor3
= (cflag
& CSTOPB
) ? Cy_2_STOP
: Cy_1_STOP
;
922 switch (cflag
& CSIZE
) {
924 info
->cor1
= Cy_5_BITS
;
927 info
->cor1
= Cy_6_BITS
;
930 info
->cor1
= Cy_7_BITS
;
933 info
->cor1
= Cy_8_BITS
;
936 if (cflag
& PARENB
) {
937 if (cflag
& PARODD
) {
938 info
->cor1
|= CyPARITY_O
;
940 info
->cor1
|= CyPARITY_E
;
943 info
->cor1
|= CyPARITY_NONE
;
946 /* CTS flow control flag */
948 /* Don't complcate matters for now! RGH 141095 */
949 if (cflag
& CRTSCTS
) {
950 info
->flags
|= ASYNC_CTS_FLOW
;
951 info
->cor2
|= CyCtsAE
;
953 info
->flags
&= ~ASYNC_CTS_FLOW
;
954 info
->cor2
&= ~CyCtsAE
;
958 info
->flags
&= ~ASYNC_CHECK_CD
;
960 info
->flags
|= ASYNC_CHECK_CD
;
962 /***********************************************
963 The hardware option, CyRtsAO, presents RTS when
964 the chip has characters to send. Since most modems
965 use RTS as reverse (inbound) flow control, this
966 option is not used. If inbound flow control is
967 necessary, DTR can be programmed to provide the
968 appropriate signals for use with a non-standard
969 cable. Contact Marcio Saito for details.
970 ***********************************************/
972 channel
= info
->line
;
974 local_irq_save(flags
);
975 base_addr
[CyCAR
] = (u_char
) channel
;
977 /* CyCMR set once only in mvme167_init_serial() */
978 if (base_addr
[CyLICR
] != channel
<< 2)
979 base_addr
[CyLICR
] = channel
<< 2;
980 if (base_addr
[CyLIVR
] != 0x5c)
981 base_addr
[CyLIVR
] = 0x5c;
983 /* tx and rx baud rate */
985 if (base_addr
[CyCOR1
] != info
->cor1
)
987 if (base_addr
[CyTCOR
] != info
->tco
)
988 base_addr
[CyTCOR
] = info
->tco
;
989 if (base_addr
[CyTBPR
] != info
->tbpr
)
990 base_addr
[CyTBPR
] = info
->tbpr
;
991 if (base_addr
[CyRCOR
] != info
->rco
)
992 base_addr
[CyRCOR
] = info
->rco
;
993 if (base_addr
[CyRBPR
] != info
->rbpr
)
994 base_addr
[CyRBPR
] = info
->rbpr
;
996 /* set line characteristics according configuration */
998 if (base_addr
[CySCHR1
] != START_CHAR(info
->tty
))
999 base_addr
[CySCHR1
] = START_CHAR(info
->tty
);
1000 if (base_addr
[CySCHR2
] != STOP_CHAR(info
->tty
))
1001 base_addr
[CySCHR2
] = STOP_CHAR(info
->tty
);
1002 if (base_addr
[CySCRL
] != START_CHAR(info
->tty
))
1003 base_addr
[CySCRL
] = START_CHAR(info
->tty
);
1004 if (base_addr
[CySCRH
] != START_CHAR(info
->tty
))
1005 base_addr
[CySCRH
] = START_CHAR(info
->tty
);
1006 if (base_addr
[CyCOR1
] != info
->cor1
)
1007 base_addr
[CyCOR1
] = info
->cor1
;
1008 if (base_addr
[CyCOR2
] != info
->cor2
)
1009 base_addr
[CyCOR2
] = info
->cor2
;
1010 if (base_addr
[CyCOR3
] != info
->cor3
)
1011 base_addr
[CyCOR3
] = info
->cor3
;
1012 if (base_addr
[CyCOR4
] != info
->cor4
)
1013 base_addr
[CyCOR4
] = info
->cor4
;
1014 if (base_addr
[CyCOR5
] != info
->cor5
)
1015 base_addr
[CyCOR5
] = info
->cor5
;
1016 if (base_addr
[CyCOR6
] != info
->cor6
)
1017 base_addr
[CyCOR6
] = info
->cor6
;
1018 if (base_addr
[CyCOR7
] != info
->cor7
)
1019 base_addr
[CyCOR7
] = info
->cor7
;
1022 write_cy_cmd(base_addr
, CyINIT_CHAN
);
1024 base_addr
[CyCAR
] = (u_char
) channel
; /* !!! Is this needed? */
1026 /* 2ms default rx timeout */
1027 ti
= info
->default_timeout
? info
->default_timeout
: 0x02;
1028 if (base_addr
[CyRTPRL
] != ti
)
1029 base_addr
[CyRTPRL
] = ti
;
1030 if (base_addr
[CyRTPRH
] != 0)
1031 base_addr
[CyRTPRH
] = 0;
1033 /* Set up RTS here also ????? RGH 141095 */
1034 if (i
== 0) { /* baud rate is zero, turn off line */
1035 if ((base_addr
[CyMSVR2
] & CyDTR
) == CyDTR
)
1036 base_addr
[CyMSVR2
] = 0;
1037 #ifdef SERIAL_DEBUG_DTR
1038 printk("cyc: %d: dropping DTR\n", __LINE__
);
1039 printk(" status: 0x%x, 0x%x\n", base_addr
[CyMSVR1
],
1040 base_addr
[CyMSVR2
]);
1043 if ((base_addr
[CyMSVR2
] & CyDTR
) != CyDTR
)
1044 base_addr
[CyMSVR2
] = CyDTR
;
1045 #ifdef SERIAL_DEBUG_DTR
1046 printk("cyc: %d: raising DTR\n", __LINE__
);
1047 printk(" status: 0x%x, 0x%x\n", base_addr
[CyMSVR1
],
1048 base_addr
[CyMSVR2
]);
1053 clear_bit(TTY_IO_ERROR
, &info
->tty
->flags
);
1056 local_irq_restore(flags
);
1058 } /* config_setup */
1060 static int cy_put_char(struct tty_struct
*tty
, unsigned char ch
)
1062 struct cyclades_port
*info
= tty
->driver_data
;
1063 unsigned long flags
;
1065 #ifdef SERIAL_DEBUG_IO
1066 printk("cy_put_char %s(0x%02x)\n", tty
->name
, ch
);
1069 if (serial_paranoia_check(info
, tty
->name
, "cy_put_char"))
1072 if (!info
->xmit_buf
)
1075 local_irq_save(flags
);
1076 if (info
->xmit_cnt
>= PAGE_SIZE
- 1) {
1077 local_irq_restore(flags
);
1081 info
->xmit_buf
[info
->xmit_head
++] = ch
;
1082 info
->xmit_head
&= PAGE_SIZE
- 1;
1084 local_irq_restore(flags
);
1088 static void cy_flush_chars(struct tty_struct
*tty
)
1090 struct cyclades_port
*info
= tty
->driver_data
;
1091 unsigned long flags
;
1092 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
1095 #ifdef SERIAL_DEBUG_IO
1096 printk("cy_flush_chars %s\n", tty
->name
); /* */
1099 if (serial_paranoia_check(info
, tty
->name
, "cy_flush_chars"))
1102 if (info
->xmit_cnt
<= 0 || tty
->stopped
1103 || tty
->hw_stopped
|| !info
->xmit_buf
)
1106 channel
= info
->line
;
1108 local_irq_save(flags
);
1109 base_addr
[CyCAR
] = channel
;
1110 base_addr
[CyIER
] |= CyTxMpty
;
1111 local_irq_restore(flags
);
1112 } /* cy_flush_chars */
1114 /* This routine gets called when tty_write has put something into
1115 the write_queue. If the port is not already transmitting stuff,
1116 start it off by enabling interrupts. The interrupt service
1117 routine will then ensure that the characters are sent. If the
1118 port is already active, there is no need to kick it.
1120 static int cy_write(struct tty_struct
*tty
, const unsigned char *buf
, int count
)
1122 struct cyclades_port
*info
= tty
->driver_data
;
1123 unsigned long flags
;
1126 #ifdef SERIAL_DEBUG_IO
1127 printk("cy_write %s\n", tty
->name
); /* */
1130 if (serial_paranoia_check(info
, tty
->name
, "cy_write")) {
1134 if (!info
->xmit_buf
) {
1139 local_irq_save(flags
);
1140 c
= min_t(int, count
, min(SERIAL_XMIT_SIZE
- info
->xmit_cnt
- 1,
1141 SERIAL_XMIT_SIZE
- info
->xmit_head
));
1143 local_irq_restore(flags
);
1147 memcpy(info
->xmit_buf
+ info
->xmit_head
, buf
, c
);
1149 (info
->xmit_head
+ c
) & (SERIAL_XMIT_SIZE
- 1);
1150 info
->xmit_cnt
+= c
;
1151 local_irq_restore(flags
);
1158 if (info
->xmit_cnt
&& !tty
->stopped
&& !tty
->hw_stopped
) {
1164 static int cy_write_room(struct tty_struct
*tty
)
1166 struct cyclades_port
*info
= tty
->driver_data
;
1169 #ifdef SERIAL_DEBUG_IO
1170 printk("cy_write_room %s\n", tty
->name
); /* */
1173 if (serial_paranoia_check(info
, tty
->name
, "cy_write_room"))
1175 ret
= PAGE_SIZE
- info
->xmit_cnt
- 1;
1179 } /* cy_write_room */
1181 static int cy_chars_in_buffer(struct tty_struct
*tty
)
1183 struct cyclades_port
*info
= tty
->driver_data
;
1185 #ifdef SERIAL_DEBUG_IO
1186 printk("cy_chars_in_buffer %s %d\n", tty
->name
, info
->xmit_cnt
); /* */
1189 if (serial_paranoia_check(info
, tty
->name
, "cy_chars_in_buffer"))
1192 return info
->xmit_cnt
;
1193 } /* cy_chars_in_buffer */
1195 static void cy_flush_buffer(struct tty_struct
*tty
)
1197 struct cyclades_port
*info
= tty
->driver_data
;
1198 unsigned long flags
;
1200 #ifdef SERIAL_DEBUG_IO
1201 printk("cy_flush_buffer %s\n", tty
->name
); /* */
1204 if (serial_paranoia_check(info
, tty
->name
, "cy_flush_buffer"))
1206 local_irq_save(flags
);
1207 info
->xmit_cnt
= info
->xmit_head
= info
->xmit_tail
= 0;
1208 local_irq_restore(flags
);
1210 } /* cy_flush_buffer */
1212 /* This routine is called by the upper-layer tty layer to signal
1213 that incoming characters should be throttled or that the
1214 throttle should be released.
1216 static void cy_throttle(struct tty_struct
*tty
)
1218 struct cyclades_port
*info
= tty
->driver_data
;
1219 unsigned long flags
;
1220 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
1223 #ifdef SERIAL_DEBUG_THROTTLE
1226 printk("throttle %s: %d....\n", tty_name(tty
, buf
),
1227 tty
->ldisc
.chars_in_buffer(tty
));
1228 printk("cy_throttle %s\n", tty
->name
);
1231 if (serial_paranoia_check(info
, tty
->name
, "cy_nthrottle")) {
1236 info
->x_char
= STOP_CHAR(tty
);
1237 /* Should use the "Send Special Character" feature!!! */
1240 channel
= info
->line
;
1242 local_irq_save(flags
);
1243 base_addr
[CyCAR
] = (u_char
) channel
;
1244 base_addr
[CyMSVR1
] = 0;
1245 local_irq_restore(flags
);
1248 static void cy_unthrottle(struct tty_struct
*tty
)
1250 struct cyclades_port
*info
= tty
->driver_data
;
1251 unsigned long flags
;
1252 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
1255 #ifdef SERIAL_DEBUG_THROTTLE
1258 printk("throttle %s: %d....\n", tty_name(tty
, buf
),
1259 tty
->ldisc
.chars_in_buffer(tty
));
1260 printk("cy_unthrottle %s\n", tty
->name
);
1263 if (serial_paranoia_check(info
, tty
->name
, "cy_nthrottle")) {
1268 info
->x_char
= START_CHAR(tty
);
1269 /* Should use the "Send Special Character" feature!!! */
1272 channel
= info
->line
;
1274 local_irq_save(flags
);
1275 base_addr
[CyCAR
] = (u_char
) channel
;
1276 base_addr
[CyMSVR1
] = CyRTS
;
1277 local_irq_restore(flags
);
1278 } /* cy_unthrottle */
1281 get_serial_info(struct cyclades_port
*info
,
1282 struct serial_struct __user
* retinfo
)
1284 struct serial_struct tmp
;
1289 memset(&tmp
, 0, sizeof(tmp
));
1290 tmp
.type
= info
->type
;
1291 tmp
.line
= info
->line
;
1292 tmp
.port
= info
->line
;
1294 tmp
.flags
= info
->flags
;
1295 tmp
.baud_base
= 0; /*!!! */
1296 tmp
.close_delay
= info
->close_delay
;
1297 tmp
.custom_divisor
= 0; /*!!! */
1298 tmp
.hub6
= 0; /*!!! */
1299 return copy_to_user(retinfo
, &tmp
, sizeof(*retinfo
)) ? -EFAULT
: 0;
1300 } /* get_serial_info */
1303 set_serial_info(struct cyclades_port
*info
,
1304 struct serial_struct __user
* new_info
)
1306 struct serial_struct new_serial
;
1307 struct cyclades_port old_info
;
1312 if (copy_from_user(&new_serial
, new_info
, sizeof(new_serial
)))
1316 if (!capable(CAP_SYS_ADMIN
)) {
1317 if ((new_serial
.close_delay
!= info
->close_delay
) ||
1318 ((new_serial
.flags
& ASYNC_FLAGS
& ~ASYNC_USR_MASK
) !=
1319 (info
->flags
& ASYNC_FLAGS
& ~ASYNC_USR_MASK
)))
1321 info
->flags
= ((info
->flags
& ~ASYNC_USR_MASK
) |
1322 (new_serial
.flags
& ASYNC_USR_MASK
));
1323 goto check_and_exit
;
1327 * OK, past this point, all the error checking has been done.
1328 * At this point, we start making changes.....
1331 info
->flags
= ((info
->flags
& ~ASYNC_FLAGS
) |
1332 (new_serial
.flags
& ASYNC_FLAGS
));
1333 info
->close_delay
= new_serial
.close_delay
;
1336 if (info
->flags
& ASYNC_INITIALIZED
) {
1340 return startup(info
);
1341 } /* set_serial_info */
1343 static int cy_tiocmget(struct tty_struct
*tty
, struct file
*file
)
1345 struct cyclades_port
*info
= tty
->driver_data
;
1347 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
1348 unsigned long flags
;
1349 unsigned char status
;
1351 channel
= info
->line
;
1353 local_irq_save(flags
);
1354 base_addr
[CyCAR
] = (u_char
) channel
;
1355 status
= base_addr
[CyMSVR1
] | base_addr
[CyMSVR2
];
1356 local_irq_restore(flags
);
1358 return ((status
& CyRTS
) ? TIOCM_RTS
: 0)
1359 | ((status
& CyDTR
) ? TIOCM_DTR
: 0)
1360 | ((status
& CyDCD
) ? TIOCM_CAR
: 0)
1361 | ((status
& CyDSR
) ? TIOCM_DSR
: 0)
1362 | ((status
& CyCTS
) ? TIOCM_CTS
: 0);
1366 cy_tiocmset(struct tty_struct
*tty
, struct file
*file
,
1367 unsigned int set
, unsigned int clear
)
1369 struct cyclades_port
*info
= tty
->driver_data
;
1371 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
1372 unsigned long flags
;
1374 channel
= info
->line
;
1376 if (set
& TIOCM_RTS
) {
1377 local_irq_save(flags
);
1378 base_addr
[CyCAR
] = (u_char
) channel
;
1379 base_addr
[CyMSVR1
] = CyRTS
;
1380 local_irq_restore(flags
);
1382 if (set
& TIOCM_DTR
) {
1383 local_irq_save(flags
);
1384 base_addr
[CyCAR
] = (u_char
) channel
;
1385 /* CP('S');CP('2'); */
1386 base_addr
[CyMSVR2
] = CyDTR
;
1387 #ifdef SERIAL_DEBUG_DTR
1388 printk("cyc: %d: raising DTR\n", __LINE__
);
1389 printk(" status: 0x%x, 0x%x\n", base_addr
[CyMSVR1
],
1390 base_addr
[CyMSVR2
]);
1392 local_irq_restore(flags
);
1395 if (clear
& TIOCM_RTS
) {
1396 local_irq_save(flags
);
1397 base_addr
[CyCAR
] = (u_char
) channel
;
1398 base_addr
[CyMSVR1
] = 0;
1399 local_irq_restore(flags
);
1401 if (clear
& TIOCM_DTR
) {
1402 local_irq_save(flags
);
1403 base_addr
[CyCAR
] = (u_char
) channel
;
1404 /* CP('C');CP('2'); */
1405 base_addr
[CyMSVR2
] = 0;
1406 #ifdef SERIAL_DEBUG_DTR
1407 printk("cyc: %d: dropping DTR\n", __LINE__
);
1408 printk(" status: 0x%x, 0x%x\n", base_addr
[CyMSVR1
],
1409 base_addr
[CyMSVR2
]);
1411 local_irq_restore(flags
);
1415 } /* set_modem_info */
1417 static void send_break(struct cyclades_port
*info
, int duration
)
1418 { /* Let the transmit ISR take care of this (since it
1419 requires stuffing characters into the output stream).
1421 info
->x_break
= duration
;
1422 if (!info
->xmit_cnt
) {
1428 get_mon_info(struct cyclades_port
*info
, struct cyclades_monitor __user
* mon
)
1431 if (copy_to_user(mon
, &info
->mon
, sizeof(struct cyclades_monitor
)))
1433 info
->mon
.int_count
= 0;
1434 info
->mon
.char_count
= 0;
1435 info
->mon
.char_max
= 0;
1436 info
->mon
.char_last
= 0;
1440 static int set_threshold(struct cyclades_port
*info
, unsigned long __user
* arg
)
1442 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
1443 unsigned long value
;
1446 if (get_user(value
, arg
))
1449 channel
= info
->line
;
1450 info
->cor4
&= ~CyREC_FIFO
;
1451 info
->cor4
|= value
& CyREC_FIFO
;
1452 base_addr
[CyCOR4
] = info
->cor4
;
1457 get_threshold(struct cyclades_port
*info
, unsigned long __user
* value
)
1459 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
1463 channel
= info
->line
;
1465 tmp
= base_addr
[CyCOR4
] & CyREC_FIFO
;
1466 return put_user(tmp
, value
);
1470 set_default_threshold(struct cyclades_port
*info
, unsigned long __user
* arg
)
1472 unsigned long value
;
1474 if (get_user(value
, arg
))
1477 info
->default_threshold
= value
& 0x0f;
1482 get_default_threshold(struct cyclades_port
*info
, unsigned long __user
* value
)
1484 return put_user(info
->default_threshold
, value
);
1487 static int set_timeout(struct cyclades_port
*info
, unsigned long __user
* arg
)
1489 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
1491 unsigned long value
;
1493 if (get_user(value
, arg
))
1496 channel
= info
->line
;
1498 base_addr
[CyRTPRL
] = value
& 0xff;
1499 base_addr
[CyRTPRH
] = (value
>> 8) & 0xff;
1503 static int get_timeout(struct cyclades_port
*info
, unsigned long __user
* value
)
1505 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
1509 channel
= info
->line
;
1511 tmp
= base_addr
[CyRTPRL
];
1512 return put_user(tmp
, value
);
1515 static int set_default_timeout(struct cyclades_port
*info
, unsigned long value
)
1517 info
->default_timeout
= value
& 0xff;
1522 get_default_timeout(struct cyclades_port
*info
, unsigned long __user
* value
)
1524 return put_user(info
->default_timeout
, value
);
1528 cy_ioctl(struct tty_struct
*tty
, struct file
*file
,
1529 unsigned int cmd
, unsigned long arg
)
1532 struct cyclades_port
*info
= tty
->driver_data
;
1534 void __user
*argp
= (void __user
*)arg
;
1536 #ifdef SERIAL_DEBUG_OTHER
1537 printk("cy_ioctl %s, cmd = %x arg = %lx\n", tty
->name
, cmd
, arg
); /* */
1544 ret_val
= get_mon_info(info
, argp
);
1547 ret_val
= get_threshold(info
, argp
);
1550 ret_val
= set_threshold(info
, argp
);
1552 case CYGETDEFTHRESH
:
1553 ret_val
= get_default_threshold(info
, argp
);
1555 case CYSETDEFTHRESH
:
1556 ret_val
= set_default_threshold(info
, argp
);
1559 ret_val
= get_timeout(info
, argp
);
1562 ret_val
= set_timeout(info
, argp
);
1564 case CYGETDEFTIMEOUT
:
1565 ret_val
= get_default_timeout(info
, argp
);
1567 case CYSETDEFTIMEOUT
:
1568 ret_val
= set_default_timeout(info
, (unsigned long)arg
);
1570 case TCSBRK
: /* SVID version: non-zero arg --> no break */
1571 ret_val
= tty_check_change(tty
);
1574 tty_wait_until_sent(tty
, 0);
1576 send_break(info
, HZ
/ 4); /* 1/4 second */
1578 case TCSBRKP
: /* support for POSIX tcsendbreak() */
1579 ret_val
= tty_check_change(tty
);
1582 tty_wait_until_sent(tty
, 0);
1583 send_break(info
, arg
? arg
* (HZ
/ 10) : HZ
/ 4);
1586 /* The following commands are incompletely implemented!!! */
1588 ret_val
= get_serial_info(info
, argp
);
1591 ret_val
= set_serial_info(info
, argp
);
1594 ret_val
= -ENOIOCTLCMD
;
1598 #ifdef SERIAL_DEBUG_OTHER
1599 printk("cy_ioctl done\n");
1605 static void cy_set_termios(struct tty_struct
*tty
, struct ktermios
*old_termios
)
1607 struct cyclades_port
*info
= tty
->driver_data
;
1609 #ifdef SERIAL_DEBUG_OTHER
1610 printk("cy_set_termios %s\n", tty
->name
);
1613 if (tty
->termios
->c_cflag
== old_termios
->c_cflag
)
1617 if ((old_termios
->c_cflag
& CRTSCTS
) &&
1618 !(tty
->termios
->c_cflag
& CRTSCTS
)) {
1622 #ifdef tytso_patch_94Nov25_1726
1623 if (!(old_termios
->c_cflag
& CLOCAL
) &&
1624 (tty
->termios
->c_cflag
& CLOCAL
))
1625 wake_up_interruptible(&info
->open_wait
);
1627 } /* cy_set_termios */
1629 static void cy_close(struct tty_struct
*tty
, struct file
*filp
)
1631 struct cyclades_port
*info
= tty
->driver_data
;
1634 #ifdef SERIAL_DEBUG_OTHER
1635 printk("cy_close %s\n", tty
->name
);
1638 if (!info
|| serial_paranoia_check(info
, tty
->name
, "cy_close")) {
1641 #ifdef SERIAL_DEBUG_OPEN
1642 printk("cy_close %s, count = %d\n", tty
->name
, info
->count
);
1645 if ((tty
->count
== 1) && (info
->count
!= 1)) {
1647 * Uh, oh. tty->count is 1, which means that the tty
1648 * structure will be freed. Info->count should always
1649 * be one in these conditions. If it's greater than
1650 * one, we've got real problems, since it means the
1651 * serial port won't be shutdown.
1653 printk("cy_close: bad serial port count; tty->count is 1, "
1654 "info->count is %d\n", info
->count
);
1657 #ifdef SERIAL_DEBUG_COUNT
1658 printk("cyc: %d: decrementing count to %d\n", __LINE__
,
1661 if (--info
->count
< 0) {
1662 printk("cy_close: bad serial port count for ttys%d: %d\n",
1663 info
->line
, info
->count
);
1664 #ifdef SERIAL_DEBUG_COUNT
1665 printk("cyc: %d: setting count to 0\n", __LINE__
);
1671 info
->flags
|= ASYNC_CLOSING
;
1672 if (info
->flags
& ASYNC_INITIALIZED
)
1673 tty_wait_until_sent(tty
, 3000); /* 30 seconds timeout */
1675 cy_flush_buffer(tty
);
1676 tty_ldisc_flush(tty
);
1678 if (info
->blocked_open
) {
1679 if (info
->close_delay
) {
1680 msleep_interruptible(jiffies_to_msecs
1681 (info
->close_delay
));
1683 wake_up_interruptible(&info
->open_wait
);
1685 info
->flags
&= ~(ASYNC_NORMAL_ACTIVE
| ASYNC_CLOSING
);
1686 wake_up_interruptible(&info
->close_wait
);
1688 #ifdef SERIAL_DEBUG_OTHER
1689 printk("cy_close done\n");
1694 * cy_hangup() --- called by tty_hangup() when a hangup is signaled.
1696 void cy_hangup(struct tty_struct
*tty
)
1698 struct cyclades_port
*info
= tty
->driver_data
;
1700 #ifdef SERIAL_DEBUG_OTHER
1701 printk("cy_hangup %s\n", tty
->name
); /* */
1704 if (serial_paranoia_check(info
, tty
->name
, "cy_hangup"))
1711 #ifdef SERIAL_DEBUG_COUNT
1712 printk("cyc: %d: setting count to 0\n", __LINE__
);
1716 info
->flags
&= ~ASYNC_NORMAL_ACTIVE
;
1717 wake_up_interruptible(&info
->open_wait
);
1721 * ------------------------------------------------------------
1722 * cy_open() and friends
1723 * ------------------------------------------------------------
1727 block_til_ready(struct tty_struct
*tty
, struct file
*filp
,
1728 struct cyclades_port
*info
)
1730 DECLARE_WAITQUEUE(wait
, current
);
1731 unsigned long flags
;
1734 volatile u_char
*base_addr
= (u_char
*) BASE_ADDR
;
1737 * If the device is in the middle of being closed, then block
1738 * until it's done, and then try again.
1740 if (info
->flags
& ASYNC_CLOSING
) {
1741 interruptible_sleep_on(&info
->close_wait
);
1742 if (info
->flags
& ASYNC_HUP_NOTIFY
) {
1745 return -ERESTARTSYS
;
1750 * If non-blocking mode is set, then make the check up front
1753 if (filp
->f_flags
& O_NONBLOCK
) {
1754 info
->flags
|= ASYNC_NORMAL_ACTIVE
;
1759 * Block waiting for the carrier detect and the line to become
1760 * free (i.e., not in use by the callout). While we are in
1761 * this loop, info->count is dropped by one, so that
1762 * cy_close() knows when to free things. We restore it upon
1763 * exit, either normal or abnormal.
1766 add_wait_queue(&info
->open_wait
, &wait
);
1767 #ifdef SERIAL_DEBUG_OPEN
1768 printk("block_til_ready before block: %s, count = %d\n",
1769 tty
->name
, info
->count
);
1773 #ifdef SERIAL_DEBUG_COUNT
1774 printk("cyc: %d: decrementing count to %d\n", __LINE__
, info
->count
);
1776 info
->blocked_open
++;
1778 channel
= info
->line
;
1781 local_irq_save(flags
);
1782 base_addr
[CyCAR
] = (u_char
) channel
;
1783 base_addr
[CyMSVR1
] = CyRTS
;
1784 /* CP('S');CP('4'); */
1785 base_addr
[CyMSVR2
] = CyDTR
;
1786 #ifdef SERIAL_DEBUG_DTR
1787 printk("cyc: %d: raising DTR\n", __LINE__
);
1788 printk(" status: 0x%x, 0x%x\n", base_addr
[CyMSVR1
],
1789 base_addr
[CyMSVR2
]);
1791 local_irq_restore(flags
);
1792 set_current_state(TASK_INTERRUPTIBLE
);
1793 if (tty_hung_up_p(filp
)
1794 || !(info
->flags
& ASYNC_INITIALIZED
)) {
1795 if (info
->flags
& ASYNC_HUP_NOTIFY
) {
1798 retval
= -ERESTARTSYS
;
1802 local_irq_save(flags
);
1803 base_addr
[CyCAR
] = (u_char
) channel
;
1804 /* CP('L');CP1(1 && C_CLOCAL(tty)); CP1(1 && (base_addr[CyMSVR1] & CyDCD) ); */
1805 if (!(info
->flags
& ASYNC_CLOSING
)
1807 || (base_addr
[CyMSVR1
] & CyDCD
))) {
1808 local_irq_restore(flags
);
1811 local_irq_restore(flags
);
1812 if (signal_pending(current
)) {
1813 retval
= -ERESTARTSYS
;
1816 #ifdef SERIAL_DEBUG_OPEN
1817 printk("block_til_ready blocking: %s, count = %d\n",
1818 tty
->name
, info
->count
);
1823 __set_current_state(TASK_RUNNING
);
1824 remove_wait_queue(&info
->open_wait
, &wait
);
1825 if (!tty_hung_up_p(filp
)) {
1827 #ifdef SERIAL_DEBUG_COUNT
1828 printk("cyc: %d: incrementing count to %d\n", __LINE__
,
1832 info
->blocked_open
--;
1833 #ifdef SERIAL_DEBUG_OPEN
1834 printk("block_til_ready after blocking: %s, count = %d\n",
1835 tty
->name
, info
->count
);
1840 info
->flags
|= ASYNC_NORMAL_ACTIVE
;
1842 } /* block_til_ready */
1845 * This routine is called whenever a serial port is opened. It
1846 * performs the serial-specific initialization for the tty structure.
1848 int cy_open(struct tty_struct
*tty
, struct file
*filp
)
1850 struct cyclades_port
*info
;
1855 if ((line
< 0) || (NR_PORTS
<= line
)) {
1858 info
= &cy_port
[line
];
1859 if (info
->line
< 0) {
1862 #ifdef SERIAL_DEBUG_OTHER
1863 printk("cy_open %s\n", tty
->name
); /* */
1865 if (serial_paranoia_check(info
, tty
->name
, "cy_open")) {
1868 #ifdef SERIAL_DEBUG_OPEN
1869 printk("cy_open %s, count = %d\n", tty
->name
, info
->count
);
1873 #ifdef SERIAL_DEBUG_COUNT
1874 printk("cyc: %d: incrementing count to %d\n", __LINE__
, info
->count
);
1876 tty
->driver_data
= info
;
1880 * Start up serial port
1882 retval
= startup(info
);
1887 retval
= block_til_ready(tty
, filp
, info
);
1889 #ifdef SERIAL_DEBUG_OPEN
1890 printk("cy_open returning after block_til_ready with %d\n",
1895 #ifdef SERIAL_DEBUG_OPEN
1896 printk("cy_open done\n");
1903 * ---------------------------------------------------------------------
1904 * serial167_init() and friends
1906 * serial167_init() is called at boot-time to initialize the serial driver.
1907 * ---------------------------------------------------------------------
1911 * This routine prints out the appropriate serial driver version
1912 * number, and identifies which options were configured into this
1915 static void show_version(void)
1917 printk("MVME166/167 cd2401 driver\n");
1918 } /* show_version */
1920 /* initialize chips on card -- return number of valid
1921 chips (which is number of ports/4) */
1924 * This initialises the hardware to a reasonable state. It should
1925 * probe the chip first so as to copy 166-Bug setup as a default for
1926 * port 0. It initialises CMR to CyASYNC; that is never done again, so
1927 * as to limit the number of CyINIT_CHAN commands in normal running.
1929 * ... I wonder what I should do if this fails ...
1932 void mvme167_serial_console_setup(int cflag
)
1934 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
1937 u_char rcor
, rbpr
, badspeed
= 0;
1938 unsigned long flags
;
1940 local_irq_save(flags
);
1943 * First probe channel zero of the chip, to see what speed has
1947 base_addr
[CyCAR
] = 0;
1949 rcor
= base_addr
[CyRCOR
] << 5;
1950 rbpr
= base_addr
[CyRBPR
];
1952 for (spd
= 0; spd
< sizeof(baud_bpr
); spd
++)
1953 if (rbpr
== baud_bpr
[spd
] && rcor
== baud_co
[spd
])
1955 if (spd
>= sizeof(baud_bpr
)) {
1956 spd
= 14; /* 19200 */
1957 badspeed
= 1; /* Failed to identify speed */
1959 initial_console_speed
= spd
;
1961 /* OK, we have chosen a speed, now reset and reinitialise */
1963 my_udelay(20000L); /* Allow time for any active o/p to complete */
1964 if (base_addr
[CyCCR
] != 0x00) {
1965 local_irq_restore(flags
);
1966 /* printk(" chip is never idle (CCR != 0)\n"); */
1970 base_addr
[CyCCR
] = CyCHIP_RESET
; /* Reset the chip */
1973 if (base_addr
[CyGFRCR
] == 0x00) {
1974 local_irq_restore(flags
);
1975 /* printk(" chip is not responding (GFRCR stayed 0)\n"); */
1980 * System clock is 20Mhz, divided by 2048, so divide by 10 for a 1.0ms
1984 base_addr
[CyTPR
] = 10;
1986 base_addr
[CyPILR1
] = 0x01; /* Interrupt level for modem change */
1987 base_addr
[CyPILR2
] = 0x02; /* Interrupt level for tx ints */
1988 base_addr
[CyPILR3
] = 0x03; /* Interrupt level for rx ints */
1991 * Attempt to set up all channels to something reasonable, and
1992 * bang out a INIT_CHAN command. We should then be able to limit
1993 * the ammount of fiddling we have to do in normal running.
1996 for (ch
= 3; ch
>= 0; ch
--) {
1997 base_addr
[CyCAR
] = (u_char
) ch
;
1998 base_addr
[CyIER
] = 0;
1999 base_addr
[CyCMR
] = CyASYNC
;
2000 base_addr
[CyLICR
] = (u_char
) ch
<< 2;
2001 base_addr
[CyLIVR
] = 0x5c;
2002 base_addr
[CyTCOR
] = baud_co
[spd
];
2003 base_addr
[CyTBPR
] = baud_bpr
[spd
];
2004 base_addr
[CyRCOR
] = baud_co
[spd
] >> 5;
2005 base_addr
[CyRBPR
] = baud_bpr
[spd
];
2006 base_addr
[CySCHR1
] = 'Q' & 0x1f;
2007 base_addr
[CySCHR2
] = 'X' & 0x1f;
2008 base_addr
[CySCRL
] = 0;
2009 base_addr
[CySCRH
] = 0;
2010 base_addr
[CyCOR1
] = Cy_8_BITS
| CyPARITY_NONE
;
2011 base_addr
[CyCOR2
] = 0;
2012 base_addr
[CyCOR3
] = Cy_1_STOP
;
2013 base_addr
[CyCOR4
] = baud_cor4
[spd
];
2014 base_addr
[CyCOR5
] = 0;
2015 base_addr
[CyCOR6
] = 0;
2016 base_addr
[CyCOR7
] = 0;
2017 base_addr
[CyRTPRL
] = 2;
2018 base_addr
[CyRTPRH
] = 0;
2019 base_addr
[CyMSVR1
] = 0;
2020 base_addr
[CyMSVR2
] = 0;
2021 write_cy_cmd(base_addr
, CyINIT_CHAN
| CyDIS_RCVR
| CyDIS_XMTR
);
2025 * Now do specials for channel zero....
2028 base_addr
[CyMSVR1
] = CyRTS
;
2029 base_addr
[CyMSVR2
] = CyDTR
;
2030 base_addr
[CyIER
] = CyRxData
;
2031 write_cy_cmd(base_addr
, CyENB_RCVR
| CyENB_XMTR
);
2033 local_irq_restore(flags
);
2035 my_udelay(20000L); /* Let it all settle down */
2037 printk("CD2401 initialised, chip is rev 0x%02x\n", base_addr
[CyGFRCR
]);
2040 (" WARNING: Failed to identify line speed, rcor=%02x,rbpr=%02x\n",
2042 } /* serial_console_init */
2044 static const struct tty_operations cy_ops
= {
2048 .put_char
= cy_put_char
,
2049 .flush_chars
= cy_flush_chars
,
2050 .write_room
= cy_write_room
,
2051 .chars_in_buffer
= cy_chars_in_buffer
,
2052 .flush_buffer
= cy_flush_buffer
,
2054 .throttle
= cy_throttle
,
2055 .unthrottle
= cy_unthrottle
,
2056 .set_termios
= cy_set_termios
,
2059 .hangup
= cy_hangup
,
2060 .tiocmget
= cy_tiocmget
,
2061 .tiocmset
= cy_tiocmset
,
2064 /* The serial driver boot-time initialization code!
2065 Hardware I/O ports are mapped to character special devices on a
2066 first found, first allocated manner. That is, this code searches
2067 for Cyclom cards in the system. As each is found, it is probed
2068 to discover how many chips (and thus how many ports) are present.
2069 These ports are mapped to the tty ports 64 and upward in monotonic
2070 fashion. If an 8-port card is replaced with a 16-port card, the
2071 port mapping on a following card will shift.
2073 This approach is different from what is used in the other serial
2074 device driver because the Cyclom is more properly a multiplexer,
2075 not just an aggregation of serial ports on one card.
2077 If there are more cards with more ports than have been statically
2078 allocated above, a warning is printed and the extra ports are ignored.
2080 static int __init
serial167_init(void)
2082 struct cyclades_port
*info
;
2089 struct sigaction sa
;
2092 if (!(mvme16x_config
& MVME16x_CONFIG_GOT_CD2401
))
2095 cy_serial_driver
= alloc_tty_driver(NR_PORTS
);
2096 if (!cy_serial_driver
)
2105 /* Has "console=0,9600n8" been used in bootinfo to change speed? */
2106 if (serial_console_cflag
)
2107 DefSpeed
= serial_console_cflag
& 0017;
2109 DefSpeed
= initial_console_speed
;
2110 serial_console_info
= &cy_port
[0];
2111 serial_console_cflag
= DefSpeed
| CS8
;
2113 serial_console
= 64; /*callout_driver.minor_start */
2117 /* Initialize the tty_driver structure */
2119 cy_serial_driver
->owner
= THIS_MODULE
;
2120 cy_serial_driver
->name
= "ttyS";
2121 cy_serial_driver
->major
= TTY_MAJOR
;
2122 cy_serial_driver
->minor_start
= 64;
2123 cy_serial_driver
->type
= TTY_DRIVER_TYPE_SERIAL
;
2124 cy_serial_driver
->subtype
= SERIAL_TYPE_NORMAL
;
2125 cy_serial_driver
->init_termios
= tty_std_termios
;
2126 cy_serial_driver
->init_termios
.c_cflag
=
2127 B9600
| CS8
| CREAD
| HUPCL
| CLOCAL
;
2128 cy_serial_driver
->flags
= TTY_DRIVER_REAL_RAW
;
2129 tty_set_operations(cy_serial_driver
, &cy_ops
);
2131 ret
= tty_register_driver(cy_serial_driver
);
2133 printk(KERN_ERR
"Couldn't register MVME166/7 serial driver\n");
2134 put_tty_driver(cy_serial_driver
);
2140 for (index
= 0; index
< 1; index
++) {
2144 if (port_num
< NR_PORTS
) {
2145 while (good_ports
-- && port_num
< NR_PORTS
) {
2146 /*** initialize port ***/
2147 info
->magic
= CYCLADES_MAGIC
;
2148 info
->type
= PORT_CIRRUS
;
2150 info
->line
= port_num
;
2151 info
->flags
= STD_COM_FLAGS
;
2153 info
->xmit_fifo_size
= 12;
2154 info
->cor1
= CyPARITY_NONE
| Cy_8_BITS
;
2156 info
->cor3
= Cy_1_STOP
;
2157 info
->cor4
= 0x08; /* _very_ small receive threshold */
2161 info
->tbpr
= baud_bpr
[DefSpeed
]; /* Tx BPR */
2162 info
->tco
= baud_co
[DefSpeed
]; /* Tx CO */
2163 info
->rbpr
= baud_bpr
[DefSpeed
]; /* Rx BPR */
2164 info
->rco
= baud_co
[DefSpeed
] >> 5; /* Rx CO */
2165 info
->close_delay
= 0;
2168 #ifdef SERIAL_DEBUG_COUNT
2169 printk("cyc: %d: setting count to 0\n",
2172 info
->blocked_open
= 0;
2173 info
->default_threshold
= 0;
2174 info
->default_timeout
= 0;
2175 init_waitqueue_head(&info
->open_wait
);
2176 init_waitqueue_head(&info
->close_wait
);
2179 /*** !!!!!!!! this may expose new bugs !!!!!!!!! *********/
2180 info
->read_status_mask
=
2181 CyTIMEOUT
| CySPECHAR
| CyBREAK
| CyPARITY
|
2182 CyFRAME
| CyOVERRUN
;
2185 printk("ttyS%d ", info
->line
);
2188 if (!(port_num
& 7)) {
2195 while (port_num
< NR_PORTS
) {
2200 #ifdef CONFIG_REMOTE_DEBUG
2203 ret
= request_irq(MVME167_IRQ_SER_ERR
, cd2401_rxerr_interrupt
, 0,
2204 "cd2401_errors", cd2401_rxerr_interrupt
);
2206 printk(KERN_ERR
"Could't get cd2401_errors IRQ");
2207 goto cleanup_serial_driver
;
2210 ret
= request_irq(MVME167_IRQ_SER_MODEM
, cd2401_modem_interrupt
, 0,
2211 "cd2401_modem", cd2401_modem_interrupt
);
2213 printk(KERN_ERR
"Could't get cd2401_modem IRQ");
2214 goto cleanup_irq_cd2401_errors
;
2217 ret
= request_irq(MVME167_IRQ_SER_TX
, cd2401_tx_interrupt
, 0,
2218 "cd2401_txints", cd2401_tx_interrupt
);
2220 printk(KERN_ERR
"Could't get cd2401_txints IRQ");
2221 goto cleanup_irq_cd2401_modem
;
2224 ret
= request_irq(MVME167_IRQ_SER_RX
, cd2401_rx_interrupt
, 0,
2225 "cd2401_rxints", cd2401_rx_interrupt
);
2227 printk(KERN_ERR
"Could't get cd2401_rxints IRQ");
2228 goto cleanup_irq_cd2401_txints
;
2231 /* Now we have registered the interrupt handlers, allow the interrupts */
2233 pcc2chip
[PccSCCMICR
] = 0x15; /* Serial ints are level 5 */
2234 pcc2chip
[PccSCCTICR
] = 0x15;
2235 pcc2chip
[PccSCCRICR
] = 0x15;
2237 pcc2chip
[PccIMLR
] = 3; /* Allow PCC2 ints above 3!? */
2240 cleanup_irq_cd2401_txints
:
2241 free_irq(MVME167_IRQ_SER_TX
, cd2401_tx_interrupt
);
2242 cleanup_irq_cd2401_modem
:
2243 free_irq(MVME167_IRQ_SER_MODEM
, cd2401_modem_interrupt
);
2244 cleanup_irq_cd2401_errors
:
2245 free_irq(MVME167_IRQ_SER_ERR
, cd2401_rxerr_interrupt
);
2246 cleanup_serial_driver
:
2247 if (tty_unregister_driver(cy_serial_driver
))
2249 "Couldn't unregister MVME166/7 serial driver\n");
2250 put_tty_driver(cy_serial_driver
);
2252 } /* serial167_init */
2254 module_init(serial167_init
);
2256 #ifdef CYCLOM_SHOW_STATUS
2257 static void show_status(int line_num
)
2259 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
2261 struct cyclades_port
*info
;
2262 unsigned long flags
;
2264 info
= &cy_port
[line_num
];
2265 channel
= info
->line
;
2266 printk(" channel %d\n", channel
);
2267 /**/ printk(" cy_port\n");
2268 printk(" card line flags = %d %d %x\n",
2269 info
->card
, info
->line
, info
->flags
);
2271 (" *tty read_status_mask timeout xmit_fifo_size = %lx %x %x %x\n",
2272 (long)info
->tty
, info
->read_status_mask
, info
->timeout
,
2273 info
->xmit_fifo_size
);
2274 printk(" cor1,cor2,cor3,cor4,cor5,cor6,cor7 = %x %x %x %x %x %x %x\n",
2275 info
->cor1
, info
->cor2
, info
->cor3
, info
->cor4
, info
->cor5
,
2276 info
->cor6
, info
->cor7
);
2277 printk(" tbpr,tco,rbpr,rco = %d %d %d %d\n", info
->tbpr
, info
->tco
,
2278 info
->rbpr
, info
->rco
);
2279 printk(" close_delay event count = %d %d %d\n", info
->close_delay
,
2280 info
->event
, info
->count
);
2281 printk(" x_char blocked_open = %x %x\n", info
->x_char
,
2282 info
->blocked_open
);
2283 printk(" open_wait = %lx %lx %lx\n", (long)info
->open_wait
);
2285 local_irq_save(flags
);
2287 /* Global Registers */
2289 printk(" CyGFRCR %x\n", base_addr
[CyGFRCR
]);
2290 printk(" CyCAR %x\n", base_addr
[CyCAR
]);
2291 printk(" CyRISR %x\n", base_addr
[CyRISR
]);
2292 printk(" CyTISR %x\n", base_addr
[CyTISR
]);
2293 printk(" CyMISR %x\n", base_addr
[CyMISR
]);
2294 printk(" CyRIR %x\n", base_addr
[CyRIR
]);
2295 printk(" CyTIR %x\n", base_addr
[CyTIR
]);
2296 printk(" CyMIR %x\n", base_addr
[CyMIR
]);
2297 printk(" CyTPR %x\n", base_addr
[CyTPR
]);
2299 base_addr
[CyCAR
] = (u_char
) channel
;
2301 /* Virtual Registers */
2304 printk(" CyRIVR %x\n", base_addr
[CyRIVR
]);
2305 printk(" CyTIVR %x\n", base_addr
[CyTIVR
]);
2306 printk(" CyMIVR %x\n", base_addr
[CyMIVR
]);
2307 printk(" CyMISR %x\n", base_addr
[CyMISR
]);
2310 /* Channel Registers */
2312 printk(" CyCCR %x\n", base_addr
[CyCCR
]);
2313 printk(" CyIER %x\n", base_addr
[CyIER
]);
2314 printk(" CyCOR1 %x\n", base_addr
[CyCOR1
]);
2315 printk(" CyCOR2 %x\n", base_addr
[CyCOR2
]);
2316 printk(" CyCOR3 %x\n", base_addr
[CyCOR3
]);
2317 printk(" CyCOR4 %x\n", base_addr
[CyCOR4
]);
2318 printk(" CyCOR5 %x\n", base_addr
[CyCOR5
]);
2320 printk(" CyCCSR %x\n", base_addr
[CyCCSR
]);
2321 printk(" CyRDCR %x\n", base_addr
[CyRDCR
]);
2323 printk(" CySCHR1 %x\n", base_addr
[CySCHR1
]);
2324 printk(" CySCHR2 %x\n", base_addr
[CySCHR2
]);
2326 printk(" CySCHR3 %x\n", base_addr
[CySCHR3
]);
2327 printk(" CySCHR4 %x\n", base_addr
[CySCHR4
]);
2328 printk(" CySCRL %x\n", base_addr
[CySCRL
]);
2329 printk(" CySCRH %x\n", base_addr
[CySCRH
]);
2330 printk(" CyLNC %x\n", base_addr
[CyLNC
]);
2331 printk(" CyMCOR1 %x\n", base_addr
[CyMCOR1
]);
2332 printk(" CyMCOR2 %x\n", base_addr
[CyMCOR2
]);
2334 printk(" CyRTPRL %x\n", base_addr
[CyRTPRL
]);
2335 printk(" CyRTPRH %x\n", base_addr
[CyRTPRH
]);
2336 printk(" CyMSVR1 %x\n", base_addr
[CyMSVR1
]);
2337 printk(" CyMSVR2 %x\n", base_addr
[CyMSVR2
]);
2338 printk(" CyRBPR %x\n", base_addr
[CyRBPR
]);
2339 printk(" CyRCOR %x\n", base_addr
[CyRCOR
]);
2340 printk(" CyTBPR %x\n", base_addr
[CyTBPR
]);
2341 printk(" CyTCOR %x\n", base_addr
[CyTCOR
]);
2343 local_irq_restore(flags
);
2348 /* Dummy routine in mvme16x/config.c for now */
2350 /* Serial console setup. Called from linux/init/main.c */
2352 void console_setup(char *str
, int *ints
)
2355 int baud
, bits
, parity
;
2359 if (ints
[0] > 3 || ints
[1] > 3)
2362 /* Get baud, bits and parity */
2368 if ((s
= strchr(str
, ','))) {
2371 } while (*s
>= '0' && *s
<= '9');
2378 /* Now construct a cflag setting. */
2417 serial_console_info
= &cy_port
[ints
[1]];
2418 serial_console_cflag
= cflag
;
2419 serial_console
= ints
[1] + 64; /*callout_driver.minor_start */
2424 * The following is probably out of date for 2.1.x serial console stuff.
2426 * The console is registered early on from arch/m68k/kernel/setup.c, and
2427 * it therefore relies on the chip being setup correctly by 166-Bug. This
2428 * seems reasonable, as the serial port has been used to invoke the system
2429 * boot. It also means that this function must not rely on any data
2430 * initialisation performed by serial167_init() etc.
2432 * Of course, once the console has been registered, we had better ensure
2433 * that serial167_init() doesn't leave the chip non-functional.
2435 * The console must be locked when we get here.
2438 void serial167_console_write(struct console
*co
, const char *str
,
2441 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
2442 unsigned long flags
;
2443 volatile u_char sink
;
2449 local_irq_save(flags
);
2451 /* Ensure transmitter is enabled! */
2454 base_addr
[CyCAR
] = (u_char
) port
;
2455 while (base_addr
[CyCCR
])
2457 base_addr
[CyCCR
] = CyENB_XMTR
;
2459 ier
= base_addr
[CyIER
];
2460 base_addr
[CyIER
] = CyTxMpty
;
2463 if (pcc2chip
[PccSCCTICR
] & 0x20) {
2464 /* We have a Tx int. Acknowledge it */
2465 sink
= pcc2chip
[PccTPIACKR
];
2466 if ((base_addr
[CyLICR
] >> 2) == port
) {
2468 /* Last char of string is now output */
2469 base_addr
[CyTEOIR
] = CyNOTRANS
;
2473 base_addr
[CyTDR
] = '\n';
2477 } else if (*str
== '\n') {
2478 base_addr
[CyTDR
] = '\r';
2481 base_addr
[CyTDR
] = *str
++;
2484 base_addr
[CyTEOIR
] = 0;
2486 base_addr
[CyTEOIR
] = CyNOTRANS
;
2490 base_addr
[CyIER
] = ier
;
2492 local_irq_restore(flags
);
2495 static struct tty_driver
*serial167_console_device(struct console
*c
,
2499 return cy_serial_driver
;
2502 static struct console sercons
= {
2504 .write
= serial167_console_write
,
2505 .device
= serial167_console_device
,
2506 .flags
= CON_PRINTBUFFER
,
2510 static int __init
serial167_console_init(void)
2512 if (vme_brdtype
== VME_TYPE_MVME166
||
2513 vme_brdtype
== VME_TYPE_MVME167
||
2514 vme_brdtype
== VME_TYPE_MVME177
) {
2515 mvme167_serial_console_setup(0);
2516 register_console(&sercons
);
2521 console_initcall(serial167_console_init
);
2523 #ifdef CONFIG_REMOTE_DEBUG
2524 void putDebugChar(int c
)
2526 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
2527 unsigned long flags
;
2528 volatile u_char sink
;
2532 local_irq_save(flags
);
2534 /* Ensure transmitter is enabled! */
2537 base_addr
[CyCAR
] = (u_char
) port
;
2538 while (base_addr
[CyCCR
])
2540 base_addr
[CyCCR
] = CyENB_XMTR
;
2542 ier
= base_addr
[CyIER
];
2543 base_addr
[CyIER
] = CyTxMpty
;
2546 if (pcc2chip
[PccSCCTICR
] & 0x20) {
2547 /* We have a Tx int. Acknowledge it */
2548 sink
= pcc2chip
[PccTPIACKR
];
2549 if ((base_addr
[CyLICR
] >> 2) == port
) {
2550 base_addr
[CyTDR
] = c
;
2551 base_addr
[CyTEOIR
] = 0;
2554 base_addr
[CyTEOIR
] = CyNOTRANS
;
2558 base_addr
[CyIER
] = ier
;
2560 local_irq_restore(flags
);
2565 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
2566 unsigned long flags
;
2567 volatile u_char sink
;
2573 if (i
!= debugiq
.in
) {
2575 if (++i
== DEBUG_LEN
)
2580 /* OK, nothing in queue, wait in poll loop */
2582 local_irq_save(flags
);
2584 /* Ensure receiver is enabled! */
2587 base_addr
[CyCAR
] = (u_char
) port
;
2589 while (base_addr
[CyCCR
])
2591 base_addr
[CyCCR
] = CyENB_RCVR
;
2593 ier
= base_addr
[CyIER
];
2594 base_addr
[CyIER
] = CyRxData
;
2597 if (pcc2chip
[PccSCCRICR
] & 0x20) {
2598 /* We have a Rx int. Acknowledge it */
2599 sink
= pcc2chip
[PccRPIACKR
];
2600 if ((base_addr
[CyLICR
] >> 2) == port
) {
2601 int cnt
= base_addr
[CyRFOC
];
2603 c
= base_addr
[CyRDR
];
2606 ("!! debug char is null (cnt=%d) !!",
2611 base_addr
[CyREOIR
] = 0;
2613 if (i
== debugiq
.in
)
2614 panic("Debug input queue empty!");
2616 if (++i
== DEBUG_LEN
)
2621 base_addr
[CyREOIR
] = CyNOTRANS
;
2625 base_addr
[CyIER
] = ier
;
2627 local_irq_restore(flags
);
2632 void queueDebugChar(int c
)
2638 if (++i
== DEBUG_LEN
)
2640 if (i
!= debugiq
.out
)
2644 static void debug_setup()
2646 unsigned long flags
;
2647 volatile unsigned char *base_addr
= (u_char
*) BASE_ADDR
;
2652 local_irq_save(flags
);
2654 for (i
= 0; i
< 4; i
++) {
2655 base_addr
[CyCAR
] = i
;
2656 base_addr
[CyLICR
] = i
<< 2;
2659 debugiq
.in
= debugiq
.out
= 0;
2661 base_addr
[CyCAR
] = DEBUG_PORT
;
2666 base_addr
[CyIER
] = 0;
2668 base_addr
[CyCMR
] = CyASYNC
;
2669 base_addr
[CyLICR
] = DEBUG_PORT
<< 2;
2670 base_addr
[CyLIVR
] = 0x5c;
2672 /* tx and rx baud rate */
2674 base_addr
[CyTCOR
] = baud_co
[i
];
2675 base_addr
[CyTBPR
] = baud_bpr
[i
];
2676 base_addr
[CyRCOR
] = baud_co
[i
] >> 5;
2677 base_addr
[CyRBPR
] = baud_bpr
[i
];
2679 /* set line characteristics according configuration */
2681 base_addr
[CySCHR1
] = 0;
2682 base_addr
[CySCHR2
] = 0;
2683 base_addr
[CySCRL
] = 0;
2684 base_addr
[CySCRH
] = 0;
2685 base_addr
[CyCOR1
] = Cy_8_BITS
| CyPARITY_NONE
;
2686 base_addr
[CyCOR2
] = 0;
2687 base_addr
[CyCOR3
] = Cy_1_STOP
;
2688 base_addr
[CyCOR4
] = baud_cor4
[i
];
2689 base_addr
[CyCOR5
] = 0;
2690 base_addr
[CyCOR6
] = 0;
2691 base_addr
[CyCOR7
] = 0;
2693 write_cy_cmd(base_addr
, CyINIT_CHAN
);
2694 write_cy_cmd(base_addr
, CyENB_RCVR
);
2696 base_addr
[CyCAR
] = DEBUG_PORT
; /* !!! Is this needed? */
2698 base_addr
[CyRTPRL
] = 2;
2699 base_addr
[CyRTPRH
] = 0;
2701 base_addr
[CyMSVR1
] = CyRTS
;
2702 base_addr
[CyMSVR2
] = CyDTR
;
2704 base_addr
[CyIER
] = CyRxData
;
2706 local_irq_restore(flags
);
2712 MODULE_LICENSE("GPL");