Blackfin serial driver: fix overhead issue
authorAubrey Li <aubrey.li@analog.com>
Mon, 21 May 2007 10:09:38 +0000 (18:09 +0800)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Mon, 21 May 2007 16:50:23 +0000 (09:50 -0700)
Signed-off-by: Aubrey Li <aubrey.li@analog.com>
Signed-off-by: Bryan Wu <bryan.wu@analog.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/serial/bfin_5xx.c

index 408390f93db9e7d4581420d5de487a5d59cc8a62..a8271d9c62020caaec68ea5b9ff91289ab55630d 100644 (file)
@@ -240,24 +240,30 @@ static void bfin_serial_tx_chars(struct bfin_serial_port *uart)
                bfin_serial_stop_tx(&uart->port);
 }
 
                bfin_serial_stop_tx(&uart->port);
 }
 
-static irqreturn_t bfin_serial_int(int irq, void *dev_id)
+static irqreturn_t bfin_serial_rx_int(int irq, void *dev_id)
+{
+       struct bfin_serial_port *uart = dev_id;
+
+       spin_lock(&uart->port.lock);
+       while ((UART_GET_IIR(uart) & IIR_STATUS) == IIR_RX_READY)
+               bfin_serial_rx_chars(uart);
+       spin_unlock(&uart->port.lock);
+       return IRQ_HANDLED;
+}
+
+static irqreturn_t bfin_serial_tx_int(int irq, void *dev_id)
 {
        struct bfin_serial_port *uart = dev_id;
        unsigned short status;
 
        spin_lock(&uart->port.lock);
 {
        struct bfin_serial_port *uart = dev_id;
        unsigned short status;
 
        spin_lock(&uart->port.lock);
-       status = UART_GET_IIR(uart);
-       do {
-               if ((status & IIR_STATUS) == IIR_TX_READY)
-                       bfin_serial_tx_chars(uart);
-               if ((status & IIR_STATUS) == IIR_RX_READY)
-                       bfin_serial_rx_chars(uart);
-               status = UART_GET_IIR(uart);
-       } while (status & (IIR_TX_READY | IIR_RX_READY));
+       while ((UART_GET_IIR(uart) & IIR_STATUS) == IIR_TX_READY)
+               bfin_serial_tx_chars(uart);
        spin_unlock(&uart->port.lock);
        return IRQ_HANDLED;
 }
 
        spin_unlock(&uart->port.lock);
        return IRQ_HANDLED;
 }
 
+
 static void bfin_serial_do_work(struct work_struct *work)
 {
        struct bfin_serial_port *uart = container_of(work, struct bfin_serial_port, cts_workqueue);
 static void bfin_serial_do_work(struct work_struct *work)
 {
        struct bfin_serial_port *uart = container_of(work, struct bfin_serial_port, cts_workqueue);
@@ -545,14 +551,14 @@ static int bfin_serial_startup(struct uart_port *port)
        add_timer(&(uart->rx_dma_timer));
 #else
        if (request_irq
        add_timer(&(uart->rx_dma_timer));
 #else
        if (request_irq
-           (uart->port.irq, bfin_serial_int, IRQF_DISABLED,
+           (uart->port.irq, bfin_serial_rx_int, IRQF_DISABLED,
             "BFIN_UART_RX", uart)) {
                printk(KERN_NOTICE "Unable to attach BlackFin UART RX interrupt\n");
                return -EBUSY;
        }
 
        if (request_irq
             "BFIN_UART_RX", uart)) {
                printk(KERN_NOTICE "Unable to attach BlackFin UART RX interrupt\n");
                return -EBUSY;
        }
 
        if (request_irq
-           (uart->port.irq+1, bfin_serial_int, IRQF_DISABLED,
+           (uart->port.irq+1, bfin_serial_tx_int, IRQF_DISABLED,
             "BFIN_UART_TX", uart)) {
                printk(KERN_NOTICE "Unable to attach BlackFin UART TX interrupt\n");
                free_irq(uart->port.irq, uart);
             "BFIN_UART_TX", uart)) {
                printk(KERN_NOTICE "Unable to attach BlackFin UART TX interrupt\n");
                free_irq(uart->port.irq, uart);