#endif
 };
 
+/* Counter to keep track of each UART port id when not using CONFIG_OF */
+static int uart_num_counter;
+
 static int mvebu_uart_probe(struct platform_device *pdev)
 {
        struct resource *reg = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        struct resource *irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
        struct uart_port *port;
        struct mvebu_uart_data *data;
-       int ret;
+       int ret, id;
 
        if (!reg || !irq) {
                dev_err(&pdev->dev, "no registers/irq defined\n");
                return -EINVAL;
        }
 
-       port = &mvebu_uart_ports[0];
+       /* Assume that all UART ports have a DT alias or none has */
+       id = of_alias_get_id(pdev->dev.of_node, "serial");
+       if (!pdev->dev.of_node || id < 0)
+               pdev->id = uart_num_counter++;
+       else
+               pdev->id = id;
+
+       if (pdev->id >= MVEBU_NR_UARTS) {
+               dev_err(&pdev->dev, "cannot have more than %d UART ports\n",
+                       MVEBU_NR_UARTS);
+               return -EINVAL;
+       }
+
+       port = &mvebu_uart_ports[pdev->id];
 
        spin_lock_init(&port->lock);
 
        port->fifosize   = 32;
        port->iotype     = UPIO_MEM32;
        port->flags      = UPF_FIXED_PORT;
-       port->line       = 0; /* single port: force line number to  0 */
+       port->line       = pdev->id;
 
        port->irq        = irq->start;
        port->irqflags   = 0;