Merge git://github.com/rustyrussell/linux
[pandora-kernel.git] / drivers / tty / serial / msm_serial.c
index 29cbfd8..8131e2c 100644 (file)
@@ -19,6 +19,7 @@
 # define SUPPORT_SYSRQ
 #endif
 
+#include <linux/atomic.h>
 #include <linux/hrtimer.h>
 #include <linux/module.h>
 #include <linux/io.h>
@@ -33,6 +34,8 @@
 #include <linux/clk.h>
 #include <linux/platform_device.h>
 #include <linux/delay.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
 
 #include "msm_serial.h"
 
@@ -589,9 +592,8 @@ static void msm_release_port(struct uart_port *port)
                iowrite32(GSBI_PROTOCOL_IDLE, msm_port->gsbi_base +
                          GSBI_CONTROL);
 
-               gsbi_resource = platform_get_resource_byname(pdev,
-                                                            IORESOURCE_MEM,
-                                                            "gsbi_resource");
+               gsbi_resource = platform_get_resource(pdev,
+                                                       IORESOURCE_MEM, 1);
 
                if (unlikely(!gsbi_resource))
                        return;
@@ -612,8 +614,7 @@ static int msm_request_port(struct uart_port *port)
        resource_size_t size;
        int ret;
 
-       uart_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM,
-                                                    "uart_resource");
+       uart_resource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (unlikely(!uart_resource))
                return -ENXIO;
 
@@ -628,8 +629,7 @@ static int msm_request_port(struct uart_port *port)
                goto fail_release_port;
        }
 
-       gsbi_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM,
-                                                    "gsbi_resource");
+       gsbi_resource = platform_get_resource(pdev, IORESOURCE_MEM, 1);
        /* Is this a GSBI-based port? */
        if (gsbi_resource) {
                size = resource_size(gsbi_resource);
@@ -857,6 +857,8 @@ static struct uart_driver msm_uart_driver = {
        .cons = MSM_CONSOLE,
 };
 
+static atomic_t msm_uart_next_id = ATOMIC_INIT(0);
+
 static int __init msm_serial_probe(struct platform_device *pdev)
 {
        struct msm_port *msm_port;
@@ -864,6 +866,9 @@ static int __init msm_serial_probe(struct platform_device *pdev)
        struct uart_port *port;
        int irq;
 
+       if (pdev->id == -1)
+               pdev->id = atomic_inc_return(&msm_uart_next_id) - 1;
+
        if (unlikely(pdev->id < 0 || pdev->id >= UART_NR))
                return -ENXIO;
 
@@ -873,7 +878,7 @@ static int __init msm_serial_probe(struct platform_device *pdev)
        port->dev = &pdev->dev;
        msm_port = UART_TO_MSM(port);
 
-       if (platform_get_resource_byname(pdev, IORESOURCE_MEM, "gsbi_resource"))
+       if (platform_get_resource(pdev, IORESOURCE_MEM, 1))
                msm_port->is_uartdm = 1;
        else
                msm_port->is_uartdm = 0;
@@ -897,8 +902,7 @@ static int __init msm_serial_probe(struct platform_device *pdev)
        printk(KERN_INFO "uartclk = %d\n", port->uartclk);
 
 
-       resource = platform_get_resource_byname(pdev, IORESOURCE_MEM,
-                                                    "uart_resource");
+       resource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (unlikely(!resource))
                return -ENXIO;
        port->mapbase = resource->start;
@@ -922,11 +926,17 @@ static int __devexit msm_serial_remove(struct platform_device *pdev)
        return 0;
 }
 
+static struct of_device_id msm_match_table[] = {
+       { .compatible = "qcom,msm-uart" },
+       {}
+};
+
 static struct platform_driver msm_platform_driver = {
        .remove = msm_serial_remove,
        .driver = {
                .name = "msm_serial",
                .owner = THIS_MODULE,
+               .of_match_table = msm_match_table,
        },
 };