Lines Matching +full:auto +full:- +full:baud
1 // SPDX-License-Identifier: GPL-2.0
3 * Probe module for 8250/16550-type Exar chips PCI serial ports.
56 #define UART_FCTR_EXAR_485 0x20 /* Auto 485 half duplex dir ctl */
62 #define UART_EXAR_TXTRG 0x0a /* Tx FIFO trigger level write-only */
63 #define UART_EXAR_RXTRG 0x0b /* Rx FIFO trigger level write-only */
81 #define UART_EXAR_DLD_485_POLARITY 0x80 /* RS-485 Enable Signal Polarity */
87 * ---- ---- --------
91 * 3 - <reserved>
95 * 7 - <reserved>
98 * 10 - Red LED
99 * 11..15 - <unused>
129 * struct exar8250_board - board information
132 * @setup: quirk run at ->probe() stage
133 * @exit: quirk run at ->remove() stage
163 * Calculate divisor with extra 4-bit fractional portion
165 static unsigned int xr17v35x_get_divisor(struct uart_port *p, unsigned int baud, in xr17v35x_get_divisor() argument
170 quot_16 = DIV_ROUND_CLOSEST(p->uartclk, baud); in xr17v35x_get_divisor()
176 static void xr17v35x_set_divisor(struct uart_port *p, unsigned int baud, in xr17v35x_set_divisor() argument
179 serial8250_do_set_divisor(p, baud, quot, quot_frac); in xr17v35x_set_divisor()
211 struct circ_buf *xmit = &port->state->xmit; in exar_shutdown()
231 const struct exar8250_board *board = priv->board; in default_setup()
235 port->port.iotype = UPIO_MEM; in default_setup()
236 port->port.mapbase = pci_resource_start(pcidev, bar) + offset; in default_setup()
237 port->port.membase = priv->virt + offset; in default_setup()
238 port->port.regshift = board->reg_shift; in default_setup()
247 status = readb(port->port.membase + UART_EXAR_DVID); in default_setup()
249 port->port.type = PORT_XR17V35X; in default_setup()
251 port->port.get_divisor = xr17v35x_get_divisor; in default_setup()
252 port->port.set_divisor = xr17v35x_set_divisor; in default_setup()
254 port->port.startup = xr17v35x_startup; in default_setup()
256 port->port.type = PORT_XR17D15X; in default_setup()
259 port->port.pm = exar_pm; in default_setup()
260 port->port.shutdown = exar_shutdown; in default_setup()
270 unsigned int baud = 1843200; in pci_fastcom335_setup() local
274 port->port.uartclk = baud * 16; in pci_fastcom335_setup()
280 p = port->port.membase; in pci_fastcom335_setup()
291 switch (pcidev->device) { in pci_fastcom335_setup()
318 unsigned int baud = 1843200; in pci_connect_tech_setup() local
320 port->port.uartclk = baud * 16; in pci_connect_tech_setup()
329 unsigned int baud = 921600; in pci_xr17c154_setup() local
331 port->port.uartclk = baud * 16; in pci_xr17c154_setup()
339 * devices will export them as GPIOs, so we pre-configure them safely in setup_gpio()
345 if ((pcidev->vendor == PCI_VENDOR_ID_EXAR) && in setup_gpio()
346 (pcidev->subsystem_vendor != PCI_VENDOR_ID_SEALEVEL)) { in setup_gpio()
377 pdev->dev.parent = &pcidev->dev; in __xr17v35x_register_gpio()
378 ACPI_COMPANION_SET(&pdev->dev, ACPI_COMPANION(&pcidev->dev)); in __xr17v35x_register_gpio()
380 if (device_add_software_node(&pdev->dev, node) < 0 || in __xr17v35x_register_gpio()
391 device_remove_software_node(&pdev->dev); in __xr17v35x_unregister_gpio()
396 PROPERTY_ENTRY_U32("exar,first-pin", 0),
407 if (pcidev->vendor == PCI_VENDOR_ID_EXAR) in xr17v35x_register_gpio()
408 port->port.private_data = in xr17v35x_register_gpio()
416 if (!port->port.private_data) in xr17v35x_unregister_gpio()
419 __xr17v35x_unregister_gpio(port->port.private_data); in xr17v35x_unregister_gpio()
420 port->port.private_data = NULL; in xr17v35x_unregister_gpio()
426 bool is_rs485 = !!(rs485->flags & SER_RS485_ENABLED); in generic_rs485_config()
427 u8 __iomem *p = port->membase; in generic_rs485_config()
447 u8 __iomem *p = port->membase; in sealevel_rs485_config()
457 if (rs485->flags & SER_RS485_ENABLED) { in sealevel_rs485_config()
465 /* Set MCR to use DTR as Auto-RS485 Enable signal */ in sealevel_rs485_config()
496 bool is_rs485 = !!(rs485->flags & SER_RS485_ENABLED); in iot2040_rs485_config()
497 u8 __iomem *p = port->membase; in iot2040_rs485_config()
502 if (rs485->flags & SER_RS485_RX_DURING_TX) in iot2040_rs485_config()
507 if (rs485->flags & SER_RS485_TERMINATE_BUS) in iot2040_rs485_config()
513 if (port->line == 3) { in iot2040_rs485_config()
532 PROPERTY_ENTRY_U32("exar,first-pin", 10),
544 u8 __iomem *p = port->port.membase; in iot2040_register_gpio()
551 port->port.private_data = in iot2040_register_gpio()
585 return dmi_match->driver_data; in exar_get_platform()
596 unsigned int baud = 7812500; in pci_xr17v35x_setup() local
600 port->port.uartclk = baud * 16; in pci_xr17v35x_setup()
601 port->port.rs485_config = platform->rs485_config; in pci_xr17v35x_setup()
602 port->port.rs485_supported = *(platform->rs485_supported); in pci_xr17v35x_setup()
604 if (pcidev->subsystem_vendor == PCI_VENDOR_ID_SEALEVEL) in pci_xr17v35x_setup()
605 port->port.rs485_config = sealevel_rs485_config; in pci_xr17v35x_setup()
612 port->port.uartclk /= 2; in pci_xr17v35x_setup()
618 p = port->port.membase; in pci_xr17v35x_setup()
629 ret = platform->register_gpio(pcidev, port); in pci_xr17v35x_setup()
639 struct uart_8250_port *port = serial8250_get_port(priv->line[0]); in pci_xr17v35x_exit()
641 platform->unregister_gpio(port); in pci_xr17v35x_exit()
647 readb(priv->virt + UART_EXAR_INT0); in exar_misc_clear()
650 if (priv->board->num_ports > 8) in exar_misc_clear()
651 readb(priv->virt + 0x2000 + UART_EXAR_INT0); in exar_misc_clear()
679 board = (struct exar8250_board *)ent->driver_data; in exar_pci_probe()
681 return -EINVAL; in exar_pci_probe()
687 maxnr = pci_resource_len(pcidev, bar) >> (board->reg_shift + 3); in exar_pci_probe()
689 if (pcidev->vendor == PCI_VENDOR_ID_ACCESSIO) in exar_pci_probe()
690 nr_ports = BIT(((pcidev->device & 0x38) >> 3) - 1); in exar_pci_probe()
691 else if (board->num_ports) in exar_pci_probe()
692 nr_ports = board->num_ports; in exar_pci_probe()
694 nr_ports = pcidev->device & 0x0f; in exar_pci_probe()
696 priv = devm_kzalloc(&pcidev->dev, struct_size(priv, line, nr_ports), GFP_KERNEL); in exar_pci_probe()
698 return -ENOMEM; in exar_pci_probe()
700 priv->board = board; in exar_pci_probe()
701 priv->virt = pcim_iomap(pcidev, bar, 0); in exar_pci_probe()
702 if (!priv->virt) in exar_pci_probe()
703 return -ENOMEM; in exar_pci_probe()
714 uart.port.dev = &pcidev->dev; in exar_pci_probe()
716 rc = devm_request_irq(&pcidev->dev, uart.port.irq, exar_misc_handler, in exar_pci_probe()
725 rc = board->setup(priv, pcidev, &uart, i); in exar_pci_probe()
727 dev_err(&pcidev->dev, "Failed to setup port %u\n", i); in exar_pci_probe()
731 dev_dbg(&pcidev->dev, "Setup PCI port: port %lx, irq %d, type %d\n", in exar_pci_probe()
734 priv->line[i] = serial8250_register_8250_port(&uart); in exar_pci_probe()
735 if (priv->line[i] < 0) { in exar_pci_probe()
736 dev_err(&pcidev->dev, in exar_pci_probe()
739 uart.port.iotype, priv->line[i]); in exar_pci_probe()
743 priv->nr = i; in exar_pci_probe()
753 for (i = 0; i < priv->nr; i++) in exar_pci_remove()
754 serial8250_unregister_port(priv->line[i]); in exar_pci_remove()
756 if (priv->board->exit) in exar_pci_remove()
757 priv->board->exit(pcidev); in exar_pci_remove()
766 for (i = 0; i < priv->nr; i++) in exar_suspend()
767 if (priv->line[i] >= 0) in exar_suspend()
768 serial8250_suspend_port(priv->line[i]); in exar_suspend()
771 if (priv->board->exit) in exar_suspend()
772 priv->board->exit(pcidev); in exar_suspend()
784 for (i = 0; i < priv->nr; i++) in exar_resume()
785 if (priv->line[i] >= 0) in exar_resume()
786 serial8250_resume_port(priv->line[i]); in exar_resume()
909 /* USRobotics USR298x-OEM PCI Modems */