linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2
@ 2018-09-03 13:10 Michal Simek
  2018-09-03 13:10 ` [PATCH v3 01/10] serial: uartps: console_setup() can't be placed to init section Michal Simek
                   ` (10 more replies)
  0 siblings, 11 replies; 13+ messages in thread
From: Michal Simek @ 2018-09-03 13:10 UTC (permalink / raw)
  To: linux-kernel, monstr, gnomes, Alexander Graf, shubhraj, robh
  Cc: Jiri Slaby, linux-serial, Greg Kroah-Hartman, linux-arm-kernel

Hi,

this series is trying to address discussion I had with Alan in past
https://patchwork.kernel.org/patch/9738445/ and also with Rob in v1
https://lkml.org/lkml/2018/4/26/551.

These patches are doing preparation to enable dynamic ID port allocation
which is capable to create devices with higher IDs.

For example this is how it works.
uart0 on higher alias
serial0 = &uart1;
serial30 = &uart0;

~# ls -la /dev/ttyPS*
crw-------    1 root     root      252,   0 Jun  6 12:19 /dev/ttyPS0
crw--w----    1 root     root      253, 100 Jan  1  1970 /dev/ttyPS30

Thanks,
Michal

Changes in v3:
- New patch found by testing
- New patch - can be sent separately but there is dependency that's why
  sent in this series
- Fix uart_unregister_driver() in error path or when driver is removed.
- Change commit message
- s/,/;/ in filling structure
- get cdns_uart_uart_driver out of PS_UART_CONSOLE ifdefs
- New patch in series
- Rebase on the top of previous broken patch
- Change patch subject ("was serial: uartps: Remove CDNS_UART_NR_PORTS
  macro")
- Keep CDNS_UART_NR_PORTS in this patch and remove it in next one and
  align commit message to reflect this
- Allocate struct console dynamically too to be unique for every
  instance
- Cleanup error path
- New patch in series

Changes in v2:
- new patch - it can be sent separately too
- new patch - it can be sent separately too
- new patch - it can be sent separately too
- Remove nr field logic
- new patch - it can be sent separately too
- Register one uart_driver with unique minor at probe time

Michal Simek (9):
  serial: uartps: console_setup() can't be placed to init section
  serial: uartps: Do not initialize field to zero again
  serial: uartps: Do not use static struct uart_driver out of probe()
  serial: uartps: Move alias reading higher in probe()
  serial: uartps: Move register to probe based on run time detection
  serial: uartps: Fill struct uart_driver in probe()
  serial: uartps: Change logic how console_port is setup
  serial: uartps: Register own uart console and driver structures
  serial: uartps: Move Port ID to device data structure

Nava kishore Manne (1):
  serial: uartps: Fix suspend functionality

 drivers/tty/serial/xilinx_uartps.c | 203 +++++++++++++++++++------------------
 1 file changed, 107 insertions(+), 96 deletions(-)

-- 
1.9.1


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v3 01/10] serial: uartps: console_setup() can't be placed to init section
  2018-09-03 13:10 [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2 Michal Simek
@ 2018-09-03 13:10 ` Michal Simek
  2018-09-03 13:10 ` [PATCH v3 02/10] serial: uartps: Do not initialize field to zero again Michal Simek
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Michal Simek @ 2018-09-03 13:10 UTC (permalink / raw)
  To: linux-kernel, monstr, gnomes, Alexander Graf, shubhraj, robh
  Cc: Jiri Slaby, linux-serial, Greg Kroah-Hartman, linux-arm-kernel

When console device is rebinded, console_setup() is called again.
But marking it as __init means that function will be clear after boot is
complete. If console device is binded again console_setup() is not found
and error "Unable to handle kernel paging request at virtual address"
is reported.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

Changes in v3:
- New patch found by testing

Changes in v2: None

 drivers/tty/serial/xilinx_uartps.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index e5d90611c03f..dd905c981f67 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -1216,7 +1216,7 @@ static void cdns_uart_console_write(struct console *co, const char *s,
  *
  * Return: 0 on success, negative errno otherwise.
  */
-static int __init cdns_uart_console_setup(struct console *co, char *options)
+static int cdns_uart_console_setup(struct console *co, char *options)
 {
 	struct uart_port *port = console_port;
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 02/10] serial: uartps: Do not initialize field to zero again
  2018-09-03 13:10 [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2 Michal Simek
  2018-09-03 13:10 ` [PATCH v3 01/10] serial: uartps: console_setup() can't be placed to init section Michal Simek
@ 2018-09-03 13:10 ` Michal Simek
  2018-09-03 13:10 ` [PATCH v3 03/10] serial: uartps: Fix suspend functionality Michal Simek
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Michal Simek @ 2018-09-03 13:10 UTC (permalink / raw)
  To: linux-kernel, monstr, gnomes, Alexander Graf, shubhraj, robh
  Cc: Jiri Slaby, linux-serial, Greg Kroah-Hartman, linux-arm-kernel

Writing zero and NULLs to already initialized fields is not needed.
Remove this additional writes.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

Changes in v3: None
Changes in v2:
- new patch - it can be sent separately too

 drivers/tty/serial/xilinx_uartps.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index dd905c981f67..9a08542cec47 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -1502,15 +1502,12 @@ static int cdns_uart_probe(struct platform_device *pdev)
 
 	/* At this point, we've got an empty uart_port struct, initialize it */
 	spin_lock_init(&port->lock);
-	port->membase	= NULL;
-	port->irq	= 0;
 	port->type	= PORT_UNKNOWN;
 	port->iotype	= UPIO_MEM32;
 	port->flags	= UPF_BOOT_AUTOCONF;
 	port->ops	= &cdns_uart_ops;
 	port->fifosize	= CDNS_UART_FIFO_SIZE;
 	port->line	= id;
-	port->dev	= NULL;
 
 	/*
 	 * Register the port.
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 03/10] serial: uartps: Fix suspend functionality
  2018-09-03 13:10 [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2 Michal Simek
  2018-09-03 13:10 ` [PATCH v3 01/10] serial: uartps: console_setup() can't be placed to init section Michal Simek
  2018-09-03 13:10 ` [PATCH v3 02/10] serial: uartps: Do not initialize field to zero again Michal Simek
@ 2018-09-03 13:10 ` Michal Simek
  2018-09-03 13:10 ` [PATCH v3 04/10] serial: uartps: Do not use static struct uart_driver out of probe() Michal Simek
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Michal Simek @ 2018-09-03 13:10 UTC (permalink / raw)
  To: linux-kernel, monstr, gnomes, Alexander Graf, shubhraj, robh
  Cc: Nava kishore Manne, Jiri Slaby, linux-serial, Greg Kroah-Hartman,
	linux-arm-kernel

From: Nava kishore Manne <nava.manne@xilinx.com>

The driver's suspend/resume functions were buggy.
If UART node contains any child node in the DT and
the child is established a communication path with
the parent UART. The relevant /dev/ttyPS* node will
be not available for other operations.
If the driver is trying to do any operations like
suspend/resume without checking the tty->dev status
it leads to the kernel crash/hang.

This patch fix this issue by call the device_may_wake()
with the generic parameter of type struct device.
in the uart suspend and resume paths.

It also fixes a race condition in the uart suspend
path(i.e uart_suspend_port() should be called at the
end of cdns_uart_suspend API this path updates the same)

Signed-off-by: Nava kishore Manne <navam@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

Changes in v3:
- New patch - can be sent separately but there is dependency that's why
  sent in this series

Changes in v2: None

 drivers/tty/serial/xilinx_uartps.c | 41 +++++++++++---------------------------
 1 file changed, 12 insertions(+), 29 deletions(-)

diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index 9a08542cec47..fc0ecaf3615d 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -1272,24 +1272,11 @@ static int cdns_uart_console_setup(struct console *co, char *options)
 static int cdns_uart_suspend(struct device *device)
 {
 	struct uart_port *port = dev_get_drvdata(device);
-	struct tty_struct *tty;
-	struct device *tty_dev;
-	int may_wake = 0;
-
-	/* Get the tty which could be NULL so don't assume it's valid */
-	tty = tty_port_tty_get(&port->state->port);
-	if (tty) {
-		tty_dev = tty->dev;
-		may_wake = device_may_wakeup(tty_dev);
-		tty_kref_put(tty);
-	}
+	int may_wake;
 
-	/*
-	 * Call the API provided in serial_core.c file which handles
-	 * the suspend.
-	 */
-	uart_suspend_port(&cdns_uart_uart_driver, port);
-	if (!(console_suspend_enabled && !may_wake)) {
+	may_wake = device_may_wakeup(device);
+
+	if (console_suspend_enabled && may_wake) {
 		unsigned long flags = 0;
 
 		spin_lock_irqsave(&port->lock, flags);
@@ -1304,7 +1291,11 @@ static int cdns_uart_suspend(struct device *device)
 		spin_unlock_irqrestore(&port->lock, flags);
 	}
 
-	return 0;
+	/*
+	 * Call the API provided in serial_core.c file which handles
+	 * the suspend.
+	 */
+	return uart_suspend_port(&cdns_uart_uart_driver, port);
 }
 
 /**
@@ -1318,17 +1309,9 @@ static int cdns_uart_resume(struct device *device)
 	struct uart_port *port = dev_get_drvdata(device);
 	unsigned long flags = 0;
 	u32 ctrl_reg;
-	struct tty_struct *tty;
-	struct device *tty_dev;
-	int may_wake = 0;
-
-	/* Get the tty which could be NULL so don't assume it's valid */
-	tty = tty_port_tty_get(&port->state->port);
-	if (tty) {
-		tty_dev = tty->dev;
-		may_wake = device_may_wakeup(tty_dev);
-		tty_kref_put(tty);
-	}
+	int may_wake;
+
+	may_wake = device_may_wakeup(device);
 
 	if (console_suspend_enabled && !may_wake) {
 		struct cdns_uart *cdns_uart = port->private_data;
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 04/10] serial: uartps: Do not use static struct uart_driver out of probe()
  2018-09-03 13:10 [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2 Michal Simek
                   ` (2 preceding siblings ...)
  2018-09-03 13:10 ` [PATCH v3 03/10] serial: uartps: Fix suspend functionality Michal Simek
@ 2018-09-03 13:10 ` Michal Simek
  2018-09-03 13:10 ` [PATCH v3 05/10] serial: uartps: Move alias reading higher in probe() Michal Simek
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Michal Simek @ 2018-09-03 13:10 UTC (permalink / raw)
  To: linux-kernel, monstr, gnomes, Alexander Graf, shubhraj, robh
  Cc: Jiri Slaby, linux-serial, Greg Kroah-Hartman, linux-arm-kernel

cdns_uart_suspend()/resume() and remove() are using static reference
to struct uart_driver. Assign this reference to private data structure
as preparation step for dynamic struct uart_driver allocation.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

Changes in v3: None
Changes in v2:
- new patch - it can be sent separately too

 drivers/tty/serial/xilinx_uartps.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index fc0ecaf3615d..5bd2b0607df6 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -180,6 +180,7 @@
  * @port:		Pointer to the UART port
  * @uartclk:		Reference clock
  * @pclk:		APB clock
+ * @cdns_uart_driver:	Pointer to UART driver
  * @baud:		Current baud rate
  * @clk_rate_change_nb:	Notifier block for clock changes
  * @quirks:		Flags for RXBS support.
@@ -188,6 +189,7 @@ struct cdns_uart {
 	struct uart_port	*port;
 	struct clk		*uartclk;
 	struct clk		*pclk;
+	struct uart_driver	*cdns_uart_driver;
 	unsigned int		baud;
 	struct notifier_block	clk_rate_change_nb;
 	u32			quirks;
@@ -1272,6 +1274,7 @@ static int cdns_uart_console_setup(struct console *co, char *options)
 static int cdns_uart_suspend(struct device *device)
 {
 	struct uart_port *port = dev_get_drvdata(device);
+	struct cdns_uart *cdns_uart = port->private_data;
 	int may_wake;
 
 	may_wake = device_may_wakeup(device);
@@ -1295,7 +1298,7 @@ static int cdns_uart_suspend(struct device *device)
 	 * Call the API provided in serial_core.c file which handles
 	 * the suspend.
 	 */
-	return uart_suspend_port(&cdns_uart_uart_driver, port);
+	return uart_suspend_port(cdns_uart->cdns_uart_driver, port);
 }
 
 /**
@@ -1307,6 +1310,7 @@ static int cdns_uart_suspend(struct device *device)
 static int cdns_uart_resume(struct device *device)
 {
 	struct uart_port *port = dev_get_drvdata(device);
+	struct cdns_uart *cdns_uart = port->private_data;
 	unsigned long flags = 0;
 	u32 ctrl_reg;
 	int may_wake;
@@ -1314,8 +1318,6 @@ static int cdns_uart_resume(struct device *device)
 	may_wake = device_may_wakeup(device);
 
 	if (console_suspend_enabled && !may_wake) {
-		struct cdns_uart *cdns_uart = port->private_data;
-
 		clk_enable(cdns_uart->pclk);
 		clk_enable(cdns_uart->uartclk);
 
@@ -1349,7 +1351,7 @@ static int cdns_uart_resume(struct device *device)
 		spin_unlock_irqrestore(&port->lock, flags);
 	}
 
-	return uart_resume_port(&cdns_uart_uart_driver, port);
+	return uart_resume_port(cdns_uart->cdns_uart_driver, port);
 }
 #endif /* ! CONFIG_PM_SLEEP */
 static int __maybe_unused cdns_runtime_suspend(struct device *dev)
@@ -1413,6 +1415,8 @@ static int cdns_uart_probe(struct platform_device *pdev)
 	if (!port)
 		return -ENOMEM;
 
+	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) {
 		const struct cdns_platform_data *data = match->data;
@@ -1570,7 +1574,7 @@ static int cdns_uart_remove(struct platform_device *pdev)
 	clk_notifier_unregister(cdns_uart_data->uartclk,
 			&cdns_uart_data->clk_rate_change_nb);
 #endif
-	rc = uart_remove_one_port(&cdns_uart_uart_driver, port);
+	rc = uart_remove_one_port(cdns_uart_data->cdns_uart_driver, port);
 	port->mapbase = 0;
 	clk_disable_unprepare(cdns_uart_data->uartclk);
 	clk_disable_unprepare(cdns_uart_data->pclk);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 05/10] serial: uartps: Move alias reading higher in probe()
  2018-09-03 13:10 [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2 Michal Simek
                   ` (3 preceding siblings ...)
  2018-09-03 13:10 ` [PATCH v3 04/10] serial: uartps: Do not use static struct uart_driver out of probe() Michal Simek
@ 2018-09-03 13:10 ` Michal Simek
  2018-09-03 13:10 ` [PATCH v3 06/10] serial: uartps: Move register to probe based on run time detection Michal Simek
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Michal Simek @ 2018-09-03 13:10 UTC (permalink / raw)
  To: linux-kernel, monstr, gnomes, Alexander Graf, shubhraj, robh
  Cc: Jiri Slaby, linux-serial, Greg Kroah-Hartman, linux-arm-kernel

This cosmetic change is done only for having next patch much easier to
read. Moving id setup higher in probe is not affecting any usage of this
driver and it also simplify error path.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

Changes in v3: None
Changes in v2:
- new patch - it can be sent separately too

 drivers/tty/serial/xilinx_uartps.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index 5bd2b0607df6..a3e97ccb376d 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -1415,6 +1415,16 @@ static int cdns_uart_probe(struct platform_device *pdev)
 	if (!port)
 		return -ENOMEM;
 
+	/* Look for a serialN alias */
+	id = of_alias_get_id(pdev->dev.of_node, "serial");
+	if (id < 0)
+		id = 0;
+
+	if (id >= CDNS_UART_NR_PORTS) {
+		dev_err(&pdev->dev, "Cannot get uart_port structure\n");
+		return -ENODEV;
+	}
+
 	cdns_uart_data->cdns_uart_driver = &cdns_uart_uart_driver;
 
 	match = of_match_node(cdns_uart_of_match, pdev->dev.of_node);
@@ -1476,16 +1486,6 @@ static int cdns_uart_probe(struct platform_device *pdev)
 				&cdns_uart_data->clk_rate_change_nb))
 		dev_warn(&pdev->dev, "Unable to register clock notifier.\n");
 #endif
-	/* Look for a serialN alias */
-	id = of_alias_get_id(pdev->dev.of_node, "serial");
-	if (id < 0)
-		id = 0;
-
-	if (id >= CDNS_UART_NR_PORTS) {
-		dev_err(&pdev->dev, "Cannot get uart_port structure\n");
-		rc = -ENODEV;
-		goto err_out_notif_unreg;
-	}
 
 	/* At this point, we've got an empty uart_port struct, initialize it */
 	spin_lock_init(&port->lock);
@@ -1544,7 +1544,6 @@ static int cdns_uart_probe(struct platform_device *pdev)
 	pm_runtime_disable(&pdev->dev);
 	pm_runtime_set_suspended(&pdev->dev);
 	pm_runtime_dont_use_autosuspend(&pdev->dev);
-err_out_notif_unreg:
 #ifdef CONFIG_COMMON_CLK
 	clk_notifier_unregister(cdns_uart_data->uartclk,
 			&cdns_uart_data->clk_rate_change_nb);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 06/10] serial: uartps: Move register to probe based on run time detection
  2018-09-03 13:10 [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2 Michal Simek
                   ` (4 preceding siblings ...)
  2018-09-03 13:10 ` [PATCH v3 05/10] serial: uartps: Move alias reading higher in probe() Michal Simek
@ 2018-09-03 13:10 ` Michal Simek
  2018-09-03 13:10 ` [PATCH v3 07/10] serial: uartps: Fill struct uart_driver in probe() Michal Simek
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Michal Simek @ 2018-09-03 13:10 UTC (permalink / raw)
  To: linux-kernel, monstr, gnomes, Alexander Graf, shubhraj, robh
  Cc: Jiri Slaby, linux-serial, Greg Kroah-Hartman, linux-arm-kernel

Register uart driver in probe to be able to register one device with
unique major/minor separately. Also calculate number of instances of
this driver to be able to call uart_unregister_driver() when there is no
instance.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

Changes in v3:
- Fix uart_unregister_driver() in error path or when driver is removed.
- Change commit message

Changes in v2:
- Remove nr field logic

Discussed here: https://patchwork.kernel.org/patch/9738445/

The same solution is done in pl011 driver.

---
 drivers/tty/serial/xilinx_uartps.c | 42 +++++++++++++++++++++-----------------
 1 file changed, 23 insertions(+), 19 deletions(-)

diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index a3e97ccb376d..54735a7f9960 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -1393,6 +1393,9 @@ static int __maybe_unused cdns_runtime_resume(struct device *dev)
 };
 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
@@ -1425,6 +1428,14 @@ static int cdns_uart_probe(struct platform_device *pdev)
 		return -ENODEV;
 	}
 
+	if (!cdns_uart_uart_driver.state) {
+		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;
 
 	match = of_match_node(cdns_uart_of_match, pdev->dev.of_node);
@@ -1442,7 +1453,8 @@ static int cdns_uart_probe(struct platform_device *pdev)
 	}
 	if (IS_ERR(cdns_uart_data->pclk)) {
 		dev_err(&pdev->dev, "pclk clock not found.\n");
-		return PTR_ERR(cdns_uart_data->pclk);
+		rc = PTR_ERR(cdns_uart_data->pclk);
+		goto err_out_unregister_driver;
 	}
 
 	cdns_uart_data->uartclk = devm_clk_get(&pdev->dev, "uart_clk");
@@ -1453,13 +1465,14 @@ static int cdns_uart_probe(struct platform_device *pdev)
 	}
 	if (IS_ERR(cdns_uart_data->uartclk)) {
 		dev_err(&pdev->dev, "uart_clk clock not found.\n");
-		return PTR_ERR(cdns_uart_data->uartclk);
+		rc = PTR_ERR(cdns_uart_data->uartclk);
+		goto err_out_unregister_driver;
 	}
 
 	rc = clk_prepare_enable(cdns_uart_data->pclk);
 	if (rc) {
 		dev_err(&pdev->dev, "Unable to enable pclk clock.\n");
-		return rc;
+		goto err_out_unregister_driver;
 	}
 	rc = clk_prepare_enable(cdns_uart_data->uartclk);
 	if (rc) {
@@ -1538,6 +1551,7 @@ static int cdns_uart_probe(struct platform_device *pdev)
 		console_port = NULL;
 #endif
 
+	instances++;
 	return 0;
 
 err_out_pm_disable:
@@ -1552,7 +1566,9 @@ static int cdns_uart_probe(struct platform_device *pdev)
 	clk_disable_unprepare(cdns_uart_data->uartclk);
 err_out_clk_dis_pclk:
 	clk_disable_unprepare(cdns_uart_data->pclk);
-
+err_out_unregister_driver:
+	if (!instances)
+		uart_unregister_driver(cdns_uart_data->cdns_uart_driver);
 	return rc;
 }
 
@@ -1580,6 +1596,8 @@ static int cdns_uart_remove(struct platform_device *pdev)
 	pm_runtime_disable(&pdev->dev);
 	pm_runtime_set_suspended(&pdev->dev);
 	pm_runtime_dont_use_autosuspend(&pdev->dev);
+	if (!--instances)
+		uart_unregister_driver(cdns_uart_data->cdns_uart_driver);
 	return rc;
 }
 
@@ -1595,28 +1613,14 @@ static int cdns_uart_remove(struct platform_device *pdev)
 
 static int __init cdns_uart_init(void)
 {
-	int retval = 0;
-
-	/* Register the cdns_uart driver with the serial core */
-	retval = uart_register_driver(&cdns_uart_uart_driver);
-	if (retval)
-		return retval;
-
 	/* Register the platform driver */
-	retval = platform_driver_register(&cdns_uart_platform_driver);
-	if (retval)
-		uart_unregister_driver(&cdns_uart_uart_driver);
-
-	return retval;
+	return platform_driver_register(&cdns_uart_platform_driver);
 }
 
 static void __exit cdns_uart_exit(void)
 {
 	/* Unregister the platform driver */
 	platform_driver_unregister(&cdns_uart_platform_driver);
-
-	/* Unregister the cdns_uart driver */
-	uart_unregister_driver(&cdns_uart_uart_driver);
 }
 
 arch_initcall(cdns_uart_init);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 07/10] serial: uartps: Fill struct uart_driver in probe()
  2018-09-03 13:10 [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2 Michal Simek
                   ` (5 preceding siblings ...)
  2018-09-03 13:10 ` [PATCH v3 06/10] serial: uartps: Move register to probe based on run time detection Michal Simek
@ 2018-09-03 13:10 ` Michal Simek
  2018-09-03 13:10 ` [PATCH v3 08/10] serial: uartps: Change logic how console_port is setup Michal Simek
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Michal Simek @ 2018-09-03 13:10 UTC (permalink / raw)
  To: linux-kernel, monstr, gnomes, Alexander Graf, shubhraj, robh
  Cc: Jiri Slaby, linux-serial, Greg Kroah-Hartman, linux-arm-kernel

This is preparation step for dynamic port allocation without
CDNS_UART_NR_PORTS macro. Fill the structure only once at probe.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

Changes in v3:
- s/,/;/ in filling structure
- get cdns_uart_uart_driver out of PS_UART_CONSOLE ifdefs

Changes in v2:
- new patch - it can be sent separately too

 drivers/tty/serial/xilinx_uartps.c | 26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index 54735a7f9960..61087233f411 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -1099,6 +1099,8 @@ static void cdns_uart_pm(struct uart_port *port, unsigned int state,
 #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
@@ -1239,8 +1241,6 @@ static int cdns_uart_console_setup(struct console *co, char *options)
 	return uart_set_options(port, co, baud, parity, bits, flow);
 }
 
-static struct uart_driver cdns_uart_uart_driver;
-
 static struct console cdns_uart_console = {
 	.name	= CDNS_UART_TTY_NAME,
 	.write	= cdns_uart_console_write,
@@ -1252,18 +1252,6 @@ static int cdns_uart_console_setup(struct console *co, char *options)
 };
 #endif /* CONFIG_SERIAL_XILINX_PS_UART_CONSOLE */
 
-static struct uart_driver cdns_uart_uart_driver = {
-	.owner		= THIS_MODULE,
-	.driver_name	= CDNS_UART_NAME,
-	.dev_name	= CDNS_UART_TTY_NAME,
-	.major		= CDNS_UART_MAJOR,
-	.minor		= CDNS_UART_MINOR,
-	.nr		= CDNS_UART_NR_PORTS,
-#ifdef CONFIG_SERIAL_XILINX_PS_UART_CONSOLE
-	.cons		= &cdns_uart_console,
-#endif
-};
-
 #ifdef CONFIG_PM_SLEEP
 /**
  * cdns_uart_suspend - suspend event
@@ -1429,6 +1417,16 @@ static int cdns_uart_probe(struct platform_device *pdev)
 	}
 
 	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_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");
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 08/10] serial: uartps: Change logic how console_port is setup
  2018-09-03 13:10 [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2 Michal Simek
                   ` (6 preceding siblings ...)
  2018-09-03 13:10 ` [PATCH v3 07/10] serial: uartps: Fill struct uart_driver in probe() Michal Simek
@ 2018-09-03 13:10 ` Michal Simek
  2018-09-03 13:10 ` [PATCH v3 09/10] serial: uartps: Register own uart console and driver structures Michal Simek
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Michal Simek @ 2018-09-03 13:10 UTC (permalink / raw)
  To: linux-kernel, monstr, gnomes, Alexander Graf, shubhraj, robh
  Cc: Jiri Slaby, linux-serial, Greg Kroah-Hartman, linux-arm-kernel

Change logic how console_port is setup by using CON_ENABLED flag
instead of index. There will be unique cdns_uart_console() structures
that's why code can't use id for console_port assignment.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

Changes in v3:
- New patch in series

Changes in v2: None

 drivers/tty/serial/xilinx_uartps.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index 61087233f411..0e578c0a8ce0 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -1532,7 +1532,7 @@ static int cdns_uart_probe(struct platform_device *pdev)
 	 * If register_console() don't assign value, then console_port pointer
 	 * is cleanup.
 	 */
-	if (cdns_uart_uart_driver.cons->index == -1)
+	if (!console_port)
 		console_port = port;
 #endif
 
@@ -1545,7 +1545,8 @@ 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 (cdns_uart_uart_driver.cons->index == -1)
+	if (console_port == port &&
+	    !(cdns_uart_uart_driver.cons->flags & CON_ENABLED))
 		console_port = NULL;
 #endif
 
@@ -1594,6 +1595,12 @@ static int cdns_uart_remove(struct platform_device *pdev)
 	pm_runtime_disable(&pdev->dev);
 	pm_runtime_set_suspended(&pdev->dev);
 	pm_runtime_dont_use_autosuspend(&pdev->dev);
+
+#ifdef CONFIG_SERIAL_XILINX_PS_UART_CONSOLE
+	if (console_port == port)
+		console_port = NULL;
+#endif
+
 	if (!--instances)
 		uart_unregister_driver(cdns_uart_data->cdns_uart_driver);
 	return rc;
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 09/10] serial: uartps: Register own uart console and driver structures
  2018-09-03 13:10 [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2 Michal Simek
                   ` (7 preceding siblings ...)
  2018-09-03 13:10 ` [PATCH v3 08/10] serial: uartps: Change logic how console_port is setup Michal Simek
@ 2018-09-03 13:10 ` Michal Simek
  2018-09-03 13:10 ` [PATCH v3 10/10] serial: uartps: Move Port ID to device data structure Michal Simek
  2018-09-18 11:54 ` [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2 Michal Simek
  10 siblings, 0 replies; 13+ messages in thread
From: Michal Simek @ 2018-09-03 13:10 UTC (permalink / raw)
  To: linux-kernel, monstr, gnomes, Alexander Graf, shubhraj, robh
  Cc: Jiri Slaby, linux-serial, Greg Kroah-Hartman, linux-arm-kernel

Every instance is registering own struct console and struct uart_driver
with minor number which corresponds to alias ID (or 0 now) and with 1 uart
port. The same alias ID is saved to tty_driver->name_base which is key
field for creating ttyPSX name.

Because name_base and minor number are setup already there is no need to
setup any port->line number because 0 is the right value.

Unfortunately this driver is setting up major number to 0 for using
dynamic assignment and kernel is allocating different major numbers for
every instance instead of using the same major and different minor
number.

~# ls -la /dev/ttyPS*
crw-------    1 root     root      252,   0 Jan  1 03:36 /dev/ttyPS0
crw--w----    1 root     root      253,   1 Jan  1 00:00 /dev/ttyPS1

When major number is not 0. For example 252 then major/minor
combinations are in expected form

~# ls -la /dev/ttyPS*
crw-------    1 root     root      252,   0 Jan  1 04:04 /dev/ttyPS0
crw--w----    1 root     root      252,   1 Jan  1 00:00 /dev/ttyPS1

Driver is not freeing struct cdns_uart_console in case that instance is
not used as console. The reason is that console is incorrectly unregistred
and "console [0] disabled" message will be shown.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

Changes in v3:
- Rebase on the top of previous broken patch
- Change patch subject ("was serial: uartps: Remove CDNS_UART_NR_PORTS
  macro")
- Keep CDNS_UART_NR_PORTS in this patch and remove it in next one and
  align commit message to reflect this
- Allocate struct console dynamically too to be unique for every
  instance
- Cleanup error path

Changes in v2:
- Register one uart_driver with unique minor at probe time

---
 drivers/tty/serial/xilinx_uartps.c | 93 ++++++++++++++++++++++----------------
 1 file changed, 55 insertions(+), 38 deletions(-)

diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index 0e578c0a8ce0..d838612eda6f 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -30,7 +30,6 @@
 #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	2
 #define CDNS_UART_FIFO_SIZE	64	/* FIFO size */
 #define CDNS_UART_REGISTER_SPACE	0x1000
@@ -1099,8 +1098,6 @@ static void cdns_uart_pm(struct uart_port *port, unsigned int state,
 #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
@@ -1240,16 +1237,6 @@ 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
@@ -1381,9 +1368,6 @@ static int __maybe_unused cdns_runtime_resume(struct device *dev)
 };
 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
@@ -1397,6 +1381,11 @@ 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);
@@ -1406,6 +1395,12 @@ 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)
@@ -1416,25 +1411,50 @@ static int cdns_uart_probe(struct platform_device *pdev)
 		return -ENODEV;
 	}
 
-	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;
+	/* 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;
+
 #ifdef CONFIG_SERIAL_XILINX_PS_UART_CONSOLE
-		cdns_uart_uart_driver.cons = &cdns_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;
 #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;
+	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;
 
 	match = of_match_node(cdns_uart_of_match, pdev->dev.of_node);
 	if (match && match->data) {
@@ -1505,7 +1525,6 @@ static int cdns_uart_probe(struct platform_device *pdev)
 	port->flags	= UPF_BOOT_AUTOCONF;
 	port->ops	= &cdns_uart_ops;
 	port->fifosize	= CDNS_UART_FIFO_SIZE;
-	port->line	= id;
 
 	/*
 	 * Register the port.
@@ -1536,7 +1555,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);
@@ -1546,11 +1565,10 @@ 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
 
-	instances++;
 	return 0;
 
 err_out_pm_disable:
@@ -1566,8 +1584,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:
-	if (!instances)
-		uart_unregister_driver(cdns_uart_data->cdns_uart_driver);
+	uart_unregister_driver(cdns_uart_data->cdns_uart_driver);
+
 	return rc;
 }
 
@@ -1601,8 +1619,7 @@ static int cdns_uart_remove(struct platform_device *pdev)
 		console_port = NULL;
 #endif
 
-	if (!--instances)
-		uart_unregister_driver(cdns_uart_data->cdns_uart_driver);
+	uart_unregister_driver(cdns_uart_data->cdns_uart_driver);
 	return rc;
 }
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 10/10] serial: uartps: Move Port ID to device data structure
  2018-09-03 13:10 [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2 Michal Simek
                   ` (8 preceding siblings ...)
  2018-09-03 13:10 ` [PATCH v3 09/10] serial: uartps: Register own uart console and driver structures Michal Simek
@ 2018-09-03 13:10 ` Michal Simek
  2018-09-18 11:54 ` [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2 Michal Simek
  10 siblings, 0 replies; 13+ messages in thread
From: Michal Simek @ 2018-09-03 13:10 UTC (permalink / raw)
  To: linux-kernel, monstr, gnomes, Alexander Graf, shubhraj, robh
  Cc: Jiri Slaby, linux-serial, Greg Kroah-Hartman, linux-arm-kernel

Record port ID in device data structure to be have it connected to
certain instance.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

Changes in v3:
- New patch in series

Changes in v2: None

 drivers/tty/serial/xilinx_uartps.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index d838612eda6f..71c032744dae 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -181,6 +181,7 @@
  * @pclk:		APB clock
  * @cdns_uart_driver:	Pointer to UART driver
  * @baud:		Current baud rate
+ * @id:			Port ID
  * @clk_rate_change_nb:	Notifier block for clock changes
  * @quirks:		Flags for RXBS support.
  */
@@ -190,6 +191,7 @@ struct cdns_uart {
 	struct clk		*pclk;
 	struct uart_driver	*cdns_uart_driver;
 	unsigned int		baud;
+	int			id;
 	struct notifier_block	clk_rate_change_nb;
 	u32			quirks;
 };
@@ -1376,7 +1378,7 @@ static int __maybe_unused cdns_runtime_resume(struct device *dev)
  */
 static int cdns_uart_probe(struct platform_device *pdev)
 {
-	int rc, id, irq;
+	int rc, irq;
 	struct uart_port *port;
 	struct resource *res;
 	struct cdns_uart *cdns_uart_data;
@@ -1402,18 +1404,18 @@ static int cdns_uart_probe(struct platform_device *pdev)
 		return -ENOMEM;
 
 	/* Look for a serialN alias */
-	id = of_alias_get_id(pdev->dev.of_node, "serial");
-	if (id < 0)
-		id = 0;
+	cdns_uart_data->id = of_alias_get_id(pdev->dev.of_node, "serial");
+	if (cdns_uart_data->id < 0)
+		cdns_uart_data->id = 0;
 
-	if (id >= CDNS_UART_NR_PORTS) {
+	if (cdns_uart_data->id >= CDNS_UART_NR_PORTS) {
 		dev_err(&pdev->dev, "Cannot get uart_port structure\n");
 		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);
+				     CDNS_UART_NAME, cdns_uart_data->id);
 	if (!driver_name)
 		return -ENOMEM;
 
@@ -1421,7 +1423,7 @@ static int cdns_uart_probe(struct platform_device *pdev)
 	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->minor = cdns_uart_data->id;
 	cdns_uart_uart_driver->nr = 1;
 
 #ifdef CONFIG_SERIAL_XILINX_PS_UART_CONSOLE
@@ -1432,7 +1434,7 @@ static int cdns_uart_probe(struct platform_device *pdev)
 
 	strncpy(cdns_uart_console->name, CDNS_UART_TTY_NAME,
 		sizeof(cdns_uart_console->name));
-	cdns_uart_console->index = id;
+	cdns_uart_console->index = cdns_uart_data->id;
 	cdns_uart_console->write = cdns_uart_console_write;
 	cdns_uart_console->device = uart_console_device;
 	cdns_uart_console->setup = cdns_uart_console_setup;
@@ -1454,7 +1456,7 @@ static int cdns_uart_probe(struct platform_device *pdev)
 	 * 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_uart_driver->tty_driver->name_base = cdns_uart_data->id;
 
 	match = of_match_node(cdns_uart_of_match, pdev->dev.of_node);
 	if (match && match->data) {
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2
  2018-09-03 13:10 [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2 Michal Simek
                   ` (9 preceding siblings ...)
  2018-09-03 13:10 ` [PATCH v3 10/10] serial: uartps: Move Port ID to device data structure Michal Simek
@ 2018-09-18 11:54 ` Michal Simek
  2018-09-18 12:01   ` Greg Kroah-Hartman
  10 siblings, 1 reply; 13+ messages in thread
From: Michal Simek @ 2018-09-18 11:54 UTC (permalink / raw)
  To: Michal Simek, linux-kernel, gnomes, Alexander Graf, shubhraj,
	robh, Greg Kroah-Hartman
  Cc: Jiri Slaby, linux-serial, linux-arm-kernel

Hi Greg,

On 3.9.2018 15:10, Michal Simek wrote:
> Hi,
> 
> this series is trying to address discussion I had with Alan in past
> https://patchwork.kernel.org/patch/9738445/ and also with Rob in v1
> https://lkml.org/lkml/2018/4/26/551.
> 
> These patches are doing preparation to enable dynamic ID port allocation
> which is capable to create devices with higher IDs.
> 
> For example this is how it works.
> uart0 on higher alias
> serial0 = &uart1;
> serial30 = &uart0;
> 
> ~# ls -la /dev/ttyPS*
> crw-------    1 root     root      252,   0 Jun  6 12:19 /dev/ttyPS0
> crw--w----    1 root     root      253, 100 Jan  1  1970 /dev/ttyPS30
> 
> Thanks,
> Michal
> 
> Changes in v3:
> - New patch found by testing
> - New patch - can be sent separately but there is dependency that's why
>   sent in this series
> - Fix uart_unregister_driver() in error path or when driver is removed.
> - Change commit message
> - s/,/;/ in filling structure
> - get cdns_uart_uart_driver out of PS_UART_CONSOLE ifdefs
> - New patch in series
> - Rebase on the top of previous broken patch
> - Change patch subject ("was serial: uartps: Remove CDNS_UART_NR_PORTS
>   macro")
> - Keep CDNS_UART_NR_PORTS in this patch and remove it in next one and
>   align commit message to reflect this
> - Allocate struct console dynamically too to be unique for every
>   instance
> - Cleanup error path
> - New patch in series
> 
> Changes in v2:
> - new patch - it can be sent separately too
> - new patch - it can be sent separately too
> - new patch - it can be sent separately too
> - Remove nr field logic
> - new patch - it can be sent separately too
> - Register one uart_driver with unique minor at probe time
> 
> Michal Simek (9):
>   serial: uartps: console_setup() can't be placed to init section
>   serial: uartps: Do not initialize field to zero again
>   serial: uartps: Do not use static struct uart_driver out of probe()
>   serial: uartps: Move alias reading higher in probe()
>   serial: uartps: Move register to probe based on run time detection
>   serial: uartps: Fill struct uart_driver in probe()
>   serial: uartps: Change logic how console_port is setup
>   serial: uartps: Register own uart console and driver structures
>   serial: uartps: Move Port ID to device data structure
> 
> Nava kishore Manne (1):
>   serial: uartps: Fix suspend functionality
> 
>  drivers/tty/serial/xilinx_uartps.c | 203 +++++++++++++++++++------------------
>  1 file changed, 107 insertions(+), 96 deletions(-)
> 

Can you please look at this series?
I have sent 2 more patches on the top of this series where OF patch was
reviewed by Rob already.

Thanks,
Michal

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2
  2018-09-18 11:54 ` [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2 Michal Simek
@ 2018-09-18 12:01   ` Greg Kroah-Hartman
  0 siblings, 0 replies; 13+ messages in thread
From: Greg Kroah-Hartman @ 2018-09-18 12:01 UTC (permalink / raw)
  To: Michal Simek
  Cc: linux-kernel, gnomes, Alexander Graf, shubhraj, robh, Jiri Slaby,
	linux-serial, linux-arm-kernel

On Tue, Sep 18, 2018 at 01:54:31PM +0200, Michal Simek wrote:
> Hi Greg,
> 
> On 3.9.2018 15:10, Michal Simek wrote:
> > Hi,
> > 
> > this series is trying to address discussion I had with Alan in past
> > https://patchwork.kernel.org/patch/9738445/ and also with Rob in v1
> > https://lkml.org/lkml/2018/4/26/551.
> > 
> > These patches are doing preparation to enable dynamic ID port allocation
> > which is capable to create devices with higher IDs.
> > 
> > For example this is how it works.
> > uart0 on higher alias
> > serial0 = &uart1;
> > serial30 = &uart0;
> > 
> > ~# ls -la /dev/ttyPS*
> > crw-------    1 root     root      252,   0 Jun  6 12:19 /dev/ttyPS0
> > crw--w----    1 root     root      253, 100 Jan  1  1970 /dev/ttyPS30
> > 
> > Thanks,
> > Michal
> > 
> > Changes in v3:
> > - New patch found by testing
> > - New patch - can be sent separately but there is dependency that's why
> >   sent in this series
> > - Fix uart_unregister_driver() in error path or when driver is removed.
> > - Change commit message
> > - s/,/;/ in filling structure
> > - get cdns_uart_uart_driver out of PS_UART_CONSOLE ifdefs
> > - New patch in series
> > - Rebase on the top of previous broken patch
> > - Change patch subject ("was serial: uartps: Remove CDNS_UART_NR_PORTS
> >   macro")
> > - Keep CDNS_UART_NR_PORTS in this patch and remove it in next one and
> >   align commit message to reflect this
> > - Allocate struct console dynamically too to be unique for every
> >   instance
> > - Cleanup error path
> > - New patch in series
> > 
> > Changes in v2:
> > - new patch - it can be sent separately too
> > - new patch - it can be sent separately too
> > - new patch - it can be sent separately too
> > - Remove nr field logic
> > - new patch - it can be sent separately too
> > - Register one uart_driver with unique minor at probe time
> > 
> > Michal Simek (9):
> >   serial: uartps: console_setup() can't be placed to init section
> >   serial: uartps: Do not initialize field to zero again
> >   serial: uartps: Do not use static struct uart_driver out of probe()
> >   serial: uartps: Move alias reading higher in probe()
> >   serial: uartps: Move register to probe based on run time detection
> >   serial: uartps: Fill struct uart_driver in probe()
> >   serial: uartps: Change logic how console_port is setup
> >   serial: uartps: Register own uart console and driver structures
> >   serial: uartps: Move Port ID to device data structure
> > 
> > Nava kishore Manne (1):
> >   serial: uartps: Fix suspend functionality
> > 
> >  drivers/tty/serial/xilinx_uartps.c | 203 +++++++++++++++++++------------------
> >  1 file changed, 107 insertions(+), 96 deletions(-)
> > 
> 
> Can you please look at this series?
> I have sent 2 more patches on the top of this series where OF patch was
> reviewed by Rob already.

My tty queue is a bit lagging right now, sorry, will get to that soon...

greg k-h

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2018-09-18 12:01 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-09-03 13:10 [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2 Michal Simek
2018-09-03 13:10 ` [PATCH v3 01/10] serial: uartps: console_setup() can't be placed to init section Michal Simek
2018-09-03 13:10 ` [PATCH v3 02/10] serial: uartps: Do not initialize field to zero again Michal Simek
2018-09-03 13:10 ` [PATCH v3 03/10] serial: uartps: Fix suspend functionality Michal Simek
2018-09-03 13:10 ` [PATCH v3 04/10] serial: uartps: Do not use static struct uart_driver out of probe() Michal Simek
2018-09-03 13:10 ` [PATCH v3 05/10] serial: uartps: Move alias reading higher in probe() Michal Simek
2018-09-03 13:10 ` [PATCH v3 06/10] serial: uartps: Move register to probe based on run time detection Michal Simek
2018-09-03 13:10 ` [PATCH v3 07/10] serial: uartps: Fill struct uart_driver in probe() Michal Simek
2018-09-03 13:10 ` [PATCH v3 08/10] serial: uartps: Change logic how console_port is setup Michal Simek
2018-09-03 13:10 ` [PATCH v3 09/10] serial: uartps: Register own uart console and driver structures Michal Simek
2018-09-03 13:10 ` [PATCH v3 10/10] serial: uartps: Move Port ID to device data structure Michal Simek
2018-09-18 11:54 ` [PATCH v3 00/10] serial: uartps: Add run time support for more IPs than hardcoded 2 Michal Simek
2018-09-18 12:01   ` Greg Kroah-Hartman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).