summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaewon Kim <jaewon02.kim@samsung.com>2014-10-17 11:55:07 +0900
committerChanho Park <chanho61.park@samsung.com>2014-10-16 23:36:14 -0700
commit9bb356dc0b15a3598b74c572f8f13ff764689123 (patch)
treef11762c5dde052bacb98205252656a47e81b0661
parentf734495626a134b9e512e9fdc6ffd3b5c31dd364 (diff)
downloadlinux-3.10-9bb356dc0b15a3598b74c572f8f13ff764689123.tar.gz
linux-3.10-9bb356dc0b15a3598b74c572f8f13ff764689123.tar.bz2
linux-3.10-9bb356dc0b15a3598b74c572f8f13ff764689123.zip
sensorhub: Fix temporary spi_read error
When try to read SPI, sometimes buffer filled with zero. And spi_read does not return error. In normal case, first byte of buffer is used to command byte. And this is not zero. So, this patch checks first byte of buffer. Change-Id: If75d57c0426d819476d87e82391901dfb8fa1652 Signed-off-by: Jaewon Kim <jaewon02.kim@samsung.com>
-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: