diff options
| author | Doug Zobel <dzobel1@motorola.com> | 2014-08-28 11:48:00 -0500 | 
|---|---|---|
| committer | Doug Zobel <dzobel1@motorola.com> | 2014-08-28 16:29:39 -0500 | 
| commit | 71c0f1a08b1b65e92f984b226d2791c3c3190a29 (patch) | |
| tree | 9547109edc552f0ca1e72f1ee24b0b00ff1b3338 | |
| parent | a1ac4d40cc3bc8cc91f78272d5669bee92f1286f (diff) | |
| download | olio-linux-3.10-71c0f1a08b1b65e92f984b226d2791c3c3190a29.tar.xz olio-linux-3.10-71c0f1a08b1b65e92f984b226d2791c3c3190a29.zip  | |
IKXCLOCK-3681 omap: uart: Leave RTS in blocking state until resume has completed
If runtime suspend is enabled before the kernel has completed resume, then
the UART may not be ready to recieve data.  To avoid this, RTS line will be
held in the block mode until kernel resume has completed.
Change-Id: Ia7dc635788c50ec150bbf65d5602f66a7a69bf5c
| -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;  }  |