Lines Matching +full:up +full:-
1 // SPDX-License-Identifier: GPL-2.0+
52 static inline unsigned int serial_in(struct uart_pxa_port *up, int offset) in serial_in() argument
55 return readl(up->port.membase + offset); in serial_in()
58 static inline void serial_out(struct uart_pxa_port *up, int offset, int value) in serial_out() argument
61 writel(value, up->port.membase + offset); in serial_out()
66 struct uart_pxa_port *up = (struct uart_pxa_port *)port; in serial_pxa_enable_ms() local
68 up->ier |= UART_IER_MSI; in serial_pxa_enable_ms()
69 serial_out(up, UART_IER, up->ier); in serial_pxa_enable_ms()
74 struct uart_pxa_port *up = (struct uart_pxa_port *)port; in serial_pxa_stop_tx() local
76 if (up->ier & UART_IER_THRI) { in serial_pxa_stop_tx()
77 up->ier &= ~UART_IER_THRI; in serial_pxa_stop_tx()
78 serial_out(up, UART_IER, up->ier); in serial_pxa_stop_tx()
84 struct uart_pxa_port *up = (struct uart_pxa_port *)port; in serial_pxa_stop_rx() local
86 up->ier &= ~UART_IER_RLSI; in serial_pxa_stop_rx()
87 up->port.read_status_mask &= ~UART_LSR_DR; in serial_pxa_stop_rx()
88 serial_out(up, UART_IER, up->ier); in serial_pxa_stop_rx()
91 static inline void receive_chars(struct uart_pxa_port *up, int *status) in receive_chars() argument
104 up->ier &= ~UART_IER_RTOIE; in receive_chars()
105 serial_out(up, UART_IER, up->ier); in receive_chars()
107 ch = serial_in(up, UART_RX); in receive_chars()
109 up->port.icount.rx++; in receive_chars()
118 up->port.icount.brk++; in receive_chars()
125 if (uart_handle_break(&up->port)) in receive_chars()
128 up->port.icount.parity++; in receive_chars()
130 up->port.icount.frame++; in receive_chars()
132 up->port.icount.overrun++; in receive_chars()
137 *status &= up->port.read_status_mask; in receive_chars()
140 if (up->port.line == up->port.cons->index) { in receive_chars()
142 *status |= up->lsr_break_flag; in receive_chars()
143 up->lsr_break_flag = 0; in receive_chars()
154 if (uart_handle_sysrq_char(&up->port, ch)) in receive_chars()
157 uart_insert_char(&up->port, *status, UART_LSR_OE, ch, flag); in receive_chars()
160 *status = serial_in(up, UART_LSR); in receive_chars()
161 } while ((*status & UART_LSR_DR) && (max_count-- > 0)); in receive_chars()
162 tty_flip_buffer_push(&up->port.state->port); in receive_chars()
169 * No more data in FIFO: Re-enable RTO interrupt via IER[RTOIE] in receive_chars()
171 up->ier |= UART_IER_RTOIE; in receive_chars()
172 serial_out(up, UART_IER, up->ier); in receive_chars()
175 static void transmit_chars(struct uart_pxa_port *up) in transmit_chars() argument
177 struct circ_buf *xmit = &up->port.state->xmit; in transmit_chars()
180 if (up->port.x_char) { in transmit_chars()
181 serial_out(up, UART_TX, up->port.x_char); in transmit_chars()
182 up->port.icount.tx++; in transmit_chars()
183 up->port.x_char = 0; in transmit_chars()
186 if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) { in transmit_chars()
187 serial_pxa_stop_tx(&up->port); in transmit_chars()
191 count = up->port.fifosize / 2; in transmit_chars()
193 serial_out(up, UART_TX, xmit->buf[xmit->tail]); in transmit_chars()
194 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); in transmit_chars()
195 up->port.icount.tx++; in transmit_chars()
198 } while (--count > 0); in transmit_chars()
201 uart_write_wakeup(&up->port); in transmit_chars()
205 serial_pxa_stop_tx(&up->port); in transmit_chars()
210 struct uart_pxa_port *up = (struct uart_pxa_port *)port; in serial_pxa_start_tx() local
212 if (!(up->ier & UART_IER_THRI)) { in serial_pxa_start_tx()
213 up->ier |= UART_IER_THRI; in serial_pxa_start_tx()
214 serial_out(up, UART_IER, up->ier); in serial_pxa_start_tx()
218 /* should hold up->port.lock */
219 static inline void check_modem_status(struct uart_pxa_port *up) in check_modem_status() argument
223 status = serial_in(up, UART_MSR); in check_modem_status()
229 up->port.icount.rng++; in check_modem_status()
231 up->port.icount.dsr++; in check_modem_status()
233 uart_handle_dcd_change(&up->port, status & UART_MSR_DCD); in check_modem_status()
235 uart_handle_cts_change(&up->port, status & UART_MSR_CTS); in check_modem_status()
237 wake_up_interruptible(&up->port.state->port.delta_msr_wait); in check_modem_status()
245 struct uart_pxa_port *up = dev_id; in serial_pxa_irq() local
248 iir = serial_in(up, UART_IIR); in serial_pxa_irq()
251 spin_lock(&up->port.lock); in serial_pxa_irq()
252 lsr = serial_in(up, UART_LSR); in serial_pxa_irq()
254 receive_chars(up, &lsr); in serial_pxa_irq()
255 check_modem_status(up); in serial_pxa_irq()
257 transmit_chars(up); in serial_pxa_irq()
258 spin_unlock(&up->port.lock); in serial_pxa_irq()
264 struct uart_pxa_port *up = (struct uart_pxa_port *)port; in serial_pxa_tx_empty() local
268 spin_lock_irqsave(&up->port.lock, flags); in serial_pxa_tx_empty()
269 ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0; in serial_pxa_tx_empty()
270 spin_unlock_irqrestore(&up->port.lock, flags); in serial_pxa_tx_empty()
277 struct uart_pxa_port *up = (struct uart_pxa_port *)port; in serial_pxa_get_mctrl() local
281 status = serial_in(up, UART_MSR); in serial_pxa_get_mctrl()
297 struct uart_pxa_port *up = (struct uart_pxa_port *)port; in serial_pxa_set_mctrl() local
311 mcr |= up->mcr; in serial_pxa_set_mctrl()
313 serial_out(up, UART_MCR, mcr); in serial_pxa_set_mctrl()
318 struct uart_pxa_port *up = (struct uart_pxa_port *)port; in serial_pxa_break_ctl() local
321 spin_lock_irqsave(&up->port.lock, flags); in serial_pxa_break_ctl()
322 if (break_state == -1) in serial_pxa_break_ctl()
323 up->lcr |= UART_LCR_SBC; in serial_pxa_break_ctl()
325 up->lcr &= ~UART_LCR_SBC; in serial_pxa_break_ctl()
326 serial_out(up, UART_LCR, up->lcr); in serial_pxa_break_ctl()
327 spin_unlock_irqrestore(&up->port.lock, flags); in serial_pxa_break_ctl()
332 struct uart_pxa_port *up = (struct uart_pxa_port *)port; in serial_pxa_startup() local
336 if (port->line == 3) /* HWUART */ in serial_pxa_startup()
337 up->mcr |= UART_MCR_AFE; in serial_pxa_startup()
339 up->mcr = 0; in serial_pxa_startup()
341 up->port.uartclk = clk_get_rate(up->clk); in serial_pxa_startup()
346 retval = request_irq(up->port.irq, serial_pxa_irq, 0, up->name, up); in serial_pxa_startup()
354 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO); in serial_pxa_startup()
355 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO | in serial_pxa_startup()
357 serial_out(up, UART_FCR, 0); in serial_pxa_startup()
362 (void) serial_in(up, UART_LSR); in serial_pxa_startup()
363 (void) serial_in(up, UART_RX); in serial_pxa_startup()
364 (void) serial_in(up, UART_IIR); in serial_pxa_startup()
365 (void) serial_in(up, UART_MSR); in serial_pxa_startup()
370 serial_out(up, UART_LCR, UART_LCR_WLEN8); in serial_pxa_startup()
372 spin_lock_irqsave(&up->port.lock, flags); in serial_pxa_startup()
373 up->port.mctrl |= TIOCM_OUT2; in serial_pxa_startup()
374 serial_pxa_set_mctrl(&up->port, up->port.mctrl); in serial_pxa_startup()
375 spin_unlock_irqrestore(&up->port.lock, flags); in serial_pxa_startup()
382 up->ier = UART_IER_RLSI | UART_IER_RDI | UART_IER_RTOIE | UART_IER_UUE; in serial_pxa_startup()
383 serial_out(up, UART_IER, up->ier); in serial_pxa_startup()
388 (void) serial_in(up, UART_LSR); in serial_pxa_startup()
389 (void) serial_in(up, UART_RX); in serial_pxa_startup()
390 (void) serial_in(up, UART_IIR); in serial_pxa_startup()
391 (void) serial_in(up, UART_MSR); in serial_pxa_startup()
398 struct uart_pxa_port *up = (struct uart_pxa_port *)port; in serial_pxa_shutdown() local
401 free_irq(up->port.irq, up); in serial_pxa_shutdown()
406 up->ier = 0; in serial_pxa_shutdown()
407 serial_out(up, UART_IER, 0); in serial_pxa_shutdown()
409 spin_lock_irqsave(&up->port.lock, flags); in serial_pxa_shutdown()
410 up->port.mctrl &= ~TIOCM_OUT2; in serial_pxa_shutdown()
411 serial_pxa_set_mctrl(&up->port, up->port.mctrl); in serial_pxa_shutdown()
412 spin_unlock_irqrestore(&up->port.lock, flags); in serial_pxa_shutdown()
417 serial_out(up, UART_LCR, serial_in(up, UART_LCR) & ~UART_LCR_SBC); in serial_pxa_shutdown()
418 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO | in serial_pxa_shutdown()
421 serial_out(up, UART_FCR, 0); in serial_pxa_shutdown()
428 struct uart_pxa_port *up = (struct uart_pxa_port *)port; in serial_pxa_set_termios() local
434 cval = UART_LCR_WLEN(tty_get_char_size(termios->c_cflag)); in serial_pxa_set_termios()
436 if (termios->c_cflag & CSTOPB) in serial_pxa_set_termios()
438 if (termios->c_cflag & PARENB) in serial_pxa_set_termios()
440 if (!(termios->c_cflag & PARODD)) in serial_pxa_set_termios()
446 baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); in serial_pxa_set_termios()
449 if ((up->port.uartclk / quot) < (2400 * 16)) in serial_pxa_set_termios()
451 else if ((up->port.uartclk / quot) < (230400 * 16)) in serial_pxa_set_termios()
460 spin_lock_irqsave(&up->port.lock, flags); in serial_pxa_set_termios()
466 up->ier |= UART_IER_UUE; in serial_pxa_set_termios()
469 * Update the per-port timeout. in serial_pxa_set_termios()
471 uart_update_timeout(port, termios->c_cflag, baud); in serial_pxa_set_termios()
473 up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; in serial_pxa_set_termios()
474 if (termios->c_iflag & INPCK) in serial_pxa_set_termios()
475 up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE; in serial_pxa_set_termios()
476 if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) in serial_pxa_set_termios()
477 up->port.read_status_mask |= UART_LSR_BI; in serial_pxa_set_termios()
482 up->port.ignore_status_mask = 0; in serial_pxa_set_termios()
483 if (termios->c_iflag & IGNPAR) in serial_pxa_set_termios()
484 up->port.ignore_status_mask |= UART_LSR_PE | UART_LSR_FE; in serial_pxa_set_termios()
485 if (termios->c_iflag & IGNBRK) { in serial_pxa_set_termios()
486 up->port.ignore_status_mask |= UART_LSR_BI; in serial_pxa_set_termios()
491 if (termios->c_iflag & IGNPAR) in serial_pxa_set_termios()
492 up->port.ignore_status_mask |= UART_LSR_OE; in serial_pxa_set_termios()
498 if ((termios->c_cflag & CREAD) == 0) in serial_pxa_set_termios()
499 up->port.ignore_status_mask |= UART_LSR_DR; in serial_pxa_set_termios()
504 up->ier &= ~UART_IER_MSI; in serial_pxa_set_termios()
505 if (UART_ENABLE_MS(&up->port, termios->c_cflag)) in serial_pxa_set_termios()
506 up->ier |= UART_IER_MSI; in serial_pxa_set_termios()
508 serial_out(up, UART_IER, up->ier); in serial_pxa_set_termios()
510 if (termios->c_cflag & CRTSCTS) in serial_pxa_set_termios()
511 up->mcr |= UART_MCR_AFE; in serial_pxa_set_termios()
513 up->mcr &= ~UART_MCR_AFE; in serial_pxa_set_termios()
515 serial_out(up, UART_LCR, cval | UART_LCR_DLAB); /* set DLAB */ in serial_pxa_set_termios()
516 serial_out(up, UART_DLL, quot & 0xff); /* LS of divisor */ in serial_pxa_set_termios()
522 dll = serial_in(up, UART_DLL); in serial_pxa_set_termios()
525 serial_out(up, UART_DLM, quot >> 8); /* MS of divisor */ in serial_pxa_set_termios()
526 serial_out(up, UART_LCR, cval); /* reset DLAB */ in serial_pxa_set_termios()
527 up->lcr = cval; /* Save LCR */ in serial_pxa_set_termios()
528 serial_pxa_set_mctrl(&up->port, up->port.mctrl); in serial_pxa_set_termios()
529 serial_out(up, UART_FCR, fcr); in serial_pxa_set_termios()
530 spin_unlock_irqrestore(&up->port.lock, flags); in serial_pxa_set_termios()
537 struct uart_pxa_port *up = (struct uart_pxa_port *)port; in serial_pxa_pm() local
540 clk_prepare_enable(up->clk); in serial_pxa_pm()
542 clk_disable_unprepare(up->clk); in serial_pxa_pm()
556 struct uart_pxa_port *up = (struct uart_pxa_port *)port; in serial_pxa_config_port() local
557 up->port.type = PORT_PXA; in serial_pxa_config_port()
564 return -EINVAL; in serial_pxa_verify_port()
570 struct uart_pxa_port *up = (struct uart_pxa_port *)port; in serial_pxa_type() local
571 return up->name; in serial_pxa_type()
582 static void wait_for_xmitr(struct uart_pxa_port *up) in wait_for_xmitr() argument
586 /* Wait up to 10ms for the character(s) to be sent. */ in wait_for_xmitr()
588 status = serial_in(up, UART_LSR); in wait_for_xmitr()
591 up->lsr_break_flag = UART_LSR_BI; in wait_for_xmitr()
593 if (--tmout == 0) in wait_for_xmitr()
598 /* Wait up to 1s for flow control if necessary */ in wait_for_xmitr()
599 if (up->port.flags & UPF_CONS_FLOW) { in wait_for_xmitr()
601 while (--tmout && in wait_for_xmitr()
602 ((serial_in(up, UART_MSR) & UART_MSR_CTS) == 0)) in wait_for_xmitr()
609 struct uart_pxa_port *up = (struct uart_pxa_port *)port; in serial_pxa_console_putchar() local
611 wait_for_xmitr(up); in serial_pxa_console_putchar()
612 serial_out(up, UART_TX, ch); in serial_pxa_console_putchar()
624 struct uart_pxa_port *up = serial_pxa_ports[co->index]; in serial_pxa_console_write() local
629 clk_enable(up->clk); in serial_pxa_console_write()
631 if (up->port.sysrq) in serial_pxa_console_write()
634 locked = spin_trylock(&up->port.lock); in serial_pxa_console_write()
636 spin_lock(&up->port.lock); in serial_pxa_console_write()
641 ier = serial_in(up, UART_IER); in serial_pxa_console_write()
642 serial_out(up, UART_IER, UART_IER_UUE); in serial_pxa_console_write()
644 uart_console_write(&up->port, s, count, serial_pxa_console_putchar); in serial_pxa_console_write()
650 wait_for_xmitr(up); in serial_pxa_console_write()
651 serial_out(up, UART_IER, ier); in serial_pxa_console_write()
654 spin_unlock(&up->port.lock); in serial_pxa_console_write()
656 clk_disable(up->clk); in serial_pxa_console_write()
668 struct uart_pxa_port *up = (struct uart_pxa_port *)port; in serial_pxa_get_poll_char() local
669 unsigned char lsr = serial_in(up, UART_LSR); in serial_pxa_get_poll_char()
672 lsr = serial_in(up, UART_LSR); in serial_pxa_get_poll_char()
674 return serial_in(up, UART_RX); in serial_pxa_get_poll_char()
682 struct uart_pxa_port *up = (struct uart_pxa_port *)port; in serial_pxa_put_poll_char() local
687 ier = serial_in(up, UART_IER); in serial_pxa_put_poll_char()
688 serial_out(up, UART_IER, UART_IER_UUE); in serial_pxa_put_poll_char()
690 wait_for_xmitr(up); in serial_pxa_put_poll_char()
694 serial_out(up, UART_TX, c); in serial_pxa_put_poll_char()
700 wait_for_xmitr(up); in serial_pxa_put_poll_char()
701 serial_out(up, UART_IER, ier); in serial_pxa_put_poll_char()
709 struct uart_pxa_port *up; in serial_pxa_console_setup() local
715 if (co->index == -1 || co->index >= serial_pxa_reg.nr) in serial_pxa_console_setup()
716 co->index = 0; in serial_pxa_console_setup()
717 up = serial_pxa_ports[co->index]; in serial_pxa_console_setup()
718 if (!up) in serial_pxa_console_setup()
719 return -ENODEV; in serial_pxa_console_setup()
724 return uart_set_options(&up->port, co, baud, parity, bits, flow); in serial_pxa_console_setup()
733 .index = -1,
782 uart_suspend_port(&serial_pxa_reg, &sport->port); in serial_pxa_suspend()
792 uart_resume_port(&serial_pxa_reg, &sport->port); in serial_pxa_resume()
804 { .compatible = "mrvl,pxa-uart", },
805 { .compatible = "mrvl,mmp-uart", },
812 struct device_node *np = pdev->dev.of_node; in serial_pxa_probe_dt()
820 dev_err(&pdev->dev, "failed to get alias id, errno %d\n", ret); in serial_pxa_probe_dt()
823 sport->port.line = ret; in serial_pxa_probe_dt()
836 return -ENODEV; in serial_pxa_probe()
844 return -ENOMEM; in serial_pxa_probe()
846 sport->clk = clk_get(&dev->dev, NULL); in serial_pxa_probe()
847 if (IS_ERR(sport->clk)) { in serial_pxa_probe()
848 ret = PTR_ERR(sport->clk); in serial_pxa_probe()
852 ret = clk_prepare(sport->clk); in serial_pxa_probe()
854 clk_put(sport->clk); in serial_pxa_probe()
858 sport->port.type = PORT_PXA; in serial_pxa_probe()
859 sport->port.iotype = UPIO_MEM; in serial_pxa_probe()
860 sport->port.mapbase = mmres->start; in serial_pxa_probe()
861 sport->port.irq = irq; in serial_pxa_probe()
862 sport->port.fifosize = 64; in serial_pxa_probe()
863 sport->port.ops = &serial_pxa_pops; in serial_pxa_probe()
864 sport->port.dev = &dev->dev; in serial_pxa_probe()
865 sport->port.flags = UPF_IOREMAP | UPF_BOOT_AUTOCONF; in serial_pxa_probe()
866 sport->port.uartclk = clk_get_rate(sport->clk); in serial_pxa_probe()
867 sport->port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_PXA_CONSOLE); in serial_pxa_probe()
871 sport->port.line = dev->id; in serial_pxa_probe()
874 if (sport->port.line >= ARRAY_SIZE(serial_pxa_ports)) { in serial_pxa_probe()
875 dev_err(&dev->dev, "serial%d out of range\n", sport->port.line); in serial_pxa_probe()
876 ret = -EINVAL; in serial_pxa_probe()
879 snprintf(sport->name, PXA_NAME_LEN - 1, "UART%d", sport->port.line + 1); in serial_pxa_probe()
881 sport->port.membase = ioremap(mmres->start, resource_size(mmres)); in serial_pxa_probe()
882 if (!sport->port.membase) { in serial_pxa_probe()
883 ret = -ENOMEM; in serial_pxa_probe()
887 serial_pxa_ports[sport->port.line] = sport; in serial_pxa_probe()
889 uart_add_one_port(&serial_pxa_reg, &sport->port); in serial_pxa_probe()
895 clk_unprepare(sport->clk); in serial_pxa_probe()
896 clk_put(sport->clk); in serial_pxa_probe()
906 .name = "pxa2xx-uart",