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 /drivers/serial/serial_core.c | |
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>
Diffstat (limited to 'drivers/serial/serial_core.c')
-rw-r--r-- | drivers/serial/serial_core.c | 9 |
1 files changed, 5 insertions, 4 deletions
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)); |