tty: serial: altera_uart: Check for NULL platform_data in probe.
[linux-flexiantxendom0.git] / drivers / tty / serial / altera_uart.c
index 1803c37..5ba0898 100644 (file)
@@ -87,16 +87,12 @@ struct altera_uart {
 
 static u32 altera_uart_readl(struct uart_port *port, int reg)
 {
-       struct altera_uart_platform_uart *platp = port->private_data;
-
-       return readl(port->membase + (reg << platp->bus_shift));
+       return readl(port->membase + (reg << port->regshift));
 }
 
 static void altera_uart_writel(struct uart_port *port, u32 dat, int reg)
 {
-       struct altera_uart_platform_uart *platp = port->private_data;
-
-       writel(dat, port->membase + (reg << platp->bus_shift));
+       writel(dat, port->membase + (reg << port->regshift));
 }
 
 static unsigned int altera_uart_tx_empty(struct uart_port *port)
@@ -319,7 +315,7 @@ static int altera_uart_startup(struct uart_port *port)
                return 0;
        }
 
-       ret = request_irq(port->irq, altera_uart_interrupt, IRQF_DISABLED,
+       ret = request_irq(port->irq, altera_uart_interrupt, 0,
                        DRV_NAME, port);
        if (ret) {
                pr_err(DRV_NAME ": unable to attach Altera UART %d "
@@ -544,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;
@@ -556,7 +555,7 @@ static int __devinit altera_uart_probe(struct platform_device *pdev)
        res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (res_mem)
                port->mapbase = res_mem->start;
-       else if (platp->mapbase)
+       else if (platp)
                port->mapbase = platp->mapbase;
        else
                return -EINVAL;
@@ -564,7 +563,7 @@ static int __devinit altera_uart_probe(struct platform_device *pdev)
        res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
        if (res_irq)
                port->irq = res_irq->start;
-       else if (platp->irq)
+       else if (platp)
                port->irq = platp->irq;
 
        /* Check platform data first so we can override device node data */
@@ -580,12 +579,18 @@ static int __devinit altera_uart_probe(struct platform_device *pdev)
        if (!port->membase)
                return -ENOMEM;
 
+       if (platp)
+               port->regshift = platp->bus_shift;
+       else
+               port->regshift = 0;
+
        port->line = i;
        port->type = PORT_ALTERA_UART;
        port->iotype = SERIAL_IO_MEM;
        port->ops = &altera_uart_ops;
        port->flags = UPF_BOOT_AUTOCONF;
-       port->private_data = platp;
+
+       dev_set_drvdata(&pdev->dev, port);
 
        uart_add_one_port(&altera_uart_driver, port);
 
@@ -594,9 +599,14 @@ static int __devinit altera_uart_probe(struct platform_device *pdev)
 
 static int __devexit altera_uart_remove(struct platform_device *pdev)
 {
-       struct uart_port *port = &altera_uart_ports[pdev->id].port;
+       struct uart_port *port = dev_get_drvdata(&pdev->dev);
+
+       if (port) {
+               uart_remove_one_port(&altera_uart_driver, port);
+               dev_set_drvdata(&pdev->dev, NULL);
+               port->mapbase = 0;
+       }
 
-       uart_remove_one_port(&altera_uart_driver, port);
        return 0;
 }
 
@@ -606,8 +616,6 @@ static struct of_device_id altera_uart_match[] = {
        {},
 };
 MODULE_DEVICE_TABLE(of, altera_uart_match);
-#else
-#define altera_uart_match NULL
 #endif /* CONFIG_OF */
 
 static struct platform_driver altera_uart_platform_driver = {
@@ -616,7 +624,7 @@ static struct platform_driver altera_uart_platform_driver = {
        .driver = {
                .name           = DRV_NAME,
                .owner          = THIS_MODULE,
-               .of_match_table = altera_uart_match,
+               .of_match_table = of_match_ptr(altera_uart_match),
        },
 };