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()
555 return -EINVAL; in f81534_find_clk()
584 return -EINVAL; in f81534_set_port_config()
586 port_priv->baud_base = baudrate_table[idx]; in f81534_set_port_config()
587 port_priv->shadow_clk &= ~F81534_CLK_MASK; in f81534_set_port_config()
588 port_priv->shadow_clk |= clock_table[idx]; in f81534_set_port_config()
591 port_priv->shadow_clk); in f81534_set_port_config()
593 dev_err(&port->dev, "CLOCK_REG setting failed\n"); in f81534_set_port_config()
604 dev_err(&port->dev, "%s: CONFIG1 setting failed\n", __func__); in f81534_set_port_config()
616 dev_err(&port->dev, "%s: FCR setting failed\n", __func__); in f81534_set_port_config()
620 divisor = f81534_calc_baud_divisor(baudrate, port_priv->baud_base); in f81534_set_port_config()
622 mutex_lock(&port_priv->lcr_mutex); in f81534_set_port_config()
628 dev_err(&port->dev, "%s: set LCR failed\n", __func__); in f81534_set_port_config()
635 dev_err(&port->dev, "%s: set DLAB LSB failed\n", __func__); in f81534_set_port_config()
642 dev_err(&port->dev, "%s: set DLAB MSB failed\n", __func__); in f81534_set_port_config()
646 value = lcr | (port_priv->shadow_lcr & UART_LCR_SBC); in f81534_set_port_config()
650 dev_err(&port->dev, "%s: set LCR failed\n", __func__); in f81534_set_port_config()
654 port_priv->shadow_lcr = value; in f81534_set_port_config()
656 mutex_unlock(&port_priv->lcr_mutex); in f81534_set_port_config()
663 struct usb_serial_port *port = tty->driver_data; in f81534_break_ctl()
667 mutex_lock(&port_priv->lcr_mutex); in f81534_break_ctl()
670 port_priv->shadow_lcr |= UART_LCR_SBC; in f81534_break_ctl()
672 port_priv->shadow_lcr &= ~UART_LCR_SBC; in f81534_break_ctl()
675 port_priv->shadow_lcr); in f81534_break_ctl()
677 dev_err(&port->dev, "set break failed: %d\n", status); in f81534_break_ctl()
679 mutex_unlock(&port_priv->lcr_mutex); in f81534_break_ctl()
692 mutex_lock(&port_priv->mcr_mutex); in f81534_update_mctrl()
698 tmp = UART_MCR_OUT2 | port_priv->shadow_mcr; in f81534_update_mctrl()
714 dev_err(&port->dev, "%s: MCR write failed\n", __func__); in f81534_update_mctrl()
715 mutex_unlock(&port_priv->mcr_mutex); in f81534_update_mctrl()
719 port_priv->shadow_mcr = tmp; in f81534_update_mctrl()
720 mutex_unlock(&port_priv->mcr_mutex); in f81534_update_mctrl()
741 dev_err(&serial->interface->dev, "%s: read failed: %d\n", in f81534_find_config_idx()
822 * 1st is pure USB-to-TTL RS232 IC and designed for 4 ports only, no any
832 * 4bytes save port mode (0:RS232/1:RS485 Invert/2:RS485), and the last
841 struct device *dev = &serial->interface->dev; in f81534_calc_num_ports()
842 int size_bulk_in = usb_endpoint_maxp(epds->bulk_in[0]); in f81534_calc_num_ports()
843 int size_bulk_out = usb_endpoint_maxp(epds->bulk_out[0]); in f81534_calc_num_ports()
852 return -ENODEV; in f81534_calc_num_ports()
855 serial_priv = devm_kzalloc(&serial->interface->dev, in f81534_calc_num_ports()
858 return -ENOMEM; in f81534_calc_num_ports()
861 mutex_init(&serial_priv->urb_mutex); in f81534_calc_num_ports()
864 status = f81534_find_config_idx(serial, &serial_priv->setting_idx); in f81534_calc_num_ports()
866 dev_err(&serial->interface->dev, "%s: find idx failed: %d\n", in f81534_calc_num_ports()
875 if (serial_priv->setting_idx != F81534_CUSTOM_NO_CUSTOM_DATA) { in f81534_calc_num_ports()
879 sizeof(serial_priv->conf_data), in f81534_calc_num_ports()
880 serial_priv->conf_data); in f81534_calc_num_ports()
882 dev_err(&serial->interface->dev, in f81534_calc_num_ports()
888 dev_dbg(&serial->interface->dev, in f81534_calc_num_ports()
890 serial_priv->setting_idx); in f81534_calc_num_ports()
895 sizeof(serial_priv->conf_data), in f81534_calc_num_ports()
896 serial_priv->conf_data); in f81534_calc_num_ports()
898 dev_err(&serial->interface->dev, in f81534_calc_num_ports()
904 dev_dbg(&serial->interface->dev, "%s: read default config\n", in f81534_calc_num_ports()
911 serial_priv->conf_data[i] |= F81534_PORT_UNAVAILABLE; in f81534_calc_num_ports()
913 if (serial_priv->conf_data[i] & F81534_PORT_UNAVAILABLE) in f81534_calc_num_ports()
920 dev_warn(&serial->interface->dev, in f81534_calc_num_ports()
925 /* Assign phy-to-logic mapping */ in f81534_calc_num_ports()
927 if (serial_priv->conf_data[i] & F81534_PORT_UNAVAILABLE) in f81534_calc_num_ports()
930 serial_priv->tty_idx[i] = index++; in f81534_calc_num_ports()
931 dev_dbg(&serial->interface->dev, in f81534_calc_num_ports()
933 serial_priv->tty_idx[i]); in f81534_calc_num_ports()
937 * Setup bulk-out endpoint multiplexing. All ports share the same in f81534_calc_num_ports()
938 * bulk-out endpoint. in f81534_calc_num_ports()
940 BUILD_BUG_ON(ARRAY_SIZE(epds->bulk_out) < F81534_NUM_PORT); in f81534_calc_num_ports()
943 epds->bulk_out[i] = epds->bulk_out[0]; in f81534_calc_num_ports()
945 epds->num_bulk_out = num_port; in f81534_calc_num_ports()
961 else if (old_termios && (old_termios->c_cflag & CBAUD) == B0) in f81534_set_termios()
1002 dev_dbg(&port->dev, "%s: baud: %d\n", __func__, baud); in f81534_set_termios()
1006 dev_err(&port->dev, "%s: set port config failed: %d\n", in f81534_set_termios()
1013 return usb_serial_generic_submit_read_urbs(serial->port[0], flags); in f81534_submit_read_urb()
1026 spin_lock_irqsave(&port_priv->msr_lock, flags); in f81534_msr_changed()
1027 old_msr = port_priv->shadow_msr; in f81534_msr_changed()
1028 port_priv->shadow_msr = msr; in f81534_msr_changed()
1029 spin_unlock_irqrestore(&port_priv->msr_lock, flags); in f81534_msr_changed()
1031 dev_dbg(&port->dev, "%s: MSR from %02x to %02x\n", __func__, old_msr, in f81534_msr_changed()
1036 port->icount.cts++; in f81534_msr_changed()
1038 port->icount.dsr++; in f81534_msr_changed()
1040 port->icount.dcd++; in f81534_msr_changed()
1042 port->icount.rng++; in f81534_msr_changed()
1044 wake_up_interruptible(&port->port.delta_msr_wait); in f81534_msr_changed()
1049 dev_dbg(&port->dev, "%s: DCD Changed: phy_num: %d from %x to %x\n", in f81534_msr_changed()
1050 __func__, port_priv->phy_num, old_msr, msr); in f81534_msr_changed()
1052 tty = tty_port_tty_get(&port->port); in f81534_msr_changed()
1073 spin_lock_irqsave(&port_priv->msr_lock, flags); in f81534_read_msr()
1074 port_priv->shadow_msr = msr; in f81534_read_msr()
1075 spin_unlock_irqrestore(&port_priv->msr_lock, flags); in f81534_read_msr()
1083 usb_get_serial_data(port->serial); in f81534_open()
1091 dev_err(&port->dev, "%s: Clear FIFO failed: %d\n", __func__, in f81534_open()
1103 mutex_lock(&serial_priv->urb_mutex); in f81534_open()
1106 if (!serial_priv->opened_port) { in f81534_open()
1107 status = f81534_submit_read_urb(port->serial, GFP_KERNEL); in f81534_open()
1112 serial_priv->opened_port++; in f81534_open()
1115 mutex_unlock(&serial_priv->urb_mutex); in f81534_open()
1117 set_bit(F81534_TX_EMPTY_BIT, &port_priv->tx_empty); in f81534_open()
1124 usb_get_serial_data(port->serial); in f81534_close()
1125 struct usb_serial_port *port0 = port->serial->port[0]; in f81534_close()
1129 usb_kill_urb(port->write_urbs[0]); in f81534_close()
1131 spin_lock_irqsave(&port->lock, flags); in f81534_close()
1132 kfifo_reset_out(&port->write_fifo); in f81534_close()
1133 spin_unlock_irqrestore(&port->lock, flags); in f81534_close()
1136 mutex_lock(&serial_priv->urb_mutex); in f81534_close()
1137 serial_priv->opened_port--; in f81534_close()
1139 if (!serial_priv->opened_port) { in f81534_close()
1140 for (i = 0; i < ARRAY_SIZE(port0->read_urbs); ++i) in f81534_close()
1141 usb_kill_urb(port0->read_urbs[i]); in f81534_close()
1144 mutex_unlock(&serial_priv->urb_mutex); in f81534_close()
1150 struct usb_serial_port *port = tty->driver_data; in f81534_get_serial_info()
1155 ss->type = PORT_16550A; in f81534_get_serial_info()
1156 ss->port = port->port_number; in f81534_get_serial_info()
1157 ss->line = port->minor; in f81534_get_serial_info()
1158 ss->baud_base = port_priv->baud_base; in f81534_get_serial_info()
1187 set_bit(F81534_TX_EMPTY_BIT, &port_priv->tx_empty); in f81534_process_per_serial_block()
1192 dev_err(&port->dev, "%s: submit failed\n", __func__); in f81534_process_per_serial_block()
1202 dev_err(&port->dev, in f81534_process_per_serial_block()
1212 dev_warn(&port->dev, "%s: unknown token: %02x\n", __func__, in f81534_process_per_serial_block()
1224 port->icount.brk++; in f81534_process_per_serial_block()
1228 port->icount.parity++; in f81534_process_per_serial_block()
1231 port->icount.frame++; in f81534_process_per_serial_block()
1235 port->icount.overrun++; in f81534_process_per_serial_block()
1236 tty_insert_flip_char(&port->port, 0, in f81534_process_per_serial_block()
1240 schedule_work(&port_priv->lsr_work); in f81534_process_per_serial_block()
1243 if (port->sysrq) { in f81534_process_per_serial_block()
1248 tty_insert_flip_char(&port->port, data[i], tty_flag); in f81534_process_per_serial_block()
1251 tty_flip_buffer_push(&port->port); in f81534_process_per_serial_block()
1264 if (!urb->actual_length || in f81534_process_read_urb()
1265 urb->actual_length % F81534_RECEIVE_BLOCK_SIZE) { in f81534_process_read_urb()
1269 port = urb->context; in f81534_process_read_urb()
1270 serial = port->serial; in f81534_process_read_urb()
1271 buf = urb->transfer_buffer; in f81534_process_read_urb()
1274 for (i = 0; i < urb->actual_length; i += F81534_RECEIVE_BLOCK_SIZE) { in f81534_process_read_urb()
1277 dev_err(&port->dev, in f81534_process_read_urb()
1283 tty_port_num = serial_priv->tty_idx[phy_port_num]; in f81534_process_read_urb()
1284 port = serial->port[tty_port_num]; in f81534_process_read_urb()
1286 if (tty_port_initialized(&port->port)) in f81534_process_read_urb()
1293 struct usb_serial_port *port = urb->context; in f81534_write_usb_callback()
1295 switch (urb->status) { in f81534_write_usb_callback()
1298 case -ENOENT: in f81534_write_usb_callback()
1299 case -ECONNRESET: in f81534_write_usb_callback()
1300 case -ESHUTDOWN: in f81534_write_usb_callback()
1301 dev_dbg(&port->dev, "%s - urb stopped: %d\n", in f81534_write_usb_callback()
1302 __func__, urb->status); in f81534_write_usb_callback()
1304 case -EPIPE: in f81534_write_usb_callback()
1305 dev_err(&port->dev, "%s - urb stopped: %d\n", in f81534_write_usb_callback()
1306 __func__, urb->status); in f81534_write_usb_callback()
1309 dev_dbg(&port->dev, "%s - nonzero urb status: %d\n", in f81534_write_usb_callback()
1310 __func__, urb->status); in f81534_write_usb_callback()
1323 port = port_priv->port; in f81534_lsr_worker()
1327 dev_warn(&port->dev, "read LSR failed: %d\n", status); in f81534_lsr_worker()
1341 serial = port->serial; in f81534_set_port_output_pin()
1345 idx = F81534_CONF_INIT_GPIO_OFFSET + port_priv->phy_num; in f81534_set_port_output_pin()
1346 value = serial_priv->conf_data[idx]; in f81534_set_port_output_pin()
1352 idx = F81534_CONF_WORK_GPIO_OFFSET + port_priv->phy_num; in f81534_set_port_output_pin()
1353 value = serial_priv->conf_data[idx]; in f81534_set_port_output_pin()
1358 pins = &f81534_port_out_pins[port_priv->phy_num]; in f81534_set_port_output_pin()
1360 for (i = 0; i < ARRAY_SIZE(pins->pin); ++i) { in f81534_set_port_output_pin()
1362 pins->pin[i].reg_addr, pins->pin[i].reg_mask, in f81534_set_port_output_pin()
1363 value & BIT(i) ? pins->pin[i].reg_mask : 0); in f81534_set_port_output_pin()
1368 dev_dbg(&port->dev, "Output pin (M0/M1/M2): %d\n", value); in f81534_set_port_output_pin()
1379 serial_priv = usb_get_serial_data(port->serial); in f81534_port_probe()
1380 port_priv = devm_kzalloc(&port->dev, sizeof(*port_priv), GFP_KERNEL); in f81534_port_probe()
1382 return -ENOMEM; in f81534_port_probe()
1386 * delay all tx data frame with 1bit. in f81534_port_probe()
1388 port_priv->shadow_clk = F81534_UART_EN | F81534_CLK_TX_DELAY_1BIT; in f81534_port_probe()
1389 spin_lock_init(&port_priv->msr_lock); in f81534_port_probe()
1390 mutex_init(&port_priv->mcr_mutex); in f81534_port_probe()
1391 mutex_init(&port_priv->lcr_mutex); in f81534_port_probe()
1392 INIT_WORK(&port_priv->lsr_work, f81534_lsr_worker); in f81534_port_probe()
1394 /* Assign logic-to-phy mapping */ in f81534_port_probe()
1395 ret = f81534_logic_to_phy_port(port->serial, port); in f81534_port_probe()
1399 port_priv->phy_num = ret; in f81534_port_probe()
1400 port_priv->port = port; in f81534_port_probe()
1402 dev_dbg(&port->dev, "%s: port_number: %d, phy_num: %d\n", __func__, in f81534_port_probe()
1403 port->port_number, port_priv->phy_num); in f81534_port_probe()
1406 * The F81532/534 will hang-up when enable LSR interrupt in IER and in f81534_port_probe()
1409 * bit with bulk-in data in f81534_process_per_serial_block(). in f81534_port_probe()
1416 value = serial_priv->conf_data[port_priv->phy_num]; in f81534_port_probe()
1419 port_priv->shadow_clk |= F81534_CLK_RS485_MODE | in f81534_port_probe()
1421 dev_dbg(&port->dev, "RS485 invert mode\n"); in f81534_port_probe()
1424 port_priv->shadow_clk |= F81534_CLK_RS485_MODE; in f81534_port_probe()
1425 dev_dbg(&port->dev, "RS485 mode\n"); in f81534_port_probe()
1430 dev_dbg(&port->dev, "RS232 mode\n"); in f81534_port_probe()
1441 flush_work(&port_priv->lsr_work); in f81534_port_remove()
1447 struct usb_serial_port *port = tty->driver_data; in f81534_tiocmget()
1459 mutex_lock(&port_priv->mcr_mutex); in f81534_tiocmget()
1460 mcr = port_priv->shadow_mcr; in f81534_tiocmget()
1461 mutex_unlock(&port_priv->mcr_mutex); in f81534_tiocmget()
1476 struct usb_serial_port *port = tty->driver_data; in f81534_tiocmset()
1497 bytes_out = kfifo_in_locked(&port->write_fifo, buf, count, in f81534_write()
1498 &port->lock); in f81534_write()
1502 dev_err(&port->dev, "%s: submit failed\n", __func__); in f81534_write()
1513 return test_bit(F81534_TX_EMPTY_BIT, &port_priv->tx_empty); in f81534_tx_empty()
1529 mutex_lock(&serial_priv->urb_mutex); in f81534_resume()
1531 if (serial_priv->opened_port) { in f81534_resume()
1534 mutex_unlock(&serial_priv->urb_mutex); in f81534_resume()
1539 mutex_unlock(&serial_priv->urb_mutex); in f81534_resume()
1541 for (i = 0; i < serial->num_ports; i++) { in f81534_resume()
1542 port = serial->port[i]; in f81534_resume()
1543 if (!tty_port_initialized(&port->port)) in f81534_resume()
1548 dev_err(&port->dev, "%s: submit failed\n", __func__); in f81534_resume()
1554 return -EIO; in f81534_resume()