Lines Matching refs:port
317 struct uart_port port; member
349 static int sc16is7xx_line(struct uart_port *port) in sc16is7xx_line() argument
351 struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); in sc16is7xx_line()
356 static u8 sc16is7xx_port_read(struct uart_port *port, u8 reg) in sc16is7xx_port_read() argument
358 struct sc16is7xx_port *s = dev_get_drvdata(port->dev); in sc16is7xx_port_read()
360 const u8 line = sc16is7xx_line(port); in sc16is7xx_port_read()
367 static void sc16is7xx_port_write(struct uart_port *port, u8 reg, u8 val) in sc16is7xx_port_write() argument
369 struct sc16is7xx_port *s = dev_get_drvdata(port->dev); in sc16is7xx_port_write()
370 const u8 line = sc16is7xx_line(port); in sc16is7xx_port_write()
375 static void sc16is7xx_fifo_read(struct uart_port *port, unsigned int rxlen) in sc16is7xx_fifo_read() argument
377 struct sc16is7xx_port *s = dev_get_drvdata(port->dev); in sc16is7xx_fifo_read()
378 const u8 line = sc16is7xx_line(port); in sc16is7xx_fifo_read()
386 static void sc16is7xx_fifo_write(struct uart_port *port, u8 to_send) in sc16is7xx_fifo_write() argument
388 struct sc16is7xx_port *s = dev_get_drvdata(port->dev); in sc16is7xx_fifo_write()
389 const u8 line = sc16is7xx_line(port); in sc16is7xx_fifo_write()
397 static void sc16is7xx_port_update(struct uart_port *port, u8 reg, in sc16is7xx_port_update() argument
400 struct sc16is7xx_port *s = dev_get_drvdata(port->dev); in sc16is7xx_port_update()
401 const u8 line = sc16is7xx_line(port); in sc16is7xx_port_update()
420 static void sc16is7xx_power(struct uart_port *port, int on) in sc16is7xx_power() argument
422 sc16is7xx_port_update(port, SC16IS7XX_IER_REG, in sc16is7xx_power()
487 static int sc16is7xx_set_baud(struct uart_port *port, int baud) in sc16is7xx_set_baud() argument
489 struct sc16is7xx_port *s = dev_get_drvdata(port->dev); in sc16is7xx_set_baud()
492 unsigned long clk = port->uartclk, div = clk / 16 / baud; in sc16is7xx_set_baud()
499 lcr = sc16is7xx_port_read(port, SC16IS7XX_LCR_REG); in sc16is7xx_set_baud()
502 sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, in sc16is7xx_set_baud()
507 sc16is7xx_port_write(port, SC16IS7XX_EFR_REG, in sc16is7xx_set_baud()
512 sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, lcr); in sc16is7xx_set_baud()
514 sc16is7xx_port_update(port, SC16IS7XX_MCR_REG, in sc16is7xx_set_baud()
519 sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, in sc16is7xx_set_baud()
524 sc16is7xx_port_write(port, SC16IS7XX_DLH_REG, div / 256); in sc16is7xx_set_baud()
525 sc16is7xx_port_write(port, SC16IS7XX_DLL_REG, div % 256); in sc16is7xx_set_baud()
529 sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, lcr); in sc16is7xx_set_baud()
534 static void sc16is7xx_handle_rx(struct uart_port *port, unsigned int rxlen, in sc16is7xx_handle_rx() argument
537 struct sc16is7xx_port *s = dev_get_drvdata(port->dev); in sc16is7xx_handle_rx()
542 dev_warn_ratelimited(port->dev, in sc16is7xx_handle_rx()
544 port->line, rxlen); in sc16is7xx_handle_rx()
545 port->icount.buf_overrun++; in sc16is7xx_handle_rx()
553 lsr = sc16is7xx_port_read(port, SC16IS7XX_LSR_REG); in sc16is7xx_handle_rx()
560 s->buf[0] = sc16is7xx_port_read(port, SC16IS7XX_RHR_REG); in sc16is7xx_handle_rx()
563 sc16is7xx_fifo_read(port, rxlen); in sc16is7xx_handle_rx()
569 port->icount.rx++; in sc16is7xx_handle_rx()
574 port->icount.brk++; in sc16is7xx_handle_rx()
575 if (uart_handle_break(port)) in sc16is7xx_handle_rx()
578 port->icount.parity++; in sc16is7xx_handle_rx()
580 port->icount.frame++; in sc16is7xx_handle_rx()
582 port->icount.overrun++; in sc16is7xx_handle_rx()
584 lsr &= port->read_status_mask; in sc16is7xx_handle_rx()
597 if (uart_handle_sysrq_char(port, ch)) in sc16is7xx_handle_rx()
600 if (lsr & port->ignore_status_mask) in sc16is7xx_handle_rx()
603 uart_insert_char(port, lsr, SC16IS7XX_LSR_OE_BIT, ch, in sc16is7xx_handle_rx()
609 tty_flip_buffer_push(&port->state->port); in sc16is7xx_handle_rx()
612 static void sc16is7xx_handle_tx(struct uart_port *port) in sc16is7xx_handle_tx() argument
614 struct sc16is7xx_port *s = dev_get_drvdata(port->dev); in sc16is7xx_handle_tx()
615 struct circ_buf *xmit = &port->state->xmit; in sc16is7xx_handle_tx()
618 if (unlikely(port->x_char)) { in sc16is7xx_handle_tx()
619 sc16is7xx_port_write(port, SC16IS7XX_THR_REG, port->x_char); in sc16is7xx_handle_tx()
620 port->icount.tx++; in sc16is7xx_handle_tx()
621 port->x_char = 0; in sc16is7xx_handle_tx()
625 if (uart_circ_empty(xmit) || uart_tx_stopped(port)) in sc16is7xx_handle_tx()
632 txlen = sc16is7xx_port_read(port, SC16IS7XX_TXLVL_REG); in sc16is7xx_handle_tx()
636 port->icount.tx += to_send; in sc16is7xx_handle_tx()
644 sc16is7xx_fifo_write(port, to_send); in sc16is7xx_handle_tx()
648 uart_write_wakeup(port); in sc16is7xx_handle_tx()
653 struct uart_port *port = &s->p[portno].port; in sc16is7xx_port_irq() local
658 iir = sc16is7xx_port_read(port, SC16IS7XX_IIR_REG); in sc16is7xx_port_irq()
669 rxlen = sc16is7xx_port_read(port, SC16IS7XX_RXLVL_REG); in sc16is7xx_port_irq()
671 sc16is7xx_handle_rx(port, rxlen, iir); in sc16is7xx_port_irq()
675 msr = sc16is7xx_port_read(port, SC16IS7XX_MSR_REG); in sc16is7xx_port_irq()
676 uart_handle_cts_change(port, in sc16is7xx_port_irq()
680 sc16is7xx_handle_tx(port); in sc16is7xx_port_irq()
683 dev_err_ratelimited(port->dev, in sc16is7xx_port_irq()
685 port->line, iir); in sc16is7xx_port_irq()
711 struct uart_port *port = &(to_sc16is7xx_one(ws, tx_work)->port); in sc16is7xx_tx_proc() local
713 if ((port->rs485.flags & SER_RS485_ENABLED) && in sc16is7xx_tx_proc()
714 (port->rs485.delay_rts_before_send > 0)) in sc16is7xx_tx_proc()
715 msleep(port->rs485.delay_rts_before_send); in sc16is7xx_tx_proc()
717 sc16is7xx_handle_tx(port); in sc16is7xx_tx_proc()
720 static void sc16is7xx_reconf_rs485(struct uart_port *port) in sc16is7xx_reconf_rs485() argument
725 struct serial_rs485 *rs485 = &port->rs485; in sc16is7xx_reconf_rs485()
728 spin_lock_irqsave(&port->lock, irqflags); in sc16is7xx_reconf_rs485()
735 spin_unlock_irqrestore(&port->lock, irqflags); in sc16is7xx_reconf_rs485()
737 sc16is7xx_port_update(port, SC16IS7XX_EFCR_REG, mask, efcr); in sc16is7xx_reconf_rs485()
746 spin_lock_irqsave(&one->port.lock, irqflags); in sc16is7xx_reg_proc()
749 spin_unlock_irqrestore(&one->port.lock, irqflags); in sc16is7xx_reg_proc()
752 sc16is7xx_port_update(&one->port, SC16IS7XX_MCR_REG, in sc16is7xx_reg_proc()
754 (one->port.mctrl & TIOCM_LOOP) ? in sc16is7xx_reg_proc()
758 sc16is7xx_port_update(&one->port, SC16IS7XX_IER_REG, in sc16is7xx_reg_proc()
762 sc16is7xx_reconf_rs485(&one->port); in sc16is7xx_reg_proc()
765 static void sc16is7xx_ier_clear(struct uart_port *port, u8 bit) in sc16is7xx_ier_clear() argument
767 struct sc16is7xx_port *s = dev_get_drvdata(port->dev); in sc16is7xx_ier_clear()
768 struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); in sc16is7xx_ier_clear()
775 static void sc16is7xx_stop_tx(struct uart_port *port) in sc16is7xx_stop_tx() argument
777 sc16is7xx_ier_clear(port, SC16IS7XX_IER_THRI_BIT); in sc16is7xx_stop_tx()
780 static void sc16is7xx_stop_rx(struct uart_port *port) in sc16is7xx_stop_rx() argument
782 sc16is7xx_ier_clear(port, SC16IS7XX_IER_RDI_BIT); in sc16is7xx_stop_rx()
785 static void sc16is7xx_start_tx(struct uart_port *port) in sc16is7xx_start_tx() argument
787 struct sc16is7xx_port *s = dev_get_drvdata(port->dev); in sc16is7xx_start_tx()
788 struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); in sc16is7xx_start_tx()
793 static unsigned int sc16is7xx_tx_empty(struct uart_port *port) in sc16is7xx_tx_empty() argument
797 lsr = sc16is7xx_port_read(port, SC16IS7XX_LSR_REG); in sc16is7xx_tx_empty()
802 static unsigned int sc16is7xx_get_mctrl(struct uart_port *port) in sc16is7xx_get_mctrl() argument
810 static void sc16is7xx_set_mctrl(struct uart_port *port, unsigned int mctrl) in sc16is7xx_set_mctrl() argument
812 struct sc16is7xx_port *s = dev_get_drvdata(port->dev); in sc16is7xx_set_mctrl()
813 struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); in sc16is7xx_set_mctrl()
819 static void sc16is7xx_break_ctl(struct uart_port *port, int break_state) in sc16is7xx_break_ctl() argument
821 sc16is7xx_port_update(port, SC16IS7XX_LCR_REG, in sc16is7xx_break_ctl()
826 static void sc16is7xx_set_termios(struct uart_port *port, in sc16is7xx_set_termios() argument
830 struct sc16is7xx_port *s = dev_get_drvdata(port->dev); in sc16is7xx_set_termios()
870 port->read_status_mask = SC16IS7XX_LSR_OE_BIT; in sc16is7xx_set_termios()
872 port->read_status_mask |= SC16IS7XX_LSR_PE_BIT | in sc16is7xx_set_termios()
875 port->read_status_mask |= SC16IS7XX_LSR_BI_BIT; in sc16is7xx_set_termios()
878 port->ignore_status_mask = 0; in sc16is7xx_set_termios()
880 port->ignore_status_mask |= SC16IS7XX_LSR_BI_BIT; in sc16is7xx_set_termios()
882 port->ignore_status_mask |= SC16IS7XX_LSR_BRK_ERROR_MASK; in sc16is7xx_set_termios()
884 sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, in sc16is7xx_set_termios()
889 sc16is7xx_port_write(port, SC16IS7XX_XON1_REG, termios->c_cc[VSTART]); in sc16is7xx_set_termios()
890 sc16is7xx_port_write(port, SC16IS7XX_XOFF1_REG, termios->c_cc[VSTOP]); in sc16is7xx_set_termios()
899 sc16is7xx_port_write(port, SC16IS7XX_EFR_REG, flow); in sc16is7xx_set_termios()
903 sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, lcr); in sc16is7xx_set_termios()
906 baud = uart_get_baud_rate(port, termios, old, in sc16is7xx_set_termios()
907 port->uartclk / 16 / 4 / 0xffff, in sc16is7xx_set_termios()
908 port->uartclk / 16); in sc16is7xx_set_termios()
911 baud = sc16is7xx_set_baud(port, baud); in sc16is7xx_set_termios()
914 uart_update_timeout(port, termios->c_cflag, baud); in sc16is7xx_set_termios()
917 static int sc16is7xx_config_rs485(struct uart_port *port, in sc16is7xx_config_rs485() argument
920 struct sc16is7xx_port *s = dev_get_drvdata(port->dev); in sc16is7xx_config_rs485()
921 struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); in sc16is7xx_config_rs485()
930 dev_err(port->dev, in sc16is7xx_config_rs485()
943 port->rs485 = *rs485; in sc16is7xx_config_rs485()
950 static int sc16is7xx_startup(struct uart_port *port) in sc16is7xx_startup() argument
952 struct sc16is7xx_port *s = dev_get_drvdata(port->dev); in sc16is7xx_startup()
955 sc16is7xx_power(port, 1); in sc16is7xx_startup()
959 sc16is7xx_port_write(port, SC16IS7XX_FCR_REG, val); in sc16is7xx_startup()
961 sc16is7xx_port_write(port, SC16IS7XX_FCR_REG, in sc16is7xx_startup()
965 sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, in sc16is7xx_startup()
971 sc16is7xx_port_write(port, SC16IS7XX_EFR_REG, in sc16is7xx_startup()
975 sc16is7xx_port_update(port, SC16IS7XX_MCR_REG, in sc16is7xx_startup()
981 sc16is7xx_port_write(port, SC16IS7XX_TCR_REG, in sc16is7xx_startup()
988 sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, SC16IS7XX_LCR_WORD_LEN_8); in sc16is7xx_startup()
991 sc16is7xx_port_update(port, SC16IS7XX_EFCR_REG, in sc16is7xx_startup()
999 sc16is7xx_port_write(port, SC16IS7XX_IER_REG, val); in sc16is7xx_startup()
1004 static void sc16is7xx_shutdown(struct uart_port *port) in sc16is7xx_shutdown() argument
1006 struct sc16is7xx_port *s = dev_get_drvdata(port->dev); in sc16is7xx_shutdown()
1009 sc16is7xx_port_write(port, SC16IS7XX_IER_REG, 0); in sc16is7xx_shutdown()
1011 sc16is7xx_port_update(port, SC16IS7XX_EFCR_REG, in sc16is7xx_shutdown()
1017 sc16is7xx_power(port, 0); in sc16is7xx_shutdown()
1022 static const char *sc16is7xx_type(struct uart_port *port) in sc16is7xx_type() argument
1024 struct sc16is7xx_port *s = dev_get_drvdata(port->dev); in sc16is7xx_type()
1026 return (port->type == PORT_SC16IS7XX) ? s->devtype->name : NULL; in sc16is7xx_type()
1029 static int sc16is7xx_request_port(struct uart_port *port) in sc16is7xx_request_port() argument
1035 static void sc16is7xx_config_port(struct uart_port *port, int flags) in sc16is7xx_config_port() argument
1038 port->type = PORT_SC16IS7XX; in sc16is7xx_config_port()
1041 static int sc16is7xx_verify_port(struct uart_port *port, in sc16is7xx_verify_port() argument
1046 if (s->irq != port->irq) in sc16is7xx_verify_port()
1052 static void sc16is7xx_pm(struct uart_port *port, unsigned int state, in sc16is7xx_pm() argument
1055 sc16is7xx_power(port, (state == UART_PM_STATE_ON) ? 1 : 0); in sc16is7xx_pm()
1058 static void sc16is7xx_null_void(struct uart_port *port) in sc16is7xx_null_void() argument
1088 struct uart_port *port = &s->p[0].port; in sc16is7xx_gpio_get() local
1090 val = sc16is7xx_port_read(port, SC16IS7XX_IOSTATE_REG); in sc16is7xx_gpio_get()
1099 struct uart_port *port = &s->p[0].port; in sc16is7xx_gpio_set() local
1101 sc16is7xx_port_update(port, SC16IS7XX_IOSTATE_REG, BIT(offset), in sc16is7xx_gpio_set()
1110 struct uart_port *port = &s->p[0].port; in sc16is7xx_gpio_direction_input() local
1112 sc16is7xx_port_update(port, SC16IS7XX_IODIR_REG, BIT(offset), 0); in sc16is7xx_gpio_direction_input()
1122 struct uart_port *port = &s->p[0].port; in sc16is7xx_gpio_direction_output() local
1124 sc16is7xx_port_update(port, SC16IS7XX_IOSTATE_REG, BIT(offset), in sc16is7xx_gpio_direction_output()
1126 sc16is7xx_port_update(port, SC16IS7XX_IODIR_REG, BIT(offset), in sc16is7xx_gpio_direction_output()
1201 s->p[i].port.dev = dev; in sc16is7xx_probe()
1202 s->p[i].port.irq = irq; in sc16is7xx_probe()
1203 s->p[i].port.type = PORT_SC16IS7XX; in sc16is7xx_probe()
1204 s->p[i].port.fifosize = SC16IS7XX_FIFO_SIZE; in sc16is7xx_probe()
1205 s->p[i].port.flags = UPF_FIXED_TYPE | UPF_LOW_LATENCY; in sc16is7xx_probe()
1206 s->p[i].port.iotype = UPIO_PORT; in sc16is7xx_probe()
1207 s->p[i].port.uartclk = freq; in sc16is7xx_probe()
1208 s->p[i].port.rs485_config = sc16is7xx_config_rs485; in sc16is7xx_probe()
1209 s->p[i].port.ops = &sc16is7xx_ops; in sc16is7xx_probe()
1210 s->p[i].port.line = sc16is7xx_alloc_line(); in sc16is7xx_probe()
1211 if (s->p[i].port.line >= SC16IS7XX_MAX_DEVS) { in sc16is7xx_probe()
1217 sc16is7xx_port_write(&s->p[i].port, SC16IS7XX_IER_REG, 0); in sc16is7xx_probe()
1219 sc16is7xx_port_write(&s->p[i].port, SC16IS7XX_EFCR_REG, in sc16is7xx_probe()
1226 uart_add_one_port(&sc16is7xx_uart, &s->p[i].port); in sc16is7xx_probe()
1228 sc16is7xx_power(&s->p[i].port, 0); in sc16is7xx_probe()
1239 uart_remove_one_port(&sc16is7xx_uart, &s->p[i].port); in sc16is7xx_probe()
1240 clear_bit(s->p[i].port.line, &sc16is7xx_lines); in sc16is7xx_probe()
1269 uart_remove_one_port(&sc16is7xx_uart, &s->p[i].port); in sc16is7xx_remove()
1270 clear_bit(s->p[i].port.line, &sc16is7xx_lines); in sc16is7xx_remove()
1271 sc16is7xx_power(&s->p[i].port, 0); in sc16is7xx_remove()