summaryrefslogtreecommitdiff
path: root/chip/g/sps.c
diff options
context:
space:
mode:
Diffstat (limited to 'chip/g/sps.c')
-rw-r--r--chip/g/sps.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/chip/g/sps.c b/chip/g/sps.c
index dba3129dfc..6a5fed0ee3 100644
--- a/chip/g/sps.c
+++ b/chip/g/sps.c
@@ -303,6 +303,8 @@ 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;
@@ -311,6 +313,7 @@ static void sps_rx_interrupt(uint32_t port, int cs_deasserted)
if (!data_size)
break;
+ seen_data = 1;
sps_rx_count += data_size;
if (sps_rx_handler)
@@ -322,16 +325,20 @@ static void sps_rx_interrupt(uint32_t port, int cs_deasserted)
sps_advance_rx(port, data_size);
}
- if (cs_deasserted)
+ if (cs_deasserted) {
sps_rx_handler(NULL, 0, 1);
- /*
- * SPI does not provide inherent flow control. Let's use this pin to
- * signal the AP that the device has finished processing received
- * data.
- */
- gpio_set_level(GPIO_INT_AP_L, 0);
- gpio_set_level(GPIO_INT_AP_L, 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.
+ */
+ gpio_set_level(GPIO_INT_AP_L, 0);
+ gpio_set_level(GPIO_INT_AP_L, 1);
+ seen_data = 0;
+ }
+ }
}
static void sps_cs_deassert_interrupt(uint32_t port)