Merge branch 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband
[powerpc.git] / drivers / serial / mux.c
index 009ce83..7633132 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/delay.h> /* for udelay */
 #include <linux/device.h>
 #include <asm/io.h>
+#include <asm/irq.h>
 #include <asm/parisc-device.h>
 
 #ifdef CONFIG_MAGIC_SYSRQ
@@ -64,8 +65,8 @@ static struct uart_driver mux_driver = {
 
 static struct timer_list mux_timer;
 
-#define UART_PUT_CHAR(p, c) __raw_writel((c), (unsigned long)(p)->membase + IO_DATA_REG_OFFSET)
-#define UART_GET_FIFO_CNT(p) __raw_readl((unsigned long)(p)->membase + IO_DCOUNT_REG_OFFSET)
+#define UART_PUT_CHAR(p, c) __raw_writel((c), (p)->membase + IO_DATA_REG_OFFSET)
+#define UART_GET_FIFO_CNT(p) __raw_readl((p)->membase + IO_DCOUNT_REG_OFFSET)
 #define GET_MUX_PORTS(iodc_data) ((((iodc_data)[4] & 0xf0) >> 4) * 8) + 8
 
 /**
@@ -78,10 +79,7 @@ static struct timer_list mux_timer;
  */
 static unsigned int mux_tx_empty(struct uart_port *port)
 {
-       unsigned int cnt = __raw_readl((unsigned long)port->membase 
-                               + IO_DCOUNT_REG_OFFSET);
-
-       return cnt ? 0 : TIOCSER_TEMT;
+       return UART_GET_FIFO_CNT(port) ? 0 : TIOCSER_TEMT;
 } 
 
 /**
@@ -217,8 +215,7 @@ static void mux_read(struct uart_port *port)
        __u32 start_count = port->icount.rx;
 
        while(1) {
-               data = __raw_readl((unsigned long)port->membase
-                                               + IO_DATA_REG_OFFSET);
+               data = __raw_readl(port->membase + IO_DATA_REG_OFFSET);
 
                if (MUX_STATUS(data))
                        continue;
@@ -469,16 +466,25 @@ static int __init mux_probe(struct parisc_device *dev)
        for(i = 0; i < ports; ++i, ++port_cnt) {
                port = &mux_ports[port_cnt];
                port->iobase    = 0;
-               port->mapbase   = dev->hpa + MUX_OFFSET + (i * MUX_LINE_OFFSET);
+               port->mapbase   = dev->hpa.start + MUX_OFFSET +
+                                               (i * MUX_LINE_OFFSET);
                port->membase   = ioremap(port->mapbase, MUX_LINE_OFFSET);
                port->iotype    = SERIAL_IO_MEM;
                port->type      = PORT_MUX;
-               port->irq       = SERIAL_IRQ_NONE;
+               port->irq       = NO_IRQ;
                port->uartclk   = 0;
                port->fifosize  = MUX_FIFO_SIZE;
                port->ops       = &mux_pops;
                port->flags     = UPF_BOOT_AUTOCONF;
                port->line      = port_cnt;
+
+               /* The port->timeout needs to match what is present in
+                * uart_wait_until_sent in serial_core.c.  Otherwise
+                * the time spent in msleep_interruptable will be very
+                * long, causing the appearance of a console hang.
+                */
+               port->timeout   = HZ / 50;
+               spin_lock_init(&port->lock);
                status = uart_add_one_port(&mux_driver, port);
                BUG_ON(status);
        }