Lines Matching +full:em +full:- +full:uart
1 // SPDX-License-Identifier: GPL-2.0
9 * Copyright (C) 1998-2000 Harald Koerfgen
20 * DIN-7 MJ-4 signal SCC
21 * 2 1 TxD <- A.TxD
22 * 3 4 RxD -> A.RxD
24 * EIA-232/EIA-423:
25 * DB-25 MMJ-6 signal SCC
26 * 2 2 TxD <- B.TxD
27 * 3 5 RxD -> B.RxD
28 * 4 RTS <- ~A.RTS
29 * 5 CTS -> ~B.CTS
30 * 6 6 DSR -> ~A.SYNC
31 * 8 CD -> ~B.DCD
32 * 12 DSRS(DCE) -> ~A.CTS (*)
33 * 15 TxC -> B.TxC
34 * 17 RxC -> B.RxC
35 * 20 1 DTR <- ~A.DTR
36 * 22 RI -> ~A.DCD
37 * 23 DSRS(DTE) <- ~B.RTS
39 * (*) EIA-232 defines the signal at this pin to be SCD, while DSRS(DCE)
80 MODULE_AUTHOR("Maciej W. Rozycki <macro@linux-mips.org>");
100 of the 16-bit IOBUS. */
144 void __iomem *control = zport->port.membase + ZS_CHAN_IO_OFFSET; in read_zsreg()
159 void __iomem *control = zport->port.membase + ZS_CHAN_IO_OFFSET; in write_zsreg()
173 void __iomem *data = zport->port.membase + in read_zsdata()
184 void __iomem *data = zport->port.membase + in write_zsdata()
202 if (!zport->scc) in zs_dump()
206 printk("W%-2d = 0x%02x\t", j, zport->regs[j]); in zs_dump()
209 printk("R%-2d = 0x%02x\t", j, read_zsreg(zport, j)); in zs_dump()
236 while ((read_zsreg(zport, R0) & Rx_CH_AV) && --loops) in zs_receive_drain()
243 struct zs_scc *scc = zport->scc; in zs_transmit_drain()
246 while (!(read_zsreg(zport, R0) & Tx_BUF_EMP) && --loops) { in zs_transmit_drain()
247 zs_spin_unlock_cond_irq(&scc->zlock, irq); in zs_transmit_drain()
249 zs_spin_lock_cond_irq(&scc->zlock, irq); in zs_transmit_drain()
256 struct zs_scc *scc = zport->scc; in zs_line_drain()
259 while (!(read_zsreg(zport, R1) & ALL_SNT) && --loops) { in zs_line_drain()
260 zs_spin_unlock_cond_irq(&scc->zlock, irq); in zs_line_drain()
262 zs_spin_lock_cond_irq(&scc->zlock, irq); in zs_line_drain()
272 /* Load 'em up. */ in load_zsregs()
299 * zs_tx_empty() -- get the transmitter empty status
301 * Purpose: Let user call ioctl() to get info when the UART physically
311 struct zs_scc *scc = zport->scc; in zs_tx_empty()
315 spin_lock_irqsave(&scc->zlock, flags); in zs_tx_empty()
317 spin_unlock_irqrestore(&scc->zlock, flags); in zs_tx_empty()
341 struct zs_port *zport_a = &zport->scc->zport[ZS_CHAN_A]; in zs_raw_get_mctrl()
348 struct zs_port *zport_a = &zport->scc->zport[ZS_CHAN_A]; in zs_raw_xor_mctrl()
355 mask_a = zport_a->regs[15]; in zs_raw_xor_mctrl()
356 mask_b = zport->regs[15]; in zs_raw_xor_mctrl()
363 mctrl = zport->mctrl; in zs_raw_xor_mctrl()
369 delta = mctrl ^ zport->mctrl; in zs_raw_xor_mctrl()
371 zport->mctrl = mctrl; in zs_raw_xor_mctrl()
379 struct zs_scc *scc = zport->scc; in zs_get_mctrl()
382 spin_lock(&scc->zlock); in zs_get_mctrl()
384 spin_unlock(&scc->zlock); in zs_get_mctrl()
392 struct zs_scc *scc = zport->scc; in zs_set_mctrl()
393 struct zs_port *zport_a = &scc->zport[ZS_CHAN_A]; in zs_set_mctrl()
396 spin_lock(&scc->zlock); in zs_set_mctrl()
399 zport_a->regs[5] |= DTR; in zs_set_mctrl()
401 zport_a->regs[5] &= ~DTR; in zs_set_mctrl()
403 zport_a->regs[5] |= RTS; in zs_set_mctrl()
405 zport_a->regs[5] &= ~RTS; in zs_set_mctrl()
406 write_zsreg(zport_a, R5, zport_a->regs[5]); in zs_set_mctrl()
410 oldloop = zport->regs[14]; in zs_set_mctrl()
417 zport->regs[14] = newloop; in zs_set_mctrl()
418 write_zsreg(zport, R14, zport->regs[14]); in zs_set_mctrl()
420 spin_unlock(&scc->zlock); in zs_set_mctrl()
426 zport->tx_stopped = 1; in zs_raw_stop_tx()
432 struct zs_scc *scc = zport->scc; in zs_stop_tx()
434 spin_lock(&scc->zlock); in zs_stop_tx()
436 spin_unlock(&scc->zlock); in zs_stop_tx()
444 struct zs_scc *scc = zport->scc; in zs_start_tx()
446 spin_lock(&scc->zlock); in zs_start_tx()
447 if (zport->tx_stopped) { in zs_start_tx()
449 zport->tx_stopped = 0; in zs_start_tx()
452 spin_unlock(&scc->zlock); in zs_start_tx()
458 struct zs_scc *scc = zport->scc; in zs_stop_rx()
459 struct zs_port *zport_a = &scc->zport[ZS_CHAN_A]; in zs_stop_rx()
461 spin_lock(&scc->zlock); in zs_stop_rx()
462 zport->regs[15] &= ~BRKIE; in zs_stop_rx()
463 zport->regs[1] &= ~(RxINT_MASK | TxINT_ENAB); in zs_stop_rx()
464 zport->regs[1] |= RxINT_DISAB; in zs_stop_rx()
467 /* A-side DCD tracks RI and SYNC tracks DSR. */ in zs_stop_rx()
468 zport_a->regs[15] &= ~(DCDIE | SYNCIE); in zs_stop_rx()
469 write_zsreg(zport_a, R15, zport_a->regs[15]); in zs_stop_rx()
470 if (!(zport_a->regs[15] & BRKIE)) { in zs_stop_rx()
471 zport_a->regs[1] &= ~EXT_INT_ENAB; in zs_stop_rx()
472 write_zsreg(zport_a, R1, zport_a->regs[1]); in zs_stop_rx()
475 /* This-side DCD tracks DCD and CTS tracks CTS. */ in zs_stop_rx()
476 zport->regs[15] &= ~(DCDIE | CTSIE); in zs_stop_rx()
477 zport->regs[1] &= ~EXT_INT_ENAB; in zs_stop_rx()
480 if (!(zport->regs[15] & (DCDIE | SYNCIE))) in zs_stop_rx()
481 zport->regs[1] &= ~EXT_INT_ENAB; in zs_stop_rx()
484 write_zsreg(zport, R15, zport->regs[15]); in zs_stop_rx()
485 write_zsreg(zport, R1, zport->regs[1]); in zs_stop_rx()
486 spin_unlock(&scc->zlock); in zs_stop_rx()
492 struct zs_scc *scc = zport->scc; in zs_enable_ms()
493 struct zs_port *zport_a = &scc->zport[ZS_CHAN_A]; in zs_enable_ms()
498 spin_lock(&scc->zlock); in zs_enable_ms()
501 if (!(zport_a->regs[1] & EXT_INT_ENAB)) in zs_enable_ms()
504 /* A-side DCD tracks RI and SYNC tracks DSR. */ in zs_enable_ms()
505 zport_a->regs[1] |= EXT_INT_ENAB; in zs_enable_ms()
506 zport_a->regs[15] |= DCDIE | SYNCIE; in zs_enable_ms()
508 /* This-side DCD tracks DCD and CTS tracks CTS. */ in zs_enable_ms()
509 zport->regs[15] |= DCDIE | CTSIE; in zs_enable_ms()
513 write_zsreg(zport_a, R1, zport_a->regs[1]); in zs_enable_ms()
514 write_zsreg(zport_a, R15, zport_a->regs[15]); in zs_enable_ms()
515 write_zsreg(zport, R15, zport->regs[15]); in zs_enable_ms()
516 spin_unlock(&scc->zlock); in zs_enable_ms()
522 struct zs_scc *scc = zport->scc; in zs_break_ctl()
525 spin_lock_irqsave(&scc->zlock, flags); in zs_break_ctl()
526 if (break_state == -1) in zs_break_ctl()
527 zport->regs[5] |= SND_BRK; in zs_break_ctl()
529 zport->regs[5] &= ~SND_BRK; in zs_break_ctl()
530 write_zsreg(zport, R5, zport->regs[5]); in zs_break_ctl()
531 spin_unlock_irqrestore(&scc->zlock, flags); in zs_break_ctl()
543 struct uart_port *uport = &zport->port; in zs_receive_chars()
544 struct zs_scc *scc = zport->scc; in zs_receive_chars()
549 for (count = 16; count; count--) { in zs_receive_chars()
550 spin_lock(&scc->zlock); in zs_receive_chars()
552 spin_unlock(&scc->zlock); in zs_receive_chars()
556 spin_lock(&scc->zlock); in zs_receive_chars()
559 spin_unlock(&scc->zlock); in zs_receive_chars()
563 icount = &uport->icount; in zs_receive_chars()
564 icount->rx++; in zs_receive_chars()
568 status |= zport->tty_break; in zs_receive_chars()
571 zport->tty_break = 0; in zs_receive_chars()
575 spin_lock(&scc->zlock); in zs_receive_chars()
577 spin_unlock(&scc->zlock); in zs_receive_chars()
581 icount->brk++; in zs_receive_chars()
586 icount->frame++; in zs_receive_chars()
588 icount->parity++; in zs_receive_chars()
590 icount->overrun++; in zs_receive_chars()
592 status &= uport->read_status_mask; in zs_receive_chars()
607 tty_flip_buffer_push(&uport->state->port); in zs_receive_chars()
612 struct circ_buf *xmit = &zport->port.state->xmit; in zs_raw_transmit_chars()
615 if (zport->port.x_char) { in zs_raw_transmit_chars()
616 write_zsdata(zport, zport->port.x_char); in zs_raw_transmit_chars()
617 zport->port.icount.tx++; in zs_raw_transmit_chars()
618 zport->port.x_char = 0; in zs_raw_transmit_chars()
623 if (uart_circ_empty(xmit) || uart_tx_stopped(&zport->port)) { in zs_raw_transmit_chars()
629 write_zsdata(zport, xmit->buf[xmit->tail]); in zs_raw_transmit_chars()
630 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); in zs_raw_transmit_chars()
631 zport->port.icount.tx++; in zs_raw_transmit_chars()
634 uart_write_wakeup(&zport->port); in zs_raw_transmit_chars()
643 struct zs_scc *scc = zport->scc; in zs_transmit_chars()
645 spin_lock(&scc->zlock); in zs_transmit_chars()
647 spin_unlock(&scc->zlock); in zs_transmit_chars()
652 struct uart_port *uport = &zport->port; in zs_status_handle()
653 struct zs_scc *scc = zport->scc; in zs_status_handle()
657 spin_lock(&scc->zlock); in zs_status_handle()
662 if (zport->regs[15] & BRKIE) { in zs_status_handle()
664 if (brk && !zport->brk) { in zs_status_handle()
665 spin_unlock(&scc->zlock); in zs_status_handle()
667 zport->tty_break = Rx_SYS; in zs_status_handle()
669 zport->tty_break = Rx_BRK; in zs_status_handle()
670 spin_lock(&scc->zlock); in zs_status_handle()
672 zport->brk = brk; in zs_status_handle()
677 spin_unlock(&scc->zlock); in zs_status_handle()
681 zport->mctrl & TIOCM_CTS); in zs_status_handle()
684 zport->mctrl & TIOCM_CAR); in zs_status_handle()
686 uport->icount.dsr++; in zs_status_handle()
688 uport->icount.rng++; in zs_status_handle()
691 wake_up_interruptible(&uport->state->port.delta_msr_wait); in zs_status_handle()
693 spin_lock(&scc->zlock); in zs_status_handle()
699 spin_unlock(&scc->zlock); in zs_status_handle()
708 struct zs_port *zport_a = &scc->zport[ZS_CHAN_A]; in zs_interrupt()
709 struct zs_port *zport_b = &scc->zport[ZS_CHAN_B]; in zs_interrupt()
721 for (count = 16; count; count--) { in zs_interrupt()
722 spin_lock(&scc->zlock); in zs_interrupt()
724 spin_unlock(&scc->zlock); in zs_interrupt()
759 struct zs_scc *scc = zport->scc; in zs_startup()
764 irq_guard = atomic_add_return(1, &scc->irq_guard); in zs_startup()
766 ret = request_irq(zport->port.irq, zs_interrupt, in zs_startup()
769 atomic_add(-1, &scc->irq_guard); in zs_startup()
771 zport->port.irq); in zs_startup()
776 spin_lock_irqsave(&scc->zlock, flags); in zs_startup()
785 if (!(zport->regs[1] & EXT_INT_ENAB)) in zs_startup()
789 zport->regs[1] &= ~RxINT_MASK; in zs_startup()
790 zport->regs[1] |= RxINT_ALL | TxINT_ENAB | EXT_INT_ENAB; in zs_startup()
791 zport->regs[3] |= RxENABLE; in zs_startup()
792 zport->regs[15] |= BRKIE; in zs_startup()
793 write_zsreg(zport, R1, zport->regs[1]); in zs_startup()
794 write_zsreg(zport, R3, zport->regs[3]); in zs_startup()
795 write_zsreg(zport, R5, zport->regs[5]); in zs_startup()
796 write_zsreg(zport, R15, zport->regs[15]); in zs_startup()
799 zport->mctrl = zs_raw_get_mctrl(zport); in zs_startup()
800 zport->brk = read_zsreg(zport, R0) & BRK_ABRT; in zs_startup()
802 zport->tx_stopped = 1; in zs_startup()
804 spin_unlock_irqrestore(&scc->zlock, flags); in zs_startup()
812 struct zs_scc *scc = zport->scc; in zs_shutdown()
816 spin_lock_irqsave(&scc->zlock, flags); in zs_shutdown()
818 zport->regs[3] &= ~RxENABLE; in zs_shutdown()
819 write_zsreg(zport, R5, zport->regs[5]); in zs_shutdown()
820 write_zsreg(zport, R3, zport->regs[3]); in zs_shutdown()
822 spin_unlock_irqrestore(&scc->zlock, flags); in zs_shutdown()
824 irq_guard = atomic_add_return(-1, &scc->irq_guard); in zs_shutdown()
826 free_irq(zport->port.irq, scc); in zs_shutdown()
832 struct zs_scc *scc = zport->scc; in zs_reset()
836 spin_lock_irqsave(&scc->zlock, flags); in zs_reset()
838 if (!scc->initialised) { in zs_reset()
846 scc->initialised = 1; in zs_reset()
848 load_zsregs(zport, zport->regs, irq); in zs_reset()
849 spin_unlock_irqrestore(&scc->zlock, flags); in zs_reset()
856 struct zs_scc *scc = zport->scc; in zs_set_termios()
857 struct zs_port *zport_a = &scc->zport[ZS_CHAN_A]; in zs_set_termios()
862 spin_lock_irqsave(&scc->zlock, flags); in zs_set_termios()
866 zport->regs[3] &= ~RxNBITS_MASK; in zs_set_termios()
867 zport->regs[5] &= ~TxNBITS_MASK; in zs_set_termios()
868 switch (termios->c_cflag & CSIZE) { in zs_set_termios()
870 zport->regs[3] |= Rx5; in zs_set_termios()
871 zport->regs[5] |= Tx5; in zs_set_termios()
874 zport->regs[3] |= Rx6; in zs_set_termios()
875 zport->regs[5] |= Tx6; in zs_set_termios()
878 zport->regs[3] |= Rx7; in zs_set_termios()
879 zport->regs[5] |= Tx7; in zs_set_termios()
883 zport->regs[3] |= Rx8; in zs_set_termios()
884 zport->regs[5] |= Tx8; in zs_set_termios()
889 zport->regs[4] &= ~(XCLK_MASK | SB_MASK | PAR_ENA | PAR_EVEN); in zs_set_termios()
890 if (termios->c_cflag & CSTOPB) in zs_set_termios()
891 zport->regs[4] |= SB2; in zs_set_termios()
893 zport->regs[4] |= SB1; in zs_set_termios()
894 if (termios->c_cflag & PARENB) in zs_set_termios()
895 zport->regs[4] |= PAR_ENA; in zs_set_termios()
896 if (!(termios->c_cflag & PARODD)) in zs_set_termios()
897 zport->regs[4] |= PAR_EVEN; in zs_set_termios()
898 switch (zport->clk_mode) { in zs_set_termios()
900 zport->regs[4] |= X64CLK; in zs_set_termios()
903 zport->regs[4] |= X32CLK; in zs_set_termios()
906 zport->regs[4] |= X16CLK; in zs_set_termios()
909 zport->regs[4] |= X1CLK; in zs_set_termios()
916 uport->uartclk / zport->clk_mode / 4); in zs_set_termios()
918 brg = ZS_BPS_TO_BRG(baud, uport->uartclk / zport->clk_mode); in zs_set_termios()
919 zport->regs[12] = brg & 0xff; in zs_set_termios()
920 zport->regs[13] = (brg >> 8) & 0xff; in zs_set_termios()
922 uart_update_timeout(uport, termios->c_cflag, baud); in zs_set_termios()
924 uport->read_status_mask = Rx_OVR; in zs_set_termios()
925 if (termios->c_iflag & INPCK) in zs_set_termios()
926 uport->read_status_mask |= FRM_ERR | PAR_ERR; in zs_set_termios()
927 if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) in zs_set_termios()
928 uport->read_status_mask |= Rx_BRK; in zs_set_termios()
930 uport->ignore_status_mask = 0; in zs_set_termios()
931 if (termios->c_iflag & IGNPAR) in zs_set_termios()
932 uport->ignore_status_mask |= FRM_ERR | PAR_ERR; in zs_set_termios()
933 if (termios->c_iflag & IGNBRK) { in zs_set_termios()
934 uport->ignore_status_mask |= Rx_BRK; in zs_set_termios()
935 if (termios->c_iflag & IGNPAR) in zs_set_termios()
936 uport->ignore_status_mask |= Rx_OVR; in zs_set_termios()
939 if (termios->c_cflag & CREAD) in zs_set_termios()
940 zport->regs[3] |= RxENABLE; in zs_set_termios()
942 zport->regs[3] &= ~RxENABLE; in zs_set_termios()
945 if (!(termios->c_cflag & CLOCAL)) { in zs_set_termios()
946 zport->regs[15] |= DCDIE; in zs_set_termios()
948 zport->regs[15] &= ~DCDIE; in zs_set_termios()
949 if (termios->c_cflag & CRTSCTS) { in zs_set_termios()
950 zport->regs[15] |= CTSIE; in zs_set_termios()
952 zport->regs[15] &= ~CTSIE; in zs_set_termios()
957 load_zsregs(zport, zport->regs, irq); in zs_set_termios()
959 spin_unlock_irqrestore(&scc->zlock, flags); in zs_set_termios()
964 * Required solely so that the initial PROM-based console
973 zport->regs[5] |= TxENAB; in zs_pm()
975 zport->regs[5] &= ~TxENAB; in zs_pm()
976 write_zsreg(zport, R5, zport->regs[5]); in zs_pm()
987 iounmap(uport->membase); in zs_release_port()
988 uport->membase = 0; in zs_release_port()
989 release_mem_region(uport->mapbase, ZS_CHAN_IO_SIZE); in zs_release_port()
994 if (!uport->membase) in zs_map_port()
995 uport->membase = ioremap_nocache(uport->mapbase, in zs_map_port()
997 if (!uport->membase) { in zs_map_port()
999 return -ENOMEM; in zs_map_port()
1008 if (!request_mem_region(uport->mapbase, ZS_CHAN_IO_SIZE, "scc")) { in zs_request_port()
1010 return -EBUSY; in zs_request_port()
1014 release_mem_region(uport->mapbase, ZS_CHAN_IO_SIZE); in zs_request_port()
1028 uport->type = PORT_ZS; in zs_config_port()
1039 if (ser->type != PORT_UNKNOWN && ser->type != PORT_ZS) in zs_verify_port()
1040 ret = -EINVAL; in zs_verify_port()
1041 if (ser->irq != uport->irq) in zs_verify_port()
1042 ret = -EINVAL; in zs_verify_port()
1043 if (ser->baud_base != uport->uartclk / zport->clk_mode / 4) in zs_verify_port()
1044 ret = -EINVAL; in zs_verify_port()
1096 return -ENXIO; in zs_probe_sccs()
1104 struct uart_port *uport = &zport->port; in zs_probe_sccs()
1106 zport->scc = &zs_sccs[chip]; in zs_probe_sccs()
1107 zport->clk_mode = 16; in zs_probe_sccs()
1109 uport->irq = zs_parms.irq[chip]; in zs_probe_sccs()
1110 uport->uartclk = ZS_CLOCK; in zs_probe_sccs()
1111 uport->fifosize = 1; in zs_probe_sccs()
1112 uport->iotype = UPIO_MEM; in zs_probe_sccs()
1113 uport->flags = UPF_BOOT_AUTOCONF; in zs_probe_sccs()
1114 uport->ops = &zs_ops; in zs_probe_sccs()
1115 uport->line = chip * ZS_NUM_CHAN + side; in zs_probe_sccs()
1116 uport->mapbase = dec_kn_slot_base + in zs_probe_sccs()
1121 zport->regs[i] = zs_init_regs[i]; in zs_probe_sccs()
1133 struct zs_scc *scc = zport->scc; in zs_console_putchar()
1137 spin_lock_irqsave(&scc->zlock, flags); in zs_console_putchar()
1141 spin_unlock_irqrestore(&scc->zlock, flags); in zs_console_putchar()
1151 int chip = co->index / ZS_NUM_CHAN, side = co->index % ZS_NUM_CHAN; in zs_console_write()
1153 struct zs_scc *scc = zport->scc; in zs_console_write()
1159 spin_lock_irqsave(&scc->zlock, flags); in zs_console_write()
1160 txint = zport->regs[1]; in zs_console_write()
1161 txenb = zport->regs[5]; in zs_console_write()
1163 zport->regs[1] = txint & ~TxINT_ENAB; in zs_console_write()
1164 write_zsreg(zport, R1, zport->regs[1]); in zs_console_write()
1167 zport->regs[5] = txenb | TxENAB; in zs_console_write()
1168 write_zsreg(zport, R5, zport->regs[5]); in zs_console_write()
1170 spin_unlock_irqrestore(&scc->zlock, flags); in zs_console_write()
1172 uart_console_write(&zport->port, s, count, zs_console_putchar); in zs_console_write()
1175 spin_lock_irqsave(&scc->zlock, flags); in zs_console_write()
1179 zport->regs[5] &= ~TxENAB; in zs_console_write()
1180 write_zsreg(zport, R5, zport->regs[5]); in zs_console_write()
1183 zport->regs[1] |= TxINT_ENAB; in zs_console_write()
1184 write_zsreg(zport, R1, zport->regs[1]); in zs_console_write()
1187 if (!zport->tx_stopped) in zs_console_write()
1190 spin_unlock_irqrestore(&scc->zlock, flags); in zs_console_write()
1195 * - construct a cflag setting for the first uart_open()
1196 * - initialise the serial port
1197 * Return non-zero if we didn't find a serial port.
1201 int chip = co->index / ZS_NUM_CHAN, side = co->index % ZS_NUM_CHAN; in zs_console_setup()
1203 struct uart_port *uport = &zport->port; in zs_console_setup()
1215 zs_pm(uport, 0, -1); in zs_console_setup()
1229 .index = -1,
1283 struct zs_port *zport = &scc->zport[i % ZS_NUM_CHAN]; in zs_init()
1284 struct uart_port *uport = &zport->port; in zs_init()
1286 if (zport->scc) in zs_init()
1297 for (i = ZS_NUM_SCCS * ZS_NUM_CHAN - 1; i >= 0; i--) { in zs_exit()
1299 struct zs_port *zport = &scc->zport[i % ZS_NUM_CHAN]; in zs_exit()
1300 struct uart_port *uport = &zport->port; in zs_exit()
1302 if (zport->scc) in zs_exit()