aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/serial/mux.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/serial/mux.c')
-rw-r--r--drivers/serial/mux.c30
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
65static struct timer_list mux_timer; 66static 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 */
79static unsigned int mux_tx_empty(struct uart_port *port) 80static 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[] = {
497MODULE_DEVICE_TABLE(parisc, mux_tbl); 503MODULE_DEVICE_TABLE(parisc, mux_tbl);
498 504
499static struct parisc_driver serial_mux_driver = { 505static 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};