|
@@ -52,6 +52,8 @@
|
|
|
#include <linux/scatterlist.h>
|
|
|
#include <linux/delay.h>
|
|
|
#include <linux/types.h>
|
|
|
+#include <linux/of.h>
|
|
|
+#include <linux/of_device.h>
|
|
|
#include <linux/pinctrl/consumer.h>
|
|
|
#include <linux/sizes.h>
|
|
|
|
|
@@ -1862,6 +1864,38 @@ static struct uart_driver amba_reg = {
|
|
|
.cons = AMBA_CONSOLE,
|
|
|
};
|
|
|
|
|
|
+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;
|
|
|
+
|
|
|
+ if (!IS_ENABLED(CONFIG_OF))
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ 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;
|
|
|
+}
|
|
|
+
|
|
|
static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
|
|
|
{
|
|
|
struct uart_amba_port *uap;
|
|
@@ -1884,6 +1918,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;
|