Skip to content

Commit

Permalink
Revert "serial: uartps: Register own uart console and driver structures"
Browse files Browse the repository at this point in the history
commit 18cc7ac upstream.

This reverts commit 024ca32.

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

Reported-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Cc: stable <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/1ee35667e36a8efddee381df5fe495ad65f4d15c.1585905873.git.michal.simek@xilinx.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Michal Simek authored and Greg Kroah-Hartman committed Apr 29, 2020
1 parent ec37770 commit 29772eb
Showing 1 changed file with 40 additions and 55 deletions.
95 changes: 40 additions & 55 deletions drivers/tty/serial/xilinx_uartps.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -1144,6 +1145,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
Expand Down Expand Up @@ -1283,6 +1286,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
Expand Down Expand Up @@ -1414,6 +1427,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
Expand All @@ -1427,11 +1443,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);
Expand All @@ -1441,12 +1452,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)
Expand All @@ -1457,50 +1462,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) {
Expand Down Expand Up @@ -1578,6 +1558,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.
Expand Down Expand Up @@ -1609,7 +1590,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);
Expand All @@ -1619,12 +1600,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:
Expand All @@ -1640,8 +1624,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;
}

Expand Down Expand Up @@ -1676,7 +1660,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;
}

Expand Down

0 comments on commit 29772eb

Please sign in to comment.