summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/sensorhub/stm/ssp_spi.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/drivers/sensorhub/stm/ssp_spi.c b/drivers/sensorhub/stm/ssp_spi.c
index 039624c66a9..d6c33a169e6 100644
--- a/drivers/sensorhub/stm/ssp_spi.c
+++ b/drivers/sensorhub/stm/ssp_spi.c
@@ -16,6 +16,7 @@
#define LIMIT_DELAY_CNT 200
#define RECEIVEBUFFERSIZE 12
+#define MAX_SPI_READ_RETRY 3
#define DEBUG_SHOW_DATA 0
static void clean_msg(struct ssp_msg *msg)
@@ -142,7 +143,7 @@ int select_irq_msg(struct ssp_data *data)
bool found = false;
u16 chLength = 0, msg_options = 0;
u8 msg_type = 0;
- int iRet = 0;
+ int iRet = 0, i = 0;
char* buffer;
char chTempBuf[4] = { -1 };
@@ -210,11 +211,24 @@ exit:
iRet = -ENOMEM;
break;
}
- iRet = spi_read(data->spi, buffer, chLength);
- if (iRet < 0)
- ssp_err("spi_read fail\n");
- else
- parse_dataframe(data, buffer, chLength);
+
+ /* FIXME : spi_read error
+ * When try to read spi ,sometimes buffer filled with 0.
+ * But spi_read dees not return error.
+ * In this case, retry spi_read again.
+ */
+ for (i = 0; i < MAX_SPI_READ_RETRY; i++) {
+ iRet = spi_read(data->spi, buffer, chLength);
+ if (iRet < 0) {
+ ssp_err("spi_read fail\n");
+ return ERROR;
+ }
+
+ if (buffer[0] != 0)
+ break;
+ }
+
+ parse_dataframe(data, buffer, chLength);
kfree(buffer);
break;
default: