Lines Matching +full:modem +full:- +full:control +full:- +full:line +full:- +full:ports

1 // SPDX-License-Identifier: GPL-2.0
10 * Copyright (C) 2000-2002 Toshiba Corporation
54 * Number of serial ports
71 /* SILCR : Line Control */
86 /* SIDICR : DMA/Int. Control */
122 /* SIFCR : FIFO Control */
141 /* SIFLCR : Flow Control */
151 /* SIBGR : Baudrate Control */
161 switch (up->iotype) { in sio_in()
163 return __raw_readl(up->membase + offset); in sio_in()
165 return inl(up->iobase + offset); in sio_in()
172 switch (up->iotype) { in sio_out()
174 __raw_writel(value, up->membase + offset); in sio_out()
177 outl(value, up->iobase + offset); in sio_out()
221 up->read_status_mask &= ~TXX9_SIDISR_RDIS; in serial_txx9_stop_rx()
232 while ((sio_in(up, TXX9_SIFCR) & TXX9_SIFCR_SWRST) && --tmout) in serial_txx9_initialize()
240 ((up->flags & UPF_TXX9_USE_SCLK) ? in serial_txx9_initialize()
258 up->icount.rx++; in receive_chars()
262 up->ignore_status_mask & ~TXX9_SIDISR_RFDN_MASK; in receive_chars()
270 up->icount.brk++; in receive_chars()
280 up->icount.parity++; in receive_chars()
282 up->icount.frame++; in receive_chars()
284 up->icount.overrun++; in receive_chars()
298 disr &= up->read_status_mask; in receive_chars()
313 up->ignore_status_mask = next_ignore_status_mask; in receive_chars()
315 } while (!(disr & TXX9_SIDISR_UVALID) && (max_count-- > 0)); in receive_chars()
317 tty_flip_buffer_push(&up->state->port); in receive_chars()
382 /* no modem control lines */ in serial_txx9_get_mctrl()
404 if (break_state == -1) in serial_txx9_break_ctl()
420 while (--tmout && in wait_for_xmitr()
424 /* Wait up to 1s for flow control if necessary */ in wait_for_xmitr()
425 if (up->flags & UPF_CONS_FLOW) { in wait_for_xmitr()
427 while (--tmout && in wait_for_xmitr()
513 retval = request_irq(up->irq, serial_txx9_interrupt, in serial_txx9_startup()
522 serial_txx9_set_mctrl(up, up->mctrl); in serial_txx9_startup()
546 serial_txx9_set_mctrl(up, up->mctrl); in serial_txx9_shutdown()
555 if (up->cons && up->line == up->cons->index) { in serial_txx9_shutdown()
556 free_irq(up->irq, up); in serial_txx9_shutdown()
570 free_irq(up->irq, up); in serial_txx9_shutdown()
582 * We don't support modem control lines. in serial_txx9_set_termios()
584 termios->c_cflag &= ~(HUPCL | CMSPAR); in serial_txx9_set_termios()
585 termios->c_cflag |= CLOCAL; in serial_txx9_set_termios()
590 switch (termios->c_cflag & CSIZE) { in serial_txx9_set_termios()
599 termios->c_cflag &= ~CSIZE; in serial_txx9_set_termios()
600 termios->c_cflag |= CS8; in serial_txx9_set_termios()
605 if (termios->c_cflag & CSTOPB) in serial_txx9_set_termios()
610 if (termios->c_cflag & PARENB) in serial_txx9_set_termios()
612 if (!(termios->c_cflag & PARODD)) in serial_txx9_set_termios()
618 baud = uart_get_baud_rate(up, termios, old, 0, up->uartclk/16/2); in serial_txx9_set_termios()
632 * Update the per-port timeout. in serial_txx9_set_termios()
634 uart_update_timeout(up, termios->c_cflag, baud); in serial_txx9_set_termios()
636 up->read_status_mask = TXX9_SIDISR_UOER | in serial_txx9_set_termios()
638 if (termios->c_iflag & INPCK) in serial_txx9_set_termios()
639 up->read_status_mask |= TXX9_SIDISR_UFER | TXX9_SIDISR_UPER; in serial_txx9_set_termios()
640 if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) in serial_txx9_set_termios()
641 up->read_status_mask |= TXX9_SIDISR_UBRK; in serial_txx9_set_termios()
646 up->ignore_status_mask = 0; in serial_txx9_set_termios()
647 if (termios->c_iflag & IGNPAR) in serial_txx9_set_termios()
648 up->ignore_status_mask |= TXX9_SIDISR_UPER | TXX9_SIDISR_UFER; in serial_txx9_set_termios()
649 if (termios->c_iflag & IGNBRK) { in serial_txx9_set_termios()
650 up->ignore_status_mask |= TXX9_SIDISR_UBRK; in serial_txx9_set_termios()
655 if (termios->c_iflag & IGNPAR) in serial_txx9_set_termios()
656 up->ignore_status_mask |= TXX9_SIDISR_UOER; in serial_txx9_set_termios()
662 if ((termios->c_cflag & CREAD) == 0) in serial_txx9_set_termios()
663 up->ignore_status_mask |= TXX9_SIDISR_RDIS; in serial_txx9_set_termios()
665 /* CTS flow control flag */ in serial_txx9_set_termios()
666 if ((termios->c_cflag & CRTSCTS) && in serial_txx9_set_termios()
667 (up->flags & UPF_TXX9_HAVE_CTS_LINE)) { in serial_txx9_set_termios()
679 serial_txx9_set_mctrl(up, up->mctrl); in serial_txx9_set_termios()
688 * If oldstate was -1 this is called from in serial_txx9_pm()
691 * non-console port) or should not be initialized here (for in serial_txx9_pm()
695 if (state == 0 && oldstate != -1) in serial_txx9_pm()
704 switch (up->iotype) { in serial_txx9_request_resource()
706 if (!up->mapbase) in serial_txx9_request_resource()
709 if (!request_mem_region(up->mapbase, size, "serial_txx9")) { in serial_txx9_request_resource()
710 ret = -EBUSY; in serial_txx9_request_resource()
714 if (up->flags & UPF_IOREMAP) { in serial_txx9_request_resource()
715 up->membase = ioremap(up->mapbase, size); in serial_txx9_request_resource()
716 if (!up->membase) { in serial_txx9_request_resource()
717 release_mem_region(up->mapbase, size); in serial_txx9_request_resource()
718 ret = -ENOMEM; in serial_txx9_request_resource()
724 if (!request_region(up->iobase, size, "serial_txx9")) in serial_txx9_request_resource()
725 ret = -EBUSY; in serial_txx9_request_resource()
735 switch (up->iotype) { in serial_txx9_release_resource()
737 if (!up->mapbase) in serial_txx9_release_resource()
740 if (up->flags & UPF_IOREMAP) { in serial_txx9_release_resource()
741 iounmap(up->membase); in serial_txx9_release_resource()
742 up->membase = NULL; in serial_txx9_release_resource()
745 release_mem_region(up->mapbase, size); in serial_txx9_release_resource()
749 release_region(up->iobase, size); in serial_txx9_release_resource()
775 up->type = PORT_TXX9; in serial_txx9_config_port()
776 up->fifosize = TXX9_SIO_TX_FIFO; in serial_txx9_config_port()
779 if (up->line == up->cons->index) in serial_txx9_config_port()
823 up->line = i; in serial_txx9_register_ports()
824 up->ops = &serial_txx9_pops; in serial_txx9_register_ports()
825 up->dev = dev; in serial_txx9_register_ports()
826 if (up->iobase || up->mapbase) in serial_txx9_register_ports()
848 struct uart_port *up = &serial_txx9_ports[co->index]; in serial_txx9_console_write()
857 * Disable flow-control if enabled (and unnecessary) in serial_txx9_console_write()
860 if (!(up->flags & UPF_CONS_FLOW) && (flcr & TXX9_SIFLCR_TES)) in serial_txx9_console_write()
887 if (co->index >= UART_NR) in serial_txx9_console_setup()
888 co->index = 0; in serial_txx9_console_setup()
889 up = &serial_txx9_ports[co->index]; in serial_txx9_console_setup()
890 if (!up->ops) in serial_txx9_console_setup()
891 return -ENODEV; in serial_txx9_console_setup()
908 .index = -1,
936 if (port->line >= ARRAY_SIZE(serial_txx9_ports)) in early_serial_txx9_setup()
937 return -ENODEV; in early_serial_txx9_setup()
939 serial_txx9_ports[port->line] = *port; in early_serial_txx9_setup()
940 serial_txx9_ports[port->line].ops = &serial_txx9_pops; in early_serial_txx9_setup()
941 serial_txx9_ports[port->line].flags |= in early_serial_txx9_setup()
949 * serial_txx9_register_port - register a serial port
957 * On success the port is ready to use and the line number is returned.
963 int ret = -ENOSPC; in serial_txx9_register_port()
977 if (!(uart->iobase || uart->mapbase)) in serial_txx9_register_port()
982 uart->iobase = port->iobase; in serial_txx9_register_port()
983 uart->membase = port->membase; in serial_txx9_register_port()
984 uart->irq = port->irq; in serial_txx9_register_port()
985 uart->uartclk = port->uartclk; in serial_txx9_register_port()
986 uart->iotype = port->iotype; in serial_txx9_register_port()
987 uart->flags = port->flags in serial_txx9_register_port()
989 uart->mapbase = port->mapbase; in serial_txx9_register_port()
990 if (port->dev) in serial_txx9_register_port()
991 uart->dev = port->dev; in serial_txx9_register_port()
994 ret = uart->line; in serial_txx9_register_port()
1001 * serial_txx9_unregister_port - remove a txx9 serial port at runtime
1002 * @line: serial line number
1005 * context. We hand the port back to the our control.
1007 static void serial_txx9_unregister_port(int line) in serial_txx9_unregister_port() argument
1009 struct uart_port *uart = &serial_txx9_ports[line]; in serial_txx9_unregister_port()
1013 uart->flags = 0; in serial_txx9_unregister_port()
1014 uart->type = PORT_UNKNOWN; in serial_txx9_unregister_port()
1015 uart->iobase = 0; in serial_txx9_unregister_port()
1016 uart->mapbase = 0; in serial_txx9_unregister_port()
1017 uart->membase = NULL; in serial_txx9_unregister_port()
1018 uart->dev = NULL; in serial_txx9_unregister_port()
1027 struct uart_port *p = dev_get_platdata(&dev->dev); in serial_txx9_probe()
1032 for (i = 0; p && p->uartclk != 0; p++, i++) { in serial_txx9_probe()
1033 port.iobase = p->iobase; in serial_txx9_probe()
1034 port.membase = p->membase; in serial_txx9_probe()
1035 port.irq = p->irq; in serial_txx9_probe()
1036 port.uartclk = p->uartclk; in serial_txx9_probe()
1037 port.iotype = p->iotype; in serial_txx9_probe()
1038 port.flags = p->flags; in serial_txx9_probe()
1039 port.mapbase = p->mapbase; in serial_txx9_probe()
1040 port.dev = &dev->dev; in serial_txx9_probe()
1044 dev_err(&dev->dev, "unable to register port at index %d " in serial_txx9_probe()
1046 p->iobase, (unsigned long long)p->mapbase, in serial_txx9_probe()
1047 p->irq, ret); in serial_txx9_probe()
1054 * Remove serial ports registered against a platform device.
1063 if (up->dev == &dev->dev) in serial_txx9_remove()
1076 if (up->type != PORT_UNKNOWN && up->dev == &dev->dev) in serial_txx9_suspend()
1090 if (up->type != PORT_UNKNOWN && up->dev == &dev->dev) in serial_txx9_resume()
1113 * to the arrangement of serial ports on a PCI card.
1119 int line; in pciserial_txx9_init_one() local
1130 port.irq = dev->irq; in pciserial_txx9_init_one()
1133 port.dev = &dev->dev; in pciserial_txx9_init_one()
1134 line = serial_txx9_register_port(&port); in pciserial_txx9_init_one()
1135 if (line < 0) { in pciserial_txx9_init_one()
1136 printk(KERN_WARNING "Couldn't register serial port %s: %d\n", pci_name(dev), line); in pciserial_txx9_init_one()
1138 return line; in pciserial_txx9_init_one()
1140 pci_set_drvdata(dev, &serial_txx9_ports[line]); in pciserial_txx9_init_one()
1150 serial_txx9_unregister_port(up->line); in pciserial_txx9_remove_one()
1208 serial_txx9_plat_devs = platform_device_alloc("serial_txx9", -1); in serial_txx9_init()
1210 ret = -ENOMEM; in serial_txx9_init()
1219 &serial_txx9_plat_devs->dev); in serial_txx9_init()
1255 if (up->iobase || up->mapbase) in serial_txx9_exit()