lkml.org 
[lkml]   [2011]   [Nov]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3/6] pch_uart: Support modem status interrupt
    Date
    Signed-off-by: Tomoya MORINAGA <tomoya.rohm@gmail.com>
    ---
    drivers/tty/serial/pch_uart.c | 15 +++++++++++++--
    1 files changed, 13 insertions(+), 2 deletions(-)

    diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c
    index 013e16a..217cf37 100644
    --- a/drivers/tty/serial/pch_uart.c
    +++ b/drivers/tty/serial/pch_uart.c
    @@ -953,10 +953,15 @@ static irqreturn_t pch_uart_interrupt(int irq, void *dev_id)
    int ret = 0;
    unsigned char iid;
    unsigned long flags;
    + int next = 1;
    + u8 msr;

    spin_lock_irqsave(&priv->port.lock, flags);
    handled = 0;
    - while ((iid = pch_uart_hal_get_iid(priv)) > 1) {
    + while (next) {
    + iid = pch_uart_hal_get_iid(priv);
    + if (iid & PCH_UART_IIR_IP) /* No Interrupt */
    + break;
    switch (iid) {
    case PCH_UART_IID_RLS: /* Receiver Line Status */
    lsr = pch_uart_hal_get_line_status(priv);
    @@ -990,12 +995,18 @@ static irqreturn_t pch_uart_interrupt(int irq, void *dev_id)
    ret = handle_tx(priv);
    break;
    case PCH_UART_IID_MS: /* Modem Status */
    - ret = PCH_UART_HANDLED_MS_INT;
    + msr = pch_uart_hal_get_modem(priv);
    + next = 0; /* MS ir prioirty is the lowest. So, MS ir
    + means final interrupt */
    + if ((msr & UART_MSR_ANY_DELTA) == 0)
    + break;
    + ret |= PCH_UART_HANDLED_MS_INT;
    break;
    default: /* Never junp to this label */
    dev_err(priv->port.dev, "%s:iid=%02x (%lu)\n", __func__,
    iid, jiffies);
    ret = -1;
    + next = 0;
    break;
    }
    handled |= (unsigned int)ret;
    --
    1.7.4.4


    \
     
     \ /
      Last update: 2011-11-17 07:01    [W:0.020 / U:149.068 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site