diff options
author | Mayank Rana <mrana@codeaurora.org> | 2011-12-07 22:36:09 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-12-09 22:10:04 -0500 |
commit | ee815f3a76a0d874bd29635366af572fb6ebe535 (patch) | |
tree | 6bd49992c43c05dd2af39d9d95993d096390579c /drivers/tty | |
parent | 8431de80dad20979cc8354a90f70e2faac017932 (diff) |
msm_serial_hs: Fix spinlock recursion in handling CTS
msm_hs_handle_delta_cts tries to acquire port->lock already acquired
by the callee function msm_hs_isr. Change function name to follow
"_locked" convention.
Signed-off-by: Mayank Rana <mrana@codeaurora.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/tty')
-rw-r--r-- | drivers/tty/serial/msm_serial_hs.c | 7 |
1 files changed, 2 insertions, 5 deletions
diff --git a/drivers/tty/serial/msm_serial_hs.c b/drivers/tty/serial/msm_serial_hs.c index 9f67b62cb77d..5e85e1e14c44 100644 --- a/drivers/tty/serial/msm_serial_hs.c +++ b/drivers/tty/serial/msm_serial_hs.c | |||
@@ -1087,12 +1087,10 @@ static void msm_hs_config_port(struct uart_port *uport, int cfg_flags) | |||
1087 | } | 1087 | } |
1088 | 1088 | ||
1089 | /* Handle CTS changes (Called from interrupt handler) */ | 1089 | /* Handle CTS changes (Called from interrupt handler) */ |
1090 | static void msm_hs_handle_delta_cts(struct uart_port *uport) | 1090 | static void msm_hs_handle_delta_cts_locked(struct uart_port *uport) |
1091 | { | 1091 | { |
1092 | unsigned long flags; | ||
1093 | struct msm_hs_port *msm_uport = UARTDM_TO_MSM(uport); | 1092 | struct msm_hs_port *msm_uport = UARTDM_TO_MSM(uport); |
1094 | 1093 | ||
1095 | spin_lock_irqsave(&uport->lock, flags); | ||
1096 | clk_enable(msm_uport->clk); | 1094 | clk_enable(msm_uport->clk); |
1097 | 1095 | ||
1098 | /* clear interrupt */ | 1096 | /* clear interrupt */ |
@@ -1100,7 +1098,6 @@ static void msm_hs_handle_delta_cts(struct uart_port *uport) | |||
1100 | uport->icount.cts++; | 1098 | uport->icount.cts++; |
1101 | 1099 | ||
1102 | clk_disable(msm_uport->clk); | 1100 | clk_disable(msm_uport->clk); |
1103 | spin_unlock_irqrestore(&uport->lock, flags); | ||
1104 | 1101 | ||
1105 | /* clear the IOCTL TIOCMIWAIT if called */ | 1102 | /* clear the IOCTL TIOCMIWAIT if called */ |
1106 | wake_up_interruptible(&uport->state->port.delta_msr_wait); | 1103 | wake_up_interruptible(&uport->state->port.delta_msr_wait); |
@@ -1248,7 +1245,7 @@ static irqreturn_t msm_hs_isr(int irq, void *dev) | |||
1248 | 1245 | ||
1249 | /* Change in CTS interrupt */ | 1246 | /* Change in CTS interrupt */ |
1250 | if (isr_status & UARTDM_ISR_DELTA_CTS_BMSK) | 1247 | if (isr_status & UARTDM_ISR_DELTA_CTS_BMSK) |
1251 | msm_hs_handle_delta_cts(uport); | 1248 | msm_hs_handle_delta_cts_locked(uport); |
1252 | 1249 | ||
1253 | spin_unlock_irqrestore(&uport->lock, flags); | 1250 | spin_unlock_irqrestore(&uport->lock, flags); |
1254 | 1251 | ||