Lines Matching +full:port +full:- +full:1
1 // SPDX-License-Identifier: GPL-2.0
31 #define CON_BREAK ((long)-1)
32 #define CON_HUP ((long)-2)
42 static void transmit_chars_putchar(struct uart_port *port, struct circ_buf *xmit) in transmit_chars_putchar() argument
45 long status = sun4v_con_putchar(xmit->buf[xmit->tail]); in transmit_chars_putchar()
50 uart_xmit_advance(port, 1); in transmit_chars_putchar()
54 static void transmit_chars_write(struct uart_port *port, struct circ_buf *xmit) in transmit_chars_write() argument
57 unsigned long ra = __pa(xmit->buf + xmit->tail); in transmit_chars_write()
60 len = CIRC_CNT_TO_END(xmit->head, xmit->tail, in transmit_chars_write()
65 uart_xmit_advance(port, sent); in transmit_chars_write()
69 static int receive_chars_getchar(struct uart_port *port) in receive_chars_getchar() argument
74 while (limit-- > 0) { in receive_chars_getchar()
82 if (uart_handle_break(port)) in receive_chars_getchar()
84 saw_console_brk = 1; in receive_chars_getchar()
89 hung_up = 1; in receive_chars_getchar()
90 uart_handle_dcd_change(port, false); in receive_chars_getchar()
93 uart_handle_dcd_change(port, true); in receive_chars_getchar()
96 if (port->state == NULL) { in receive_chars_getchar()
97 uart_handle_sysrq_char(port, c); in receive_chars_getchar()
101 port->icount.rx++; in receive_chars_getchar()
103 if (uart_handle_sysrq_char(port, c)) in receive_chars_getchar()
106 tty_insert_flip_char(&port->state->port, c, TTY_NORMAL); in receive_chars_getchar()
112 static int receive_chars_read(struct uart_port *port) in receive_chars_read() argument
117 while (limit-- > 0) { in receive_chars_read()
129 if (uart_handle_break(port)) in receive_chars_read()
131 saw_console_brk = 1; in receive_chars_read()
133 bytes_read = 1; in receive_chars_read()
135 hung_up = 1; in receive_chars_read()
136 uart_handle_dcd_change(port, false); in receive_chars_read()
146 uart_handle_dcd_change(port, true); in receive_chars_read()
149 if (port->sysrq != 0 && *con_read_page) { in receive_chars_read()
151 uart_handle_sysrq_char(port, con_read_page[i]); in receive_chars_read()
155 if (port->state == NULL) in receive_chars_read()
158 port->icount.rx += bytes_read; in receive_chars_read()
160 tty_insert_flip_string(&port->state->port, con_read_page, in receive_chars_read()
168 void (*transmit_chars)(struct uart_port *port, struct circ_buf *xmit);
169 int (*receive_chars)(struct uart_port *port);
184 static struct tty_port *receive_chars(struct uart_port *port) in receive_chars() argument
188 if (port->state != NULL) /* Unopened serial console */ in receive_chars()
189 tport = &port->state->port; in receive_chars()
191 if (sunhv_ops->receive_chars(port)) in receive_chars()
197 static void transmit_chars(struct uart_port *port) in transmit_chars() argument
201 if (!port->state) in transmit_chars()
204 xmit = &port->state->xmit; in transmit_chars()
205 if (uart_circ_empty(xmit) || uart_tx_stopped(port)) in transmit_chars()
208 sunhv_ops->transmit_chars(port, xmit); in transmit_chars()
211 uart_write_wakeup(port); in transmit_chars()
216 struct uart_port *port = dev_id; in sunhv_interrupt() local
220 spin_lock_irqsave(&port->lock, flags); in sunhv_interrupt()
221 tport = receive_chars(port); in sunhv_interrupt()
222 transmit_chars(port); in sunhv_interrupt()
223 spin_unlock_irqrestore(&port->lock, flags); in sunhv_interrupt()
231 /* port->lock is not held. */
232 static unsigned int sunhv_tx_empty(struct uart_port *port) in sunhv_tx_empty() argument
235 * is non-empty or there is an x_char pending, our caller in sunhv_tx_empty()
241 /* port->lock held by caller. */
242 static void sunhv_set_mctrl(struct uart_port *port, unsigned int mctrl) in sunhv_set_mctrl() argument
247 /* port->lock is held by caller and interrupts are disabled. */
248 static unsigned int sunhv_get_mctrl(struct uart_port *port) in sunhv_get_mctrl() argument
253 /* port->lock held by caller. */
254 static void sunhv_stop_tx(struct uart_port *port) in sunhv_stop_tx() argument
259 /* port->lock held by caller. */
260 static void sunhv_start_tx(struct uart_port *port) in sunhv_start_tx() argument
262 transmit_chars(port); in sunhv_start_tx()
265 /* port->lock is not held. */
266 static void sunhv_send_xchar(struct uart_port *port, char ch) in sunhv_send_xchar() argument
274 spin_lock_irqsave(&port->lock, flags); in sunhv_send_xchar()
276 while (limit-- > 0) { in sunhv_send_xchar()
280 udelay(1); in sunhv_send_xchar()
283 spin_unlock_irqrestore(&port->lock, flags); in sunhv_send_xchar()
286 /* port->lock held by caller. */
287 static void sunhv_stop_rx(struct uart_port *port) in sunhv_stop_rx() argument
291 /* port->lock is not held. */
292 static void sunhv_break_ctl(struct uart_port *port, int break_state) in sunhv_break_ctl() argument
298 spin_lock_irqsave(&port->lock, flags); in sunhv_break_ctl()
300 while (limit-- > 0) { in sunhv_break_ctl()
304 udelay(1); in sunhv_break_ctl()
307 spin_unlock_irqrestore(&port->lock, flags); in sunhv_break_ctl()
311 /* port->lock is not held. */
312 static int sunhv_startup(struct uart_port *port) in sunhv_startup() argument
317 /* port->lock is not held. */
318 static void sunhv_shutdown(struct uart_port *port) in sunhv_shutdown() argument
322 /* port->lock is not held. */
323 static void sunhv_set_termios(struct uart_port *port, struct ktermios *termios, in sunhv_set_termios() argument
326 unsigned int baud = uart_get_baud_rate(port, termios, old, 0, 4000000); in sunhv_set_termios()
327 unsigned int quot = uart_get_divisor(port, baud); in sunhv_set_termios()
331 spin_lock_irqsave(&port->lock, flags); in sunhv_set_termios()
333 iflag = termios->c_iflag; in sunhv_set_termios()
334 cflag = termios->c_cflag; in sunhv_set_termios()
336 port->ignore_status_mask = 0; in sunhv_set_termios()
338 port->ignore_status_mask |= IGNORE_BREAK; in sunhv_set_termios()
340 port->ignore_status_mask |= IGNORE_ALL; in sunhv_set_termios()
343 uart_update_timeout(port, cflag, in sunhv_set_termios()
344 (port->uartclk / (16 * quot))); in sunhv_set_termios()
346 spin_unlock_irqrestore(&port->lock, flags); in sunhv_set_termios()
349 static const char *sunhv_type(struct uart_port *port) in sunhv_type() argument
354 static void sunhv_release_port(struct uart_port *port) in sunhv_release_port() argument
358 static int sunhv_request_port(struct uart_port *port) in sunhv_request_port() argument
363 static void sunhv_config_port(struct uart_port *port, int flags) in sunhv_config_port() argument
367 static int sunhv_verify_port(struct uart_port *port, struct serial_struct *ser) in sunhv_verify_port() argument
369 return -EINVAL; in sunhv_verify_port()
403 irq_force_affinity(sunhv_port->irq, cpumask_of(cpu)); in sunhv_migrate_hvcons_irq()
418 while (n--) { in fill_con_write_page()
423 left--; in fill_con_write_page()
424 } else if (left < 1) in fill_con_write_page()
427 left--; in fill_con_write_page()
429 *page_bytes = p - con_write_page; in fill_con_write_page()
430 return s - orig_s; in fill_con_write_page()
435 struct uart_port *port = sunhv_port; in sunhv_console_write_paged() local
437 int locked = 1; in sunhv_console_write_paged()
439 if (port->sysrq || oops_in_progress) in sunhv_console_write_paged()
440 locked = spin_trylock_irqsave(&port->lock, flags); in sunhv_console_write_paged()
442 spin_lock_irqsave(&port->lock, flags); in sunhv_console_write_paged()
450 n -= cpy; in sunhv_console_write_paged()
456 while (limit--) { in sunhv_console_write_paged()
463 udelay(1); in sunhv_console_write_paged()
467 page_bytes -= written; in sunhv_console_write_paged()
473 spin_unlock_irqrestore(&port->lock, flags); in sunhv_console_write_paged()
476 static inline void sunhv_console_putchar(struct uart_port *port, char c) in sunhv_console_putchar() argument
480 while (limit-- > 0) { in sunhv_console_putchar()
484 udelay(1); in sunhv_console_putchar()
490 struct uart_port *port = sunhv_port; in sunhv_console_write_bychar() local
492 int i, locked = 1; in sunhv_console_write_bychar()
494 if (port->sysrq || oops_in_progress) in sunhv_console_write_bychar()
495 locked = spin_trylock_irqsave(&port->lock, flags); in sunhv_console_write_bychar()
497 spin_lock_irqsave(&port->lock, flags); in sunhv_console_write_bychar()
501 sunhv_console_putchar(port, '\r'); in sunhv_console_write_bychar()
502 sunhv_console_putchar(port, *s++); in sunhv_console_write_bychar()
506 spin_unlock_irqrestore(&port->lock, flags); in sunhv_console_write_bychar()
514 .index = -1,
520 struct uart_port *port; in hv_probe() local
524 if (op->archdata.irqs[0] == 0xffffffff) in hv_probe()
525 return -ENODEV; in hv_probe()
527 port = kzalloc(sizeof(struct uart_port), GFP_KERNEL); in hv_probe()
528 if (unlikely(!port)) in hv_probe()
529 return -ENOMEM; in hv_probe()
531 minor = 1; in hv_probe()
532 if (sun4v_hvapi_register(HV_GRP_CORE, 1, &minor) == 0 && in hv_probe()
533 minor >= 1) { in hv_probe()
534 err = -ENOMEM; in hv_probe()
547 sunhv_port = port; in hv_probe()
549 port->has_sysrq = 1; in hv_probe()
550 port->line = 0; in hv_probe()
551 port->ops = &sunhv_pops; in hv_probe()
552 port->type = PORT_SUNHV; in hv_probe()
553 port->uartclk = ( 29491200 / 16 ); /* arbitrary */ in hv_probe()
555 port->membase = (unsigned char __iomem *) __pa(port); in hv_probe()
557 port->irq = op->archdata.irqs[0]; in hv_probe()
559 port->dev = &op->dev; in hv_probe()
561 err = sunserial_register_minors(&sunhv_reg, 1); in hv_probe()
565 sunserial_console_match(&sunhv_console, op->dev.of_node, in hv_probe()
566 &sunhv_reg, port->line, false); in hv_probe()
568 err = uart_add_one_port(&sunhv_reg, port); in hv_probe()
572 err = request_irq(port->irq, sunhv_interrupt, 0, "hvcons", port); in hv_probe()
576 platform_set_drvdata(op, port); in hv_probe()
581 uart_remove_one_port(&sunhv_reg, port); in hv_probe()
584 sunserial_unregister_minors(&sunhv_reg, 1); in hv_probe()
593 kfree(port); in hv_probe()
600 struct uart_port *port = platform_get_drvdata(dev); in hv_remove() local
602 free_irq(port->irq, port); in hv_remove()
604 uart_remove_one_port(&sunhv_reg, port); in hv_remove()
606 sunserial_unregister_minors(&sunhv_reg, 1); in hv_remove()
609 kfree(port); in hv_remove()
622 .compatible = "SUNW,sun4v-console",
639 return -ENODEV; in sunhv_init()