diff options
author | Magnus Damm <damm@igel.co.jp> | 2009-01-21 10:14:22 -0500 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2009-05-08 10:16:07 -0400 |
commit | 08f8cb315fdf9195b472aeb440ae65b189b151da (patch) | |
tree | f0bab5565847b51008dc2845abf532b5e752a716 /drivers/serial | |
parent | 7ed7e0711b3ff85b3e15591081b42f2af96d584b (diff) |
sh-sci: ioremap() in a single place
Handle ioremap() in sci_config_port only.
Signed-off-by: Magnus Damm <damm@igel.co.jp>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'drivers/serial')
-rw-r--r-- | drivers/serial/sh-sci.c | 54 |
1 files changed, 20 insertions, 34 deletions
diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c index 039c700ce1ec..408624ae7fec 100644 --- a/drivers/serial/sh-sci.c +++ b/drivers/serial/sh-sci.c | |||
@@ -994,9 +994,21 @@ static void sci_config_port(struct uart_port *port, int flags) | |||
994 | 994 | ||
995 | port->type = s->type; | 995 | port->type = s->type; |
996 | 996 | ||
997 | if (port->flags & UPF_IOREMAP && !port->membase) { | 997 | if (port->membase) |
998 | return; | ||
999 | |||
1000 | if (port->flags & UPF_IOREMAP) { | ||
998 | port->membase = ioremap_nocache(port->mapbase, 0x40); | 1001 | port->membase = ioremap_nocache(port->mapbase, 0x40); |
999 | dev_err(port->dev, "can't remap port#%d\n", port->line); | 1002 | |
1003 | if (IS_ERR(port->membase)) | ||
1004 | dev_err(port->dev, "can't remap port#%d\n", port->line); | ||
1005 | } else { | ||
1006 | /* | ||
1007 | * For the simple (and majority of) cases where we don't | ||
1008 | * need to do any remapping, just cast the cookie | ||
1009 | * directly. | ||
1010 | */ | ||
1011 | port->membase = (void __iomem *)port->mapbase; | ||
1000 | } | 1012 | } |
1001 | } | 1013 | } |
1002 | 1014 | ||
@@ -1036,9 +1048,9 @@ static struct uart_ops sci_uart_ops = { | |||
1036 | #endif | 1048 | #endif |
1037 | }; | 1049 | }; |
1038 | 1050 | ||
1039 | static int __devinit sci_init_single(struct sci_port *sci_port, | 1051 | static void __devinit sci_init_single(struct sci_port *sci_port, |
1040 | unsigned int index, | 1052 | unsigned int index, |
1041 | struct plat_sci_port *p) | 1053 | struct plat_sci_port *p) |
1042 | { | 1054 | { |
1043 | sci_port->port.ops = &sci_uart_ops; | 1055 | sci_port->port.ops = &sci_uart_ops; |
1044 | sci_port->port.iotype = UPIO_MEM; | 1056 | sci_port->port.iotype = UPIO_MEM; |
@@ -1069,22 +1081,6 @@ static int __devinit sci_init_single(struct sci_port *sci_port, | |||
1069 | init_timer(&sci_port->break_timer); | 1081 | init_timer(&sci_port->break_timer); |
1070 | 1082 | ||
1071 | sci_port->port.mapbase = p->mapbase; | 1083 | sci_port->port.mapbase = p->mapbase; |
1072 | |||
1073 | if (p->mapbase && !p->membase) { | ||
1074 | if (p->flags & UPF_IOREMAP) { | ||
1075 | p->membase = ioremap_nocache(p->mapbase, 0x40); | ||
1076 | if (IS_ERR(p->membase)) | ||
1077 | return PTR_ERR(p->membase); | ||
1078 | } else { | ||
1079 | /* | ||
1080 | * For the simple (and majority of) cases | ||
1081 | * where we don't need to do any remapping, | ||
1082 | * just cast the cookie directly. | ||
1083 | */ | ||
1084 | p->membase = (void __iomem *)p->mapbase; | ||
1085 | } | ||
1086 | } | ||
1087 | |||
1088 | sci_port->port.membase = p->membase; | 1084 | sci_port->port.membase = p->membase; |
1089 | 1085 | ||
1090 | sci_port->port.irq = p->irqs[SCIx_TXI_IRQ]; | 1086 | sci_port->port.irq = p->irqs[SCIx_TXI_IRQ]; |
@@ -1092,8 +1088,6 @@ static int __devinit sci_init_single(struct sci_port *sci_port, | |||
1092 | sci_port->type = sci_port->port.type = p->type; | 1088 | sci_port->type = sci_port->port.type = p->type; |
1093 | 1089 | ||
1094 | memcpy(&sci_port->irqs, &p->irqs, sizeof(p->irqs)); | 1090 | memcpy(&sci_port->irqs, &p->irqs, sizeof(p->irqs)); |
1095 | |||
1096 | return 0; | ||
1097 | } | 1091 | } |
1098 | 1092 | ||
1099 | #ifdef CONFIG_SERIAL_SH_SCI_CONSOLE | 1093 | #ifdef CONFIG_SERIAL_SH_SCI_CONSOLE |
@@ -1163,8 +1157,7 @@ static int __init serial_console_setup(struct console *co, char *options) | |||
1163 | sci_port->clk = clk_get(NULL, "module_clk"); | 1157 | sci_port->clk = clk_get(NULL, "module_clk"); |
1164 | #endif | 1158 | #endif |
1165 | 1159 | ||
1166 | if (port->flags & UPF_IOREMAP) | 1160 | sci_config_port(port, 0); |
1167 | sci_config_port(port, 0); | ||
1168 | 1161 | ||
1169 | if (sci_port->enable) | 1162 | if (sci_port->enable) |
1170 | sci_port->enable(port); | 1163 | sci_port->enable(port); |
@@ -1258,18 +1251,11 @@ static int __devinit sci_probe_single(struct platform_device *dev, | |||
1258 | } | 1251 | } |
1259 | 1252 | ||
1260 | sciport->port.dev = &dev->dev; | 1253 | sciport->port.dev = &dev->dev; |
1261 | ret = sci_init_single(sciport, index, p); | 1254 | sci_init_single(sciport, index, p); |
1262 | if (ret) | ||
1263 | return ret; | ||
1264 | 1255 | ||
1265 | ret = uart_add_one_port(&sci_uart_driver, &sciport->port); | 1256 | ret = uart_add_one_port(&sci_uart_driver, &sciport->port); |
1266 | 1257 | if (ret) | |
1267 | if (ret) { | ||
1268 | if (p->flags & UPF_IOREMAP) | ||
1269 | iounmap(p->membase); | ||
1270 | |||
1271 | return ret; | 1258 | return ret; |
1272 | } | ||
1273 | 1259 | ||
1274 | INIT_LIST_HEAD(&sciport->node); | 1260 | INIT_LIST_HEAD(&sciport->node); |
1275 | 1261 | ||