lkml.org 
[lkml]   [2012]   [Aug]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 06/13] serial: omap: simplify IRQ handling
    Date
    quite a few changes here, though they are
    pretty obvious. In summary we're making sure
    to detect which interrupt type we need to
    handle before calling the underlying interrupt
    handling procedure.

    Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
    Signed-off-by: Felipe Balbi <balbi@ti.com>
    ---
    drivers/tty/serial/omap-serial.c | 48 +++++++++++++++++++++++++++++++---------
    1 file changed, 37 insertions(+), 11 deletions(-)

    diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
    index 16808b6..2d3e64e 100644
    --- a/drivers/tty/serial/omap-serial.c
    +++ b/drivers/tty/serial/omap-serial.c
    @@ -350,33 +350,59 @@ static inline irqreturn_t serial_omap_irq(int irq, void *dev_id)
    {
    struct uart_omap_port *up = dev_id;
    unsigned int iir, lsr;
    + unsigned int type;
    unsigned long flags;
    + irqreturn_t ret = IRQ_HANDLED;

    + spin_lock_irqsave(&up->port.lock, flags);
    pm_runtime_get_sync(up->dev);
    iir = serial_in(up, UART_IIR);
    +again:
    if (iir & UART_IIR_NO_INT) {
    - pm_runtime_mark_last_busy(up->dev);
    - pm_runtime_put_autosuspend(up->dev);
    - return IRQ_NONE;
    + ret = IRQ_NONE;
    + goto out;
    }

    - spin_lock_irqsave(&up->port.lock, flags);
    lsr = serial_in(up, UART_LSR);
    - if (iir & UART_IIR_RLSI) {
    +
    + /* extract IRQ type from IIR register */
    + type = iir & 0x3e;
    +
    + switch (type) {
    + case UART_IIR_MSI:
    + check_modem_status(up);
    + break;
    + case UART_IIR_THRI:
    + if (lsr & UART_LSR_THRE)
    + transmit_chars(up);
    + break;
    + case UART_IIR_RDI:
    if (lsr & UART_LSR_DR)
    receive_chars(up, &lsr);
    + break;
    + case UART_IIR_RLSI:
    + if (lsr & UART_LSR_BRK_ERROR_BITS)
    + receive_chars(up, &lsr);
    + break;
    + case UART_IIR_RX_TIMEOUT:
    + receive_chars(up, &lsr);
    + break;
    + case UART_IIR_CTS_RTS_DSR:
    + iir = serial_in(up, UART_IIR);
    + goto again;
    + case UART_IIR_XOFF:
    + /* FALLTHROUGH */
    + default:
    + break;
    }

    - check_modem_status(up);
    - if ((lsr & UART_LSR_THRE) && (iir & UART_IIR_THRI))
    - transmit_chars(up);
    -
    +out:
    spin_unlock_irqrestore(&up->port.lock, flags);
    pm_runtime_mark_last_busy(up->dev);
    pm_runtime_put_autosuspend(up->dev);
    -
    up->port_activity = jiffies;
    - return IRQ_HANDLED;
    +
    + return ret;
    }

    static unsigned int serial_omap_tx_empty(struct uart_port *port)
    --
    1.7.12.rc3


    \
     
     \ /
      Last update: 2012-08-21 15:01    [W:4.824 / U:0.196 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site