Lines Matching refs:port
71 #define SUP_DUMMY_READ BIT(16) /* drop bytes received on a !CREAD port */
75 struct uart_port port;
80 static void sp_uart_put_char(struct uart_port *port, unsigned int ch)
82 writel(ch, port->membase + SUP_UART_DATA);
85 static u32 sunplus_tx_buf_not_full(struct uart_port *port)
87 unsigned int lsr = readl(port->membase + SUP_UART_LSR);
92 static unsigned int sunplus_tx_empty(struct uart_port *port)
94 unsigned int lsr = readl(port->membase + SUP_UART_LSR);
99 static void sunplus_set_mctrl(struct uart_port *port, unsigned int mctrl)
101 unsigned int mcr = readl(port->membase + SUP_UART_MCR);
128 writel(mcr, port->membase + SUP_UART_MCR);
131 static unsigned int sunplus_get_mctrl(struct uart_port *port)
135 mcr = readl(port->membase + SUP_UART_MCR);
155 static void sunplus_stop_tx(struct uart_port *port)
159 isc = readl(port->membase + SUP_UART_ISC);
161 writel(isc, port->membase + SUP_UART_ISC);
164 static void sunplus_start_tx(struct uart_port *port)
168 isc = readl(port->membase + SUP_UART_ISC);
170 writel(isc, port->membase + SUP_UART_ISC);
173 static void sunplus_stop_rx(struct uart_port *port)
177 isc = readl(port->membase + SUP_UART_ISC);
179 writel(isc, port->membase + SUP_UART_ISC);
182 static void sunplus_break_ctl(struct uart_port *port, int ctl)
187 spin_lock_irqsave(&port->lock, flags);
189 lcr = readl(port->membase + SUP_UART_LCR);
196 writel(lcr, port->membase + SUP_UART_LCR);
198 spin_unlock_irqrestore(&port->lock, flags);
201 static void transmit_chars(struct uart_port *port)
203 struct circ_buf *xmit = &port->state->xmit;
205 if (port->x_char) {
206 sp_uart_put_char(port, port->x_char);
207 port->icount.tx++;
208 port->x_char = 0;
212 if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
213 sunplus_stop_tx(port);
218 sp_uart_put_char(port, xmit->buf[xmit->tail]);
219 uart_xmit_advance(port, 1);
222 } while (sunplus_tx_buf_not_full(port));
225 uart_write_wakeup(port);
228 sunplus_stop_tx(port);
231 static void receive_chars(struct uart_port *port)
233 unsigned int lsr = readl(port->membase + SUP_UART_LSR);
237 ch = readl(port->membase + SUP_UART_DATA);
239 port->icount.rx++;
244 port->icount.brk++;
246 if (uart_handle_break(port))
249 port->icount.parity++;
252 port->icount.frame++;
257 port->icount.overrun++;
260 if (port->ignore_status_mask & SUP_DUMMY_READ)
263 if (uart_handle_sysrq_char(port, ch))
266 uart_insert_char(port, lsr, SUP_UART_LSR_OE, ch, flag);
269 lsr = readl(port->membase + SUP_UART_LSR);
272 tty_flip_buffer_push(&port->state->port);
277 struct uart_port *port = args;
280 spin_lock(&port->lock);
282 isc = readl(port->membase + SUP_UART_ISC);
285 receive_chars(port);
288 transmit_chars(port);
290 spin_unlock(&port->lock);
295 static int sunplus_startup(struct uart_port *port)
301 ret = request_irq(port->irq, sunplus_uart_irq, 0, "sunplus_uart", port);
305 spin_lock_irqsave(&port->lock, flags);
311 writel(isc, port->membase + SUP_UART_ISC);
312 spin_unlock_irqrestore(&port->lock, flags);
317 static void sunplus_shutdown(struct uart_port *port)
321 spin_lock_irqsave(&port->lock, flags);
326 writel(0, port->membase + SUP_UART_ISC); /* disable all interrupt */
327 spin_unlock_irqrestore(&port->lock, flags);
329 free_irq(port->irq, port);
332 static void sunplus_set_termios(struct uart_port *port,
337 u32 clk = port->uartclk;
340 baud = uart_get_baud_rate(port, termios, oldtermios, 0, port->uartclk / 16);
375 spin_lock_irqsave(&port->lock, flags);
377 uart_update_timeout(port, termios->c_cflag, baud);
379 port->read_status_mask = 0;
381 port->read_status_mask |= SUP_UART_LSR_PE | SUP_UART_LSR_FE;
384 port->read_status_mask |= SUP_UART_LSR_BC;
387 port->ignore_status_mask = 0;
389 port->ignore_status_mask |= SUP_UART_LSR_FE | SUP_UART_LSR_PE;
392 port->ignore_status_mask |= SUP_UART_LSR_BC;
395 port->ignore_status_mask |= SUP_UART_LSR_OE;
400 port->ignore_status_mask |= SUP_DUMMY_READ;
402 writel(0, port->membase + SUP_UART_RX_RESIDUE);
406 writel(div_h, port->membase + SUP_UART_DIV_H);
407 writel(div_l, port->membase + SUP_UART_DIV_L);
408 writel(lcr, port->membase + SUP_UART_LCR);
410 spin_unlock_irqrestore(&port->lock, flags);
413 static void sunplus_set_ldisc(struct uart_port *port, struct ktermios *termios)
418 port->flags |= UPF_HARDPPS_CD;
420 port->flags &= ~UPF_HARDPPS_CD;
423 static const char *sunplus_type(struct uart_port *port)
425 return port->type == PORT_SUNPLUS ? "sunplus_uart" : NULL;
428 static void sunplus_config_port(struct uart_port *port, int type)
431 port->type = PORT_SUNPLUS;
434 static int sunplus_verify_port(struct uart_port *port, struct serial_struct *ser)
443 static void wait_for_xmitr(struct uart_port *port)
449 ret = readl_poll_timeout_atomic(port->membase + SUP_UART_LSR, val,
453 dev_err(port->dev, "Timeout waiting while UART TX FULL\n");
460 static void sunplus_poll_put_char(struct uart_port *port, unsigned char data)
462 wait_for_xmitr(port);
463 sp_uart_put_char(port, data);
466 static int sunplus_poll_get_char(struct uart_port *port)
468 unsigned int lsr = readl(port->membase + SUP_UART_LSR);
473 return readl(port->membase + SUP_UART_DATA);
501 static void sunplus_uart_console_putchar(struct uart_port *port,
504 wait_for_xmitr(port);
505 sp_uart_put_char(port, ch);
517 if (sunplus_console_ports[co->index]->port.sysrq)
520 locked = spin_trylock(&sunplus_console_ports[co->index]->port.lock);
522 spin_lock(&sunplus_console_ports[co->index]->port.lock);
524 uart_console_write(&sunplus_console_ports[co->index]->port, s, count,
528 spin_unlock(&sunplus_console_ports[co->index]->port.lock);
551 return uart_set_options(&sup->port, co, baud, parity, bits, flow);
593 struct uart_port *port;
622 port = &sup->port;
624 port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
625 if (IS_ERR(port->membase))
626 return dev_err_probe(&pdev->dev, PTR_ERR(port->membase), "membase not found\n");
632 port->mapbase = res->start;
633 port->uartclk = clk_get_rate(sup->clk);
634 port->line = pdev->id;
635 port->irq = irq;
636 port->dev = &pdev->dev;
637 port->iotype = UPIO_MEM;
638 port->ops = &sunplus_uart_ops;
639 port->flags = UPF_BOOT_AUTOCONF;
640 port->fifosize = 128;
651 sunplus_console_ports[sup->port.line] = sup;
654 platform_set_drvdata(pdev, &sup->port);
656 ret = uart_add_one_port(&sunplus_uart_driver, &sup->port);
659 sunplus_console_ports[sup->port.line] = NULL;
669 uart_remove_one_port(&sunplus_uart_driver, &sup->port);
678 if (!uart_console(&sup->port))
679 uart_suspend_port(&sunplus_uart_driver, &sup->port);
688 if (!uart_console(&sup->port))
689 uart_resume_port(&sunplus_uart_driver, &sup->port);
738 static void sunplus_uart_putc(struct uart_port *port, unsigned char c)
743 ret = readl_poll_timeout_atomic(port->membase + SUP_UART_LSR, val,
748 writel(c, port->membase + SUP_UART_DATA);
755 uart_console_write(&dev->port, s, n, sunplus_uart_putc);
761 if (!(dev->port.membase || dev->port.iobase))