aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial/amba-pl011.c
diff options
context:
space:
mode:
authorMatthew Leach <matthew.leach@arm.com>2012-08-28 11:41:28 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-09-05 16:18:12 -0400
commit32614aad30549b0e4caf44c26efe8e2b09d597ce (patch)
treea5b55ada04da752a571d260c97c7ec68c4944bf3 /drivers/tty/serial/amba-pl011.c
parent4b71598b6a1e72d11a657ccd67bdb14f1c269186 (diff)
serial: pl011: honour serial aliases in device tree
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. Acked-by: Linus Walleij <linus.walleij@linaro.org> Reviewed-by: Will Deacon <will.deacon@arm.com> Acked-by: Rob Herring <rob.herring@calxeda.com> Signed-off-by: Matthew Leach <matthew.leach@arm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/serial/amba-pl011.c')
-rw-r--r--drivers/tty/serial/amba-pl011.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c
index 3322023e38aa..05c15ec7bd21 100644
--- a/drivers/tty/serial/amba-pl011.c
+++ b/drivers/tty/serial/amba-pl011.c
@@ -52,6 +52,8 @@
52#include <linux/scatterlist.h> 52#include <linux/scatterlist.h>
53#include <linux/delay.h> 53#include <linux/delay.h>
54#include <linux/types.h> 54#include <linux/types.h>
55#include <linux/of.h>
56#include <linux/of_device.h>
55#include <linux/pinctrl/consumer.h> 57#include <linux/pinctrl/consumer.h>
56#include <linux/sizes.h> 58#include <linux/sizes.h>
57 59
@@ -1862,6 +1864,38 @@ static struct uart_driver amba_reg = {
1862 .cons = AMBA_CONSOLE, 1864 .cons = AMBA_CONSOLE,
1863}; 1865};
1864 1866
1867static int pl011_probe_dt_alias(int index, struct device *dev)
1868{
1869 struct device_node *np;
1870 static bool seen_dev_with_alias = false;
1871 static bool seen_dev_without_alias = false;
1872 int ret = index;
1873
1874 if (!IS_ENABLED(CONFIG_OF))
1875 return ret;
1876
1877 np = dev->of_node;
1878 if (!np)
1879 return ret;
1880
1881 ret = of_alias_get_id(np, "serial");
1882 if (IS_ERR_VALUE(ret)) {
1883 seen_dev_without_alias = true;
1884 ret = index;
1885 } else {
1886 seen_dev_with_alias = true;
1887 if (ret >= ARRAY_SIZE(amba_ports) || amba_ports[ret] != NULL) {
1888 dev_warn(dev, "requested serial port %d not available.\n", ret);
1889 ret = index;
1890 }
1891 }
1892
1893 if (seen_dev_with_alias && seen_dev_without_alias)
1894 dev_warn(dev, "aliased and non-aliased serial devices found in device tree. Serial port enumeration may be unpredictable.\n");
1895
1896 return ret;
1897}
1898
1865static int pl011_probe(struct amba_device *dev, const struct amba_id *id) 1899static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
1866{ 1900{
1867 struct uart_amba_port *uap; 1901 struct uart_amba_port *uap;
@@ -1884,6 +1918,8 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
1884 goto out; 1918 goto out;
1885 } 1919 }
1886 1920
1921 i = pl011_probe_dt_alias(i, &dev->dev);
1922
1887 base = ioremap(dev->res.start, resource_size(&dev->res)); 1923 base = ioremap(dev->res.start, resource_size(&dev->res));
1888 if (!base) { 1924 if (!base) {
1889 ret = -ENOMEM; 1925 ret = -ENOMEM;