aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/serial/uartlite.c41
1 files changed, 38 insertions, 3 deletions
diff --git a/drivers/serial/uartlite.c b/drivers/serial/uartlite.c
index 0904c2a62fc4..2b8404c81164 100644
--- a/drivers/serial/uartlite.c
+++ b/drivers/serial/uartlite.c
@@ -373,6 +373,31 @@ static void ulite_console_write(struct console *co, const char *s,
373 spin_unlock_irqrestore(&port->lock, flags); 373 spin_unlock_irqrestore(&port->lock, flags);
374} 374}
375 375
376#if defined(CONFIG_OF)
377static inline void __init ulite_console_of_find_device(int id)
378{
379 struct device_node *np;
380 struct resource res;
381 const unsigned int *of_id;
382 int rc;
383
384 for_each_compatible_node(np, NULL, "xilinx,uartlite") {
385 of_id = of_get_property(np, "port-number", NULL);
386 if ((!of_id) || (*of_id != id))
387 continue;
388
389 rc = of_address_to_resource(np, 0, &res);
390 if (rc)
391 continue;
392
393 ulite_ports[id].mapbase = res.start;
394 return;
395 }
396}
397#else /* CONFIG_OF */
398static inline void __init ulite_console_of_find_device(int id) { /* do nothing */ }
399#endif /* CONFIG_OF */
400
376static int __init ulite_console_setup(struct console *co, char *options) 401static int __init ulite_console_setup(struct console *co, char *options)
377{ 402{
378 struct uart_port *port; 403 struct uart_port *port;
@@ -386,10 +411,20 @@ static int __init ulite_console_setup(struct console *co, char *options)
386 411
387 port = &ulite_ports[co->index]; 412 port = &ulite_ports[co->index];
388 413
414 /* Check if it is an OF device */
415 if (!port->mapbase)
416 ulite_console_of_find_device(co->index);
417
418 /* Do we have a device now? */
419 if (!port->mapbase) {
420 pr_debug("console on ttyUL%i not present\n", co->index);
421 return -ENODEV;
422 }
423
389 /* not initialized yet? */ 424 /* not initialized yet? */
390 if (!port->membase) { 425 if (!port->membase) {
391 pr_debug("console on ttyUL%i not initialized\n", co->index); 426 if (ulite_request_port(port))
392 return -ENODEV; 427 return -ENODEV;
393 } 428 }
394 429
395 if (options) 430 if (options)
@@ -461,7 +496,7 @@ static int __devinit ulite_assign(struct device *dev, int id, u32 base, int irq)
461 return -EINVAL; 496 return -EINVAL;
462 } 497 }
463 498
464 if (ulite_ports[id].mapbase) { 499 if ((ulite_ports[id].mapbase) && (ulite_ports[id].mapbase != base)) {
465 dev_err(dev, "cannot assign to %s%i; it is already in use\n", 500 dev_err(dev, "cannot assign to %s%i; it is already in use\n",
466 ULITE_NAME, id); 501 ULITE_NAME, id);
467 return -EBUSY; 502 return -EBUSY;