xref: /openbmc/linux/drivers/tty/amiserial.c (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1  // SPDX-License-Identifier: GPL-2.0
2  /*
3   * Serial driver for the amiga builtin port.
4   *
5   * This code was created by taking serial.c version 4.30 from kernel
6   * release 2.3.22, replacing all hardware related stuff with the
7   * corresponding amiga hardware actions, and removing all irrelevant
8   * code. As a consequence, it uses many of the constants and names
9   * associated with the registers and bits of 16550 compatible UARTS -
10   * but only to keep track of status, etc in the state variables. It
11   * was done this was to make it easier to keep the code in line with
12   * (non hardware specific) changes to serial.c.
13   *
14   * The port is registered with the tty driver as minor device 64, and
15   * therefore other ports should only use 65 upwards.
16   *
17   * Richard Lucock 28/12/99
18   *
19   *  Copyright (C) 1991, 1992  Linus Torvalds
20   *  Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997,
21   * 		1998, 1999  Theodore Ts'o
22   *
23   */
24  
25  /* Set of debugging defines */
26  
27  #undef SERIAL_DEBUG_INTR
28  #undef SERIAL_DEBUG_OPEN
29  #undef SERIAL_DEBUG_FLOW
30  #undef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
31  
32  /*
33   * End of serial driver configuration section.
34   */
35  
36  #include <linux/bitops.h>
37  #include <linux/circ_buf.h>
38  #include <linux/console.h>
39  #include <linux/delay.h>
40  #include <linux/errno.h>
41  #include <linux/fcntl.h>
42  #include <linux/init.h>
43  #include <linux/interrupt.h>
44  #include <linux/ioport.h>
45  #include <linux/kernel.h>
46  #include <linux/major.h>
47  #include <linux/mm.h>
48  #include <linux/module.h>
49  #include <linux/platform_device.h>
50  #include <linux/ptrace.h>
51  #include <linux/seq_file.h>
52  #include <linux/serial.h>
53  #include <linux/serial_reg.h>
54  #include <linux/serial_core.h>
55  #include <linux/sched.h>
56  #include <linux/signal.h>
57  #include <linux/slab.h>
58  #include <linux/string.h>
59  #include <linux/timer.h>
60  #include <linux/tty_flip.h>
61  #include <linux/tty.h>
62  #include <linux/types.h>
63  #include <linux/uaccess.h>
64  
65  #include <asm/amigahw.h>
66  #include <asm/amigaints.h>
67  #include <asm/irq.h>
68  #include <asm/setup.h>
69  
70  struct serial_state {
71  	struct tty_port		tport;
72  	struct circ_buf		xmit;
73  	struct async_icount	icount;
74  
75  	unsigned long		port;
76  	int			baud_base;
77  	int			custom_divisor;
78  	int			read_status_mask;
79  	int			ignore_status_mask;
80  	int			timeout;
81  	int			quot;
82  	int			IER; 	/* Interrupt Enable Register */
83  	int			MCR; 	/* Modem control register */
84  	int			x_char;	/* xon/xoff character */
85  };
86  
87  static struct tty_driver *serial_driver;
88  
89  /* number of characters left in xmit buffer before we ask for more */
90  #define WAKEUP_CHARS 256
91  
92  #define XMIT_FIFO_SIZE 1
93  
94  static unsigned char current_ctl_bits;
95  
96  static void change_speed(struct tty_struct *tty, struct serial_state *info,
97  			 const struct ktermios *old);
98  static void rs_wait_until_sent(struct tty_struct *tty, int timeout);
99  
100  
101  static struct serial_state serial_state;
102  
103  /* some serial hardware definitions */
104  #define SDR_OVRUN   (1<<15)
105  #define SDR_RBF     (1<<14)
106  #define SDR_TBE     (1<<13)
107  #define SDR_TSRE    (1<<12)
108  
109  #define SERPER_PARENB    (1<<15)
110  
111  #define AC_SETCLR   (1<<15)
112  #define AC_UARTBRK  (1<<11)
113  
114  #define SER_DTR     (1<<7)
115  #define SER_RTS     (1<<6)
116  #define SER_DCD     (1<<5)
117  #define SER_CTS     (1<<4)
118  #define SER_DSR     (1<<3)
119  
rtsdtr_ctrl(int bits)120  static __inline__ void rtsdtr_ctrl(int bits)
121  {
122      ciab.pra = ((bits & (SER_RTS | SER_DTR)) ^ (SER_RTS | SER_DTR)) | (ciab.pra & ~(SER_RTS | SER_DTR));
123  }
124  
125  /*
126   * ------------------------------------------------------------
127   * rs_stop() and rs_start()
128   *
129   * This routines are called before setting or resetting tty->flow.stopped.
130   * They enable or disable transmitter interrupts, as necessary.
131   * ------------------------------------------------------------
132   */
rs_stop(struct tty_struct * tty)133  static void rs_stop(struct tty_struct *tty)
134  {
135  	struct serial_state *info = tty->driver_data;
136  	unsigned long flags;
137  
138  	local_irq_save(flags);
139  	if (info->IER & UART_IER_THRI) {
140  		info->IER &= ~UART_IER_THRI;
141  		/* disable Tx interrupt and remove any pending interrupts */
142  		amiga_custom.intena = IF_TBE;
143  		mb();
144  		amiga_custom.intreq = IF_TBE;
145  		mb();
146  	}
147  	local_irq_restore(flags);
148  }
149  
rs_start(struct tty_struct * tty)150  static void rs_start(struct tty_struct *tty)
151  {
152  	struct serial_state *info = tty->driver_data;
153  	unsigned long flags;
154  
155  	local_irq_save(flags);
156  	if (info->xmit.head != info->xmit.tail
157  	    && info->xmit.buf
158  	    && !(info->IER & UART_IER_THRI)) {
159  		info->IER |= UART_IER_THRI;
160  		amiga_custom.intena = IF_SETCLR | IF_TBE;
161  		mb();
162  		/* set a pending Tx Interrupt, transmitter should restart now */
163  		amiga_custom.intreq = IF_SETCLR | IF_TBE;
164  		mb();
165  	}
166  	local_irq_restore(flags);
167  }
168  
169  /*
170   * ----------------------------------------------------------------------
171   *
172   * Here start the interrupt handling routines.
173   *
174   * -----------------------------------------------------------------------
175   */
176  
receive_chars(struct serial_state * info)177  static void receive_chars(struct serial_state *info)
178  {
179          int status;
180  	int serdatr;
181  	unsigned char ch, flag;
182  	struct	async_icount *icount;
183  	int oe = 0;
184  
185  	icount = &info->icount;
186  
187  	status = UART_LSR_DR; /* We obviously have a character! */
188  	serdatr = amiga_custom.serdatr;
189  	mb();
190  	amiga_custom.intreq = IF_RBF;
191  	mb();
192  
193  	if((serdatr & 0x1ff) == 0)
194  	    status |= UART_LSR_BI;
195  	if(serdatr & SDR_OVRUN)
196  	    status |= UART_LSR_OE;
197  
198  	ch = serdatr & 0xff;
199  	icount->rx++;
200  
201  #ifdef SERIAL_DEBUG_INTR
202  	printk("DR%02x:%02x...", ch, status);
203  #endif
204  	flag = TTY_NORMAL;
205  
206  	/*
207  	 * We don't handle parity or frame errors - but I have left
208  	 * the code in, since I'm not sure that the errors can't be
209  	 * detected.
210  	 */
211  
212  	if (status & (UART_LSR_BI | UART_LSR_PE |
213  		      UART_LSR_FE | UART_LSR_OE)) {
214  	  /*
215  	   * For statistics only
216  	   */
217  	  if (status & UART_LSR_BI) {
218  	    status &= ~(UART_LSR_FE | UART_LSR_PE);
219  	    icount->brk++;
220  	  } else if (status & UART_LSR_PE)
221  	    icount->parity++;
222  	  else if (status & UART_LSR_FE)
223  	    icount->frame++;
224  	  if (status & UART_LSR_OE)
225  	    icount->overrun++;
226  
227  	  /*
228  	   * Now check to see if character should be
229  	   * ignored, and mask off conditions which
230  	   * should be ignored.
231  	   */
232  	  if (status & info->ignore_status_mask)
233  	    goto out;
234  
235  	  status &= info->read_status_mask;
236  
237  	  if (status & (UART_LSR_BI)) {
238  #ifdef SERIAL_DEBUG_INTR
239  	    printk("handling break....");
240  #endif
241  	    flag = TTY_BREAK;
242  	    if (info->tport.flags & ASYNC_SAK)
243  	      do_SAK(info->tport.tty);
244  	  } else if (status & UART_LSR_PE)
245  	    flag = TTY_PARITY;
246  	  else if (status & UART_LSR_FE)
247  	    flag = TTY_FRAME;
248  	  if (status & UART_LSR_OE) {
249  	    /*
250  	     * Overrun is special, since it's
251  	     * reported immediately, and doesn't
252  	     * affect the current character
253  	     */
254  	     oe = 1;
255  	  }
256  	}
257  	tty_insert_flip_char(&info->tport, ch, flag);
258  	if (oe == 1)
259  		tty_insert_flip_char(&info->tport, 0, TTY_OVERRUN);
260  	tty_flip_buffer_push(&info->tport);
261  out:
262  	return;
263  }
264  
transmit_chars(struct serial_state * info)265  static void transmit_chars(struct serial_state *info)
266  {
267  	amiga_custom.intreq = IF_TBE;
268  	mb();
269  	if (info->x_char) {
270  	        amiga_custom.serdat = info->x_char | 0x100;
271  		mb();
272  		info->icount.tx++;
273  		info->x_char = 0;
274  		return;
275  	}
276  	if (info->xmit.head == info->xmit.tail
277  	    || info->tport.tty->flow.stopped
278  	    || info->tport.tty->hw_stopped) {
279  		info->IER &= ~UART_IER_THRI;
280  	        amiga_custom.intena = IF_TBE;
281  		mb();
282  		return;
283  	}
284  
285  	amiga_custom.serdat = info->xmit.buf[info->xmit.tail++] | 0x100;
286  	mb();
287  	info->xmit.tail = info->xmit.tail & (UART_XMIT_SIZE - 1);
288  	info->icount.tx++;
289  
290  	if (CIRC_CNT(info->xmit.head,
291  		     info->xmit.tail,
292  		     UART_XMIT_SIZE) < WAKEUP_CHARS)
293  		tty_wakeup(info->tport.tty);
294  
295  #ifdef SERIAL_DEBUG_INTR
296  	printk("THRE...");
297  #endif
298  	if (info->xmit.head == info->xmit.tail) {
299  	        amiga_custom.intena = IF_TBE;
300  		mb();
301  		info->IER &= ~UART_IER_THRI;
302  	}
303  }
304  
check_modem_status(struct serial_state * info)305  static void check_modem_status(struct serial_state *info)
306  {
307  	struct tty_port *port = &info->tport;
308  	unsigned char status = ciab.pra & (SER_DCD | SER_CTS | SER_DSR);
309  	unsigned char dstatus;
310  	struct	async_icount *icount;
311  
312  	/* Determine bits that have changed */
313  	dstatus = status ^ current_ctl_bits;
314  	current_ctl_bits = status;
315  
316  	if (dstatus) {
317  		icount = &info->icount;
318  		/* update input line counters */
319  		if (dstatus & SER_DSR)
320  			icount->dsr++;
321  		if (dstatus & SER_DCD) {
322  			icount->dcd++;
323  		}
324  		if (dstatus & SER_CTS)
325  			icount->cts++;
326  		wake_up_interruptible(&port->delta_msr_wait);
327  	}
328  
329  	if (tty_port_check_carrier(port) && (dstatus & SER_DCD)) {
330  #if (defined(SERIAL_DEBUG_OPEN) || defined(SERIAL_DEBUG_INTR))
331  		printk("ttyS%d CD now %s...", info->line,
332  		       (!(status & SER_DCD)) ? "on" : "off");
333  #endif
334  		if (!(status & SER_DCD))
335  			wake_up_interruptible(&port->open_wait);
336  		else {
337  #ifdef SERIAL_DEBUG_OPEN
338  			printk("doing serial hangup...");
339  #endif
340  			if (port->tty)
341  				tty_hangup(port->tty);
342  		}
343  	}
344  	if (tty_port_cts_enabled(port)) {
345  		if (port->tty->hw_stopped) {
346  			if (!(status & SER_CTS)) {
347  #if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
348  				printk("CTS tx start...");
349  #endif
350  				port->tty->hw_stopped = false;
351  				info->IER |= UART_IER_THRI;
352  				amiga_custom.intena = IF_SETCLR | IF_TBE;
353  				mb();
354  				/* set a pending Tx Interrupt, transmitter should restart now */
355  				amiga_custom.intreq = IF_SETCLR | IF_TBE;
356  				mb();
357  				tty_wakeup(port->tty);
358  				return;
359  			}
360  		} else {
361  			if ((status & SER_CTS)) {
362  #if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
363  				printk("CTS tx stop...");
364  #endif
365  				port->tty->hw_stopped = true;
366  				info->IER &= ~UART_IER_THRI;
367  				/* disable Tx interrupt and remove any pending interrupts */
368  				amiga_custom.intena = IF_TBE;
369  				mb();
370  				amiga_custom.intreq = IF_TBE;
371  				mb();
372  			}
373  		}
374  	}
375  }
376  
ser_vbl_int(int irq,void * data)377  static irqreturn_t ser_vbl_int( int irq, void *data)
378  {
379          /* vbl is just a periodic interrupt we tie into to update modem status */
380  	struct serial_state *info = data;
381  	/*
382  	 * TBD - is it better to unregister from this interrupt or to
383  	 * ignore it if MSI is clear ?
384  	 */
385  	if(info->IER & UART_IER_MSI)
386  	  check_modem_status(info);
387  	return IRQ_HANDLED;
388  }
389  
ser_rx_int(int irq,void * dev_id)390  static irqreturn_t ser_rx_int(int irq, void *dev_id)
391  {
392  	struct serial_state *info = dev_id;
393  
394  #ifdef SERIAL_DEBUG_INTR
395  	printk("ser_rx_int...");
396  #endif
397  
398  	if (!info->tport.tty)
399  		return IRQ_NONE;
400  
401  	receive_chars(info);
402  #ifdef SERIAL_DEBUG_INTR
403  	printk("end.\n");
404  #endif
405  	return IRQ_HANDLED;
406  }
407  
ser_tx_int(int irq,void * dev_id)408  static irqreturn_t ser_tx_int(int irq, void *dev_id)
409  {
410  	struct serial_state *info = dev_id;
411  
412  	if (amiga_custom.serdatr & SDR_TBE) {
413  #ifdef SERIAL_DEBUG_INTR
414  	  printk("ser_tx_int...");
415  #endif
416  
417  	  if (!info->tport.tty)
418  		return IRQ_NONE;
419  
420  	  transmit_chars(info);
421  #ifdef SERIAL_DEBUG_INTR
422  	  printk("end.\n");
423  #endif
424  	}
425  	return IRQ_HANDLED;
426  }
427  
428  /*
429   * -------------------------------------------------------------------
430   * Here ends the serial interrupt routines.
431   * -------------------------------------------------------------------
432   */
433  
434  /*
435   * ---------------------------------------------------------------
436   * Low level utility subroutines for the serial driver:  routines to
437   * figure out the appropriate timeout for an interrupt chain, routines
438   * to initialize and startup a serial port, and routines to shutdown a
439   * serial port.  Useful stuff like that.
440   * ---------------------------------------------------------------
441   */
442  
startup(struct tty_struct * tty,struct serial_state * info)443  static int startup(struct tty_struct *tty, struct serial_state *info)
444  {
445  	struct tty_port *port = &info->tport;
446  	unsigned long flags;
447  	int	retval=0;
448  	unsigned long page;
449  
450  	page = get_zeroed_page(GFP_KERNEL);
451  	if (!page)
452  		return -ENOMEM;
453  
454  	local_irq_save(flags);
455  
456  	if (tty_port_initialized(port)) {
457  		free_page(page);
458  		goto errout;
459  	}
460  
461  	if (info->xmit.buf)
462  		free_page(page);
463  	else
464  		info->xmit.buf = (unsigned char *) page;
465  
466  #ifdef SERIAL_DEBUG_OPEN
467  	printk("starting up ttys%d ...", info->line);
468  #endif
469  
470  	/* Clear anything in the input buffer */
471  
472  	amiga_custom.intreq = IF_RBF;
473  	mb();
474  
475  	retval = request_irq(IRQ_AMIGA_VERTB, ser_vbl_int, 0, "serial status", info);
476  	if (retval) {
477  		if (capable(CAP_SYS_ADMIN)) {
478  			set_bit(TTY_IO_ERROR, &tty->flags);
479  			retval = 0;
480  		}
481  		goto errout;
482  	}
483  
484  	/* enable both Rx and Tx interrupts */
485  	amiga_custom.intena = IF_SETCLR | IF_RBF | IF_TBE;
486  	mb();
487  	info->IER = UART_IER_MSI;
488  
489  	/* remember current state of the DCD and CTS bits */
490  	current_ctl_bits = ciab.pra & (SER_DCD | SER_CTS | SER_DSR);
491  
492  	info->MCR = 0;
493  	if (C_BAUD(tty))
494  	  info->MCR = SER_DTR | SER_RTS;
495  	rtsdtr_ctrl(info->MCR);
496  
497  	clear_bit(TTY_IO_ERROR, &tty->flags);
498  	info->xmit.head = info->xmit.tail = 0;
499  
500  	/*
501  	 * and set the speed of the serial port
502  	 */
503  	change_speed(tty, info, NULL);
504  
505  	tty_port_set_initialized(port, true);
506  	local_irq_restore(flags);
507  	return 0;
508  
509  errout:
510  	local_irq_restore(flags);
511  	return retval;
512  }
513  
514  /*
515   * This routine will shutdown a serial port; interrupts are disabled, and
516   * DTR is dropped if the hangup on close termio flag is on.
517   */
shutdown(struct tty_struct * tty,struct serial_state * info)518  static void shutdown(struct tty_struct *tty, struct serial_state *info)
519  {
520  	unsigned long	flags;
521  
522  	if (!tty_port_initialized(&info->tport))
523  		return;
524  
525  #ifdef SERIAL_DEBUG_OPEN
526  	printk("Shutting down serial port %d ....\n", info->line);
527  #endif
528  
529  	local_irq_save(flags); /* Disable interrupts */
530  
531  	/*
532  	 * clear delta_msr_wait queue to avoid mem leaks: we may free the irq
533  	 * here so the queue might never be waken up
534  	 */
535  	wake_up_interruptible(&info->tport.delta_msr_wait);
536  
537  	/*
538  	 * Free the IRQ, if necessary
539  	 */
540  	free_irq(IRQ_AMIGA_VERTB, info);
541  
542  	free_page((unsigned long)info->xmit.buf);
543  	info->xmit.buf = NULL;
544  
545  	info->IER = 0;
546  	amiga_custom.intena = IF_RBF | IF_TBE;
547  	mb();
548  
549  	/* disable break condition */
550  	amiga_custom.adkcon = AC_UARTBRK;
551  	mb();
552  
553  	if (C_HUPCL(tty))
554  		info->MCR &= ~(SER_DTR|SER_RTS);
555  	rtsdtr_ctrl(info->MCR);
556  
557  	set_bit(TTY_IO_ERROR, &tty->flags);
558  
559  	tty_port_set_initialized(&info->tport, false);
560  	local_irq_restore(flags);
561  }
562  
563  
564  /*
565   * This routine is called to set the UART divisor registers to match
566   * the specified baud rate for a serial port.
567   */
change_speed(struct tty_struct * tty,struct serial_state * info,const struct ktermios * old_termios)568  static void change_speed(struct tty_struct *tty, struct serial_state *info,
569  			 const struct ktermios *old_termios)
570  {
571  	struct tty_port *port = &info->tport;
572  	int	quot = 0, baud_base, baud;
573  	unsigned cflag, cval = 0;
574  	int	bits;
575  	unsigned long	flags;
576  
577  	cflag = tty->termios.c_cflag;
578  
579  	/* Byte size is always 8 bits plus parity bit if requested */
580  
581  	cval = 3; bits = 10;
582  	if (cflag & CSTOPB) {
583  		cval |= 0x04;
584  		bits++;
585  	}
586  	if (cflag & PARENB) {
587  		cval |= UART_LCR_PARITY;
588  		bits++;
589  	}
590  	if (!(cflag & PARODD))
591  		cval |= UART_LCR_EPAR;
592  	if (cflag & CMSPAR)
593  		cval |= UART_LCR_SPAR;
594  
595  	/* Determine divisor based on baud rate */
596  	baud = tty_get_baud_rate(tty);
597  	if (!baud)
598  		baud = 9600;	/* B0 transition handled in rs_set_termios */
599  	baud_base = info->baud_base;
600  	if (baud == 38400 && (port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
601  		quot = info->custom_divisor;
602  	else {
603  		if (baud == 134)
604  			/* Special case since 134 is really 134.5 */
605  			quot = (2*baud_base / 269);
606  		else if (baud)
607  			quot = baud_base / baud;
608  	}
609  	/* If the quotient is zero refuse the change */
610  	if (!quot && old_termios) {
611  		/* FIXME: Will need updating for new tty in the end */
612  		tty->termios.c_cflag &= ~CBAUD;
613  		tty->termios.c_cflag |= (old_termios->c_cflag & CBAUD);
614  		baud = tty_get_baud_rate(tty);
615  		if (!baud)
616  			baud = 9600;
617  		if (baud == 38400 &&
618  		    (port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
619  			quot = info->custom_divisor;
620  		else {
621  			if (baud == 134)
622  				/* Special case since 134 is really 134.5 */
623  				quot = (2*baud_base / 269);
624  			else if (baud)
625  				quot = baud_base / baud;
626  		}
627  	}
628  	/* As a last resort, if the quotient is zero, default to 9600 bps */
629  	if (!quot)
630  		quot = baud_base / 9600;
631  	info->quot = quot;
632  	info->timeout = (XMIT_FIFO_SIZE*HZ*bits*quot) / baud_base;
633  	info->timeout += HZ/50;		/* Add .02 seconds of slop */
634  
635  	/* CTS flow control flag and modem status interrupts */
636  	info->IER &= ~UART_IER_MSI;
637  	if (port->flags & ASYNC_HARDPPS_CD)
638  		info->IER |= UART_IER_MSI;
639  	tty_port_set_cts_flow(port, cflag & CRTSCTS);
640  	if (cflag & CRTSCTS)
641  		info->IER |= UART_IER_MSI;
642  	tty_port_set_check_carrier(port, ~cflag & CLOCAL);
643  	if (~cflag & CLOCAL)
644  		info->IER |= UART_IER_MSI;
645  	/* TBD:
646  	 * Does clearing IER_MSI imply that we should disable the VBL interrupt ?
647  	 */
648  
649  	/*
650  	 * Set up parity check flag
651  	 */
652  
653  	info->read_status_mask = UART_LSR_OE | UART_LSR_DR;
654  	if (I_INPCK(tty))
655  		info->read_status_mask |= UART_LSR_FE | UART_LSR_PE;
656  	if (I_BRKINT(tty) || I_PARMRK(tty))
657  		info->read_status_mask |= UART_LSR_BI;
658  
659  	/*
660  	 * Characters to ignore
661  	 */
662  	info->ignore_status_mask = 0;
663  	if (I_IGNPAR(tty))
664  		info->ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
665  	if (I_IGNBRK(tty)) {
666  		info->ignore_status_mask |= UART_LSR_BI;
667  		/*
668  		 * If we're ignore parity and break indicators, ignore
669  		 * overruns too.  (For real raw support).
670  		 */
671  		if (I_IGNPAR(tty))
672  			info->ignore_status_mask |= UART_LSR_OE;
673  	}
674  	/*
675  	 * !!! ignore all characters if CREAD is not set
676  	 */
677  	if ((cflag & CREAD) == 0)
678  		info->ignore_status_mask |= UART_LSR_DR;
679  	local_irq_save(flags);
680  
681  	{
682  	  short serper;
683  
684  	/* Set up the baud rate */
685  	  serper = quot - 1;
686  
687  	/* Enable or disable parity bit */
688  
689  	if(cval & UART_LCR_PARITY)
690  	  serper |= (SERPER_PARENB);
691  
692  	amiga_custom.serper = serper;
693  	mb();
694  	}
695  
696  	local_irq_restore(flags);
697  }
698  
rs_put_char(struct tty_struct * tty,u8 ch)699  static int rs_put_char(struct tty_struct *tty, u8 ch)
700  {
701  	struct serial_state *info;
702  	unsigned long flags;
703  
704  	info = tty->driver_data;
705  
706  	if (!info->xmit.buf)
707  		return 0;
708  
709  	local_irq_save(flags);
710  	if (CIRC_SPACE(info->xmit.head,
711  		       info->xmit.tail,
712  		       UART_XMIT_SIZE) == 0) {
713  		local_irq_restore(flags);
714  		return 0;
715  	}
716  
717  	info->xmit.buf[info->xmit.head++] = ch;
718  	info->xmit.head &= UART_XMIT_SIZE - 1;
719  	local_irq_restore(flags);
720  	return 1;
721  }
722  
rs_flush_chars(struct tty_struct * tty)723  static void rs_flush_chars(struct tty_struct *tty)
724  {
725  	struct serial_state *info = tty->driver_data;
726  	unsigned long flags;
727  
728  	if (info->xmit.head == info->xmit.tail
729  	    || tty->flow.stopped
730  	    || tty->hw_stopped
731  	    || !info->xmit.buf)
732  		return;
733  
734  	local_irq_save(flags);
735  	info->IER |= UART_IER_THRI;
736  	amiga_custom.intena = IF_SETCLR | IF_TBE;
737  	mb();
738  	/* set a pending Tx Interrupt, transmitter should restart now */
739  	amiga_custom.intreq = IF_SETCLR | IF_TBE;
740  	mb();
741  	local_irq_restore(flags);
742  }
743  
rs_write(struct tty_struct * tty,const u8 * buf,size_t count)744  static ssize_t rs_write(struct tty_struct * tty, const u8 *buf, size_t count)
745  {
746  	int	c, ret = 0;
747  	struct serial_state *info = tty->driver_data;
748  	unsigned long flags;
749  
750  	if (!info->xmit.buf)
751  		return 0;
752  
753  	local_irq_save(flags);
754  	while (1) {
755  		c = CIRC_SPACE_TO_END(info->xmit.head,
756  				      info->xmit.tail,
757  				      UART_XMIT_SIZE);
758  		if (count < c)
759  			c = count;
760  		if (c <= 0) {
761  			break;
762  		}
763  		memcpy(info->xmit.buf + info->xmit.head, buf, c);
764  		info->xmit.head = (info->xmit.head + c) & (UART_XMIT_SIZE - 1);
765  		buf += c;
766  		count -= c;
767  		ret += c;
768  	}
769  	local_irq_restore(flags);
770  
771  	if (info->xmit.head != info->xmit.tail
772  	    && !tty->flow.stopped
773  	    && !tty->hw_stopped
774  	    && !(info->IER & UART_IER_THRI)) {
775  		info->IER |= UART_IER_THRI;
776  		local_irq_disable();
777  		amiga_custom.intena = IF_SETCLR | IF_TBE;
778  		mb();
779  		/* set a pending Tx Interrupt, transmitter should restart now */
780  		amiga_custom.intreq = IF_SETCLR | IF_TBE;
781  		mb();
782  		local_irq_restore(flags);
783  	}
784  	return ret;
785  }
786  
rs_write_room(struct tty_struct * tty)787  static unsigned int rs_write_room(struct tty_struct *tty)
788  {
789  	struct serial_state *info = tty->driver_data;
790  
791  	return CIRC_SPACE(info->xmit.head, info->xmit.tail, UART_XMIT_SIZE);
792  }
793  
rs_chars_in_buffer(struct tty_struct * tty)794  static unsigned int rs_chars_in_buffer(struct tty_struct *tty)
795  {
796  	struct serial_state *info = tty->driver_data;
797  
798  	return CIRC_CNT(info->xmit.head, info->xmit.tail, UART_XMIT_SIZE);
799  }
800  
rs_flush_buffer(struct tty_struct * tty)801  static void rs_flush_buffer(struct tty_struct *tty)
802  {
803  	struct serial_state *info = tty->driver_data;
804  	unsigned long flags;
805  
806  	local_irq_save(flags);
807  	info->xmit.head = info->xmit.tail = 0;
808  	local_irq_restore(flags);
809  	tty_wakeup(tty);
810  }
811  
812  /*
813   * This function is used to send a high-priority XON/XOFF character to
814   * the device
815   */
rs_send_xchar(struct tty_struct * tty,char ch)816  static void rs_send_xchar(struct tty_struct *tty, char ch)
817  {
818  	struct serial_state *info = tty->driver_data;
819          unsigned long flags;
820  
821  	info->x_char = ch;
822  	if (ch) {
823  		/* Make sure transmit interrupts are on */
824  
825  	        /* Check this ! */
826  	        local_irq_save(flags);
827  		if(!(amiga_custom.intenar & IF_TBE)) {
828  		    amiga_custom.intena = IF_SETCLR | IF_TBE;
829  		    mb();
830  		    /* set a pending Tx Interrupt, transmitter should restart now */
831  		    amiga_custom.intreq = IF_SETCLR | IF_TBE;
832  		    mb();
833  		}
834  		local_irq_restore(flags);
835  
836  		info->IER |= UART_IER_THRI;
837  	}
838  }
839  
840  /*
841   * ------------------------------------------------------------
842   * rs_throttle()
843   *
844   * This routine is called by the upper-layer tty layer to signal that
845   * incoming characters should be throttled.
846   * ------------------------------------------------------------
847   */
rs_throttle(struct tty_struct * tty)848  static void rs_throttle(struct tty_struct * tty)
849  {
850  	struct serial_state *info = tty->driver_data;
851  	unsigned long flags;
852  #ifdef SERIAL_DEBUG_THROTTLE
853  	printk("throttle %s ....\n", tty_name(tty));
854  #endif
855  
856  	if (I_IXOFF(tty))
857  		rs_send_xchar(tty, STOP_CHAR(tty));
858  
859  	if (C_CRTSCTS(tty))
860  		info->MCR &= ~SER_RTS;
861  
862  	local_irq_save(flags);
863  	rtsdtr_ctrl(info->MCR);
864  	local_irq_restore(flags);
865  }
866  
rs_unthrottle(struct tty_struct * tty)867  static void rs_unthrottle(struct tty_struct * tty)
868  {
869  	struct serial_state *info = tty->driver_data;
870  	unsigned long flags;
871  #ifdef SERIAL_DEBUG_THROTTLE
872  	printk("unthrottle %s ....\n", tty_name(tty));
873  #endif
874  
875  	if (I_IXOFF(tty)) {
876  		if (info->x_char)
877  			info->x_char = 0;
878  		else
879  			rs_send_xchar(tty, START_CHAR(tty));
880  	}
881  	if (C_CRTSCTS(tty))
882  		info->MCR |= SER_RTS;
883  	local_irq_save(flags);
884  	rtsdtr_ctrl(info->MCR);
885  	local_irq_restore(flags);
886  }
887  
888  /*
889   * ------------------------------------------------------------
890   * rs_ioctl() and friends
891   * ------------------------------------------------------------
892   */
893  
get_serial_info(struct tty_struct * tty,struct serial_struct * ss)894  static int get_serial_info(struct tty_struct *tty, struct serial_struct *ss)
895  {
896  	struct serial_state *state = tty->driver_data;
897  	unsigned int close_delay, closing_wait;
898  
899  	tty_lock(tty);
900  	close_delay = jiffies_to_msecs(state->tport.close_delay) / 10;
901  	closing_wait = state->tport.closing_wait;
902  	if (closing_wait != ASYNC_CLOSING_WAIT_NONE)
903  		closing_wait = jiffies_to_msecs(closing_wait) / 10;
904  
905  	ss->line = tty->index;
906  	ss->port = state->port;
907  	ss->flags = state->tport.flags;
908  	ss->xmit_fifo_size = XMIT_FIFO_SIZE;
909  	ss->baud_base = state->baud_base;
910  	ss->close_delay = close_delay;
911  	ss->closing_wait = closing_wait;
912  	ss->custom_divisor = state->custom_divisor;
913  	tty_unlock(tty);
914  	return 0;
915  }
916  
set_serial_info(struct tty_struct * tty,struct serial_struct * ss)917  static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss)
918  {
919  	struct serial_state *state = tty->driver_data;
920  	struct tty_port *port = &state->tport;
921  	bool change_spd;
922  	int 			retval = 0;
923  	unsigned int close_delay, closing_wait;
924  
925  	tty_lock(tty);
926  	change_spd = ((ss->flags ^ port->flags) & ASYNC_SPD_MASK) ||
927  		ss->custom_divisor != state->custom_divisor;
928  	if (ss->irq || ss->port != state->port ||
929  			ss->xmit_fifo_size != XMIT_FIFO_SIZE) {
930  		tty_unlock(tty);
931  		return -EINVAL;
932  	}
933  
934  	close_delay = msecs_to_jiffies(ss->close_delay * 10);
935  	closing_wait = ss->closing_wait;
936  	if (closing_wait != ASYNC_CLOSING_WAIT_NONE)
937  		closing_wait = msecs_to_jiffies(closing_wait * 10);
938  
939  	if (!capable(CAP_SYS_ADMIN)) {
940  		if ((ss->baud_base != state->baud_base) ||
941  		    (close_delay != port->close_delay) ||
942  		    (closing_wait != port->closing_wait) ||
943  		    ((ss->flags & ~ASYNC_USR_MASK) !=
944  		     (port->flags & ~ASYNC_USR_MASK))) {
945  			tty_unlock(tty);
946  			return -EPERM;
947  		}
948  		port->flags = ((port->flags & ~ASYNC_USR_MASK) |
949  			       (ss->flags & ASYNC_USR_MASK));
950  		state->custom_divisor = ss->custom_divisor;
951  		goto check_and_exit;
952  	}
953  
954  	if (ss->baud_base < 9600) {
955  		tty_unlock(tty);
956  		return -EINVAL;
957  	}
958  
959  	/*
960  	 * OK, past this point, all the error checking has been done.
961  	 * At this point, we start making changes.....
962  	 */
963  
964  	state->baud_base = ss->baud_base;
965  	port->flags = ((port->flags & ~ASYNC_FLAGS) |
966  			(ss->flags & ASYNC_FLAGS));
967  	state->custom_divisor = ss->custom_divisor;
968  	port->close_delay = close_delay;
969  	port->closing_wait = closing_wait;
970  
971  check_and_exit:
972  	if (tty_port_initialized(port)) {
973  		if (change_spd) {
974  			/* warn about deprecation unless clearing */
975  			if (ss->flags & ASYNC_SPD_MASK)
976  				dev_warn_ratelimited(tty->dev, "use of SPD flags is deprecated\n");
977  			change_speed(tty, state, NULL);
978  		}
979  	} else
980  		retval = startup(tty, state);
981  	tty_unlock(tty);
982  	return retval;
983  }
984  
985  /*
986   * get_lsr_info - get line status register info
987   *
988   * Purpose: Let user call ioctl() to get info when the UART physically
989   * 	    is emptied.  On bus types like RS485, the transmitter must
990   * 	    release the bus after transmitting. This must be done when
991   * 	    the transmit shift register is empty, not be done when the
992   * 	    transmit holding register is empty.  This functionality
993   * 	    allows an RS485 driver to be written in user space.
994   */
get_lsr_info(struct serial_state * info,unsigned int __user * value)995  static int get_lsr_info(struct serial_state *info, unsigned int __user *value)
996  {
997  	unsigned char status;
998  	unsigned int result;
999  	unsigned long flags;
1000  
1001  	local_irq_save(flags);
1002  	status = amiga_custom.serdatr;
1003  	mb();
1004  	local_irq_restore(flags);
1005  	result = ((status & SDR_TSRE) ? TIOCSER_TEMT : 0);
1006  	if (copy_to_user(value, &result, sizeof(int)))
1007  		return -EFAULT;
1008  	return 0;
1009  }
1010  
1011  
rs_tiocmget(struct tty_struct * tty)1012  static int rs_tiocmget(struct tty_struct *tty)
1013  {
1014  	struct serial_state *info = tty->driver_data;
1015  	unsigned char control, status;
1016  	unsigned long flags;
1017  
1018  	if (tty_io_error(tty))
1019  		return -EIO;
1020  
1021  	control = info->MCR;
1022  	local_irq_save(flags);
1023  	status = ciab.pra;
1024  	local_irq_restore(flags);
1025  	return    ((control & SER_RTS) ? TIOCM_RTS : 0)
1026  		| ((control & SER_DTR) ? TIOCM_DTR : 0)
1027  		| (!(status  & SER_DCD) ? TIOCM_CAR : 0)
1028  		| (!(status  & SER_DSR) ? TIOCM_DSR : 0)
1029  		| (!(status  & SER_CTS) ? TIOCM_CTS : 0);
1030  }
1031  
rs_tiocmset(struct tty_struct * tty,unsigned int set,unsigned int clear)1032  static int rs_tiocmset(struct tty_struct *tty, unsigned int set,
1033  						unsigned int clear)
1034  {
1035  	struct serial_state *info = tty->driver_data;
1036  	unsigned long flags;
1037  
1038  	if (tty_io_error(tty))
1039  		return -EIO;
1040  
1041  	local_irq_save(flags);
1042  	if (set & TIOCM_RTS)
1043  		info->MCR |= SER_RTS;
1044  	if (set & TIOCM_DTR)
1045  		info->MCR |= SER_DTR;
1046  	if (clear & TIOCM_RTS)
1047  		info->MCR &= ~SER_RTS;
1048  	if (clear & TIOCM_DTR)
1049  		info->MCR &= ~SER_DTR;
1050  	rtsdtr_ctrl(info->MCR);
1051  	local_irq_restore(flags);
1052  	return 0;
1053  }
1054  
1055  /*
1056   * rs_break() --- routine which turns the break handling on or off
1057   */
rs_break(struct tty_struct * tty,int break_state)1058  static int rs_break(struct tty_struct *tty, int break_state)
1059  {
1060  	unsigned long flags;
1061  
1062  	local_irq_save(flags);
1063  	if (break_state == -1)
1064  	  amiga_custom.adkcon = AC_SETCLR | AC_UARTBRK;
1065  	else
1066  	  amiga_custom.adkcon = AC_UARTBRK;
1067  	mb();
1068  	local_irq_restore(flags);
1069  	return 0;
1070  }
1071  
1072  /*
1073   * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
1074   * Return: write counters to the user passed counter struct
1075   * NB: both 1->0 and 0->1 transitions are counted except for
1076   *     RI where only 0->1 is counted.
1077   */
rs_get_icount(struct tty_struct * tty,struct serial_icounter_struct * icount)1078  static int rs_get_icount(struct tty_struct *tty,
1079  				struct serial_icounter_struct *icount)
1080  {
1081  	struct serial_state *info = tty->driver_data;
1082  	struct async_icount cnow;
1083  	unsigned long flags;
1084  
1085  	local_irq_save(flags);
1086  	cnow = info->icount;
1087  	local_irq_restore(flags);
1088  	icount->cts = cnow.cts;
1089  	icount->dsr = cnow.dsr;
1090  	icount->rng = cnow.rng;
1091  	icount->dcd = cnow.dcd;
1092  	icount->rx = cnow.rx;
1093  	icount->tx = cnow.tx;
1094  	icount->frame = cnow.frame;
1095  	icount->overrun = cnow.overrun;
1096  	icount->parity = cnow.parity;
1097  	icount->brk = cnow.brk;
1098  	icount->buf_overrun = cnow.buf_overrun;
1099  
1100  	return 0;
1101  }
1102  
rs_ioctl(struct tty_struct * tty,unsigned int cmd,unsigned long arg)1103  static int rs_ioctl(struct tty_struct *tty,
1104  		    unsigned int cmd, unsigned long arg)
1105  {
1106  	struct serial_state *info = tty->driver_data;
1107  	struct async_icount cprev, cnow;	/* kernel counter temps */
1108  	void __user *argp = (void __user *)arg;
1109  	unsigned long flags;
1110  	DEFINE_WAIT(wait);
1111  	int ret;
1112  
1113  	if ((cmd != TIOCSERCONFIG) &&
1114  	    (cmd != TIOCMIWAIT) && (cmd != TIOCGICOUNT)) {
1115  		if (tty_io_error(tty))
1116  		    return -EIO;
1117  	}
1118  
1119  	switch (cmd) {
1120  		case TIOCSERCONFIG:
1121  			return 0;
1122  
1123  		case TIOCSERGETLSR: /* Get line status register */
1124  			return get_lsr_info(info, argp);
1125  
1126  		/*
1127  		 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
1128  		 * - mask passed in arg for lines of interest
1129   		 *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
1130  		 * Caller should use TIOCGICOUNT to see which one it was
1131  		 */
1132  		case TIOCMIWAIT:
1133  			local_irq_save(flags);
1134  			/* note the counters on entry */
1135  			cprev = info->icount;
1136  			local_irq_restore(flags);
1137  			while (1) {
1138  				prepare_to_wait(&info->tport.delta_msr_wait,
1139  						&wait, TASK_INTERRUPTIBLE);
1140  				local_irq_save(flags);
1141  				cnow = info->icount; /* atomic copy */
1142  				local_irq_restore(flags);
1143  				if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
1144  				    cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) {
1145  					ret = -EIO; /* no change => error */
1146  					break;
1147  				}
1148  				if ( ((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
1149  				     ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
1150  				     ((arg & TIOCM_CD)  && (cnow.dcd != cprev.dcd)) ||
1151  				     ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
1152  					ret = 0;
1153  					break;
1154  				}
1155  				schedule();
1156  				/* see if a signal did it */
1157  				if (signal_pending(current)) {
1158  					ret = -ERESTARTSYS;
1159  					break;
1160  				}
1161  				cprev = cnow;
1162  			}
1163  			finish_wait(&info->tport.delta_msr_wait, &wait);
1164  			return ret;
1165  
1166  		default:
1167  			return -ENOIOCTLCMD;
1168  		}
1169  	return 0;
1170  }
1171  
rs_set_termios(struct tty_struct * tty,const struct ktermios * old_termios)1172  static void rs_set_termios(struct tty_struct *tty, const struct ktermios *old_termios)
1173  {
1174  	struct serial_state *info = tty->driver_data;
1175  	unsigned long flags;
1176  	unsigned int cflag = tty->termios.c_cflag;
1177  
1178  	change_speed(tty, info, old_termios);
1179  
1180  	/* Handle transition to B0 status */
1181  	if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD)) {
1182  		info->MCR &= ~(SER_DTR|SER_RTS);
1183  		local_irq_save(flags);
1184  		rtsdtr_ctrl(info->MCR);
1185  		local_irq_restore(flags);
1186  	}
1187  
1188  	/* Handle transition away from B0 status */
1189  	if (!(old_termios->c_cflag & CBAUD) && (cflag & CBAUD)) {
1190  		info->MCR |= SER_DTR;
1191  		if (!C_CRTSCTS(tty) || !tty_throttled(tty))
1192  			info->MCR |= SER_RTS;
1193  		local_irq_save(flags);
1194  		rtsdtr_ctrl(info->MCR);
1195  		local_irq_restore(flags);
1196  	}
1197  
1198  	/* Handle turning off CRTSCTS */
1199  	if ((old_termios->c_cflag & CRTSCTS) && !C_CRTSCTS(tty)) {
1200  		tty->hw_stopped = false;
1201  		rs_start(tty);
1202  	}
1203  
1204  #if 0
1205  	/*
1206  	 * No need to wake up processes in open wait, since they
1207  	 * sample the CLOCAL flag once, and don't recheck it.
1208  	 * XXX  It's not clear whether the current behavior is correct
1209  	 * or not.  Hence, this may change.....
1210  	 */
1211  	if (!(old_termios->c_cflag & CLOCAL) && C_CLOCAL(tty))
1212  		wake_up_interruptible(&info->open_wait);
1213  #endif
1214  }
1215  
1216  /*
1217   * ------------------------------------------------------------
1218   * rs_close()
1219   *
1220   * This routine is called when the serial port gets closed.  First, we
1221   * wait for the last remaining data to be sent.  Then, we unlink its
1222   * async structure from the interrupt chain if necessary, and we free
1223   * that IRQ if nothing is left in the chain.
1224   * ------------------------------------------------------------
1225   */
rs_close(struct tty_struct * tty,struct file * filp)1226  static void rs_close(struct tty_struct *tty, struct file * filp)
1227  {
1228  	struct serial_state *state = tty->driver_data;
1229  	struct tty_port *port = &state->tport;
1230  
1231  	if (tty_port_close_start(port, tty, filp) == 0)
1232  		return;
1233  
1234  	/*
1235  	 * At this point we stop accepting input.  To do this, we
1236  	 * disable the receive line status interrupts, and tell the
1237  	 * interrupt driver to stop checking the data ready bit in the
1238  	 * line status register.
1239  	 */
1240  	state->read_status_mask &= ~UART_LSR_DR;
1241  	if (tty_port_initialized(port)) {
1242  	        /* disable receive interrupts */
1243  	        amiga_custom.intena = IF_RBF;
1244  		mb();
1245  		/* clear any pending receive interrupt */
1246  		amiga_custom.intreq = IF_RBF;
1247  		mb();
1248  
1249  		/*
1250  		 * Before we drop DTR, make sure the UART transmitter
1251  		 * has completely drained; this is especially
1252  		 * important if there is a transmit FIFO!
1253  		 */
1254  		rs_wait_until_sent(tty, state->timeout);
1255  	}
1256  	shutdown(tty, state);
1257  	rs_flush_buffer(tty);
1258  
1259  	tty_ldisc_flush(tty);
1260  	port->tty = NULL;
1261  
1262  	tty_port_close_end(port, tty);
1263  }
1264  
1265  /*
1266   * rs_wait_until_sent() --- wait until the transmitter is empty
1267   */
rs_wait_until_sent(struct tty_struct * tty,int timeout)1268  static void rs_wait_until_sent(struct tty_struct *tty, int timeout)
1269  {
1270  	struct serial_state *info = tty->driver_data;
1271  	unsigned long orig_jiffies, char_time;
1272  	int lsr;
1273  
1274  	orig_jiffies = jiffies;
1275  
1276  	/*
1277  	 * Set the check interval to be 1/5 of the estimated time to
1278  	 * send a single character, and make it at least 1.  The check
1279  	 * interval should also be less than the timeout.
1280  	 *
1281  	 * Note: we have to use pretty tight timings here to satisfy
1282  	 * the NIST-PCTS.
1283  	 */
1284  	char_time = (info->timeout - HZ/50) / XMIT_FIFO_SIZE;
1285  	char_time = char_time / 5;
1286  	if (char_time == 0)
1287  		char_time = 1;
1288  	if (timeout)
1289  	  char_time = min_t(unsigned long, char_time, timeout);
1290  	/*
1291  	 * If the transmitter hasn't cleared in twice the approximate
1292  	 * amount of time to send the entire FIFO, it probably won't
1293  	 * ever clear.  This assumes the UART isn't doing flow
1294  	 * control, which is currently the case.  Hence, if it ever
1295  	 * takes longer than info->timeout, this is probably due to a
1296  	 * UART bug of some kind.  So, we clamp the timeout parameter at
1297  	 * 2*info->timeout.
1298  	 */
1299  	if (!timeout || timeout > 2*info->timeout)
1300  		timeout = 2*info->timeout;
1301  #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
1302  	printk("In rs_wait_until_sent(%d) check=%lu...", timeout, char_time);
1303  	printk("jiff=%lu...", jiffies);
1304  #endif
1305  	while(!((lsr = amiga_custom.serdatr) & SDR_TSRE)) {
1306  #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
1307  		printk("serdatr = %d (jiff=%lu)...", lsr, jiffies);
1308  #endif
1309  		msleep_interruptible(jiffies_to_msecs(char_time));
1310  		if (signal_pending(current))
1311  			break;
1312  		if (timeout && time_after(jiffies, orig_jiffies + timeout))
1313  			break;
1314  	}
1315  	__set_current_state(TASK_RUNNING);
1316  
1317  #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
1318  	printk("lsr = %d (jiff=%lu)...done\n", lsr, jiffies);
1319  #endif
1320  }
1321  
1322  /*
1323   * rs_hangup() --- called by tty_hangup() when a hangup is signaled.
1324   */
rs_hangup(struct tty_struct * tty)1325  static void rs_hangup(struct tty_struct *tty)
1326  {
1327  	struct serial_state *info = tty->driver_data;
1328  
1329  	rs_flush_buffer(tty);
1330  	shutdown(tty, info);
1331  	info->tport.count = 0;
1332  	tty_port_set_active(&info->tport, false);
1333  	info->tport.tty = NULL;
1334  	wake_up_interruptible(&info->tport.open_wait);
1335  }
1336  
1337  /*
1338   * This routine is called whenever a serial port is opened.  It
1339   * enables interrupts for a serial port, linking in its async structure into
1340   * the IRQ chain.   It also performs the serial-specific
1341   * initialization for the tty structure.
1342   */
rs_open(struct tty_struct * tty,struct file * filp)1343  static int rs_open(struct tty_struct *tty, struct file * filp)
1344  {
1345  	struct tty_port *port = tty->port;
1346  	struct serial_state *info = container_of(port, struct serial_state,
1347  			tport);
1348  	int retval;
1349  
1350  	port->count++;
1351  	port->tty = tty;
1352  	tty->driver_data = info;
1353  
1354  	retval = startup(tty, info);
1355  	if (retval) {
1356  		return retval;
1357  	}
1358  
1359  	return tty_port_block_til_ready(port, tty, filp);
1360  }
1361  
1362  /*
1363   * /proc fs routines....
1364   */
1365  
line_info(struct seq_file * m,int line,struct serial_state * state)1366  static inline void line_info(struct seq_file *m, int line,
1367  		struct serial_state *state)
1368  {
1369  	char	stat_buf[30], control, status;
1370  	unsigned long flags;
1371  
1372  	seq_printf(m, "%d: uart:amiga_builtin", line);
1373  
1374  	local_irq_save(flags);
1375  	status = ciab.pra;
1376  	control = tty_port_initialized(&state->tport) ? state->MCR : status;
1377  	local_irq_restore(flags);
1378  
1379  	stat_buf[0] = 0;
1380  	stat_buf[1] = 0;
1381  	if(!(control & SER_RTS))
1382  		strcat(stat_buf, "|RTS");
1383  	if(!(status & SER_CTS))
1384  		strcat(stat_buf, "|CTS");
1385  	if(!(control & SER_DTR))
1386  		strcat(stat_buf, "|DTR");
1387  	if(!(status & SER_DSR))
1388  		strcat(stat_buf, "|DSR");
1389  	if(!(status & SER_DCD))
1390  		strcat(stat_buf, "|CD");
1391  
1392  	if (state->quot)
1393  		seq_printf(m, " baud:%d", state->baud_base / state->quot);
1394  
1395  	seq_printf(m, " tx:%d rx:%d", state->icount.tx, state->icount.rx);
1396  
1397  	if (state->icount.frame)
1398  		seq_printf(m, " fe:%d", state->icount.frame);
1399  
1400  	if (state->icount.parity)
1401  		seq_printf(m, " pe:%d", state->icount.parity);
1402  
1403  	if (state->icount.brk)
1404  		seq_printf(m, " brk:%d", state->icount.brk);
1405  
1406  	if (state->icount.overrun)
1407  		seq_printf(m, " oe:%d", state->icount.overrun);
1408  
1409  	/*
1410  	 * Last thing is the RS-232 status lines
1411  	 */
1412  	seq_printf(m, " %s\n", stat_buf+1);
1413  }
1414  
rs_proc_show(struct seq_file * m,void * v)1415  static int rs_proc_show(struct seq_file *m, void *v)
1416  {
1417  	seq_printf(m, "serinfo:1.0 driver:4.30\n");
1418  	line_info(m, 0, &serial_state);
1419  	return 0;
1420  }
1421  
1422  /*
1423   * ---------------------------------------------------------------------
1424   * rs_init() and friends
1425   *
1426   * rs_init() is called at boot-time to initialize the serial driver.
1427   * ---------------------------------------------------------------------
1428   */
1429  
1430  static const struct tty_operations serial_ops = {
1431  	.open = rs_open,
1432  	.close = rs_close,
1433  	.write = rs_write,
1434  	.put_char = rs_put_char,
1435  	.flush_chars = rs_flush_chars,
1436  	.write_room = rs_write_room,
1437  	.chars_in_buffer = rs_chars_in_buffer,
1438  	.flush_buffer = rs_flush_buffer,
1439  	.ioctl = rs_ioctl,
1440  	.throttle = rs_throttle,
1441  	.unthrottle = rs_unthrottle,
1442  	.set_termios = rs_set_termios,
1443  	.stop = rs_stop,
1444  	.start = rs_start,
1445  	.hangup = rs_hangup,
1446  	.break_ctl = rs_break,
1447  	.send_xchar = rs_send_xchar,
1448  	.wait_until_sent = rs_wait_until_sent,
1449  	.tiocmget = rs_tiocmget,
1450  	.tiocmset = rs_tiocmset,
1451  	.get_icount = rs_get_icount,
1452  	.set_serial = set_serial_info,
1453  	.get_serial = get_serial_info,
1454  	.proc_show = rs_proc_show,
1455  };
1456  
amiga_carrier_raised(struct tty_port * port)1457  static bool amiga_carrier_raised(struct tty_port *port)
1458  {
1459  	return !(ciab.pra & SER_DCD);
1460  }
1461  
amiga_dtr_rts(struct tty_port * port,bool active)1462  static void amiga_dtr_rts(struct tty_port *port, bool active)
1463  {
1464  	struct serial_state *info = container_of(port, struct serial_state,
1465  			tport);
1466  	unsigned long flags;
1467  
1468  	if (active)
1469  		info->MCR |= SER_DTR|SER_RTS;
1470  	else
1471  		info->MCR &= ~(SER_DTR|SER_RTS);
1472  
1473  	local_irq_save(flags);
1474  	rtsdtr_ctrl(info->MCR);
1475  	local_irq_restore(flags);
1476  }
1477  
1478  static const struct tty_port_operations amiga_port_ops = {
1479  	.carrier_raised = amiga_carrier_raised,
1480  	.dtr_rts = amiga_dtr_rts,
1481  };
1482  
1483  /*
1484   * The serial driver boot-time initialization code!
1485   */
amiga_serial_probe(struct platform_device * pdev)1486  static int __init amiga_serial_probe(struct platform_device *pdev)
1487  {
1488  	struct serial_state *state = &serial_state;
1489  	struct tty_driver *driver;
1490  	unsigned long flags;
1491  	int error;
1492  
1493  	driver = tty_alloc_driver(1, TTY_DRIVER_REAL_RAW);
1494  	if (IS_ERR(driver))
1495  		return PTR_ERR(driver);
1496  
1497  	/* Initialize the tty_driver structure */
1498  
1499  	driver->driver_name = "amiserial";
1500  	driver->name = "ttyS";
1501  	driver->major = TTY_MAJOR;
1502  	driver->minor_start = 64;
1503  	driver->type = TTY_DRIVER_TYPE_SERIAL;
1504  	driver->subtype = SERIAL_TYPE_NORMAL;
1505  	driver->init_termios = tty_std_termios;
1506  	driver->init_termios.c_cflag =
1507  		B9600 | CS8 | CREAD | HUPCL | CLOCAL;
1508  	tty_set_operations(driver, &serial_ops);
1509  
1510  	memset(state, 0, sizeof(*state));
1511  	state->port = (int)&amiga_custom.serdatr; /* Just to give it a value */
1512  	tty_port_init(&state->tport);
1513  	state->tport.ops = &amiga_port_ops;
1514  	tty_port_link_device(&state->tport, driver, 0);
1515  
1516  	error = tty_register_driver(driver);
1517  	if (error)
1518  		goto fail_tty_driver_kref_put;
1519  
1520  	printk(KERN_INFO "ttyS0 is the amiga builtin serial port\n");
1521  
1522  	/* Hardware set up */
1523  
1524  	state->baud_base = amiga_colorclock;
1525  
1526  	/* set ISRs, and then disable the rx interrupts */
1527  	error = request_irq(IRQ_AMIGA_TBE, ser_tx_int, 0, "serial TX", state);
1528  	if (error)
1529  		goto fail_unregister;
1530  
1531  	error = request_irq(IRQ_AMIGA_RBF, ser_rx_int, 0,
1532  			    "serial RX", state);
1533  	if (error)
1534  		goto fail_free_irq;
1535  
1536  	local_irq_save(flags);
1537  
1538  	/* turn off Rx and Tx interrupts */
1539  	amiga_custom.intena = IF_RBF | IF_TBE;
1540  	mb();
1541  
1542  	/* clear any pending interrupt */
1543  	amiga_custom.intreq = IF_RBF | IF_TBE;
1544  	mb();
1545  
1546  	local_irq_restore(flags);
1547  
1548  	/*
1549  	 * set the appropriate directions for the modem control flags,
1550  	 * and clear RTS and DTR
1551  	 */
1552  	ciab.ddra |= (SER_DTR | SER_RTS);   /* outputs */
1553  	ciab.ddra &= ~(SER_DCD | SER_CTS | SER_DSR);  /* inputs */
1554  
1555  	platform_set_drvdata(pdev, state);
1556  
1557  	serial_driver = driver;
1558  
1559  	return 0;
1560  
1561  fail_free_irq:
1562  	free_irq(IRQ_AMIGA_TBE, state);
1563  fail_unregister:
1564  	tty_unregister_driver(driver);
1565  fail_tty_driver_kref_put:
1566  	tty_port_destroy(&state->tport);
1567  	tty_driver_kref_put(driver);
1568  	return error;
1569  }
1570  
amiga_serial_remove(struct platform_device * pdev)1571  static int __exit amiga_serial_remove(struct platform_device *pdev)
1572  {
1573  	struct serial_state *state = platform_get_drvdata(pdev);
1574  
1575  	tty_unregister_driver(serial_driver);
1576  	tty_driver_kref_put(serial_driver);
1577  	tty_port_destroy(&state->tport);
1578  
1579  	free_irq(IRQ_AMIGA_TBE, state);
1580  	free_irq(IRQ_AMIGA_RBF, state);
1581  
1582  	return 0;
1583  }
1584  
1585  static struct platform_driver amiga_serial_driver = {
1586  	.remove = __exit_p(amiga_serial_remove),
1587  	.driver   = {
1588  		.name	= "amiga-serial",
1589  	},
1590  };
1591  
1592  module_platform_driver_probe(amiga_serial_driver, amiga_serial_probe);
1593  
1594  
1595  #if defined(CONFIG_SERIAL_CONSOLE) && !defined(MODULE)
1596  
1597  /*
1598   * ------------------------------------------------------------
1599   * Serial console driver
1600   * ------------------------------------------------------------
1601   */
1602  
amiga_serial_putc(char c)1603  static void amiga_serial_putc(char c)
1604  {
1605  	amiga_custom.serdat = (unsigned char)c | 0x100;
1606  	while (!(amiga_custom.serdatr & 0x2000))
1607  		barrier();
1608  }
1609  
1610  /*
1611   *	Print a string to the serial port trying not to disturb
1612   *	any possible real use of the port...
1613   *
1614   *	The console must be locked when we get here.
1615   */
serial_console_write(struct console * co,const char * s,unsigned count)1616  static void serial_console_write(struct console *co, const char *s,
1617  				unsigned count)
1618  {
1619  	unsigned short intena = amiga_custom.intenar;
1620  
1621  	amiga_custom.intena = IF_TBE;
1622  
1623  	while (count--) {
1624  		if (*s == '\n')
1625  			amiga_serial_putc('\r');
1626  		amiga_serial_putc(*s++);
1627  	}
1628  
1629  	amiga_custom.intena = IF_SETCLR | (intena & IF_TBE);
1630  }
1631  
serial_console_device(struct console * c,int * index)1632  static struct tty_driver *serial_console_device(struct console *c, int *index)
1633  {
1634  	*index = 0;
1635  	return serial_driver;
1636  }
1637  
1638  static struct console sercons = {
1639  	.name =		"ttyS",
1640  	.write =	serial_console_write,
1641  	.device =	serial_console_device,
1642  	.flags =	CON_PRINTBUFFER,
1643  	.index =	-1,
1644  };
1645  
1646  /*
1647   *	Register console.
1648   */
amiserial_console_init(void)1649  static int __init amiserial_console_init(void)
1650  {
1651  	if (!MACH_IS_AMIGA)
1652  		return -ENODEV;
1653  
1654  	register_console(&sercons);
1655  	return 0;
1656  }
1657  console_initcall(amiserial_console_init);
1658  
1659  #endif /* CONFIG_SERIAL_CONSOLE && !MODULE */
1660  
1661  MODULE_LICENSE("GPL");
1662  MODULE_ALIAS("platform:amiga-serial");
1663