patch "Revert "serial: uartps: Register own uart console and driver" added to tty-linus
Subsystems (3)
This is a note to let you know that I've just added the patch titled
Revert "serial: uartps: Register own uart console and driver
to my tty git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git
in the tty-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From 18cc7ac8a28e28cd005c2475f52576cfe10cabfb Mon Sep 17 00:00:00 2001
From: Michal Simek <[email protected]>
Date: Fri, 3 Apr 2020 11:24:36 +0200
Subject: Revert "serial: uartps: Register own uart console and driver
structures"
This reverts commit 024ca329bfb9a948f76eaff3243e21b7e70182f2.
As Johan says, this driver needs a lot more work and these changes are only going in the wrong direction:
https://lkml.kernel.org/r/20190523091839.GC568@localhost
--- drivers/tty/serial/xilinx_uartps.c | 95 +++++++++++++----------------- 1 file changed, 40 insertions(+), 55 deletions(-)
drivers/tty/serial/xilinx_uartps.c +40 -55
@@ -27,6 +27,7 @@#define CDNS_UART_TTY_NAME "ttyPS"#define CDNS_UART_NAME "xuartps"#define CDNS_UART_MAJOR 0/* use dynamic node allocation */ +#define CDNS_UART_MINOR 0/* works best with devtmpfs */ #define CDNS_UART_NR_PORTS 16#define CDNS_UART_FIFO_SIZE 64/* FIFO size */ #define CDNS_UART_REGISTER_SPACE 0x1000
@@ -1132,6 +1133,8 @@ static const struct uart_ops cdns_uart_ops = {#endif }; +static struct uart_driver cdns_uart_uart_driver; +#ifdef CONFIG_SERIAL_XILINX_PS_UART_CONSOLE /** * cdns_uart_console_putchar - write the character to the FIFO buffer
@@ -1271,6 +1274,16 @@ static int cdns_uart_console_setup(struct console *co, char *options) return uart_set_options(port, co, baud, parity, bits, flow); } + +static struct console cdns_uart_console = { + .name =CDNS_UART_TTY_NAME , + .write = cdns_uart_console_write, + .device = uart_console_device, + .setup = cdns_uart_console_setup, + .flags =CON_PRINTBUFFER , + .index =-1 ,/* Specified on the cmdline (e.g. console=ttyPS ) */ + .data = &cdns_uart_uart_driver, +};#endif /* CONFIG_SERIAL_XILINX_PS_UART_CONSOLE */ #ifdef CONFIG_PM_SLEEP
@@ -1402,6 +1415,9 @@ static const struct of_device_id cdns_uart_of_match[] = { };MODULE_DEVICE_TABLE (of, cdns_uart_of_match); +/* Temporary variable for storing number of instances */ +static int instances; +/** * cdns_uart_probe - Platform driver probe * @pdev: Pointer to the platform device structure
@@ -1415,11 +1431,6 @@ static int cdns_uart_probe(struct platform_device *pdev)struct resource *res;struct cdns_uart *cdns_uart_data;const struct of_device_id *match; -struct uart_driver *cdns_uart_uart_driver; -char *driver_name; -#ifdef CONFIG_SERIAL_XILINX_PS_UART_CONSOLE -struct console *cdns_uart_console; -#endif cdns_uart_data =devm_kzalloc (&pdev->dev,sizeof (*cdns_uart_data),GFP_KERNEL );
@@ -1429,12 +1440,6 @@ static int cdns_uart_probe(struct platform_device *pdev)if (!port)return -ENOMEM ; - cdns_uart_uart_driver =devm_kzalloc (&pdev->dev, -sizeof (*cdns_uart_uart_driver), -GFP_KERNEL ); -if (!cdns_uart_uart_driver) -return -ENOMEM ; -/* Look for a serialN alias */ id =of_alias_get_id (pdev->dev.of_node,"serial" );if (id <0 )
@@ -1445,50 +1450,25 @@ static int cdns_uart_probe(struct platform_device *pdev)return -ENODEV ; } -/* There is a need to use unique driver name */ - driver_name =devm_kasprintf (&pdev->dev,GFP_KERNEL ,"%s%d" , -CDNS_UART_NAME , id); -if (!driver_name) -return -ENOMEM ; - - cdns_uart_uart_driver->owner =THIS_MODULE ; - cdns_uart_uart_driver->driver_name = driver_name; - cdns_uart_uart_driver->dev_name =CDNS_UART_TTY_NAME ; - cdns_uart_uart_driver->major =CDNS_UART_MAJOR ; - cdns_uart_uart_driver->minor = id; - cdns_uart_uart_driver->nr =1 ; - +if (!cdns_uart_uart_driver.state) { + cdns_uart_uart_driver.owner =THIS_MODULE ; + cdns_uart_uart_driver.driver_name =CDNS_UART_NAME ; + cdns_uart_uart_driver.dev_name =CDNS_UART_TTY_NAME ; + cdns_uart_uart_driver.major =CDNS_UART_MAJOR ; + cdns_uart_uart_driver.minor =CDNS_UART_MINOR ; + cdns_uart_uart_driver.nr =CDNS_UART_NR_PORTS ;#ifdef CONFIG_SERIAL_XILINX_PS_UART_CONSOLE - cdns_uart_console =devm_kzalloc (&pdev->dev,sizeof (*cdns_uart_console), -GFP_KERNEL ); -if (!cdns_uart_console) -return -ENOMEM ; - -strncpy (cdns_uart_console->name,CDNS_UART_TTY_NAME , -sizeof (cdns_uart_console->name)); - cdns_uart_console->index = id; - cdns_uart_console->write = cdns_uart_console_write; - cdns_uart_console->device = uart_console_device; - cdns_uart_console->setup = cdns_uart_console_setup; - cdns_uart_console->flags =CON_PRINTBUFFER ; - cdns_uart_console->data = cdns_uart_uart_driver; - cdns_uart_uart_driver->cons = cdns_uart_console; + cdns_uart_uart_driver.cons = &cdns_uart_console;#endif - rc =uart_register_driver (cdns_uart_uart_driver); -if (rc <0 ) { -dev_err (&pdev->dev,"Failed to register driver\n" ); -return rc; + rc =uart_register_driver (&cdns_uart_uart_driver); +if (rc <0 ) { +dev_err (&pdev->dev,"Failed to register driver\n" ); +return rc; + } } - cdns_uart_data->cdns_uart_driver = cdns_uart_uart_driver; - -/* -* Setting up proper name_base needs to be done after uart -* registration because tty_driver structure is not filled. -* name_base is 0 by default. -*/ - cdns_uart_uart_driver->tty_driver->name_base = id; + cdns_uart_data->cdns_uart_driver = &cdns_uart_uart_driver; match =of_match_node (cdns_uart_of_match, pdev->dev.of_node);if (match && match->data) {
@@ -1566,6 +1546,7 @@ static int cdns_uart_probe(struct platform_device *pdev) port->ops = &cdns_uart_ops; port->fifosize =CDNS_UART_FIFO_SIZE ; port->has_sysrq =IS_ENABLED (CONFIG_SERIAL_XILINX_PS_UART_CONSOLE ); + port->line = id;/* * Register the port.
@@ -1597,7 +1578,7 @@ static int cdns_uart_probe(struct platform_device *pdev) console_port = port;#endif - rc =uart_add_one_port (cdns_uart_uart_driver, port); + rc =uart_add_one_port (&cdns_uart_uart_driver, port);if (rc) {dev_err (&pdev->dev,"uart_add_one_port() failed; err=%i\n" , rc);
@@ -1607,12 +1588,15 @@ static int cdns_uart_probe(struct platform_device *pdev)#ifdef CONFIG_SERIAL_XILINX_PS_UART_CONSOLE /* This is not port which is used for console that's why clean it up */ if (console_port == port && - !(cdns_uart_uart_driver->cons->flags &CON_ENABLED )) + !(cdns_uart_uart_driver.cons->flags &CON_ENABLED )) console_port =NULL ;#endif cdns_uart_data->cts_override =of_property_read_bool (pdev->dev.of_node,"cts-override" ); + + instances++; +return 0 ; err_out_pm_disable:
@@ -1628,8 +1612,8 @@ static int cdns_uart_probe(struct platform_device *pdev) err_out_clk_dis_pclk:clk_disable_unprepare (cdns_uart_data->pclk); err_out_unregister_driver: -uart_unregister_driver (cdns_uart_data->cdns_uart_driver); - +if (!instances) +uart_unregister_driver (cdns_uart_data->cdns_uart_driver);return rc; }
@@ -1664,7 +1648,8 @@ static int cdns_uart_remove(struct platform_device *pdev) console_port =NULL ;#endif -uart_unregister_driver (cdns_uart_data->cdns_uart_driver); +if (!--instances) +uart_unregister_driver (cdns_uart_data->cdns_uart_driver);return rc; }
Signature · 1 line
2.26.1