diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c index 7b2760be0260..c55cec5ba992 100644 --- a/drivers/serial/sh-sci.c +++ b/drivers/serial/sh-sci.c @@ -1602,6 +1602,34 @@ static inline unsigned long sci_port_size(struct uart_port *port) return 64; } +static int sci_remap_port(struct uart_port *port) +{ + unsigned long size = sci_port_size(port); + + /* + * Nothing to do if there's already an established membase. + */ + if (port->membase) + return 0; + + if (port->flags & UPF_IOREMAP) { + port->membase = ioremap_nocache(port->mapbase, size); + if (unlikely(!port->membase)) { + dev_err(port->dev, "can't remap port#%d\n", port->line); + return -ENXIO; + } + } else { + /* + * For the simple (and majority of) cases where we don't + * need to do any remapping, just cast the cookie + * directly. + */ + port->membase = (void __iomem *)port->mapbase; + } + + return 0; +} + static void sci_release_port(struct uart_port *port) { if (port->flags & UPF_IOREMAP) { @@ -1616,25 +1644,16 @@ static int sci_request_port(struct uart_port *port) { unsigned long size = sci_port_size(port); struct resource *res; + int ret; res = request_mem_region(port->mapbase, size, sci_type(port)); if (unlikely(res == NULL)) return -EBUSY; - if (port->flags & UPF_IOREMAP) { - port->membase = ioremap_nocache(port->mapbase, size); - if (unlikely(!port->membase)) { - dev_err(port->dev, "can't remap port#%d\n", port->line); - release_resource(res); - return -ENXIO; - } - } else { - /* - * For the simple (and majority of) cases where we don't - * need to do any remapping, just cast the cookie - * directly. - */ - port->membase = (void __iomem *)port->mapbase; + ret = sci_remap_port(port); + if (unlikely(ret != 0)) { + release_resource(res); + return ret; } return 0; @@ -1835,7 +1854,9 @@ static int __devinit serial_console_setup(struct console *co, char *options) if (!port->type) return -ENODEV; - sci_config_port(port, 0); + ret = sci_remap_port(port); + if (unlikely(ret != 0)) + return ret; if (sci_port->enable) sci_port->enable(port);