Re: [PATCH RFC 07/10] tty: serial: Add Cortina Systems CS75xx UART driver

From: Greg Kroah-Hartman

Date: Wed Sep 30 2026 - 03:15:23 EST


On Wed, Sep 30, 2026 at 10:00:06AM +0300, Fil Dunsky via B4 Relay wrote:
> From: Fil Dunsky <filipp.dunsky@xxxxxxxxx>
>
> Add a driver for the UARTs of the Cortina Systems CS75xx (Goldengate G2)
> SoCs. The block has transmit and receive FIFOs with full/empty status,
> a 24-bit baud rate divider clocked from the peripheral (APB) clock, a
> receive sampling point register and one interrupt line per port with
> per-cause enable and write-one-to-clear status registers.
>
> The driver is a rewrite of the vendor driver shipped with the Linux
> 2.6.36 and 4.9 based vendor kernels, using the current serial core API
> (uart_port_tx(), port lock helpers, deferred sysrq handling) and devm
> resource management. It supports the system console and earlycon.
> Hardware flow control is not supported.
>
> The ports are named ttyCS so that the driver can coexist with the 8250
> driver in multiplatform kernels, and PORT_GENERIC is used rather than
> allocating a new port type.

But even if you build a multi-platform kernel, only one of the uarts is
going to be on the system, so why have a new name for it? Can't you
just use the "default" name instead? If you do that, what happens?


>
> Signed-off-by: Fil Dunsky <filipp.dunsky@xxxxxxxxx>
> ---
> drivers/tty/serial/Kconfig | 24 ++
> drivers/tty/serial/Makefile | 1 +
> drivers/tty/serial/cs75xx-uart.c | 546 +++++++++++++++++++++++++++++++++++++++
> 3 files changed, 571 insertions(+)
>
> diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
> index bf680d22199..c4239c42190 100644
> --- a/drivers/tty/serial/Kconfig
> +++ b/drivers/tty/serial/Kconfig
> @@ -1359,6 +1359,30 @@ config SERIAL_CONEXANT_DIGICOLOR_CONSOLE
> If you have enabled the USART serial port on Conexant Digicolor
> SoCs, you can make it the console by answering Y to this option.
>
> +config SERIAL_CS75XX
> + tristate "Cortina Systems CS75xx UART support"
> + depends on ARCH_CORTINA_CS75XX || COMPILE_TEST
> + depends on OF
> + select SERIAL_CORE
> + help
> + Support for the on-chip UARTs of the Cortina Systems CS75xx
> + (Goldengate G2) SoCs, such as the CS7542. The ports are named
> + ttyCS0 to ttyCS3.
> +
> + To compile this driver as a module, choose M here: the module
> + will be called cs75xx-uart.
> +
> +config SERIAL_CS75XX_CONSOLE
> + bool "Console on Cortina Systems CS75xx UART"
> + depends on SERIAL_CS75XX=y
> + select SERIAL_CORE_CONSOLE
> + select SERIAL_EARLYCON
> + help
> + Say Y here to use a Cortina Systems CS75xx UART as the system
> + console. This also enables the early console, which can be
> + selected with "earlycon" on the kernel command line when the
> + device tree chosen node has a stdout-path pointing at the UART.
> +
> config SERIAL_ST_ASC
> tristate "ST ASC serial port support"
> select SERIAL_CORE
> diff --git a/drivers/tty/serial/Makefile b/drivers/tty/serial/Makefile
> index bba7b21a4a1..81bb5e39aa2 100644
> --- a/drivers/tty/serial/Makefile
> +++ b/drivers/tty/serial/Makefile
> @@ -36,6 +36,7 @@ obj-$(CONFIG_SERIAL_BCM63XX) += bcm63xx_uart.o
> obj-$(CONFIG_SERIAL_CLPS711X) += clps711x.o
> obj-$(CONFIG_SERIAL_CPM) += cpm_uart.o
> obj-$(CONFIG_SERIAL_CONEXANT_DIGICOLOR) += digicolor-usart.o
> +obj-$(CONFIG_SERIAL_CS75XX) += cs75xx-uart.o
> obj-$(CONFIG_SERIAL_DZ) += dz.o
> obj-$(CONFIG_SERIAL_FSL_LINFLEXUART) += fsl_linflexuart.o
> obj-$(CONFIG_SERIAL_FSL_LPUART) += fsl_lpuart.o
> diff --git a/drivers/tty/serial/cs75xx-uart.c b/drivers/tty/serial/cs75xx-uart.c
> new file mode 100644
> index 00000000000..c15e2227b97
> --- /dev/null
> +++ b/drivers/tty/serial/cs75xx-uart.c
> @@ -0,0 +1,546 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * UART driver for the Cortina Systems CS75xx (Goldengate G2) SoCs
> + *
> + * Based on the Cortina Systems vendor driver.
> + */

No copyright info?

> +static void cs75xx_uart_set_mctrl(struct uart_port *port, unsigned int mctrl)
> +{
> +}

Why an empty function? Can't you just leave it out?

> +static void cs75xx_uart_break_ctl(struct uart_port *port, int break_state)
> +{
> +}

Same here.

> +static void cs75xx_uart_release_port(struct uart_port *port)
> +{
> +}

This feels wrong.

> +static int cs75xx_uart_request_port(struct uart_port *port)
> +{
> + return 0;
> +}

As does this.

thanks,

greg k-h