summaryrefslogtreecommitdiff
path: root/drivers/tty/serial/omap-serial.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/tty/serial/omap-serial.c')
-rw-r--r--drivers/tty/serial/omap-serial.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
index 7d041f28cf2..3009a8909cc 100644
--- a/drivers/tty/serial/omap-serial.c
+++ b/drivers/tty/serial/omap-serial.c
@@ -172,6 +172,7 @@ struct uart_omap_port {
struct pinctrl_state *pin_default;
struct pinctrl_state *pin_idle;
bool is_suspending;
+ spinlock_t delayed_rts_lock; /* protect need_delayed_rts*/
bool need_delayed_rts;
bool in_transmit;
int ext_rt_cnt;
@@ -1372,12 +1373,16 @@ static int serial_omap_prepare(struct device *dev)
static void serial_omap_complete(struct device *dev)
{
struct uart_omap_port *up = dev_get_drvdata(dev);
+ unsigned long flags;
+
+ spin_lock_irqsave(&up->delayed_rts_lock, flags);
if (up->need_delayed_rts && up->pin_default && up->pin_idle) {
pinctrl_select_state(up->pins, up->pin_default);
up->need_delayed_rts = 0;
}
up->is_suspending = false;
+ spin_unlock_irqrestore(&up->delayed_rts_lock, flags);
}
static int serial_omap_suspend(struct device *dev)
@@ -1747,6 +1752,7 @@ static void serial_omap_restore_context(struct uart_omap_port *up)
static int serial_omap_runtime_suspend(struct device *dev)
{
struct uart_omap_port *up = dev_get_drvdata(dev);
+ unsigned long flags;
/*
* When using 'no_console_suspend', the console UART must not be
@@ -1762,8 +1768,10 @@ static int serial_omap_runtime_suspend(struct device *dev)
return -EINVAL;
if (up->pin_idle) {
+ spin_lock_irqsave(&up->delayed_rts_lock, flags);
pinctrl_select_state(up->pins, up->pin_idle);
up->need_delayed_rts = 0;
+ spin_unlock_irqrestore(&up->delayed_rts_lock, flags);
}
up->context_loss_cnt = serial_omap_get_context_loss_count(up);