devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] serial: pl011: honour serial aliases in device tree
@ 2012-08-21 10:18 Matthew Leach
  2012-08-21 13:26 ` Rob Herring
  0 siblings, 1 reply; 2+ messages in thread
From: Matthew Leach @ 2012-08-21 10:18 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-serial, devicetree-discuss, robherring2, Matthew Leach

If the order of UART nodes is changed in the device tree, then tty dev
devices are attached to different serial ports causing the console to
be directed to a different physical serial port. The "serial" aliases
in the device tree should prevent this.

This patch ensures that the UART driver creates tty devices that
honour these aliases if a device tree is present.

Signed-off-by: Matthew Leach <matthew.leach@arm.com>
---
 drivers/tty/serial/amba-pl011.c |   39 +++++++++++++++++++++++++++++++++++++++
 1 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c
index c17923e..5919599 100644
--- a/drivers/tty/serial/amba-pl011.c
+++ b/drivers/tty/serial/amba-pl011.c
@@ -52,6 +52,7 @@
 #include <linux/scatterlist.h>
 #include <linux/delay.h>
 #include <linux/types.h>
+#include <linux/of_device.h>
 #include <linux/pinctrl/consumer.h>
 
 #include <asm/io.h>
@@ -1869,6 +1870,42 @@ static struct uart_driver amba_reg = {
 	.cons			= AMBA_CONSOLE,
 };
 
+#ifdef CONFIG_OF
+static int pl011_probe_dt_alias(int index, struct device *dev)
+{
+	struct device_node *np;
+	static bool seen_dev_with_alias = false;
+	static bool seen_dev_without_alias = false;
+	int ret = index;
+
+	np = dev->of_node;
+	if (!np)
+		return ret;
+
+	ret = of_alias_get_id(np, "serial");
+	if (IS_ERR_VALUE(ret)) {
+		seen_dev_without_alias = true;
+		ret = index;
+	} else {
+		seen_dev_with_alias = true;
+		if (ret >= ARRAY_SIZE(amba_ports) || amba_ports[ret] != NULL) {
+			dev_warn(dev, "requested serial port %d  not available.\n", ret);
+			ret = index;
+		}
+	}
+
+	if (seen_dev_with_alias && seen_dev_without_alias)
+		dev_warn(dev, "aliased and non-aliased serial devices found in device tree. Serial port enumeration may be unpredictable.\n");
+
+	return ret;
+}
+#else
+static int pl011_probe_dt_alias(int index, struct device *dev)
+{
+	return index;
+}
+#endif
+
 static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
 {
 	struct uart_amba_port *uap;
@@ -1891,6 +1928,8 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
 		goto out;
 	}
 
+	i = pl011_probe_dt_alias(i, &dev->dev);
+
 	base = ioremap(dev->res.start, resource_size(&dev->res));
 	if (!base) {
 		ret = -ENOMEM;
-- 
1.7.0.4


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

* Re: [PATCH] serial: pl011: honour serial aliases in device tree
  2012-08-21 10:18 [PATCH] serial: pl011: honour serial aliases in device tree Matthew Leach
@ 2012-08-21 13:26 ` Rob Herring
  0 siblings, 0 replies; 2+ messages in thread
From: Rob Herring @ 2012-08-21 13:26 UTC (permalink / raw)
  To: Matthew Leach
  Cc: linux-arm-kernel, linux-serial, devicetree-discuss, Arnd Bergmann

On 08/21/2012 05:18 AM, Matthew Leach wrote:
> If the order of UART nodes is changed in the device tree, then tty dev
> devices are attached to different serial ports causing the console to
> be directed to a different physical serial port. The "serial" aliases
> in the device tree should prevent this.
> 
> This patch ensures that the UART driver creates tty devices that
> honour these aliases if a device tree is present.
> 
> Signed-off-by: Matthew Leach <matthew.leach@arm.com>

One comment/question below, but otherwise:

Acked-by: Rob Herring <rob.herring@calxeda.com>

> ---
>  drivers/tty/serial/amba-pl011.c |   39 +++++++++++++++++++++++++++++++++++++++
>  1 files changed, 39 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c
> index c17923e..5919599 100644
> --- a/drivers/tty/serial/amba-pl011.c
> +++ b/drivers/tty/serial/amba-pl011.c
> @@ -52,6 +52,7 @@
>  #include <linux/scatterlist.h>
>  #include <linux/delay.h>
>  #include <linux/types.h>
> +#include <linux/of_device.h>
>  #include <linux/pinctrl/consumer.h>
>  
>  #include <asm/io.h>
> @@ -1869,6 +1870,42 @@ static struct uart_driver amba_reg = {
>  	.cons			= AMBA_CONSOLE,
>  };
>  
> +#ifdef CONFIG_OF

Now that we have IS_ENABLED, perhaps we want to put this inside the
function instead?

if (!IS_ENABLED(CONFIG_OF))
	return index;


> +static int pl011_probe_dt_alias(int index, struct device *dev)
> +{
> +	struct device_node *np;
> +	static bool seen_dev_with_alias = false;
> +	static bool seen_dev_without_alias = false;
> +	int ret = index;
> +
> +	np = dev->of_node;
> +	if (!np)
> +		return ret;
> +
> +	ret = of_alias_get_id(np, "serial");
> +	if (IS_ERR_VALUE(ret)) {
> +		seen_dev_without_alias = true;
> +		ret = index;
> +	} else {
> +		seen_dev_with_alias = true;
> +		if (ret >= ARRAY_SIZE(amba_ports) || amba_ports[ret] != NULL) {
> +			dev_warn(dev, "requested serial port %d  not available.\n", ret);
> +			ret = index;
> +		}
> +	}
> +
> +	if (seen_dev_with_alias && seen_dev_without_alias)
> +		dev_warn(dev, "aliased and non-aliased serial devices found in device tree. Serial port enumeration may be unpredictable.\n");
> +
> +	return ret;
> +}
> +#else
> +static int pl011_probe_dt_alias(int index, struct device *dev)
> +{
> +	return index;
> +}
> +#endif
> +
>  static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
>  {
>  	struct uart_amba_port *uap;
> @@ -1891,6 +1928,8 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
>  		goto out;
>  	}
>  
> +	i = pl011_probe_dt_alias(i, &dev->dev);
> +
>  	base = ioremap(dev->res.start, resource_size(&dev->res));
>  	if (!base) {
>  		ret = -ENOMEM;
> 


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

end of thread, other threads:[~2012-08-21 13:26 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-08-21 10:18 [PATCH] serial: pl011: honour serial aliases in device tree Matthew Leach
2012-08-21 13:26 ` Rob Herring

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).