aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty
diff options
context:
space:
mode:
authorPaul Gortmaker <paul.gortmaker@windriver.com>2011-12-04 18:42:20 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2011-12-09 22:14:13 -0500
commit3986fb2ba67bb30cac18b0cff48c88d69ad37681 (patch)
treeca29a9b2338245a681a8956d94557a9022f38155 /drivers/tty
parent0690f41fddd285c3473e4af2a42d15bce7ff3e68 (diff)
serial: export the key functions for an 8250 IRQ handler
For drivers that need to construct their own IRQ handler, the three components are seen in the current handle_port -- i.e. Rx, Tx and modem_status. Make these exported symbols so that "almost" 8250 UARTs can construct their own IRQ handler with these shared components, while working around their own unique errata issues. The function names are given a serial8250 prefix, since they are now entering the global namespace. Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> Acked-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/tty')
-rw-r--r--drivers/tty/serial/8250.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/drivers/tty/serial/8250.c b/drivers/tty/serial/8250.c
index 5274228fa03c..9c0396fa3915 100644
--- a/drivers/tty/serial/8250.c
+++ b/drivers/tty/serial/8250.c
@@ -1300,8 +1300,6 @@ static void serial8250_stop_tx(struct uart_port *port)
1300 } 1300 }
1301} 1301}
1302 1302
1303static void transmit_chars(struct uart_8250_port *up);
1304
1305static void serial8250_start_tx(struct uart_port *port) 1303static void serial8250_start_tx(struct uart_port *port)
1306{ 1304{
1307 struct uart_8250_port *up = 1305 struct uart_8250_port *up =
@@ -1318,7 +1316,7 @@ static void serial8250_start_tx(struct uart_port *port)
1318 if ((up->port.type == PORT_RM9000) ? 1316 if ((up->port.type == PORT_RM9000) ?
1319 (lsr & UART_LSR_THRE) : 1317 (lsr & UART_LSR_THRE) :
1320 (lsr & UART_LSR_TEMT)) 1318 (lsr & UART_LSR_TEMT))
1321 transmit_chars(up); 1319 serial8250_tx_chars(up);
1322 } 1320 }
1323 } 1321 }
1324 1322
@@ -1376,12 +1374,12 @@ static void clear_rx_fifo(struct uart_8250_port *up)
1376} 1374}
1377 1375
1378/* 1376/*
1379 * receive_chars: processes according to the passed in LSR 1377 * serial8250_rx_chars: processes according to the passed in LSR
1380 * value, and returns the remaining LSR bits not handled 1378 * value, and returns the remaining LSR bits not handled
1381 * by this Rx routine. 1379 * by this Rx routine.
1382 */ 1380 */
1383static unsigned char 1381unsigned char
1384receive_chars(struct uart_8250_port *up, unsigned char lsr) 1382serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr)
1385{ 1383{
1386 struct tty_struct *tty = up->port.state->port.tty; 1384 struct tty_struct *tty = up->port.state->port.tty;
1387 unsigned char ch; 1385 unsigned char ch;
@@ -1462,8 +1460,9 @@ ignore_char:
1462 spin_lock(&up->port.lock); 1460 spin_lock(&up->port.lock);
1463 return lsr; 1461 return lsr;
1464} 1462}
1463EXPORT_SYMBOL_GPL(serial8250_rx_chars);
1465 1464
1466static void transmit_chars(struct uart_8250_port *up) 1465void serial8250_tx_chars(struct uart_8250_port *up)
1467{ 1466{
1468 struct circ_buf *xmit = &up->port.state->xmit; 1467 struct circ_buf *xmit = &up->port.state->xmit;
1469 int count; 1468 int count;
@@ -1500,8 +1499,9 @@ static void transmit_chars(struct uart_8250_port *up)
1500 if (uart_circ_empty(xmit)) 1499 if (uart_circ_empty(xmit))
1501 __stop_tx(up); 1500 __stop_tx(up);
1502} 1501}
1502EXPORT_SYMBOL_GPL(serial8250_tx_chars);
1503 1503
1504static unsigned int check_modem_status(struct uart_8250_port *up) 1504unsigned int serial8250_modem_status(struct uart_8250_port *up)
1505{ 1505{
1506 unsigned int status = serial_in(up, UART_MSR); 1506 unsigned int status = serial_in(up, UART_MSR);
1507 1507
@@ -1523,6 +1523,7 @@ static unsigned int check_modem_status(struct uart_8250_port *up)
1523 1523
1524 return status; 1524 return status;
1525} 1525}
1526EXPORT_SYMBOL_GPL(serial8250_modem_status);
1526 1527
1527/* 1528/*
1528 * This handles the interrupt from one port. 1529 * This handles the interrupt from one port.
@@ -1539,10 +1540,10 @@ static void serial8250_handle_port(struct uart_8250_port *up)
1539 DEBUG_INTR("status = %x...", status); 1540 DEBUG_INTR("status = %x...", status);
1540 1541
1541 if (status & (UART_LSR_DR | UART_LSR_BI)) 1542 if (status & (UART_LSR_DR | UART_LSR_BI))
1542 status = receive_chars(up, status); 1543 status = serial8250_rx_chars(up, status);
1543 check_modem_status(up); 1544 serial8250_modem_status(up);
1544 if (status & UART_LSR_THRE) 1545 if (status & UART_LSR_THRE)
1545 transmit_chars(up); 1546 serial8250_tx_chars(up);
1546 1547
1547 spin_unlock_irqrestore(&up->port.lock, flags); 1548 spin_unlock_irqrestore(&up->port.lock, flags);
1548} 1549}
@@ -1782,7 +1783,7 @@ static void serial8250_backup_timeout(unsigned long data)
1782 } 1783 }
1783 1784
1784 if (!(iir & UART_IIR_NO_INT)) 1785 if (!(iir & UART_IIR_NO_INT))
1785 transmit_chars(up); 1786 serial8250_tx_chars(up);
1786 1787
1787 if (is_real_interrupt(up->port.irq)) 1788 if (is_real_interrupt(up->port.irq))
1788 serial_out(up, UART_IER, ier); 1789 serial_out(up, UART_IER, ier);
@@ -1816,7 +1817,7 @@ static unsigned int serial8250_get_mctrl(struct uart_port *port)
1816 unsigned int status; 1817 unsigned int status;
1817 unsigned int ret; 1818 unsigned int ret;
1818 1819
1819 status = check_modem_status(up); 1820 status = serial8250_modem_status(up);
1820 1821
1821 ret = 0; 1822 ret = 0;
1822 if (status & UART_MSR_DCD) 1823 if (status & UART_MSR_DCD)
@@ -2863,7 +2864,7 @@ serial8250_console_write(struct console *co, const char *s, unsigned int count)
2863 * while processing with interrupts off. 2864 * while processing with interrupts off.
2864 */ 2865 */
2865 if (up->msr_saved_flags) 2866 if (up->msr_saved_flags)
2866 check_modem_status(up); 2867 serial8250_modem_status(up);
2867 2868
2868 if (locked) 2869 if (locked)
2869 spin_unlock(&up->port.lock); 2870 spin_unlock(&up->port.lock);