summaryrefslogtreecommitdiff
path: root/chip/g/sps.c
diff options
context:
space:
mode:
authorVadim Bendebury <vbendeb@chromium.org>2017-10-31 18:53:50 -0700
committerchrome-bot <chrome-bot@chromium.org>2017-11-08 01:11:20 -0800
commitfebb392391eee9d4f286dcf8a25b3d9d82a5be1e (patch)
tree9e9dc0dcd21e66a71a4527b9c3331bb23a8d4db0 /chip/g/sps.c
parent4328a3c58e6c5a4769d344f490a5e497ffb98cf0 (diff)
downloadchrome-ec-febb392391eee9d4f286dcf8a25b3d9d82a5be1e.tar.gz
g: sps do not invoke rx_handler unless data was received
There is no point in invoking SPS receive handler if there has been no data transferred while CS was asserted, as would be the case when the AP generates the wake up pulse. Also, make sure that the flag indicating that data was seen is cleared when the interface is reinitialized, as TPM reset could come during an SPS transaction. BRANCH=cr50 BUG=b:68012381 TEST=verified that the AP firmware test passes Change-Id: I82d63d257b67a715d6dbc540c2d7480e5ff718ff Signed-off-by: Vadim Bendebury <vbendeb@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/754503 Reviewed-by: Randall Spangler <rspangler@chromium.org> Reviewed-by: Mary Ruthven <mruthven@chromium.org> Reviewed-by: Andrey Pronin <apronin@chromium.org>
Diffstat (limited to 'chip/g/sps.c')
-rw-r--r--chip/g/sps.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/chip/g/sps.c b/chip/g/sps.c
index fc7a0d8458..6a78c5f7d5 100644
--- a/chip/g/sps.c
+++ b/chip/g/sps.c
@@ -60,6 +60,9 @@ static uint32_t sps_tx_count, sps_rx_count, tx_empty_count, max_rx_batch;
#define CPUTS(outstr) cputs(CC_SPS, outstr)
#define CPRINTS(format, args...) cprints(CC_SPS, format, ## args)
+/* Flag indicating if there has been any data received while CS was asserted. */
+static uint8_t seen_data;
+
void sps_tx_status(uint8_t byte)
{
GREG32(SPS, DUMMY_WORD) = byte;
@@ -198,6 +201,8 @@ static void sps_configure(enum sps_mode mode, enum spi_clock_mode clk_mode,
GWRITE_FIELD(SPS, ICTRL, RXFIFO_LVL, 1);
+ seen_data = 0;
+
/* Use CS_DEASSERT to retrieve all remaining bytes from RX FIFO. */
GWRITE_FIELD(SPS, ISTATE_CLR, CS_DEASSERT, 1);
GWRITE_FIELD(SPS, ICTRL, CS_DEASSERT, 1);
@@ -306,8 +311,6 @@ static void sps_advance_rx(int port, int data_size)
*/
static void sps_rx_interrupt(uint32_t port, int cs_deasserted)
{
- static uint8_t seen_data;
-
for (;;) {
uint8_t *received_data = NULL;
size_t data_size;
@@ -329,14 +332,14 @@ static void sps_rx_interrupt(uint32_t port, int cs_deasserted)
}
if (cs_deasserted) {
- sps_rx_handler(NULL, 0, 1);
-
if (seen_data) {
/*
* SPI does not provide inherent flow control. Let's
* use this pin to signal the AP that the device has
* finished processing received data.
*/
+
+ sps_rx_handler(NULL, 0, 1);
gpio_set_level(GPIO_INT_AP_L, 0);
gpio_set_level(GPIO_INT_AP_L, 1);
seen_data = 0;