Lines Matching +full:rs485 +full:- +full:rts +full:- +full:delay
1 // SPDX-License-Identifier: GPL-2.0
9 * associated with the registers and bits of 16550 compatible UARTS -
25 #include <linux/delay.h>
37 #define DBG_CNT(s) printk("(%s): [%x] refc=%d, serc=%d, ttyc=%d -> %s\n", \
38 tty->name, (info->tport.flags), serial_driver->refcount,info->count,tty->count,s)
103 static char *serial_name = "Amiga-builtin serial driver";
148 * ------------------------------------------------------------
151 * This routines are called before setting or resetting tty->stopped.
153 * ------------------------------------------------------------
157 struct serial_state *info = tty->driver_data; in rs_stop()
161 if (info->IER & UART_IER_THRI) { in rs_stop()
162 info->IER &= ~UART_IER_THRI; in rs_stop()
174 struct serial_state *info = tty->driver_data; in rs_start()
178 if (info->xmit.head != info->xmit.tail in rs_start()
179 && info->xmit.buf in rs_start()
180 && !(info->IER & UART_IER_THRI)) { in rs_start()
181 info->IER |= UART_IER_THRI; in rs_start()
192 * ----------------------------------------------------------------------
204 * gcc -S -DKERNEL -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer serial.c
208 * - Ted Ts'o (tytso@mit.edu), 7-Mar-93
209 * -----------------------------------------------------------------------
220 icount = &info->icount; in receive_chars()
234 icount->rx++; in receive_chars()
242 * We don't handle parity or frame errors - but I have left in receive_chars()
254 icount->brk++; in receive_chars()
256 icount->parity++; in receive_chars()
258 icount->frame++; in receive_chars()
260 icount->overrun++; in receive_chars()
267 if (status & info->ignore_status_mask) in receive_chars()
270 status &= info->read_status_mask; in receive_chars()
277 if (info->tport.flags & ASYNC_SAK) in receive_chars()
278 do_SAK(info->tport.tty); in receive_chars()
292 tty_insert_flip_char(&info->tport, ch, flag); in receive_chars()
294 tty_insert_flip_char(&info->tport, 0, TTY_OVERRUN); in receive_chars()
295 tty_flip_buffer_push(&info->tport); in receive_chars()
304 if (info->x_char) { in transmit_chars()
305 custom.serdat = info->x_char | 0x100; in transmit_chars()
307 info->icount.tx++; in transmit_chars()
308 info->x_char = 0; in transmit_chars()
311 if (info->xmit.head == info->xmit.tail in transmit_chars()
312 || info->tport.tty->stopped in transmit_chars()
313 || info->tport.tty->hw_stopped) { in transmit_chars()
314 info->IER &= ~UART_IER_THRI; in transmit_chars()
320 custom.serdat = info->xmit.buf[info->xmit.tail++] | 0x100; in transmit_chars()
322 info->xmit.tail = info->xmit.tail & (SERIAL_XMIT_SIZE-1); in transmit_chars()
323 info->icount.tx++; in transmit_chars()
325 if (CIRC_CNT(info->xmit.head, in transmit_chars()
326 info->xmit.tail, in transmit_chars()
328 tty_wakeup(info->tport.tty); in transmit_chars()
333 if (info->xmit.head == info->xmit.tail) { in transmit_chars()
336 info->IER &= ~UART_IER_THRI; in transmit_chars()
342 struct tty_port *port = &info->tport; in check_modem_status()
352 icount = &info->icount; in check_modem_status()
355 icount->dsr++; in check_modem_status()
357 icount->dcd++; in check_modem_status()
360 icount->cts++; in check_modem_status()
361 wake_up_interruptible(&port->delta_msr_wait); in check_modem_status()
366 printk("ttyS%d CD now %s...", info->line, in check_modem_status()
370 wake_up_interruptible(&port->open_wait); in check_modem_status()
375 if (port->tty) in check_modem_status()
376 tty_hangup(port->tty); in check_modem_status()
380 if (port->tty->hw_stopped) { in check_modem_status()
385 port->tty->hw_stopped = 0; in check_modem_status()
386 info->IER |= UART_IER_THRI; in check_modem_status()
392 tty_wakeup(port->tty); in check_modem_status()
400 port->tty->hw_stopped = 1; in check_modem_status()
401 info->IER &= ~UART_IER_THRI; in check_modem_status()
417 * TBD - is it better to unregister from this interrupt or to in ser_vbl_int()
420 if(info->IER & UART_IER_MSI) in ser_vbl_int()
433 if (!info->tport.tty) in ser_rx_int()
452 if (!info->tport.tty) in ser_tx_int()
464 * -------------------------------------------------------------------
466 * -------------------------------------------------------------------
470 * ---------------------------------------------------------------
475 * ---------------------------------------------------------------
480 struct tty_port *port = &info->tport; in startup()
487 return -ENOMEM; in startup()
496 if (info->xmit.buf) in startup()
499 info->xmit.buf = (unsigned char *) page; in startup()
502 printk("starting up ttys%d ...", info->line); in startup()
513 set_bit(TTY_IO_ERROR, &tty->flags); in startup()
522 info->IER = UART_IER_MSI; in startup()
527 info->MCR = 0; in startup()
529 info->MCR = SER_DTR | SER_RTS; in startup()
530 rtsdtr_ctrl(info->MCR); in startup()
532 clear_bit(TTY_IO_ERROR, &tty->flags); in startup()
533 info->xmit.head = info->xmit.tail = 0; in startup()
558 if (!tty_port_initialized(&info->tport)) in shutdown()
564 printk("Shutting down serial port %d ....\n", info->line); in shutdown()
573 wake_up_interruptible(&info->tport.delta_msr_wait); in shutdown()
580 if (info->xmit.buf) { in shutdown()
581 free_page((unsigned long) info->xmit.buf); in shutdown()
582 info->xmit.buf = NULL; in shutdown()
585 info->IER = 0; in shutdown()
594 info->MCR &= ~(SER_DTR|SER_RTS); in shutdown()
595 rtsdtr_ctrl(info->MCR); in shutdown()
597 set_bit(TTY_IO_ERROR, &tty->flags); in shutdown()
599 tty_port_set_initialized(&info->tport, 0); in shutdown()
611 struct tty_port *port = &info->tport; in change_speed()
617 cflag = tty->termios.c_cflag; in change_speed()
641 baud_base = info->baud_base; in change_speed()
642 if (baud == 38400 && (port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) in change_speed()
643 quot = info->custom_divisor; in change_speed()
654 tty->termios.c_cflag &= ~CBAUD; in change_speed()
655 tty->termios.c_cflag |= (old_termios->c_cflag & CBAUD); in change_speed()
660 (port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) in change_speed()
661 quot = info->custom_divisor; in change_speed()
673 info->quot = quot; in change_speed()
674 info->timeout = ((info->xmit_fifo_size*HZ*bits*quot) / baud_base); in change_speed()
675 info->timeout += HZ/50; /* Add .02 seconds of slop */ in change_speed()
678 info->IER &= ~UART_IER_MSI; in change_speed()
679 if (port->flags & ASYNC_HARDPPS_CD) in change_speed()
680 info->IER |= UART_IER_MSI; in change_speed()
683 info->IER |= UART_IER_MSI; in change_speed()
686 info->IER |= UART_IER_MSI; in change_speed()
695 info->read_status_mask = UART_LSR_OE | UART_LSR_DR; in change_speed()
697 info->read_status_mask |= UART_LSR_FE | UART_LSR_PE; in change_speed()
699 info->read_status_mask |= UART_LSR_BI; in change_speed()
704 info->ignore_status_mask = 0; in change_speed()
706 info->ignore_status_mask |= UART_LSR_PE | UART_LSR_FE; in change_speed()
708 info->ignore_status_mask |= UART_LSR_BI; in change_speed()
714 info->ignore_status_mask |= UART_LSR_OE; in change_speed()
720 info->ignore_status_mask |= UART_LSR_DR; in change_speed()
727 serper = quot - 1; in change_speed()
746 info = tty->driver_data; in rs_put_char()
748 if (!info->xmit.buf) in rs_put_char()
752 if (CIRC_SPACE(info->xmit.head, in rs_put_char()
753 info->xmit.tail, in rs_put_char()
759 info->xmit.buf[info->xmit.head++] = ch; in rs_put_char()
760 info->xmit.head &= SERIAL_XMIT_SIZE-1; in rs_put_char()
767 struct serial_state *info = tty->driver_data; in rs_flush_chars()
770 if (info->xmit.head == info->xmit.tail in rs_flush_chars()
771 || tty->stopped in rs_flush_chars()
772 || tty->hw_stopped in rs_flush_chars()
773 || !info->xmit.buf) in rs_flush_chars()
777 info->IER |= UART_IER_THRI; in rs_flush_chars()
789 struct serial_state *info = tty->driver_data; in rs_write()
792 if (!info->xmit.buf) in rs_write()
797 c = CIRC_SPACE_TO_END(info->xmit.head, in rs_write()
798 info->xmit.tail, in rs_write()
805 memcpy(info->xmit.buf + info->xmit.head, buf, c); in rs_write()
806 info->xmit.head = ((info->xmit.head + c) & in rs_write()
807 (SERIAL_XMIT_SIZE-1)); in rs_write()
809 count -= c; in rs_write()
814 if (info->xmit.head != info->xmit.tail in rs_write()
815 && !tty->stopped in rs_write()
816 && !tty->hw_stopped in rs_write()
817 && !(info->IER & UART_IER_THRI)) { in rs_write()
818 info->IER |= UART_IER_THRI; in rs_write()
832 struct serial_state *info = tty->driver_data; in rs_write_room()
834 return CIRC_SPACE(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); in rs_write_room()
839 struct serial_state *info = tty->driver_data; in rs_chars_in_buffer()
841 return CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); in rs_chars_in_buffer()
846 struct serial_state *info = tty->driver_data; in rs_flush_buffer()
850 info->xmit.head = info->xmit.tail = 0; in rs_flush_buffer()
856 * This function is used to send a high-priority XON/XOFF character to
861 struct serial_state *info = tty->driver_data; in rs_send_xchar()
864 info->x_char = ch; in rs_send_xchar()
879 info->IER |= UART_IER_THRI; in rs_send_xchar()
884 * ------------------------------------------------------------
887 * This routine is called by the upper-layer tty layer to signal that
889 * ------------------------------------------------------------
893 struct serial_state *info = tty->driver_data; in rs_throttle()
903 info->MCR &= ~SER_RTS; in rs_throttle()
906 rtsdtr_ctrl(info->MCR); in rs_throttle()
912 struct serial_state *info = tty->driver_data; in rs_unthrottle()
919 if (info->x_char) in rs_unthrottle()
920 info->x_char = 0; in rs_unthrottle()
925 info->MCR |= SER_RTS; in rs_unthrottle()
927 rtsdtr_ctrl(info->MCR); in rs_unthrottle()
932 * ------------------------------------------------------------
934 * ------------------------------------------------------------
939 struct serial_state *state = tty->driver_data; in get_serial_info()
942 ss->line = tty->index; in get_serial_info()
943 ss->port = state->port; in get_serial_info()
944 ss->flags = state->tport.flags; in get_serial_info()
945 ss->xmit_fifo_size = state->xmit_fifo_size; in get_serial_info()
946 ss->baud_base = state->baud_base; in get_serial_info()
947 ss->close_delay = state->tport.close_delay; in get_serial_info()
948 ss->closing_wait = state->tport.closing_wait; in get_serial_info()
949 ss->custom_divisor = state->custom_divisor; in get_serial_info()
956 struct serial_state *state = tty->driver_data; in set_serial_info()
957 struct tty_port *port = &state->tport; in set_serial_info()
962 change_spd = ((ss->flags ^ port->flags) & ASYNC_SPD_MASK) || in set_serial_info()
963 ss->custom_divisor != state->custom_divisor; in set_serial_info()
964 if (ss->irq || ss->port != state->port || in set_serial_info()
965 ss->xmit_fifo_size != state->xmit_fifo_size) { in set_serial_info()
967 return -EINVAL; in set_serial_info()
971 if ((ss->baud_base != state->baud_base) || in set_serial_info()
972 (ss->close_delay != port->close_delay) || in set_serial_info()
973 (ss->xmit_fifo_size != state->xmit_fifo_size) || in set_serial_info()
974 ((ss->flags & ~ASYNC_USR_MASK) != in set_serial_info()
975 (port->flags & ~ASYNC_USR_MASK))) { in set_serial_info()
977 return -EPERM; in set_serial_info()
979 port->flags = ((port->flags & ~ASYNC_USR_MASK) | in set_serial_info()
980 (ss->flags & ASYNC_USR_MASK)); in set_serial_info()
981 state->custom_divisor = ss->custom_divisor; in set_serial_info()
985 if (ss->baud_base < 9600) { in set_serial_info()
987 return -EINVAL; in set_serial_info()
995 state->baud_base = ss->baud_base; in set_serial_info()
996 port->flags = ((port->flags & ~ASYNC_FLAGS) | in set_serial_info()
997 (ss->flags & ASYNC_FLAGS)); in set_serial_info()
998 state->custom_divisor = ss->custom_divisor; in set_serial_info()
999 port->close_delay = ss->close_delay * HZ/100; in set_serial_info()
1000 port->closing_wait = ss->closing_wait * HZ/100; in set_serial_info()
1001 port->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0; in set_serial_info()
1007 if (ss->flags & ASYNC_SPD_MASK) in set_serial_info()
1008 dev_warn_ratelimited(tty->dev, "use of SPD flags is deprecated\n"); in set_serial_info()
1018 * get_lsr_info - get line status register info
1021 * is emptied. On bus types like RS485, the transmitter must
1025 * allows an RS485 driver to be written in user space.
1039 return -EFAULT; in get_lsr_info()
1046 struct serial_state *info = tty->driver_data; in rs_tiocmget()
1051 return -EIO; in rs_tiocmget()
1053 control = info->MCR; in rs_tiocmget()
1067 struct serial_state *info = tty->driver_data; in rs_tiocmset()
1071 return -EIO; in rs_tiocmset()
1075 info->MCR |= SER_RTS; in rs_tiocmset()
1077 info->MCR |= SER_DTR; in rs_tiocmset()
1079 info->MCR &= ~SER_RTS; in rs_tiocmset()
1081 info->MCR &= ~SER_DTR; in rs_tiocmset()
1082 rtsdtr_ctrl(info->MCR); in rs_tiocmset()
1088 * rs_break() --- routine which turns the break handling on or off
1095 if (break_state == -1) in rs_break()
1107 * NB: both 1->0 and 0->1 transitions are counted except for
1108 * RI where only 0->1 is counted.
1113 struct serial_state *info = tty->driver_data; in rs_get_icount()
1118 cnow = info->icount; in rs_get_icount()
1120 icount->cts = cnow.cts; in rs_get_icount()
1121 icount->dsr = cnow.dsr; in rs_get_icount()
1122 icount->rng = cnow.rng; in rs_get_icount()
1123 icount->dcd = cnow.dcd; in rs_get_icount()
1124 icount->rx = cnow.rx; in rs_get_icount()
1125 icount->tx = cnow.tx; in rs_get_icount()
1126 icount->frame = cnow.frame; in rs_get_icount()
1127 icount->overrun = cnow.overrun; in rs_get_icount()
1128 icount->parity = cnow.parity; in rs_get_icount()
1129 icount->brk = cnow.brk; in rs_get_icount()
1130 icount->buf_overrun = cnow.buf_overrun; in rs_get_icount()
1138 struct serial_state *info = tty->driver_data; in rs_ioctl()
1148 return -EIO; in rs_ioctl()
1160 * - mask passed in arg for lines of interest in rs_ioctl()
1167 cprev = info->icount; in rs_ioctl()
1170 prepare_to_wait(&info->tport.delta_msr_wait, in rs_ioctl()
1173 cnow = info->icount; /* atomic copy */ in rs_ioctl()
1177 ret = -EIO; /* no change => error */ in rs_ioctl()
1190 ret = -ERESTARTSYS; in rs_ioctl()
1195 finish_wait(&info->tport.delta_msr_wait, &wait); in rs_ioctl()
1199 return -ENOIOCTLCMD; in rs_ioctl()
1206 struct serial_state *info = tty->driver_data; in rs_set_termios()
1208 unsigned int cflag = tty->termios.c_cflag; in rs_set_termios()
1213 if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD)) { in rs_set_termios()
1214 info->MCR &= ~(SER_DTR|SER_RTS); in rs_set_termios()
1216 rtsdtr_ctrl(info->MCR); in rs_set_termios()
1221 if (!(old_termios->c_cflag & CBAUD) && (cflag & CBAUD)) { in rs_set_termios()
1222 info->MCR |= SER_DTR; in rs_set_termios()
1224 info->MCR |= SER_RTS; in rs_set_termios()
1226 rtsdtr_ctrl(info->MCR); in rs_set_termios()
1231 if ((old_termios->c_cflag & CRTSCTS) && !C_CRTSCTS(tty)) { in rs_set_termios()
1232 tty->hw_stopped = 0; in rs_set_termios()
1243 if (!(old_termios->c_cflag & CLOCAL) && C_CLOCAL(tty)) in rs_set_termios()
1244 wake_up_interruptible(&info->open_wait); in rs_set_termios()
1249 * ------------------------------------------------------------
1256 * ------------------------------------------------------------
1260 struct serial_state *state = tty->driver_data; in rs_close()
1261 struct tty_port *port = &state->tport; in rs_close()
1272 state->read_status_mask &= ~UART_LSR_DR; in rs_close()
1286 rs_wait_until_sent(tty, state->timeout); in rs_close()
1292 port->tty = NULL; in rs_close()
1298 * rs_wait_until_sent() --- wait until the transmitter is empty
1302 struct serial_state *info = tty->driver_data; in rs_wait_until_sent()
1306 if (info->xmit_fifo_size == 0) in rs_wait_until_sent()
1317 * the NIST-PCTS. in rs_wait_until_sent()
1319 char_time = (info->timeout - HZ/50) / info->xmit_fifo_size; in rs_wait_until_sent()
1330 * takes longer than info->timeout, this is probably due to a in rs_wait_until_sent()
1332 * 2*info->timeout. in rs_wait_until_sent()
1334 if (!timeout || timeout > 2*info->timeout) in rs_wait_until_sent()
1335 timeout = 2*info->timeout; in rs_wait_until_sent()
1358 * rs_hangup() --- called by tty_hangup() when a hangup is signaled.
1362 struct serial_state *info = tty->driver_data; in rs_hangup()
1366 info->tport.count = 0; in rs_hangup()
1367 tty_port_set_active(&info->tport, 0); in rs_hangup()
1368 info->tport.tty = NULL; in rs_hangup()
1369 wake_up_interruptible(&info->tport.open_wait); in rs_hangup()
1375 * the IRQ chain. It also performs the serial-specific
1380 struct serial_state *info = rs_table + tty->index; in rs_open()
1381 struct tty_port *port = &info->tport; in rs_open()
1384 port->count++; in rs_open()
1385 port->tty = tty; in rs_open()
1386 tty->driver_data = info; in rs_open()
1387 tty->port = port; in rs_open()
1389 port->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0; in rs_open()
1413 control = tty_port_initialized(&state->tport) ? state->MCR : status; in line_info()
1419 strcat(stat_buf, "|RTS"); in line_info()
1429 if (state->quot) in line_info()
1430 seq_printf(m, " baud:%d", state->baud_base / state->quot); in line_info()
1432 seq_printf(m, " tx:%d rx:%d", state->icount.tx, state->icount.rx); in line_info()
1434 if (state->icount.frame) in line_info()
1435 seq_printf(m, " fe:%d", state->icount.frame); in line_info()
1437 if (state->icount.parity) in line_info()
1438 seq_printf(m, " pe:%d", state->icount.parity); in line_info()
1440 if (state->icount.brk) in line_info()
1441 seq_printf(m, " brk:%d", state->icount.brk); in line_info()
1443 if (state->icount.overrun) in line_info()
1444 seq_printf(m, " oe:%d", state->icount.overrun); in line_info()
1447 * Last thing is the RS-232 status lines in line_info()
1460 * ---------------------------------------------------------------------
1463 * rs_init() is called at boot-time to initialize the serial driver.
1464 * ---------------------------------------------------------------------
1517 info->MCR |= SER_DTR|SER_RTS; in amiga_dtr_rts()
1519 info->MCR &= ~(SER_DTR|SER_RTS); in amiga_dtr_rts()
1522 rtsdtr_ctrl(info->MCR); in amiga_dtr_rts()
1532 * The serial driver boot-time initialization code!
1542 return -ENOMEM; in amiga_serial_probe()
1548 serial_driver->driver_name = "amiserial"; in amiga_serial_probe()
1549 serial_driver->name = "ttyS"; in amiga_serial_probe()
1550 serial_driver->major = TTY_MAJOR; in amiga_serial_probe()
1551 serial_driver->minor_start = 64; in amiga_serial_probe()
1552 serial_driver->type = TTY_DRIVER_TYPE_SERIAL; in amiga_serial_probe()
1553 serial_driver->subtype = SERIAL_TYPE_NORMAL; in amiga_serial_probe()
1554 serial_driver->init_termios = tty_std_termios; in amiga_serial_probe()
1555 serial_driver->init_termios.c_cflag = in amiga_serial_probe()
1557 serial_driver->flags = TTY_DRIVER_REAL_RAW; in amiga_serial_probe()
1561 state->port = (int)&custom.serdatr; /* Just to give it a value */ in amiga_serial_probe()
1562 state->custom_divisor = 0; in amiga_serial_probe()
1563 state->icount.cts = state->icount.dsr = in amiga_serial_probe()
1564 state->icount.rng = state->icount.dcd = 0; in amiga_serial_probe()
1565 state->icount.rx = state->icount.tx = 0; in amiga_serial_probe()
1566 state->icount.frame = state->icount.parity = 0; in amiga_serial_probe()
1567 state->icount.overrun = state->icount.brk = 0; in amiga_serial_probe()
1568 tty_port_init(&state->tport); in amiga_serial_probe()
1569 state->tport.ops = &amiga_port_ops; in amiga_serial_probe()
1570 tty_port_link_device(&state->tport, serial_driver, 0); in amiga_serial_probe()
1580 state->baud_base = amiga_colorclock; in amiga_serial_probe()
1581 state->xmit_fifo_size = 1; in amiga_serial_probe()
1607 * and clear RTS and DTR in amiga_serial_probe()
1621 tty_port_destroy(&state->tport); in amiga_serial_probe()
1637 tty_port_destroy(&state->tport); in amiga_serial_remove()
1648 .name = "amiga-serial",
1658 * ------------------------------------------------------------
1660 * ------------------------------------------------------------
1683 while (count--) { in serial_console_write()
1703 .index = -1,
1712 return -ENODEV; in amiserial_console_init()
1722 MODULE_ALIAS("platform:amiga-serial");