diff options
author | John Linn <john.linn@xilinx.com> | 2008-04-03 01:22:19 +0200 |
---|---|---|
committer | Josh Boyer <jwboyer@linux.vnet.ibm.com> | 2008-04-24 20:32:46 +0200 |
commit | b912b5e2cfb35c02c9c79d3f6e31753f3be4dd83 (patch) | |
tree | f9b09696b097dc85cb69d0b28c321cdc92c6afe4 /drivers/serial/of_serial.c | |
parent | [POWERPC] Xilinx: boot support for Xilinx uart 16550. (diff) | |
download | linux-b912b5e2cfb35c02c9c79d3f6e31753f3be4dd83.tar.xz linux-b912b5e2cfb35c02c9c79d3f6e31753f3be4dd83.zip |
[POWERPC] Xilinx: of_serial support for Xilinx uart 16550.
The Xilinx 16550 uart core is not a standard 16550 because it uses
word-based addressing rather than byte-based addressing. With
additional properties it is compatible with the open firmware
'ns16550' compatible binding.
This code updates the of_serial driver to handle the reg-offset
and reg-shift properties to enable this core to be used.
Signed-off-by: John Linn <john.linn@xilinx.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
Diffstat (limited to 'drivers/serial/of_serial.c')
-rw-r--r-- | drivers/serial/of_serial.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/serial/of_serial.c b/drivers/serial/of_serial.c index 8aacfb78deab..25029c7570b6 100644 --- a/drivers/serial/of_serial.c +++ b/drivers/serial/of_serial.c @@ -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; |