summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chip/g/sps.c15
-rw-r--r--chip/g/sps.h6
-rw-r--r--chip/g/sps_hc.c2
-rw-r--r--chip/g/sps_tpm.c6
4 files changed, 21 insertions, 8 deletions
diff --git a/chip/g/sps.c b/chip/g/sps.c
index 92b4acf1e4..100f73c904 100644
--- a/chip/g/sps.c
+++ b/chip/g/sps.c
@@ -165,7 +165,8 @@ int sps_transmit(uint8_t *data, size_t data_size)
* @param mode Clock polarity and phase mode (0 - 3)
*
*/
-static void sps_configure(enum sps_mode mode, enum spi_clock_mode clk_mode)
+static void sps_configure(enum sps_mode mode, enum spi_clock_mode clk_mode,
+ unsigned rx_fifo_threshold)
{
/* Disable All Interrupts */
GREG32(SPS, ICTRL) = 0;
@@ -191,7 +192,7 @@ static void sps_configure(enum sps_mode mode, enum spi_clock_mode clk_mode)
/* Do not enable TX FIFO until we have something to send. */
GWRITE_FIELD(SPS, FIFO_CTRL, RXFIFO_EN, 1);
- GREG32(SPS, RXFIFO_THRESHOLD) = 8;
+ GREG32(SPS, RXFIFO_THRESHOLD) = rx_fifo_threshold;
GWRITE_FIELD(SPS, ICTRL, RXFIFO_LVL, 1);
@@ -206,13 +207,17 @@ static void sps_configure(enum sps_mode mode, enum spi_clock_mode clk_mode)
*/
static rx_handler_f sps_rx_handler;
-int sps_register_rx_handler(enum sps_mode mode, rx_handler_f rx_handler)
+int sps_register_rx_handler(enum sps_mode mode, rx_handler_f rx_handler,
+ unsigned rx_fifo_threshold)
{
if (sps_rx_handler)
return -1;
+ if (!rx_fifo_threshold)
+ rx_fifo_threshold = 8; /* This is a sensible default. */
sps_rx_handler = rx_handler;
- sps_configure(mode, SPI_CLOCK_MODE0);
+
+ sps_configure(mode, SPI_CLOCK_MODE0, rx_fifo_threshold);
task_enable_irq(GC_IRQNUM_SPS0_RXFIFO_LVL_INTR);
task_enable_irq(GC_IRQNUM_SPS0_CS_DEASSERT_INTR);
@@ -436,7 +441,7 @@ static int command_sps(int argc, char **argv)
sps_tx_status(GC_SPS_DUMMY_WORD_DEFAULT);
rx_state = spstrx_not_started;
- sps_register_rx_handler(SPS_GENERIC_MODE, sps_receive_callback);
+ sps_register_rx_handler(SPS_GENERIC_MODE, sps_receive_callback, 0);
if (argc > 1) {
target = strtoi(argv[1], &e, 10);
diff --git a/chip/g/sps.h b/chip/g/sps.h
index 83505909f1..f7889b82bd 100644
--- a/chip/g/sps.h
+++ b/chip/g/sps.h
@@ -42,8 +42,12 @@ int sps_transmit(uint8_t *data, size_t data_size);
* These functions return zero on success or non-zero on failure (attempt to
* register a callback on top of existing one, or attempt to unregister
* non-exitisng callback.
+ *
+ * rx_fifo_threshold value of zero means 'default'.
*/
-int sps_register_rx_handler(enum sps_mode mode, rx_handler_f rx_handler);
+int sps_register_rx_handler(enum sps_mode mode,
+ rx_handler_f rx_handler,
+ unsigned rx_fifo_threshold);
int sps_unregister_rx_handler(void);
void sps_tx_status(uint8_t byte);
unsigned sps_rx_fifo_wrptr(void);
diff --git a/chip/g/sps_hc.c b/chip/g/sps_hc.c
index d99e095ab9..5ddad59d34 100644
--- a/chip/g/sps_hc.c
+++ b/chip/g/sps_hc.c
@@ -254,7 +254,7 @@ static void sps_hc_enable(void)
state = SPI_STATE_DISABLED;
/* Ready to receive */
- sps_register_rx_handler(SPS_GENERIC_MODE, hc_rx_handler);
+ sps_register_rx_handler(SPS_GENERIC_MODE, hc_rx_handler, 0);
/* Here we go */
discard_response = 0;
diff --git a/chip/g/sps_tpm.c b/chip/g/sps_tpm.c
index 5ce79a661f..0dea0ce4ed 100644
--- a/chip/g/sps_tpm.c
+++ b/chip/g/sps_tpm.c
@@ -250,7 +250,11 @@ static void tpm_rx_handler(uint8_t *data, size_t data_size, int cs_disabled)
static void sps_tpm_enable(void)
{
- sps_register_rx_handler(SPS_GENERIC_MODE, tpm_rx_handler);
+ /*
+ * Let's make sure we get an interrupt as soon as the header is
+ * received.
+ */
+ sps_register_rx_handler(SPS_GENERIC_MODE, tpm_rx_handler, 3);
init_new_cycle();
}