From 2fe38f21c807abaf135da43ad61020f15c4c9ea2 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Mon, 28 Mar 2011 13:57:11 +0200 Subject: [PATCH] --- yaml --- r: 248657 b: refs/heads/master c: a664ec9675d77aa2196e797afa5516d3e476da77 h: refs/heads/master i: 248655: f19f3f5fa9b834aefe0bc0879ee5587d1421148c v: v3 --- [refs] | 2 +- trunk/drivers/tty/serial/altera_uart.c | 26 +++++++++++++++----------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/[refs] b/[refs] index b75aa3cf791c..aff0cb4d11eb 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0259894c732837c801565d038eaecdcf8fc5bbe7 +refs/heads/master: a664ec9675d77aa2196e797afa5516d3e476da77 diff --git a/trunk/drivers/tty/serial/altera_uart.c b/trunk/drivers/tty/serial/altera_uart.c index 6d5b036ac783..50bc5a5ac653 100644 --- a/trunk/drivers/tty/serial/altera_uart.c +++ b/trunk/drivers/tty/serial/altera_uart.c @@ -540,11 +540,14 @@ static int __devinit altera_uart_probe(struct platform_device *pdev) int i = pdev->id; int ret; - /* -1 emphasizes that the platform must have one port, no .N suffix */ - if (i == -1) - i = 0; + /* if id is -1 scan for a free id and use that one */ + if (i == -1) { + for (i = 0; i < CONFIG_SERIAL_ALTERA_UART_MAXPORTS; i++) + if (altera_uart_ports[i].port.mapbase == 0) + break; + } - if (i >= CONFIG_SERIAL_ALTERA_UART_MAXPORTS) + if (i < 0 || i >= CONFIG_SERIAL_ALTERA_UART_MAXPORTS) return -EINVAL; port = &altera_uart_ports[i].port; @@ -587,6 +590,8 @@ static int __devinit altera_uart_probe(struct platform_device *pdev) port->ops = &altera_uart_ops; port->flags = UPF_BOOT_AUTOCONF; + dev_set_drvdata(&pdev->dev, port); + uart_add_one_port(&altera_uart_driver, port); return 0; @@ -594,14 +599,13 @@ static int __devinit altera_uart_probe(struct platform_device *pdev) static int __devexit altera_uart_remove(struct platform_device *pdev) { - struct uart_port *port; - int i = pdev->id; + struct uart_port *port = dev_get_drvdata(&pdev->dev); - if (i == -1) - i = 0; - - port = &altera_uart_ports[i].port; - uart_remove_one_port(&altera_uart_driver, port); + if (port) { + uart_remove_one_port(&altera_uart_driver, port); + dev_set_drvdata(&pdev->dev, NULL); + port->mapbase = 0; + } return 0; }