]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/serial/of_serial.c
cpumask: introduce new API, without changing anything, v3
[linux-2.6-omap-h63xx.git] / drivers / serial / of_serial.c
index c0e50a461055b85a5b4dd8e6996692679e62c1c1..8fa0ff561e9fbd901acb46787bff587b035ddd79 100644 (file)
@@ -13,8 +13,8 @@
 #include <linux/module.h>
 #include <linux/serial_core.h>
 #include <linux/serial_8250.h>
+#include <linux/of_platform.h>
 
-#include <asm/of_platform.h>
 #include <asm/prom.h>
 
 struct of_serial_info {
@@ -31,7 +31,8 @@ static int __devinit of_platform_serial_setup(struct of_device *ofdev,
        struct resource resource;
        struct device_node *np = ofdev->node;
        const unsigned int *clk, *spd;
-       int ret;
+       const u32 *prop;
+       int ret, prop_size;
 
        memset(port, 0, sizeof *port);
        spd = of_get_property(np, "current-speed", NULL);
@@ -49,6 +50,17 @@ static int __devinit of_platform_serial_setup(struct of_device *ofdev,
 
        spin_lock_init(&port->lock);
        port->mapbase = resource.start;
+
+       /* Check for shifted address mapping */
+       prop = of_get_property(np, "reg-offset", &prop_size);
+       if (prop && (prop_size == sizeof(u32)))
+               port->mapbase += *prop;
+
+       /* Check for registers offset within the devices address range */
+       prop = of_get_property(np, "reg-shift", &prop_size);
+       if (prop && (prop_size == sizeof(u32)))
+               port->regshift = *prop;
+
        port->irq = irq_of_parse_and_map(np, 0);
        port->iotype = UPIO_MEM;
        port->type = type;
@@ -56,7 +68,9 @@ static int __devinit of_platform_serial_setup(struct of_device *ofdev,
        port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP
                | UPF_FIXED_PORT;
        port->dev = &ofdev->dev;
-       port->custom_divisor = *clk / (16 * (*spd));
+       /* If current-speed was set, then try not to change it. */
+       if (spd)
+               port->custom_divisor = *clk / (16 * (*spd));
 
        return 0;
 }