diff options
Diffstat (limited to 'drivers/tty/serial/omap-serial.c')
| -rw-r--r-- | drivers/tty/serial/omap-serial.c | 8 | 
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);  |