Lines Matching +full:rs485 +full:- +full:rts +full:- +full:active +full:- +full:low

1 // SPDX-License-Identifier: GPL-2.0
9 * associated with the registers and bits of 16550 compatible UARTS -
126 * ------------------------------------------------------------
129 * This routines are called before setting or resetting tty->flow.stopped.
131 * ------------------------------------------------------------
135 struct serial_state *info = tty->driver_data; in rs_stop()
139 if (info->IER & UART_IER_THRI) { in rs_stop()
140 info->IER &= ~UART_IER_THRI; in rs_stop()
152 struct serial_state *info = tty->driver_data; in rs_start()
156 if (info->xmit.head != info->xmit.tail in rs_start()
157 && info->xmit.buf in rs_start()
158 && !(info->IER & UART_IER_THRI)) { in rs_start()
159 info->IER |= UART_IER_THRI; in rs_start()
170 * ----------------------------------------------------------------------
174 * -----------------------------------------------------------------------
185 icount = &info->icount; in receive_chars()
199 icount->rx++; in receive_chars()
207 * We don't handle parity or frame errors - but I have left in receive_chars()
219 icount->brk++; in receive_chars()
221 icount->parity++; in receive_chars()
223 icount->frame++; in receive_chars()
225 icount->overrun++; in receive_chars()
232 if (status & info->ignore_status_mask) in receive_chars()
235 status &= info->read_status_mask; in receive_chars()
242 if (info->tport.flags & ASYNC_SAK) in receive_chars()
243 do_SAK(info->tport.tty); in receive_chars()
257 tty_insert_flip_char(&info->tport, ch, flag); in receive_chars()
259 tty_insert_flip_char(&info->tport, 0, TTY_OVERRUN); in receive_chars()
260 tty_flip_buffer_push(&info->tport); in receive_chars()
267 if (info->x_char) { in transmit_chars()
268 amiga_custom.serdat = info->x_char | 0x100; in transmit_chars()
270 info->icount.tx++; in transmit_chars()
271 info->x_char = 0; in transmit_chars()
274 if (info->xmit.head == info->xmit.tail in transmit_chars()
275 || info->tport.tty->flow.stopped in transmit_chars()
276 || info->tport.tty->hw_stopped) { in transmit_chars()
277 info->IER &= ~UART_IER_THRI; in transmit_chars()
283 amiga_custom.serdat = info->xmit.buf[info->xmit.tail++] | 0x100; in transmit_chars()
285 info->xmit.tail = info->xmit.tail & (UART_XMIT_SIZE - 1); in transmit_chars()
286 info->icount.tx++; in transmit_chars()
288 if (CIRC_CNT(info->xmit.head, in transmit_chars()
289 info->xmit.tail, in transmit_chars()
291 tty_wakeup(info->tport.tty); in transmit_chars()
296 if (info->xmit.head == info->xmit.tail) { in transmit_chars()
299 info->IER &= ~UART_IER_THRI; in transmit_chars()
305 struct tty_port *port = &info->tport; in check_modem_status()
315 icount = &info->icount; in check_modem_status()
318 icount->dsr++; in check_modem_status()
320 icount->dcd++; in check_modem_status()
323 icount->cts++; in check_modem_status()
324 wake_up_interruptible(&port->delta_msr_wait); in check_modem_status()
329 printk("ttyS%d CD now %s...", info->line, in check_modem_status()
333 wake_up_interruptible(&port->open_wait); in check_modem_status()
338 if (port->tty) in check_modem_status()
339 tty_hangup(port->tty); in check_modem_status()
343 if (port->tty->hw_stopped) { in check_modem_status()
348 port->tty->hw_stopped = false; in check_modem_status()
349 info->IER |= UART_IER_THRI; in check_modem_status()
355 tty_wakeup(port->tty); in check_modem_status()
363 port->tty->hw_stopped = true; in check_modem_status()
364 info->IER &= ~UART_IER_THRI; in check_modem_status()
380 * TBD - is it better to unregister from this interrupt or to in ser_vbl_int()
383 if(info->IER & UART_IER_MSI) in ser_vbl_int()
396 if (!info->tport.tty) in ser_rx_int()
415 if (!info->tport.tty) in ser_tx_int()
427 * -------------------------------------------------------------------
429 * -------------------------------------------------------------------
433 * ---------------------------------------------------------------
434 * Low level utility subroutines for the serial driver: routines to
438 * ---------------------------------------------------------------
443 struct tty_port *port = &info->tport; in startup()
450 return -ENOMEM; in startup()
459 if (info->xmit.buf) in startup()
462 info->xmit.buf = (unsigned char *) page; in startup()
465 printk("starting up ttys%d ...", info->line); in startup()
476 set_bit(TTY_IO_ERROR, &tty->flags); in startup()
485 info->IER = UART_IER_MSI; in startup()
490 info->MCR = 0; in startup()
492 info->MCR = SER_DTR | SER_RTS; in startup()
493 rtsdtr_ctrl(info->MCR); in startup()
495 clear_bit(TTY_IO_ERROR, &tty->flags); in startup()
496 info->xmit.head = info->xmit.tail = 0; in startup()
520 if (!tty_port_initialized(&info->tport)) in shutdown()
524 printk("Shutting down serial port %d ....\n", info->line); in shutdown()
533 wake_up_interruptible(&info->tport.delta_msr_wait); in shutdown()
540 free_page((unsigned long)info->xmit.buf); in shutdown()
541 info->xmit.buf = NULL; in shutdown()
543 info->IER = 0; in shutdown()
552 info->MCR &= ~(SER_DTR|SER_RTS); in shutdown()
553 rtsdtr_ctrl(info->MCR); in shutdown()
555 set_bit(TTY_IO_ERROR, &tty->flags); in shutdown()
557 tty_port_set_initialized(&info->tport, false); in shutdown()
569 struct tty_port *port = &info->tport; in change_speed()
575 cflag = tty->termios.c_cflag; in change_speed()
597 baud_base = info->baud_base; in change_speed()
598 if (baud == 38400 && (port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) in change_speed()
599 quot = info->custom_divisor; in change_speed()
610 tty->termios.c_cflag &= ~CBAUD; in change_speed()
611 tty->termios.c_cflag |= (old_termios->c_cflag & CBAUD); in change_speed()
616 (port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) in change_speed()
617 quot = info->custom_divisor; in change_speed()
629 info->quot = quot; in change_speed()
630 info->timeout = (XMIT_FIFO_SIZE*HZ*bits*quot) / baud_base; in change_speed()
631 info->timeout += HZ/50; /* Add .02 seconds of slop */ in change_speed()
634 info->IER &= ~UART_IER_MSI; in change_speed()
635 if (port->flags & ASYNC_HARDPPS_CD) in change_speed()
636 info->IER |= UART_IER_MSI; in change_speed()
639 info->IER |= UART_IER_MSI; in change_speed()
642 info->IER |= UART_IER_MSI; in change_speed()
651 info->read_status_mask = UART_LSR_OE | UART_LSR_DR; in change_speed()
653 info->read_status_mask |= UART_LSR_FE | UART_LSR_PE; in change_speed()
655 info->read_status_mask |= UART_LSR_BI; in change_speed()
660 info->ignore_status_mask = 0; in change_speed()
662 info->ignore_status_mask |= UART_LSR_PE | UART_LSR_FE; in change_speed()
664 info->ignore_status_mask |= UART_LSR_BI; in change_speed()
670 info->ignore_status_mask |= UART_LSR_OE; in change_speed()
676 info->ignore_status_mask |= UART_LSR_DR; in change_speed()
683 serper = quot - 1; in change_speed()
702 info = tty->driver_data; in rs_put_char()
704 if (!info->xmit.buf) in rs_put_char()
708 if (CIRC_SPACE(info->xmit.head, in rs_put_char()
709 info->xmit.tail, in rs_put_char()
715 info->xmit.buf[info->xmit.head++] = ch; in rs_put_char()
716 info->xmit.head &= UART_XMIT_SIZE - 1; in rs_put_char()
723 struct serial_state *info = tty->driver_data; in rs_flush_chars()
726 if (info->xmit.head == info->xmit.tail in rs_flush_chars()
727 || tty->flow.stopped in rs_flush_chars()
728 || tty->hw_stopped in rs_flush_chars()
729 || !info->xmit.buf) in rs_flush_chars()
733 info->IER |= UART_IER_THRI; in rs_flush_chars()
745 struct serial_state *info = tty->driver_data; in rs_write()
748 if (!info->xmit.buf) in rs_write()
753 c = CIRC_SPACE_TO_END(info->xmit.head, in rs_write()
754 info->xmit.tail, in rs_write()
761 memcpy(info->xmit.buf + info->xmit.head, buf, c); in rs_write()
762 info->xmit.head = (info->xmit.head + c) & (UART_XMIT_SIZE - 1); in rs_write()
764 count -= c; in rs_write()
769 if (info->xmit.head != info->xmit.tail in rs_write()
770 && !tty->flow.stopped in rs_write()
771 && !tty->hw_stopped in rs_write()
772 && !(info->IER & UART_IER_THRI)) { in rs_write()
773 info->IER |= UART_IER_THRI; in rs_write()
787 struct serial_state *info = tty->driver_data; in rs_write_room()
789 return CIRC_SPACE(info->xmit.head, info->xmit.tail, UART_XMIT_SIZE); in rs_write_room()
794 struct serial_state *info = tty->driver_data; in rs_chars_in_buffer()
796 return CIRC_CNT(info->xmit.head, info->xmit.tail, UART_XMIT_SIZE); in rs_chars_in_buffer()
801 struct serial_state *info = tty->driver_data; in rs_flush_buffer()
805 info->xmit.head = info->xmit.tail = 0; in rs_flush_buffer()
811 * This function is used to send a high-priority XON/XOFF character to
816 struct serial_state *info = tty->driver_data; in rs_send_xchar()
819 info->x_char = ch; in rs_send_xchar()
834 info->IER |= UART_IER_THRI; in rs_send_xchar()
839 * ------------------------------------------------------------
842 * This routine is called by the upper-layer tty layer to signal that
844 * ------------------------------------------------------------
848 struct serial_state *info = tty->driver_data; in rs_throttle()
858 info->MCR &= ~SER_RTS; in rs_throttle()
861 rtsdtr_ctrl(info->MCR); in rs_throttle()
867 struct serial_state *info = tty->driver_data; in rs_unthrottle()
874 if (info->x_char) in rs_unthrottle()
875 info->x_char = 0; in rs_unthrottle()
880 info->MCR |= SER_RTS; in rs_unthrottle()
882 rtsdtr_ctrl(info->MCR); in rs_unthrottle()
887 * ------------------------------------------------------------
889 * ------------------------------------------------------------
894 struct serial_state *state = tty->driver_data; in get_serial_info()
898 close_delay = jiffies_to_msecs(state->tport.close_delay) / 10; in get_serial_info()
899 closing_wait = state->tport.closing_wait; in get_serial_info()
903 ss->line = tty->index; in get_serial_info()
904 ss->port = state->port; in get_serial_info()
905 ss->flags = state->tport.flags; in get_serial_info()
906 ss->xmit_fifo_size = XMIT_FIFO_SIZE; in get_serial_info()
907 ss->baud_base = state->baud_base; in get_serial_info()
908 ss->close_delay = close_delay; in get_serial_info()
909 ss->closing_wait = closing_wait; in get_serial_info()
910 ss->custom_divisor = state->custom_divisor; in get_serial_info()
917 struct serial_state *state = tty->driver_data; in set_serial_info()
918 struct tty_port *port = &state->tport; in set_serial_info()
924 change_spd = ((ss->flags ^ port->flags) & ASYNC_SPD_MASK) || in set_serial_info()
925 ss->custom_divisor != state->custom_divisor; in set_serial_info()
926 if (ss->irq || ss->port != state->port || in set_serial_info()
927 ss->xmit_fifo_size != XMIT_FIFO_SIZE) { in set_serial_info()
929 return -EINVAL; in set_serial_info()
932 close_delay = msecs_to_jiffies(ss->close_delay * 10); in set_serial_info()
933 closing_wait = ss->closing_wait; in set_serial_info()
938 if ((ss->baud_base != state->baud_base) || in set_serial_info()
939 (close_delay != port->close_delay) || in set_serial_info()
940 (closing_wait != port->closing_wait) || in set_serial_info()
941 ((ss->flags & ~ASYNC_USR_MASK) != in set_serial_info()
942 (port->flags & ~ASYNC_USR_MASK))) { in set_serial_info()
944 return -EPERM; in set_serial_info()
946 port->flags = ((port->flags & ~ASYNC_USR_MASK) | in set_serial_info()
947 (ss->flags & ASYNC_USR_MASK)); in set_serial_info()
948 state->custom_divisor = ss->custom_divisor; in set_serial_info()
952 if (ss->baud_base < 9600) { in set_serial_info()
954 return -EINVAL; in set_serial_info()
962 state->baud_base = ss->baud_base; in set_serial_info()
963 port->flags = ((port->flags & ~ASYNC_FLAGS) | in set_serial_info()
964 (ss->flags & ASYNC_FLAGS)); in set_serial_info()
965 state->custom_divisor = ss->custom_divisor; in set_serial_info()
966 port->close_delay = close_delay; in set_serial_info()
967 port->closing_wait = closing_wait; in set_serial_info()
973 if (ss->flags & ASYNC_SPD_MASK) in set_serial_info()
974 dev_warn_ratelimited(tty->dev, "use of SPD flags is deprecated\n"); in set_serial_info()
984 * get_lsr_info - get line status register info
987 * is emptied. On bus types like RS485, the transmitter must
991 * allows an RS485 driver to be written in user space.
1005 return -EFAULT; in get_lsr_info()
1012 struct serial_state *info = tty->driver_data; in rs_tiocmget()
1017 return -EIO; in rs_tiocmget()
1019 control = info->MCR; in rs_tiocmget()
1033 struct serial_state *info = tty->driver_data; in rs_tiocmset()
1037 return -EIO; in rs_tiocmset()
1041 info->MCR |= SER_RTS; in rs_tiocmset()
1043 info->MCR |= SER_DTR; in rs_tiocmset()
1045 info->MCR &= ~SER_RTS; in rs_tiocmset()
1047 info->MCR &= ~SER_DTR; in rs_tiocmset()
1048 rtsdtr_ctrl(info->MCR); in rs_tiocmset()
1054 * rs_break() --- routine which turns the break handling on or off
1061 if (break_state == -1) in rs_break()
1073 * NB: both 1->0 and 0->1 transitions are counted except for
1074 * RI where only 0->1 is counted.
1079 struct serial_state *info = tty->driver_data; in rs_get_icount()
1084 cnow = info->icount; in rs_get_icount()
1086 icount->cts = cnow.cts; in rs_get_icount()
1087 icount->dsr = cnow.dsr; in rs_get_icount()
1088 icount->rng = cnow.rng; in rs_get_icount()
1089 icount->dcd = cnow.dcd; in rs_get_icount()
1090 icount->rx = cnow.rx; in rs_get_icount()
1091 icount->tx = cnow.tx; in rs_get_icount()
1092 icount->frame = cnow.frame; in rs_get_icount()
1093 icount->overrun = cnow.overrun; in rs_get_icount()
1094 icount->parity = cnow.parity; in rs_get_icount()
1095 icount->brk = cnow.brk; in rs_get_icount()
1096 icount->buf_overrun = cnow.buf_overrun; in rs_get_icount()
1104 struct serial_state *info = tty->driver_data; in rs_ioctl()
1114 return -EIO; in rs_ioctl()
1126 * - mask passed in arg for lines of interest in rs_ioctl()
1133 cprev = info->icount; in rs_ioctl()
1136 prepare_to_wait(&info->tport.delta_msr_wait, in rs_ioctl()
1139 cnow = info->icount; /* atomic copy */ in rs_ioctl()
1143 ret = -EIO; /* no change => error */ in rs_ioctl()
1156 ret = -ERESTARTSYS; in rs_ioctl()
1161 finish_wait(&info->tport.delta_msr_wait, &wait); in rs_ioctl()
1165 return -ENOIOCTLCMD; in rs_ioctl()
1172 struct serial_state *info = tty->driver_data; in rs_set_termios()
1174 unsigned int cflag = tty->termios.c_cflag; in rs_set_termios()
1179 if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD)) { in rs_set_termios()
1180 info->MCR &= ~(SER_DTR|SER_RTS); in rs_set_termios()
1182 rtsdtr_ctrl(info->MCR); in rs_set_termios()
1187 if (!(old_termios->c_cflag & CBAUD) && (cflag & CBAUD)) { in rs_set_termios()
1188 info->MCR |= SER_DTR; in rs_set_termios()
1190 info->MCR |= SER_RTS; in rs_set_termios()
1192 rtsdtr_ctrl(info->MCR); in rs_set_termios()
1197 if ((old_termios->c_cflag & CRTSCTS) && !C_CRTSCTS(tty)) { in rs_set_termios()
1198 tty->hw_stopped = false; in rs_set_termios()
1209 if (!(old_termios->c_cflag & CLOCAL) && C_CLOCAL(tty)) in rs_set_termios()
1210 wake_up_interruptible(&info->open_wait); in rs_set_termios()
1215 * ------------------------------------------------------------
1222 * ------------------------------------------------------------
1226 struct serial_state *state = tty->driver_data; in rs_close()
1227 struct tty_port *port = &state->tport; in rs_close()
1238 state->read_status_mask &= ~UART_LSR_DR; in rs_close()
1252 rs_wait_until_sent(tty, state->timeout); in rs_close()
1258 port->tty = NULL; in rs_close()
1264 * rs_wait_until_sent() --- wait until the transmitter is empty
1268 struct serial_state *info = tty->driver_data; in rs_wait_until_sent()
1280 * the NIST-PCTS. in rs_wait_until_sent()
1282 char_time = (info->timeout - HZ/50) / XMIT_FIFO_SIZE; in rs_wait_until_sent()
1293 * takes longer than info->timeout, this is probably due to a in rs_wait_until_sent()
1295 * 2*info->timeout. in rs_wait_until_sent()
1297 if (!timeout || timeout > 2*info->timeout) in rs_wait_until_sent()
1298 timeout = 2*info->timeout; in rs_wait_until_sent()
1321 * rs_hangup() --- called by tty_hangup() when a hangup is signaled.
1325 struct serial_state *info = tty->driver_data; in rs_hangup()
1329 info->tport.count = 0; in rs_hangup()
1330 tty_port_set_active(&info->tport, false); in rs_hangup()
1331 info->tport.tty = NULL; in rs_hangup()
1332 wake_up_interruptible(&info->tport.open_wait); in rs_hangup()
1338 * the IRQ chain. It also performs the serial-specific
1343 struct tty_port *port = tty->port; in rs_open()
1348 port->count++; in rs_open()
1349 port->tty = tty; in rs_open()
1350 tty->driver_data = info; in rs_open()
1374 control = tty_port_initialized(&state->tport) ? state->MCR : status; in line_info()
1380 strcat(stat_buf, "|RTS"); in line_info()
1390 if (state->quot) in line_info()
1391 seq_printf(m, " baud:%d", state->baud_base / state->quot); in line_info()
1393 seq_printf(m, " tx:%d rx:%d", state->icount.tx, state->icount.rx); in line_info()
1395 if (state->icount.frame) in line_info()
1396 seq_printf(m, " fe:%d", state->icount.frame); in line_info()
1398 if (state->icount.parity) in line_info()
1399 seq_printf(m, " pe:%d", state->icount.parity); in line_info()
1401 if (state->icount.brk) in line_info()
1402 seq_printf(m, " brk:%d", state->icount.brk); in line_info()
1404 if (state->icount.overrun) in line_info()
1405 seq_printf(m, " oe:%d", state->icount.overrun); in line_info()
1408 * Last thing is the RS-232 status lines in line_info()
1421 * ---------------------------------------------------------------------
1424 * rs_init() is called at boot-time to initialize the serial driver.
1425 * ---------------------------------------------------------------------
1460 static void amiga_dtr_rts(struct tty_port *port, bool active) in amiga_dtr_rts() argument
1466 if (active) in amiga_dtr_rts()
1467 info->MCR |= SER_DTR|SER_RTS; in amiga_dtr_rts()
1469 info->MCR &= ~(SER_DTR|SER_RTS); in amiga_dtr_rts()
1472 rtsdtr_ctrl(info->MCR); in amiga_dtr_rts()
1482 * The serial driver boot-time initialization code!
1497 driver->driver_name = "amiserial"; in amiga_serial_probe()
1498 driver->name = "ttyS"; in amiga_serial_probe()
1499 driver->major = TTY_MAJOR; in amiga_serial_probe()
1500 driver->minor_start = 64; in amiga_serial_probe()
1501 driver->type = TTY_DRIVER_TYPE_SERIAL; in amiga_serial_probe()
1502 driver->subtype = SERIAL_TYPE_NORMAL; in amiga_serial_probe()
1503 driver->init_termios = tty_std_termios; in amiga_serial_probe()
1504 driver->init_termios.c_cflag = in amiga_serial_probe()
1509 state->port = (int)&amiga_custom.serdatr; /* Just to give it a value */ in amiga_serial_probe()
1510 tty_port_init(&state->tport); in amiga_serial_probe()
1511 state->tport.ops = &amiga_port_ops; in amiga_serial_probe()
1512 tty_port_link_device(&state->tport, driver, 0); in amiga_serial_probe()
1522 state->baud_base = amiga_colorclock; in amiga_serial_probe()
1548 * and clear RTS and DTR in amiga_serial_probe()
1564 tty_port_destroy(&state->tport); in amiga_serial_probe()
1575 tty_port_destroy(&state->tport); in amiga_serial_remove()
1590 .name = "amiga-serial",
1600 * ------------------------------------------------------------
1602 * ------------------------------------------------------------
1625 while (count--) { in serial_console_write()
1645 .index = -1,
1654 return -ENODEV; in amiserial_console_init()
1665 MODULE_ALIAS("platform:amiga-serial");