aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty
diff options
context:
space:
mode:
authorTobias Klauser <tklauser@distanz.ch>2011-02-18 10:38:39 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2011-02-22 18:50:04 -0500
commit72af4762ee640b717a30761e27fc55126c686568 (patch)
tree9a11c376eebd89d6e4838a41ee0bc2fdc668e7ec /drivers/tty
parent3231f075070ac61ab7174a9a82bdc6d7b1de10bb (diff)
tty: serial: altera_jtaguart: Support getting mapbase and IRQ from resources
This will make it easier to get the driver to support device tree. The old platform data method is still supported though. Also change the driver to use only one platform device per port. Signed-off-by: Tobias Klauser <tklauser@distanz.ch> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/tty')
-rw-r--r--drivers/tty/serial/altera_jtaguart.c61
1 files changed, 42 insertions, 19 deletions
diff --git a/drivers/tty/serial/altera_jtaguart.c b/drivers/tty/serial/altera_jtaguart.c
index 94ccf4741f0e..aa2a4caaa1c3 100644
--- a/drivers/tty/serial/altera_jtaguart.c
+++ b/drivers/tty/serial/altera_jtaguart.c
@@ -409,22 +409,45 @@ static int __devinit altera_jtaguart_probe(struct platform_device *pdev)
409{ 409{
410 struct altera_jtaguart_platform_uart *platp = pdev->dev.platform_data; 410 struct altera_jtaguart_platform_uart *platp = pdev->dev.platform_data;
411 struct uart_port *port; 411 struct uart_port *port;
412 int i; 412 struct resource *res_irq, *res_mem;
413 int i = pdev->id;
413 414
414 for (i = 0; i < ALTERA_JTAGUART_MAXPORTS && platp[i].mapbase; i++) { 415 /* -1 emphasizes that the platform must have one port, no .N suffix */
415 port = &altera_jtaguart_ports[i].port; 416 if (i == -1)
417 i = 0;
416 418
417 port->line = i; 419 if (i >= ALTERA_JTAGUART_MAXPORTS)
418 port->type = PORT_ALTERA_JTAGUART; 420 return -EINVAL;
419 port->mapbase = platp[i].mapbase;
420 port->membase = ioremap(port->mapbase, ALTERA_JTAGUART_SIZE);
421 port->iotype = SERIAL_IO_MEM;
422 port->irq = platp[i].irq;
423 port->ops = &altera_jtaguart_ops;
424 port->flags = ASYNC_BOOT_AUTOCONF;
425 421
426 uart_add_one_port(&altera_jtaguart_driver, port); 422 port = &altera_jtaguart_ports[i].port;
427 } 423
424 res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
425 if (res_mem)
426 port->mapbase = res_mem->start;
427 else if (platp)
428 port->mapbase = platp->mapbase;
429 else
430 return -ENODEV;
431
432 res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
433 if (res_irq)
434 port->irq = res_irq->start;
435 else if (platp)
436 port->irq = platp->irq;
437 else
438 return -ENODEV;
439
440 port->membase = ioremap(port->mapbase, ALTERA_JTAGUART_SIZE);
441 if (!port->membase)
442 return -ENOMEM;
443
444 port->line = i;
445 port->type = PORT_ALTERA_JTAGUART;
446 port->iotype = SERIAL_IO_MEM;
447 port->ops = &altera_jtaguart_ops;
448 port->flags = ASYNC_BOOT_AUTOCONF;
449
450 uart_add_one_port(&altera_jtaguart_driver, port);
428 451
429 return 0; 452 return 0;
430} 453}
@@ -432,13 +455,13 @@ static int __devinit altera_jtaguart_probe(struct platform_device *pdev)
432static int __devexit altera_jtaguart_remove(struct platform_device *pdev) 455static int __devexit altera_jtaguart_remove(struct platform_device *pdev)
433{ 456{
434 struct uart_port *port; 457 struct uart_port *port;
435 int i; 458 int i = pdev->id;
436 459
437 for (i = 0; i < ALTERA_JTAGUART_MAXPORTS; i++) { 460 if (i == -1)
438 port = &altera_jtaguart_ports[i].port; 461 i = 0;
439 if (port) 462
440 uart_remove_one_port(&altera_jtaguart_driver, port); 463 port = &altera_jtaguart_ports[i].port;
441 } 464 uart_remove_one_port(&altera_jtaguart_driver, port);
442 465
443 return 0; 466 return 0;
444} 467}