Lines Matching +full:init +full:- +full:brt

1 // SPDX-License-Identifier: GPL-2.0
12 * [31-AUG-98] triemer
14 * removed base_addr code - moving address assignment to setup.c
16 * [13-NOV-98] triemer fixed code to receive characters
18 * [09-JAN-99] triemer minor fix for schedule - due to removal of timeout
19 * field from "current" - somewhere between 2.1.121 and 2.1.131
20 Qua Jun 27 15:02:26 BRT 2001
21 * [27-JUN-2001] Arnaldo Carvalho de Melo <acme@conectiva.com.br> - cleanups
24 * [07-SEP-99] Bugfixes
26 * [06-Jan-2002] Russell King <rmk@arm.linux.org.uk>
37 #include <linux/init.h>
91 * ------------------------------------------------------------
96 * ------------------------------------------------------------
101 void __iomem *addr = dport->port.membase + offset; in dz_in()
108 void __iomem *addr = dport->port.membase + offset; in dz_out()
114 * ------------------------------------------------------------
118 * tty->flow.stopped. They enable or disable transmitter interrupts,
120 * ------------------------------------------------------------
126 u16 tmp, mask = 1 << dport->port.line; in dz_stop_tx()
136 u16 tmp, mask = 1 << dport->port.line; in dz_start_tx()
147 dport->cflag &= ~DZ_RXENAB; in dz_stop_rx()
148 dz_out(dport, DZ_LPR, dport->cflag); in dz_stop_rx()
152 * ------------------------------------------------------------
168 * ------------------------------------------------------------
172 * ------------------------------------------------------------
176 * ------------------------------------------------------------
181 struct dz_port *dport = &mux->dport[0]; in dz_receive_chars()
183 int lines_rx[DZ_NB_PORT] = { [0 ... DZ_NB_PORT - 1] = 0 }; in dz_receive_chars()
189 dport = &mux->dport[LINE(status)]; in dz_receive_chars()
190 uport = &dport->port; in dz_receive_chars()
195 icount = &uport->icount; in dz_receive_chars()
196 icount->rx++; in dz_receive_chars()
208 (ffs(DZ_FERR) - ffs(DZ_BREAK)); in dz_receive_chars()
214 icount->brk++; in dz_receive_chars()
218 icount->frame++; in dz_receive_chars()
220 icount->parity++; in dz_receive_chars()
222 icount->overrun++; in dz_receive_chars()
224 status &= uport->read_status_mask; in dz_receive_chars()
242 tty_flip_buffer_push(&mux->dport[i].port.state->port); in dz_receive_chars()
246 * ------------------------------------------------------------
250 * ------------------------------------------------------------
254 struct dz_port *dport = &mux->dport[0]; in dz_transmit_chars()
260 dport = &mux->dport[LINE(status)]; in dz_transmit_chars()
261 xmit = &dport->port.state->xmit; in dz_transmit_chars()
263 if (dport->port.x_char) { /* XON/XOFF chars */ in dz_transmit_chars()
264 dz_out(dport, DZ_TDR, dport->port.x_char); in dz_transmit_chars()
265 dport->port.icount.tx++; in dz_transmit_chars()
266 dport->port.x_char = 0; in dz_transmit_chars()
270 if (uart_circ_empty(xmit) || uart_tx_stopped(&dport->port)) { in dz_transmit_chars()
271 spin_lock(&dport->port.lock); in dz_transmit_chars()
272 dz_stop_tx(&dport->port); in dz_transmit_chars()
273 spin_unlock(&dport->port.lock); in dz_transmit_chars()
279 * so we go one char at a time) :-< in dz_transmit_chars()
281 tmp = xmit->buf[xmit->tail]; in dz_transmit_chars()
283 uart_xmit_advance(&dport->port, 1); in dz_transmit_chars()
286 uart_write_wakeup(&dport->port); in dz_transmit_chars()
290 spin_lock(&dport->port.lock); in dz_transmit_chars()
291 dz_stop_tx(&dport->port); in dz_transmit_chars()
292 spin_unlock(&dport->port.lock); in dz_transmit_chars()
297 * ------------------------------------------------------------
302 * ------------------------------------------------------------
309 * 2. Handle the 3100/5000 as appropriate. --macro in check_modem_status()
314 if (dport->port.line != DZ_MODEM) in check_modem_status()
321 dport->port.icount.dsr++; in check_modem_status()
325 * ------------------------------------------------------------
330 * ------------------------------------------------------------
335 struct dz_port *dport = &mux->dport[0]; in dz_interrupt()
351 * -------------------------------------------------------------------
353 * -------------------------------------------------------------------
359 * FIXME: Handle the 3100/5000 as appropriate. --macro in dz_get_mctrl()
364 if (dport->port.line == DZ_MODEM) { in dz_get_mctrl()
375 * FIXME: Handle the 3100/5000 as appropriate. --macro in dz_set_mctrl()
380 if (dport->port.line == DZ_MODEM) { in dz_set_mctrl()
391 * -------------------------------------------------------------------
395 * -------------------------------------------------------------------
400 struct dz_mux *mux = dport->mux; in dz_startup()
406 irq_guard = atomic_add_return(1, &mux->irq_guard); in dz_startup()
410 ret = request_irq(dport->port.irq, dz_interrupt, in dz_startup()
413 atomic_add(-1, &mux->irq_guard); in dz_startup()
414 printk(KERN_ERR "dz: Cannot get IRQ %d!\n", dport->port.irq); in dz_startup()
418 spin_lock_irqsave(&dport->port.lock, flags); in dz_startup()
425 spin_unlock_irqrestore(&dport->port.lock, flags); in dz_startup()
431 * -------------------------------------------------------------------
436 * -------------------------------------------------------------------
441 struct dz_mux *mux = dport->mux; in dz_shutdown()
446 spin_lock_irqsave(&dport->port.lock, flags); in dz_shutdown()
447 dz_stop_tx(&dport->port); in dz_shutdown()
448 spin_unlock_irqrestore(&dport->port.lock, flags); in dz_shutdown()
450 irq_guard = atomic_add_return(-1, &mux->irq_guard); in dz_shutdown()
457 free_irq(dport->port.irq, mux); in dz_shutdown()
462 * -------------------------------------------------------------------
463 * dz_tx_empty() -- get the transmitter empty status
471 * -------------------------------------------------------------------
476 unsigned short tmp, mask = 1 << dport->port.line; in dz_tx_empty()
488 * reuse the code for polled TX. --macro in dz_break_ctl()
492 unsigned short tmp, mask = 1 << dport->port.line; in dz_break_ctl()
494 spin_lock_irqsave(&uport->lock, flags); in dz_break_ctl()
501 spin_unlock_irqrestore(&uport->lock, flags); in dz_break_ctl()
538 return -1; in dz_encode_baud_rate()
545 struct dz_mux *mux = dport->mux; in dz_reset()
547 if (mux->initialised) in dz_reset()
557 mux->initialised = 1; in dz_reset()
568 cflag = dport->port.line; in dz_set_termios()
570 switch (termios->c_cflag & CSIZE) { in dz_set_termios()
585 if (termios->c_cflag & CSTOPB) in dz_set_termios()
587 if (termios->c_cflag & PARENB) in dz_set_termios()
589 if (termios->c_cflag & PARODD) in dz_set_termios()
608 if (termios->c_cflag & CREAD) in dz_set_termios()
611 spin_lock_irqsave(&dport->port.lock, flags); in dz_set_termios()
613 uart_update_timeout(uport, termios->c_cflag, baud); in dz_set_termios()
616 dport->cflag = cflag; in dz_set_termios()
619 dport->port.read_status_mask = DZ_OERR; in dz_set_termios()
620 if (termios->c_iflag & INPCK) in dz_set_termios()
621 dport->port.read_status_mask |= DZ_FERR | DZ_PERR; in dz_set_termios()
622 if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) in dz_set_termios()
623 dport->port.read_status_mask |= DZ_BREAK; in dz_set_termios()
626 uport->ignore_status_mask = 0; in dz_set_termios()
627 if ((termios->c_iflag & (IGNPAR | IGNBRK)) == (IGNPAR | IGNBRK)) in dz_set_termios()
628 dport->port.ignore_status_mask |= DZ_OERR; in dz_set_termios()
629 if (termios->c_iflag & IGNPAR) in dz_set_termios()
630 dport->port.ignore_status_mask |= DZ_FERR | DZ_PERR; in dz_set_termios()
631 if (termios->c_iflag & IGNBRK) in dz_set_termios()
632 dport->port.ignore_status_mask |= DZ_BREAK; in dz_set_termios()
634 spin_unlock_irqrestore(&dport->port.lock, flags); in dz_set_termios()
639 * Required solely so that the initial PROM-based console
648 spin_lock_irqsave(&dport->port.lock, flags); in dz_pm()
650 dz_start_tx(&dport->port); in dz_pm()
652 dz_stop_tx(&dport->port); in dz_pm()
653 spin_unlock_irqrestore(&dport->port.lock, flags); in dz_pm()
664 struct dz_mux *mux = to_dport(uport)->mux; in dz_release_port()
667 iounmap(uport->membase); in dz_release_port()
668 uport->membase = NULL; in dz_release_port()
670 map_guard = atomic_add_return(-1, &mux->map_guard); in dz_release_port()
672 release_mem_region(uport->mapbase, dec_kn_slot_size); in dz_release_port()
677 if (!uport->membase) in dz_map_port()
678 uport->membase = ioremap(uport->mapbase, in dz_map_port()
680 if (!uport->membase) { in dz_map_port()
682 return -ENOMEM; in dz_map_port()
689 struct dz_mux *mux = to_dport(uport)->mux; in dz_request_port()
693 map_guard = atomic_add_return(1, &mux->map_guard); in dz_request_port()
695 if (!request_mem_region(uport->mapbase, dec_kn_slot_size, in dz_request_port()
697 atomic_add(-1, &mux->map_guard); in dz_request_port()
700 return -EBUSY; in dz_request_port()
705 map_guard = atomic_add_return(-1, &mux->map_guard); in dz_request_port()
707 release_mem_region(uport->mapbase, dec_kn_slot_size); in dz_request_port()
721 uport->type = PORT_DZ; in dz_config_port()
734 if (ser->type != PORT_UNKNOWN && ser->type != PORT_DZ) in dz_verify_port()
735 ret = -EINVAL; in dz_verify_port()
736 if (ser->irq != uport->irq) in dz_verify_port()
737 ret = -EINVAL; in dz_verify_port()
777 struct uart_port *uport = &dport->port; in dz_init_ports()
779 dport->mux = &dz_mux; in dz_init_ports()
781 uport->irq = dec_interrupt[DEC_IRQ_DZ11]; in dz_init_ports()
782 uport->fifosize = 1; in dz_init_ports()
783 uport->iotype = UPIO_MEM; in dz_init_ports()
784 uport->flags = UPF_BOOT_AUTOCONF; in dz_init_ports()
785 uport->ops = &dz_ops; in dz_init_ports()
786 uport->line = line; in dz_init_ports()
787 uport->mapbase = base; in dz_init_ports()
788 uport->has_sysrq = IS_ENABLED(CONFIG_SERIAL_DZ_CONSOLE); in dz_init_ports()
794 * -------------------------------------------------------------------
795 * dz_console_putchar() -- transmit a character
804 * restored. Welcome to the world of PDP-11!
805 * -------------------------------------------------------------------
814 spin_lock_irqsave(&dport->port.lock, flags); in dz_console_putchar()
818 tcr |= 1 << dport->port.line; in dz_console_putchar()
822 spin_unlock_irqrestore(&dport->port.lock, flags); in dz_console_putchar()
829 if (trdy == dport->port.line) in dz_console_putchar()
835 } while (--loops); in dz_console_putchar()
845 * -------------------------------------------------------------------
850 * -------------------------------------------------------------------
856 struct dz_port *dport = &dz_mux.dport[co->index]; in dz_console_print()
860 uart_console_write(&dport->port, str, count, dz_console_putchar); in dz_console_print()
865 struct dz_port *dport = &dz_mux.dport[co->index]; in dz_console_setup()
866 struct uart_port *uport = &dport->port; in dz_console_setup()
877 spin_lock_init(&dport->port.lock); /* For dz_pm(). */ in dz_console_setup()
880 dz_pm(uport, 0, -1); in dz_console_setup()
885 return uart_set_options(&dport->port, co, baud, parity, bits, flow); in dz_console_setup()
895 .index = -1,
906 return -ENXIO; in dz_serial_console_init()
931 return -ENXIO; in dz_init()