mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-11 18:35:28 +00:00
npcx/uart: Disallow deep sleep when alternate pad is selected
Also, fix uart_rx_available to only call
clock_refresh_console_in_use when the default pad is selected.
BRANCH=none
BUG=b:65526215
TEST=On Lux, EC console works, so does pad-switching EC-EC comm,
and idlestats shows that the EC goes to deep sleep.
TEST=In uart_alt_pad_write_read, increase usleep time in loop from
100 to 10000 (the shorter 100us time prevents EC from going
into deep sleep during the transaction), no transaction
error in EC-EC communication when system goes into deep sleep.
Change-Id: I3855b07f37def0ac9cfd700318ba64c432d3c42b
Signed-off-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/735103
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
This commit is contained in:
committed by
chrome-bot
parent
e098add1d1
commit
bbadd37a11
@@ -132,8 +132,12 @@ void uart_tx_stop(void) /* Disable TX interrupt */
|
||||
{
|
||||
NPCX_UICTRL &= ~0x20;
|
||||
|
||||
/* Re-allow deep sleep */
|
||||
enable_sleep(SLEEP_MASK_UART);
|
||||
/*
|
||||
* Re-allow deep sleep when transmiting on the default pad (deep sleep
|
||||
* is always disabled when alternate pad is selected).
|
||||
*/
|
||||
if (pad == UART_DEFAULT_PAD)
|
||||
enable_sleep(SLEEP_MASK_UART);
|
||||
}
|
||||
|
||||
void uart_tx_flush(void)
|
||||
@@ -161,7 +165,7 @@ int uart_rx_available(void)
|
||||
{
|
||||
int rx_available = NPCX_UICTRL & 0x02;
|
||||
|
||||
if (rx_available) {
|
||||
if (rx_available && pad == UART_DEFAULT_PAD) {
|
||||
#ifdef CONFIG_LOW_POWER_IDLE
|
||||
/*
|
||||
* Activity seen on UART RX pin while UART was disabled for deep
|
||||
@@ -172,8 +176,7 @@ int uart_rx_available(void)
|
||||
clock_refresh_console_in_use();
|
||||
#endif
|
||||
#ifdef CONFIG_UART_PAD_SWITCH
|
||||
if (pad == UART_DEFAULT_PAD)
|
||||
last_default_pad_rx_time = get_time();
|
||||
last_default_pad_rx_time = get_time();
|
||||
#endif
|
||||
}
|
||||
return rx_available; /* If RX FIFO is empty return '0'. */
|
||||
@@ -259,6 +262,15 @@ static void uart_set_pad(enum uart_pad newpad)
|
||||
uart_tx_flush();
|
||||
uart_tx_stop();
|
||||
|
||||
/*
|
||||
* Allow deep sleep when default pad is selected (sleep is inhibited
|
||||
* during TX). Disallow deep sleep when alternate pad is selected.
|
||||
*/
|
||||
if (newpad == UART_DEFAULT_PAD)
|
||||
enable_sleep(SLEEP_MASK_UART);
|
||||
else
|
||||
disable_sleep(SLEEP_MASK_UART);
|
||||
|
||||
pad = newpad;
|
||||
|
||||
/* Configure new pad. */
|
||||
@@ -286,8 +298,13 @@ void uart_default_pad_rx_interrupt(enum gpio_signal signal)
|
||||
* transaction and switch back.
|
||||
*/
|
||||
gpio_disable_interrupt(GPIO_UART_MAIN_RX);
|
||||
uart_set_pad(UART_DEFAULT_PAD);
|
||||
|
||||
#ifdef CONFIG_LOW_POWER_IDLE
|
||||
clock_refresh_console_in_use();
|
||||
#endif
|
||||
last_default_pad_rx_time = get_time();
|
||||
|
||||
uart_set_pad(UART_DEFAULT_PAD);
|
||||
}
|
||||
|
||||
int uart_alt_pad_write_read(uint8_t *tx, int tx_len, uint8_t *rx, int rx_len,
|
||||
|
||||
Reference in New Issue
Block a user