diff options
author | Josh Boyer <jwboyer@linux.vnet.ibm.com> | 2007-07-23 21:43:44 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-24 15:24:58 -0400 |
commit | 4f640efb3170dbcf99a37a3cc99060647b95428c (patch) | |
tree | b600b237e4efc1c7dab2b362eae23e076e5ce8f9 | |
parent | f695baf2df9e0413d3521661070103711545207a (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.c | 5 | ||||
-rw-r--r-- | drivers/serial/8250_early.c | 10 | ||||
-rw-r--r-- | drivers/serial/serial_core.c | 9 | ||||
-rw-r--r-- | include/linux/serial_8250.h | 2 | ||||
-rw-r--r-- | include/linux/serial_core.h | 2 |
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 @@ | |||
20 | struct plat_serial8250_port { | 20 | struct 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]; |