diff options
Diffstat (limited to 'drivers/serial/mux.c')
-rw-r--r-- | drivers/serial/mux.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/drivers/serial/mux.c b/drivers/serial/mux.c index 189064607709..7633132a10aa 100644 --- a/drivers/serial/mux.c +++ b/drivers/serial/mux.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/delay.h> /* for udelay */ | 27 | #include <linux/delay.h> /* for udelay */ |
28 | #include <linux/device.h> | 28 | #include <linux/device.h> |
29 | #include <asm/io.h> | 29 | #include <asm/io.h> |
30 | #include <asm/irq.h> | ||
30 | #include <asm/parisc-device.h> | 31 | #include <asm/parisc-device.h> |
31 | 32 | ||
32 | #ifdef CONFIG_MAGIC_SYSRQ | 33 | #ifdef CONFIG_MAGIC_SYSRQ |
@@ -64,8 +65,8 @@ static struct uart_driver mux_driver = { | |||
64 | 65 | ||
65 | static struct timer_list mux_timer; | 66 | static struct timer_list mux_timer; |
66 | 67 | ||
67 | #define UART_PUT_CHAR(p, c) __raw_writel((c), (unsigned long)(p)->membase + IO_DATA_REG_OFFSET) | 68 | #define UART_PUT_CHAR(p, c) __raw_writel((c), (p)->membase + IO_DATA_REG_OFFSET) |
68 | #define UART_GET_FIFO_CNT(p) __raw_readl((unsigned long)(p)->membase + IO_DCOUNT_REG_OFFSET) | 69 | #define UART_GET_FIFO_CNT(p) __raw_readl((p)->membase + IO_DCOUNT_REG_OFFSET) |
69 | #define GET_MUX_PORTS(iodc_data) ((((iodc_data)[4] & 0xf0) >> 4) * 8) + 8 | 70 | #define GET_MUX_PORTS(iodc_data) ((((iodc_data)[4] & 0xf0) >> 4) * 8) + 8 |
70 | 71 | ||
71 | /** | 72 | /** |
@@ -78,10 +79,7 @@ static struct timer_list mux_timer; | |||
78 | */ | 79 | */ |
79 | static unsigned int mux_tx_empty(struct uart_port *port) | 80 | static unsigned int mux_tx_empty(struct uart_port *port) |
80 | { | 81 | { |
81 | unsigned int cnt = __raw_readl((unsigned long)port->membase | 82 | return UART_GET_FIFO_CNT(port) ? 0 : TIOCSER_TEMT; |
82 | + IO_DCOUNT_REG_OFFSET); | ||
83 | |||
84 | return cnt ? 0 : TIOCSER_TEMT; | ||
85 | } | 83 | } |
86 | 84 | ||
87 | /** | 85 | /** |
@@ -217,8 +215,7 @@ static void mux_read(struct uart_port *port) | |||
217 | __u32 start_count = port->icount.rx; | 215 | __u32 start_count = port->icount.rx; |
218 | 216 | ||
219 | while(1) { | 217 | while(1) { |
220 | data = __raw_readl((unsigned long)port->membase | 218 | data = __raw_readl(port->membase + IO_DATA_REG_OFFSET); |
221 | + IO_DATA_REG_OFFSET); | ||
222 | 219 | ||
223 | if (MUX_STATUS(data)) | 220 | if (MUX_STATUS(data)) |
224 | continue; | 221 | continue; |
@@ -444,7 +441,7 @@ static int __init mux_probe(struct parisc_device *dev) | |||
444 | unsigned long bytecnt; | 441 | unsigned long bytecnt; |
445 | struct uart_port *port; | 442 | struct uart_port *port; |
446 | 443 | ||
447 | status = pdc_iodc_read(&bytecnt, dev->hpa, 0, iodc_data, 32); | 444 | status = pdc_iodc_read(&bytecnt, dev->hpa.start, 0, iodc_data, 32); |
448 | if(status != PDC_OK) { | 445 | if(status != PDC_OK) { |
449 | printk(KERN_ERR "Serial mux: Unable to read IODC.\n"); | 446 | printk(KERN_ERR "Serial mux: Unable to read IODC.\n"); |
450 | return 1; | 447 | return 1; |
@@ -469,16 +466,25 @@ static int __init mux_probe(struct parisc_device *dev) | |||
469 | for(i = 0; i < ports; ++i, ++port_cnt) { | 466 | for(i = 0; i < ports; ++i, ++port_cnt) { |
470 | port = &mux_ports[port_cnt]; | 467 | port = &mux_ports[port_cnt]; |
471 | port->iobase = 0; | 468 | port->iobase = 0; |
472 | port->mapbase = dev->hpa + MUX_OFFSET + (i * MUX_LINE_OFFSET); | 469 | port->mapbase = dev->hpa.start + MUX_OFFSET + |
470 | (i * MUX_LINE_OFFSET); | ||
473 | port->membase = ioremap(port->mapbase, MUX_LINE_OFFSET); | 471 | port->membase = ioremap(port->mapbase, MUX_LINE_OFFSET); |
474 | port->iotype = SERIAL_IO_MEM; | 472 | port->iotype = SERIAL_IO_MEM; |
475 | port->type = PORT_MUX; | 473 | port->type = PORT_MUX; |
476 | port->irq = SERIAL_IRQ_NONE; | 474 | port->irq = NO_IRQ; |
477 | port->uartclk = 0; | 475 | port->uartclk = 0; |
478 | port->fifosize = MUX_FIFO_SIZE; | 476 | port->fifosize = MUX_FIFO_SIZE; |
479 | port->ops = &mux_pops; | 477 | port->ops = &mux_pops; |
480 | port->flags = UPF_BOOT_AUTOCONF; | 478 | port->flags = UPF_BOOT_AUTOCONF; |
481 | port->line = port_cnt; | 479 | port->line = port_cnt; |
480 | |||
481 | /* The port->timeout needs to match what is present in | ||
482 | * uart_wait_until_sent in serial_core.c. Otherwise | ||
483 | * the time spent in msleep_interruptable will be very | ||
484 | * long, causing the appearance of a console hang. | ||
485 | */ | ||
486 | port->timeout = HZ / 50; | ||
487 | spin_lock_init(&port->lock); | ||
482 | status = uart_add_one_port(&mux_driver, port); | 488 | status = uart_add_one_port(&mux_driver, port); |
483 | BUG_ON(status); | 489 | BUG_ON(status); |
484 | } | 490 | } |
@@ -497,7 +503,7 @@ static struct parisc_device_id mux_tbl[] = { | |||
497 | MODULE_DEVICE_TABLE(parisc, mux_tbl); | 503 | MODULE_DEVICE_TABLE(parisc, mux_tbl); |
498 | 504 | ||
499 | static struct parisc_driver serial_mux_driver = { | 505 | static struct parisc_driver serial_mux_driver = { |
500 | .name = "Serial MUX", | 506 | .name = "serial_mux", |
501 | .id_table = mux_tbl, | 507 | .id_table = mux_tbl, |
502 | .probe = mux_probe, | 508 | .probe = mux_probe, |
503 | }; | 509 | }; |