Lines Matching +full:rs485 +full:- +full:rts +full:- +full:delay

1 // SPDX-License-Identifier: GPL-2.0+
12 * The F81532/F81534 had 1 control endpoint for setting, 1 endpoint bulk-out
13 * for all serial port TX and 1 endpoint bulk-in for all serial port read in
122 * Bit2-1: Clock source selector
127 * Bit4: Auto direction(RTS) control (RTS pin Low when TX)
128 * Bit5: Invert direction(RTS) when Bit4 enabled (RTS pin high when TX)
197 usb_get_serial_data(port->serial); in f81534_logic_to_phy_port()
202 if (serial_priv->conf_data[i] & F81534_PORT_UNAVAILABLE) in f81534_logic_to_phy_port()
205 if (port->port_number == count) in f81534_logic_to_phy_port()
211 return -ENODEV; in f81534_logic_to_phy_port()
216 struct usb_interface *interface = serial->interface; in f81534_set_register()
217 struct usb_device *dev = serial->dev; in f81534_set_register()
224 return -ENOMEM; in f81534_set_register()
232 while (count--) { in f81534_set_register()
242 status = -EIO; in f81534_set_register()
247 dev_err(&interface->dev, "%s: reg: %x data: %x failed: %d\n", in f81534_set_register()
257 struct usb_interface *interface = serial->interface; in f81534_get_register()
258 struct usb_device *dev = serial->dev; in f81534_get_register()
265 return -ENOMEM; in f81534_get_register()
271 while (count--) { in f81534_get_register()
281 status = -EIO; in f81534_get_register()
286 dev_err(&interface->dev, "%s: reg: %x failed: %d\n", __func__, in f81534_get_register()
333 return f81534_set_register(port->serial, in f81534_set_port_register()
334 reg + port_priv->phy_num * F81534_UART_OFFSET, data); in f81534_set_port_register()
342 return f81534_get_register(port->serial, in f81534_get_port_register()
343 reg + port_priv->phy_num * F81534_UART_OFFSET, data); in f81534_get_port_register()
368 } while (--count); in f81534_wait_for_spi_idle()
371 dev_err(&serial->interface->dev, in f81534_wait_for_spi_idle()
374 return -EIO; in f81534_wait_for_spi_idle()
466 size -= read_size; in f81534_read_flash()
476 int phy_num = port_priv->phy_num; in f81534_prepare_write_buffer()
495 tx_len = kfifo_out_locked(&port->write_fifo, in f81534_prepare_write_buffer()
497 F81534_MAX_TX_SIZE, &port->lock); in f81534_prepare_write_buffer()
510 spin_lock_irqsave(&port->lock, flags); in f81534_submit_writer()
512 if (kfifo_is_empty(&port->write_fifo)) { in f81534_submit_writer()
513 spin_unlock_irqrestore(&port->lock, flags); in f81534_submit_writer()
517 spin_unlock_irqrestore(&port->lock, flags); in f81534_submit_writer()
520 if (!test_and_clear_bit(F81534_TX_EMPTY_BIT, &port_priv->tx_empty)) in f81534_submit_writer()
523 urb = port->write_urbs[0]; in f81534_submit_writer()
524 f81534_prepare_write_buffer(port, port->bulk_out_buffers[0]); in f81534_submit_writer()
525 urb->transfer_buffer_length = F81534_WRITE_BUFFER_SIZE; in f81534_submit_writer()
529 set_bit(F81534_TX_EMPTY_BIT, &port_priv->tx_empty); in f81534_submit_writer()
530 dev_err(&port->dev, "%s: submit failed: %d\n", __func__, in f81534_submit_writer()
558 return -EINVAL; in f81534_find_clk()
582 return -EINVAL; in f81534_set_port_config()
584 port_priv->baud_base = baudrate_table[idx]; in f81534_set_port_config()
585 port_priv->shadow_clk &= ~F81534_CLK_MASK; in f81534_set_port_config()
586 port_priv->shadow_clk |= clock_table[idx]; in f81534_set_port_config()
589 port_priv->shadow_clk); in f81534_set_port_config()
591 dev_err(&port->dev, "CLOCK_REG setting failed\n"); in f81534_set_port_config()
602 dev_err(&port->dev, "%s: CONFIG1 setting failed\n", __func__); in f81534_set_port_config()
614 dev_err(&port->dev, "%s: FCR setting failed\n", __func__); in f81534_set_port_config()
618 divisor = f81534_calc_baud_divisor(baudrate, port_priv->baud_base); in f81534_set_port_config()
620 mutex_lock(&port_priv->lcr_mutex); in f81534_set_port_config()
626 dev_err(&port->dev, "%s: set LCR failed\n", __func__); in f81534_set_port_config()
633 dev_err(&port->dev, "%s: set DLAB LSB failed\n", __func__); in f81534_set_port_config()
640 dev_err(&port->dev, "%s: set DLAB MSB failed\n", __func__); in f81534_set_port_config()
644 value = lcr | (port_priv->shadow_lcr & UART_LCR_SBC); in f81534_set_port_config()
648 dev_err(&port->dev, "%s: set LCR failed\n", __func__); in f81534_set_port_config()
652 port_priv->shadow_lcr = value; in f81534_set_port_config()
654 mutex_unlock(&port_priv->lcr_mutex); in f81534_set_port_config()
661 struct usb_serial_port *port = tty->driver_data; in f81534_break_ctl()
665 mutex_lock(&port_priv->lcr_mutex); in f81534_break_ctl()
668 port_priv->shadow_lcr |= UART_LCR_SBC; in f81534_break_ctl()
670 port_priv->shadow_lcr &= ~UART_LCR_SBC; in f81534_break_ctl()
673 port_priv->shadow_lcr); in f81534_break_ctl()
675 dev_err(&port->dev, "set break failed: %d\n", status); in f81534_break_ctl()
677 mutex_unlock(&port_priv->lcr_mutex); in f81534_break_ctl()
690 mutex_lock(&port_priv->mcr_mutex); in f81534_update_mctrl()
696 tmp = UART_MCR_OUT2 | port_priv->shadow_mcr; in f81534_update_mctrl()
712 dev_err(&port->dev, "%s: MCR write failed\n", __func__); in f81534_update_mctrl()
713 mutex_unlock(&port_priv->mcr_mutex); in f81534_update_mctrl()
717 port_priv->shadow_mcr = tmp; in f81534_update_mctrl()
718 mutex_unlock(&port_priv->mcr_mutex); in f81534_update_mctrl()
739 dev_err(&serial->interface->dev, "%s: read failed: %d\n", in f81534_find_config_idx()
820 * 1st is pure USB-to-TTL RS232 IC and designed for 4 ports only, no any
830 * 4bytes save port mode (0:RS232/1:RS485 Invert/2:RS485), and the last
839 struct device *dev = &serial->interface->dev; in f81534_calc_num_ports()
840 int size_bulk_in = usb_endpoint_maxp(epds->bulk_in[0]); in f81534_calc_num_ports()
841 int size_bulk_out = usb_endpoint_maxp(epds->bulk_out[0]); in f81534_calc_num_ports()
850 return -ENODEV; in f81534_calc_num_ports()
853 serial_priv = devm_kzalloc(&serial->interface->dev, in f81534_calc_num_ports()
856 return -ENOMEM; in f81534_calc_num_ports()
859 mutex_init(&serial_priv->urb_mutex); in f81534_calc_num_ports()
862 status = f81534_find_config_idx(serial, &serial_priv->setting_idx); in f81534_calc_num_ports()
864 dev_err(&serial->interface->dev, "%s: find idx failed: %d\n", in f81534_calc_num_ports()
873 if (serial_priv->setting_idx != F81534_CUSTOM_NO_CUSTOM_DATA) { in f81534_calc_num_ports()
877 sizeof(serial_priv->conf_data), in f81534_calc_num_ports()
878 serial_priv->conf_data); in f81534_calc_num_ports()
880 dev_err(&serial->interface->dev, in f81534_calc_num_ports()
886 dev_dbg(&serial->interface->dev, in f81534_calc_num_ports()
888 serial_priv->setting_idx); in f81534_calc_num_ports()
893 sizeof(serial_priv->conf_data), in f81534_calc_num_ports()
894 serial_priv->conf_data); in f81534_calc_num_ports()
896 dev_err(&serial->interface->dev, in f81534_calc_num_ports()
902 dev_dbg(&serial->interface->dev, "%s: read default config\n", in f81534_calc_num_ports()
909 serial_priv->conf_data[i] |= F81534_PORT_UNAVAILABLE; in f81534_calc_num_ports()
911 if (serial_priv->conf_data[i] & F81534_PORT_UNAVAILABLE) in f81534_calc_num_ports()
918 dev_warn(&serial->interface->dev, in f81534_calc_num_ports()
923 /* Assign phy-to-logic mapping */ in f81534_calc_num_ports()
925 if (serial_priv->conf_data[i] & F81534_PORT_UNAVAILABLE) in f81534_calc_num_ports()
928 serial_priv->tty_idx[i] = index++; in f81534_calc_num_ports()
929 dev_dbg(&serial->interface->dev, in f81534_calc_num_ports()
931 serial_priv->tty_idx[i]); in f81534_calc_num_ports()
935 * Setup bulk-out endpoint multiplexing. All ports share the same in f81534_calc_num_ports()
936 * bulk-out endpoint. in f81534_calc_num_ports()
938 BUILD_BUG_ON(ARRAY_SIZE(epds->bulk_out) < F81534_NUM_PORT); in f81534_calc_num_ports()
941 epds->bulk_out[i] = epds->bulk_out[0]; in f81534_calc_num_ports()
943 epds->num_bulk_out = num_port; in f81534_calc_num_ports()
959 else if (old_termios && (old_termios->c_cflag & CBAUD) == B0) in f81534_set_termios()
1000 dev_dbg(&port->dev, "%s: baud: %d\n", __func__, baud); in f81534_set_termios()
1004 dev_err(&port->dev, "%s: set port config failed: %d\n", in f81534_set_termios()
1011 return usb_serial_generic_submit_read_urbs(serial->port[0], flags); in f81534_submit_read_urb()
1024 spin_lock_irqsave(&port_priv->msr_lock, flags); in f81534_msr_changed()
1025 old_msr = port_priv->shadow_msr; in f81534_msr_changed()
1026 port_priv->shadow_msr = msr; in f81534_msr_changed()
1027 spin_unlock_irqrestore(&port_priv->msr_lock, flags); in f81534_msr_changed()
1029 dev_dbg(&port->dev, "%s: MSR from %02x to %02x\n", __func__, old_msr, in f81534_msr_changed()
1034 port->icount.cts++; in f81534_msr_changed()
1036 port->icount.dsr++; in f81534_msr_changed()
1038 port->icount.dcd++; in f81534_msr_changed()
1040 port->icount.rng++; in f81534_msr_changed()
1042 wake_up_interruptible(&port->port.delta_msr_wait); in f81534_msr_changed()
1047 dev_dbg(&port->dev, "%s: DCD Changed: phy_num: %d from %x to %x\n", in f81534_msr_changed()
1048 __func__, port_priv->phy_num, old_msr, msr); in f81534_msr_changed()
1050 tty = tty_port_tty_get(&port->port); in f81534_msr_changed()
1071 spin_lock_irqsave(&port_priv->msr_lock, flags); in f81534_read_msr()
1072 port_priv->shadow_msr = msr; in f81534_read_msr()
1073 spin_unlock_irqrestore(&port_priv->msr_lock, flags); in f81534_read_msr()
1081 usb_get_serial_data(port->serial); in f81534_open()
1089 dev_err(&port->dev, "%s: Clear FIFO failed: %d\n", __func__, in f81534_open()
1101 mutex_lock(&serial_priv->urb_mutex); in f81534_open()
1104 if (!serial_priv->opened_port) { in f81534_open()
1105 status = f81534_submit_read_urb(port->serial, GFP_KERNEL); in f81534_open()
1110 serial_priv->opened_port++; in f81534_open()
1113 mutex_unlock(&serial_priv->urb_mutex); in f81534_open()
1115 set_bit(F81534_TX_EMPTY_BIT, &port_priv->tx_empty); in f81534_open()
1122 usb_get_serial_data(port->serial); in f81534_close()
1123 struct usb_serial_port *port0 = port->serial->port[0]; in f81534_close()
1127 usb_kill_urb(port->write_urbs[0]); in f81534_close()
1129 spin_lock_irqsave(&port->lock, flags); in f81534_close()
1130 kfifo_reset_out(&port->write_fifo); in f81534_close()
1131 spin_unlock_irqrestore(&port->lock, flags); in f81534_close()
1134 mutex_lock(&serial_priv->urb_mutex); in f81534_close()
1135 serial_priv->opened_port--; in f81534_close()
1137 if (!serial_priv->opened_port) { in f81534_close()
1138 for (i = 0; i < ARRAY_SIZE(port0->read_urbs); ++i) in f81534_close()
1139 usb_kill_urb(port0->read_urbs[i]); in f81534_close()
1142 mutex_unlock(&serial_priv->urb_mutex); in f81534_close()
1148 struct usb_serial_port *port = tty->driver_data; in f81534_get_serial_info()
1153 ss->type = PORT_16550A; in f81534_get_serial_info()
1154 ss->port = port->port_number; in f81534_get_serial_info()
1155 ss->line = port->minor; in f81534_get_serial_info()
1156 ss->baud_base = port_priv->baud_base; in f81534_get_serial_info()
1185 set_bit(F81534_TX_EMPTY_BIT, &port_priv->tx_empty); in f81534_process_per_serial_block()
1190 dev_err(&port->dev, "%s: submit failed\n", __func__); in f81534_process_per_serial_block()
1200 dev_err(&port->dev, in f81534_process_per_serial_block()
1210 dev_warn(&port->dev, "%s: unknown token: %02x\n", __func__, in f81534_process_per_serial_block()
1222 port->icount.brk++; in f81534_process_per_serial_block()
1226 port->icount.parity++; in f81534_process_per_serial_block()
1229 port->icount.frame++; in f81534_process_per_serial_block()
1233 port->icount.overrun++; in f81534_process_per_serial_block()
1234 tty_insert_flip_char(&port->port, 0, in f81534_process_per_serial_block()
1238 schedule_work(&port_priv->lsr_work); in f81534_process_per_serial_block()
1241 if (port->sysrq) { in f81534_process_per_serial_block()
1246 tty_insert_flip_char(&port->port, data[i], tty_flag); in f81534_process_per_serial_block()
1249 tty_flip_buffer_push(&port->port); in f81534_process_per_serial_block()
1262 if (!urb->actual_length || in f81534_process_read_urb()
1263 urb->actual_length % F81534_RECEIVE_BLOCK_SIZE) { in f81534_process_read_urb()
1267 port = urb->context; in f81534_process_read_urb()
1268 serial = port->serial; in f81534_process_read_urb()
1269 buf = urb->transfer_buffer; in f81534_process_read_urb()
1272 for (i = 0; i < urb->actual_length; i += F81534_RECEIVE_BLOCK_SIZE) { in f81534_process_read_urb()
1275 dev_err(&port->dev, in f81534_process_read_urb()
1281 tty_port_num = serial_priv->tty_idx[phy_port_num]; in f81534_process_read_urb()
1282 port = serial->port[tty_port_num]; in f81534_process_read_urb()
1284 if (tty_port_initialized(&port->port)) in f81534_process_read_urb()
1291 struct usb_serial_port *port = urb->context; in f81534_write_usb_callback()
1293 switch (urb->status) { in f81534_write_usb_callback()
1296 case -ENOENT: in f81534_write_usb_callback()
1297 case -ECONNRESET: in f81534_write_usb_callback()
1298 case -ESHUTDOWN: in f81534_write_usb_callback()
1299 dev_dbg(&port->dev, "%s - urb stopped: %d\n", in f81534_write_usb_callback()
1300 __func__, urb->status); in f81534_write_usb_callback()
1302 case -EPIPE: in f81534_write_usb_callback()
1303 dev_err(&port->dev, "%s - urb stopped: %d\n", in f81534_write_usb_callback()
1304 __func__, urb->status); in f81534_write_usb_callback()
1307 dev_dbg(&port->dev, "%s - nonzero urb status: %d\n", in f81534_write_usb_callback()
1308 __func__, urb->status); in f81534_write_usb_callback()
1321 port = port_priv->port; in f81534_lsr_worker()
1325 dev_warn(&port->dev, "read LSR failed: %d\n", status); in f81534_lsr_worker()
1339 serial = port->serial; in f81534_set_port_output_pin()
1343 idx = F81534_CONF_INIT_GPIO_OFFSET + port_priv->phy_num; in f81534_set_port_output_pin()
1344 value = serial_priv->conf_data[idx]; in f81534_set_port_output_pin()
1350 idx = F81534_CONF_WORK_GPIO_OFFSET + port_priv->phy_num; in f81534_set_port_output_pin()
1351 value = serial_priv->conf_data[idx]; in f81534_set_port_output_pin()
1356 pins = &f81534_port_out_pins[port_priv->phy_num]; in f81534_set_port_output_pin()
1358 for (i = 0; i < ARRAY_SIZE(pins->pin); ++i) { in f81534_set_port_output_pin()
1360 pins->pin[i].reg_addr, pins->pin[i].reg_mask, in f81534_set_port_output_pin()
1361 value & BIT(i) ? pins->pin[i].reg_mask : 0); in f81534_set_port_output_pin()
1366 dev_dbg(&port->dev, "Output pin (M0/M1/M2): %d\n", value); in f81534_set_port_output_pin()
1377 serial_priv = usb_get_serial_data(port->serial); in f81534_port_probe()
1378 port_priv = devm_kzalloc(&port->dev, sizeof(*port_priv), GFP_KERNEL); in f81534_port_probe()
1380 return -ENOMEM; in f81534_port_probe()
1384 * delay all tx data frame with 1bit. in f81534_port_probe()
1386 port_priv->shadow_clk = F81534_UART_EN | F81534_CLK_TX_DELAY_1BIT; in f81534_port_probe()
1387 spin_lock_init(&port_priv->msr_lock); in f81534_port_probe()
1388 mutex_init(&port_priv->mcr_mutex); in f81534_port_probe()
1389 mutex_init(&port_priv->lcr_mutex); in f81534_port_probe()
1390 INIT_WORK(&port_priv->lsr_work, f81534_lsr_worker); in f81534_port_probe()
1392 /* Assign logic-to-phy mapping */ in f81534_port_probe()
1393 ret = f81534_logic_to_phy_port(port->serial, port); in f81534_port_probe()
1397 port_priv->phy_num = ret; in f81534_port_probe()
1398 port_priv->port = port; in f81534_port_probe()
1400 dev_dbg(&port->dev, "%s: port_number: %d, phy_num: %d\n", __func__, in f81534_port_probe()
1401 port->port_number, port_priv->phy_num); in f81534_port_probe()
1404 * The F81532/534 will hang-up when enable LSR interrupt in IER and in f81534_port_probe()
1407 * bit with bulk-in data in f81534_process_per_serial_block(). in f81534_port_probe()
1414 value = serial_priv->conf_data[port_priv->phy_num]; in f81534_port_probe()
1417 port_priv->shadow_clk |= F81534_CLK_RS485_MODE | in f81534_port_probe()
1419 dev_dbg(&port->dev, "RS485 invert mode\n"); in f81534_port_probe()
1422 port_priv->shadow_clk |= F81534_CLK_RS485_MODE; in f81534_port_probe()
1423 dev_dbg(&port->dev, "RS485 mode\n"); in f81534_port_probe()
1428 dev_dbg(&port->dev, "RS232 mode\n"); in f81534_port_probe()
1439 flush_work(&port_priv->lsr_work); in f81534_port_remove()
1445 struct usb_serial_port *port = tty->driver_data; in f81534_tiocmget()
1457 mutex_lock(&port_priv->mcr_mutex); in f81534_tiocmget()
1458 mcr = port_priv->shadow_mcr; in f81534_tiocmget()
1459 mutex_unlock(&port_priv->mcr_mutex); in f81534_tiocmget()
1474 struct usb_serial_port *port = tty->driver_data; in f81534_tiocmset()
1495 bytes_out = kfifo_in_locked(&port->write_fifo, buf, count, in f81534_write()
1496 &port->lock); in f81534_write()
1500 dev_err(&port->dev, "%s: submit failed\n", __func__); in f81534_write()
1511 return test_bit(F81534_TX_EMPTY_BIT, &port_priv->tx_empty); in f81534_tx_empty()
1527 mutex_lock(&serial_priv->urb_mutex); in f81534_resume()
1529 if (serial_priv->opened_port) { in f81534_resume()
1532 mutex_unlock(&serial_priv->urb_mutex); in f81534_resume()
1537 mutex_unlock(&serial_priv->urb_mutex); in f81534_resume()
1539 for (i = 0; i < serial->num_ports; i++) { in f81534_resume()
1540 port = serial->port[i]; in f81534_resume()
1541 if (!tty_port_initialized(&port->port)) in f81534_resume()
1546 dev_err(&port->dev, "%s: submit failed\n", __func__); in f81534_resume()
1552 return -EIO; in f81534_resume()