Commit 9ee1acef authored by Cyril Chemparathy's avatar Cyril Chemparathy Committed by Kevin Hilman

Davinci: serial - use ioremap()

This patch implements davinci serial cleanups towards having this code
reusable on tnetv107x.

The change reuses the platform data membase field to hold the remapped space.
By disabling the UPF_IOREMAP flag in the platform data, we prevent
the 8250 driver from repeating the ioremap.
Signed-off-by: default avatarCyril Chemparathy <cyril@ti.com>
Signed-off-by: default avatarKevin Hilman <khilman@deeprootsystems.com>
parent da0122ca
...@@ -35,14 +35,20 @@ static inline unsigned int serial_read_reg(struct plat_serial8250_port *up, ...@@ -35,14 +35,20 @@ static inline unsigned int serial_read_reg(struct plat_serial8250_port *up,
int offset) int offset)
{ {
offset <<= up->regshift; offset <<= up->regshift;
return (unsigned int)__raw_readl(IO_ADDRESS(up->mapbase) + offset);
WARN_ONCE(!up->membase, "unmapped read: uart[%d]\n", offset);
return (unsigned int)__raw_readl(up->membase + offset);
} }
static inline void serial_write_reg(struct plat_serial8250_port *p, int offset, static inline void serial_write_reg(struct plat_serial8250_port *p, int offset,
int value) int value)
{ {
offset <<= p->regshift; offset <<= p->regshift;
__raw_writel(value, IO_ADDRESS(p->mapbase) + offset);
WARN_ONCE(!p->membase, "unmapped write: uart[%d]\n", offset);
__raw_writel(value, p->membase + offset);
} }
static void __init davinci_serial_reset(struct plat_serial8250_port *p) static void __init davinci_serial_reset(struct plat_serial8250_port *p)
...@@ -83,14 +89,26 @@ int __init davinci_serial_init(struct davinci_uart_config *info) ...@@ -83,14 +89,26 @@ int __init davinci_serial_init(struct davinci_uart_config *info)
sprintf(name, "uart%d", i); sprintf(name, "uart%d", i);
uart_clk = clk_get(dev, name); uart_clk = clk_get(dev, name);
if (IS_ERR(uart_clk)) if (IS_ERR(uart_clk)) {
printk(KERN_ERR "%s:%d: failed to get UART%d clock\n", printk(KERN_ERR "%s:%d: failed to get UART%d clock\n",
__func__, __LINE__, i); __func__, __LINE__, i);
else { continue;
clk_enable(uart_clk);
p->uartclk = clk_get_rate(uart_clk);
davinci_serial_reset(p);
} }
clk_enable(uart_clk);
p->uartclk = clk_get_rate(uart_clk);
if (!p->membase && p->mapbase) {
p->membase = ioremap(p->mapbase, SZ_4K);
if (p->membase)
p->flags &= ~UPF_IOREMAP;
else
pr_err("uart regs ioremap failed\n");
}
if (p->membase)
davinci_serial_reset(p);
} }
return platform_device_register(soc_info->serial_dev); return platform_device_register(soc_info->serial_dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment