]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/tty/serial/apbuart.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / tty / serial / apbuart.c
similarity index 95%
rename from drivers/serial/apbuart.c
rename to drivers/tty/serial/apbuart.c
index cc01c650a1447291a13c59af301e076418533067..095a5d562618ceb0f829465542699506617b729c 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/of_platform.h>
+#include <linux/of_irq.h>
 #include <linux/platform_device.h>
 #include <linux/io.h>
 #include <linux/serial_core.h>
@@ -520,11 +521,12 @@ static struct console grlib_apbuart_console = {
 };
 
 
-static void grlib_apbuart_configure(void);
+static int grlib_apbuart_configure(void);
 
 static int __init apbuart_console_init(void)
 {
-       grlib_apbuart_configure();
+       if (grlib_apbuart_configure())
+               return -ENODEV;
        register_console(&grlib_apbuart_console);
        return 0;
 }
@@ -573,13 +575,15 @@ static int __devinit apbuart_probe(struct platform_device *op,
        printk(KERN_INFO "grlib-apbuart at 0x%llx, irq %d\n",
               (unsigned long long) port->mapbase, port->irq);
        return 0;
-
 }
 
 static struct of_device_id __initdata apbuart_match[] = {
        {
         .name = "GAISLER_APBUART",
         },
+       {
+        .name = "01_00c",
+        },
        {},
 };
 
@@ -593,54 +597,49 @@ static struct of_platform_driver grlib_apbuart_of_driver = {
 };
 
 
-static void grlib_apbuart_configure(void)
+static int grlib_apbuart_configure(void)
 {
-       static int enum_done;
        struct device_node *np, *rp;
-       struct uart_port *port = NULL;
        const u32 *prop;
-       int freq_khz;
-       int v = 0, d = 0;
-       unsigned int addr;
-       int irq, line;
-       struct amba_prom_registers *regs;
-
-       if (enum_done)
-               return;
+       int freq_khz, line = 0;
 
        /* Get bus frequency */
        rp = of_find_node_by_path("/");
+       if (!rp)
+               return -ENODEV;
        rp = of_get_next_child(rp, NULL);
+       if (!rp)
+               return -ENODEV;
        prop = of_get_property(rp, "clock-frequency", NULL);
+       if (!prop)
+               return -ENODEV;
        freq_khz = *prop;
 
-       line = 0;
        for_each_matching_node(np, apbuart_match) {
+               const int *irqs, *ampopts;
+               const struct amba_prom_registers *regs;
+               struct uart_port *port;
+               unsigned long addr;
 
-               int *vendor = (int *) of_get_property(np, "vendor", NULL);
-               int *device = (int *) of_get_property(np, "device", NULL);
-               int *irqs = (int *) of_get_property(np, "interrupts", NULL);
-               regs = (struct amba_prom_registers *)
-                   of_get_property(np, "reg", NULL);
+               ampopts = of_get_property(np, "ampopts", NULL);
+               if (ampopts && (*ampopts == 0))
+                       continue; /* Ignore if used by another OS instance */
 
-               if (vendor)
-                       v = *vendor;
-               if (device)
-                       d = *device;
+               irqs = of_get_property(np, "interrupts", NULL);
+               regs = of_get_property(np, "reg", NULL);
 
                if (!irqs || !regs)
-                       return;
+                       continue;
 
                grlib_apbuart_nodes[line] = np;
 
                addr = regs->phys_addr;
-               irq = *irqs;
 
                port = &grlib_apbuart_ports[line];
 
                port->mapbase = addr;
                port->membase = ioremap(addr, sizeof(struct grlib_apbuart_regs_map));
-               port->irq = irq;
+               port->irq = *irqs;
                port->iotype = UPIO_MEM;
                port->ops = &grlib_apbuart_ops;
                port->flags = UPF_BOOT_AUTOCONF;
@@ -652,12 +651,10 @@ static void grlib_apbuart_configure(void)
                /* We support maximum UART_NR uarts ... */
                if (line == UART_NR)
                        break;
-
        }
 
-       enum_done = 1;
-
        grlib_apbuart_driver.nr = grlib_apbuart_port_nr = line;
+       return line ? 0 : -ENODEV;
 }
 
 static int __init grlib_apbuart_init(void)
@@ -665,7 +662,9 @@ static int __init grlib_apbuart_init(void)
        int ret;
 
        /* Find all APBUARTS in device the tree and initialize their ports */
-       grlib_apbuart_configure();
+       ret = grlib_apbuart_configure();
+       if (ret)
+               return ret;
 
        printk(KERN_INFO "Serial: GRLIB APBUART driver\n");