diff options
| -rw-r--r-- | drivers/tty/serial/omap-serial.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c index 8ec43253e64..e637567b40b 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; + bool need_delayed_rts; bool in_transmit; int ext_rt_cnt; bool open_close_pm; @@ -1389,6 +1390,10 @@ static int serial_omap_resume(struct device *dev) struct uart_omap_port *up = dev_get_drvdata(dev); uart_resume_port(&serial_omap_reg, &up->port); + if (up->need_delayed_rts && up->pin_default && up->pin_idle) { + pinctrl_select_state(up->pins, up->pin_default); + up->need_delayed_rts = 0; + } return 0; } @@ -1756,8 +1761,10 @@ static int serial_omap_runtime_suspend(struct device *dev) if (!up) return -EINVAL; - if (up->pin_idle) + if (up->pin_idle) { pinctrl_select_state(up->pins, up->pin_idle); + up->need_delayed_rts = 0; + } up->context_loss_cnt = serial_omap_get_context_loss_count(up); if (device_may_wakeup(dev)) { @@ -1787,8 +1794,12 @@ static int serial_omap_runtime_resume(struct device *dev) } up->latency = up->calc_latency; serial_omap_uart_qos(up); - if (up->pin_default && up->pin_idle) - pinctrl_select_state(up->pins, up->pin_default); + if (up->pin_default && up->pin_idle) { + if (up->is_suspending) + up->need_delayed_rts = 1; + else + pinctrl_select_state(up->pins, up->pin_default); + } return 0; } |