aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Boyer <jwboyer@linux.vnet.ibm.com>2007-07-23 21:43:44 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-24 15:24:58 -0400
commit4f640efb3170dbcf99a37a3cc99060647b95428c (patch)
treeb600b237e4efc1c7dab2b362eae23e076e5ce8f9
parentf695baf2df9e0413d3521661070103711545207a (diff)
Use resource_size_t for serial port IO addresses
At present, various parts of the serial code use unsigned long to define resource addresses. This is a problem, because some 32-bit platforms have physical addresses larger than 32-bits, and have mmio serial uarts located above the 4GB point. This patch changes the type of mapbase in both struct uart_port and struct plat_serial8250_port to resource_size_t, which can be configured to be 64 bits on such platforms. The mapbase in serial_struct can't safely be changed, because that structure is user visible. Signed-off-by: David Gibson <dwg@au1.ibm.com> Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com> Cc: Russell King <rmk@arm.linux.org.uk> Cc: Paul Mackerras <paulus@samba.org> Cc: Jason Wessel <jason.wessel@windriver.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/serial/8250.c5
-rw-r--r--drivers/serial/8250_early.c10
-rw-r--r--drivers/serial/serial_core.c9
-rw-r--r--include/linux/serial_8250.h2
-rw-r--r--include/linux/serial_core.h2
5 files changed, 16 insertions, 12 deletions
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index 0b3ec38ae614..2f5a5ac1b271 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -2650,8 +2650,9 @@ static int __devinit serial8250_probe(struct platform_device *dev)
2650 ret = serial8250_register_port(&port); 2650 ret = serial8250_register_port(&port);
2651 if (ret < 0) { 2651 if (ret < 0) {
2652 dev_err(&dev->dev, "unable to register port at index %d " 2652 dev_err(&dev->dev, "unable to register port at index %d "
2653 "(IO%lx MEM%lx IRQ%d): %d\n", i, 2653 "(IO%lx MEM%llx IRQ%d): %d\n", i,
2654 p->iobase, p->mapbase, p->irq, ret); 2654 p->iobase, (unsigned long long)p->mapbase,
2655 p->irq, ret);
2655 } 2656 }
2656 } 2657 }
2657 return 0; 2658 return 0;
diff --git a/drivers/serial/8250_early.c b/drivers/serial/8250_early.c
index 947c20507e1f..150cad5c2eba 100644
--- a/drivers/serial/8250_early.c
+++ b/drivers/serial/8250_early.c
@@ -151,8 +151,9 @@ static int __init parse_options(struct early_serial8250_device *device, char *op
151#else 151#else
152 port->membase = ioremap(port->mapbase, 64); 152 port->membase = ioremap(port->mapbase, 64);
153 if (!port->membase) { 153 if (!port->membase) {
154 printk(KERN_ERR "%s: Couldn't ioremap 0x%lx\n", 154 printk(KERN_ERR "%s: Couldn't ioremap 0x%llx\n",
155 __FUNCTION__, port->mapbase); 155 __FUNCTION__,
156 (unsigned long long)port->mapbase);
156 return -ENOMEM; 157 return -ENOMEM;
157 } 158 }
158#endif 159#endif
@@ -175,9 +176,10 @@ static int __init parse_options(struct early_serial8250_device *device, char *op
175 device->baud); 176 device->baud);
176 } 177 }
177 178
178 printk(KERN_INFO "Early serial console at %s 0x%lx (options '%s')\n", 179 printk(KERN_INFO "Early serial console at %s 0x%llx (options '%s')\n",
179 mmio ? "MMIO" : "I/O port", 180 mmio ? "MMIO" : "I/O port",
180 mmio ? port->mapbase : (unsigned long) port->iobase, 181 mmio ? (unsigned long long) port->mapbase
182 : (unsigned long long) port->iobase,
181 device->options); 183 device->options);
182 return 0; 184 return 0;
183} 185}
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c
index 9c57486c2e7f..030a6063541d 100644
--- a/drivers/serial/serial_core.c
+++ b/drivers/serial/serial_core.c
@@ -626,7 +626,7 @@ static int uart_get_info(struct uart_state *state,
626 tmp.hub6 = port->hub6; 626 tmp.hub6 = port->hub6;
627 tmp.io_type = port->iotype; 627 tmp.io_type = port->iotype;
628 tmp.iomem_reg_shift = port->regshift; 628 tmp.iomem_reg_shift = port->regshift;
629 tmp.iomem_base = (void *)port->mapbase; 629 tmp.iomem_base = (void *)(unsigned long)port->mapbase;
630 630
631 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo))) 631 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
632 return -EFAULT; 632 return -EFAULT;
@@ -1666,10 +1666,11 @@ static int uart_line_info(char *buf, struct uart_driver *drv, int i)
1666 return 0; 1666 return 0;
1667 1667
1668 mmio = port->iotype >= UPIO_MEM; 1668 mmio = port->iotype >= UPIO_MEM;
1669 ret = sprintf(buf, "%d: uart:%s %s%08lX irq:%d", 1669 ret = sprintf(buf, "%d: uart:%s %s%08llX irq:%d",
1670 port->line, uart_type(port), 1670 port->line, uart_type(port),
1671 mmio ? "mmio:0x" : "port:", 1671 mmio ? "mmio:0x" : "port:",
1672 mmio ? port->mapbase : (unsigned long) port->iobase, 1672 mmio ? (unsigned long long)port->mapbase
1673 : (unsigned long long) port->iobase,
1673 port->irq); 1674 port->irq);
1674 1675
1675 if (port->type == PORT_UNKNOWN) { 1676 if (port->type == PORT_UNKNOWN) {
@@ -2069,7 +2070,7 @@ uart_report_port(struct uart_driver *drv, struct uart_port *port)
2069 case UPIO_TSI: 2070 case UPIO_TSI:
2070 case UPIO_DWAPB: 2071 case UPIO_DWAPB:
2071 snprintf(address, sizeof(address), 2072 snprintf(address, sizeof(address),
2072 "MMIO 0x%lx", port->mapbase); 2073 "MMIO 0x%llx", (unsigned long long)port->mapbase);
2073 break; 2074 break;
2074 default: 2075 default:
2075 strlcpy(address, "*unknown*", sizeof(address)); 2076 strlcpy(address, "*unknown*", sizeof(address));
diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h
index 8518fa2a6f89..afe0f6d9b9bc 100644
--- a/include/linux/serial_8250.h
+++ b/include/linux/serial_8250.h
@@ -20,7 +20,7 @@
20struct plat_serial8250_port { 20struct plat_serial8250_port {
21 unsigned long iobase; /* io base address */ 21 unsigned long iobase; /* io base address */
22 void __iomem *membase; /* ioremap cookie or NULL */ 22 void __iomem *membase; /* ioremap cookie or NULL */
23 unsigned long mapbase; /* resource base */ 23 resource_size_t mapbase; /* resource base */
24 unsigned int irq; /* interrupt number */ 24 unsigned int irq; /* interrupt number */
25 unsigned int uartclk; /* UART clock rate */ 25 unsigned int uartclk; /* UART clock rate */
26 unsigned char regshift; /* register shift */ 26 unsigned char regshift; /* register shift */
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
index 773d8d8828ad..09d17b06bf02 100644
--- a/include/linux/serial_core.h
+++ b/include/linux/serial_core.h
@@ -288,7 +288,7 @@ struct uart_port {
288 const struct uart_ops *ops; 288 const struct uart_ops *ops;
289 unsigned int custom_divisor; 289 unsigned int custom_divisor;
290 unsigned int line; /* port index */ 290 unsigned int line; /* port index */
291 unsigned long mapbase; /* for ioremap */ 291 resource_size_t mapbase; /* for ioremap */
292 struct device *dev; /* parent device */ 292 struct device *dev; /* parent device */
293 unsigned char hub6; /* this should be in the 8250 driver */ 293 unsigned char hub6; /* this should be in the 8250 driver */
294 unsigned char unused[3]; 294 unsigned char unused[3];