Use resource_size_t for serial port IO addresses
authorJosh Boyer <jwboyer@linux.vnet.ibm.com>
Tue, 24 Jul 2007 01:43:44 +0000 (18:43 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Tue, 24 Jul 2007 19:24:58 +0000 (12:24 -0700)
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>
drivers/serial/8250.c
drivers/serial/8250_early.c
drivers/serial/serial_core.c
include/linux/serial_8250.h
include/linux/serial_core.h

index 0b3ec38ae6147e05ac8e02a917e1427adb4c46e8..2f5a5ac1b271d009ea69ac6b85608fd23406499c 100644 (file)
@@ -2650,8 +2650,9 @@ static int __devinit serial8250_probe(struct platform_device *dev)
                ret = serial8250_register_port(&port);
                if (ret < 0) {
                        dev_err(&dev->dev, "unable to register port at index %d "
-                               "(IO%lx MEM%lx IRQ%d): %d\n", i,
-                               p->iobase, p->mapbase, p->irq, ret);
+                               "(IO%lx MEM%llx IRQ%d): %d\n", i,
+                               p->iobase, (unsigned long long)p->mapbase,
+                               p->irq, ret);
                }
        }
        return 0;
index 947c20507e1f2a4bee47d64d918e9b3ecb167c45..150cad5c2eba1adecd0896854cfa83b7c2161639 100644 (file)
@@ -151,8 +151,9 @@ static int __init parse_options(struct early_serial8250_device *device, char *op
 #else
                port->membase = ioremap(port->mapbase, 64);
                if (!port->membase) {
-                       printk(KERN_ERR "%s: Couldn't ioremap 0x%lx\n",
-                               __FUNCTION__, port->mapbase);
+                       printk(KERN_ERR "%s: Couldn't ioremap 0x%llx\n",
+                               __FUNCTION__,
+                              (unsigned long long)port->mapbase);
                        return -ENOMEM;
                }
 #endif
@@ -175,9 +176,10 @@ static int __init parse_options(struct early_serial8250_device *device, char *op
                        device->baud);
        }
 
-       printk(KERN_INFO "Early serial console at %s 0x%lx (options '%s')\n",
+       printk(KERN_INFO "Early serial console at %s 0x%llx (options '%s')\n",
                mmio ? "MMIO" : "I/O port",
-               mmio ? port->mapbase : (unsigned long) port->iobase,
+               mmio ? (unsigned long long) port->mapbase
+                    : (unsigned long long) port->iobase,
                device->options);
        return 0;
 }
index 9c57486c2e7fe20783b004dad25475b4cc805358..030a6063541dc36466b15cec3bc1005cbed30809 100644 (file)
@@ -626,7 +626,7 @@ static int uart_get_info(struct uart_state *state,
        tmp.hub6            = port->hub6;
        tmp.io_type         = port->iotype;
        tmp.iomem_reg_shift = port->regshift;
-       tmp.iomem_base      = (void *)port->mapbase;
+       tmp.iomem_base      = (void *)(unsigned long)port->mapbase;
 
        if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
                return -EFAULT;
@@ -1666,10 +1666,11 @@ static int uart_line_info(char *buf, struct uart_driver *drv, int i)
                return 0;
 
        mmio = port->iotype >= UPIO_MEM;
-       ret = sprintf(buf, "%d: uart:%s %s%08lX irq:%d",
+       ret = sprintf(buf, "%d: uart:%s %s%08llX irq:%d",
                        port->line, uart_type(port),
                        mmio ? "mmio:0x" : "port:",
-                       mmio ? port->mapbase : (unsigned long) port->iobase,
+                       mmio ? (unsigned long long)port->mapbase
+                            : (unsigned long long) port->iobase,
                        port->irq);
 
        if (port->type == PORT_UNKNOWN) {
@@ -2069,7 +2070,7 @@ uart_report_port(struct uart_driver *drv, struct uart_port *port)
        case UPIO_TSI:
        case UPIO_DWAPB:
                snprintf(address, sizeof(address),
-                        "MMIO 0x%lx", port->mapbase);
+                        "MMIO 0x%llx", (unsigned long long)port->mapbase);
                break;
        default:
                strlcpy(address, "*unknown*", sizeof(address));
index 8518fa2a6f89038d36ceac34c436a3519d69e8ee..afe0f6d9b9bcbfdbc39d726f5a202307d3ddbc81 100644 (file)
@@ -20,7 +20,7 @@
 struct plat_serial8250_port {
        unsigned long   iobase;         /* io base address */
        void __iomem    *membase;       /* ioremap cookie or NULL */
-       unsigned long   mapbase;        /* resource base */
+       resource_size_t mapbase;        /* resource base */
        unsigned int    irq;            /* interrupt number */
        unsigned int    uartclk;        /* UART clock rate */
        unsigned char   regshift;       /* register shift */
index 773d8d8828ad77bb7006e039232b4d6bf6900dca..09d17b06bf025c29a0c79a71e765e29e36c32d67 100644 (file)
@@ -288,7 +288,7 @@ struct uart_port {
        const struct uart_ops   *ops;
        unsigned int            custom_divisor;
        unsigned int            line;                   /* port index */
-       unsigned long           mapbase;                /* for ioremap */
+       resource_size_t         mapbase;                /* for ioremap */
        struct device           *dev;                   /* parent device */
        unsigned char           hub6;                   /* this should be in the 8250 driver */
        unsigned char           unused[3];