diff options
-rw-r--r-- | drivers/sensorhub/stm/ssp_spi.c | 26 |
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: |