summaryrefslogtreecommitdiff
path: root/goodix_brl_spi.c
diff options
context:
space:
mode:
authorWendly Li <wendlyli@google.com>2022-06-08 13:52:47 +0000
committerWendly Li <wendlyli@google.com>2022-06-24 06:00:03 +0000
commit0fd1a952fe2109de81a6268b94ab1ec2f879fc8c (patch)
tree3c702b114029beabf6e6bb4cd611054d60ffb4f8 /goodix_brl_spi.c
parent616086ad731981c95fd01f915538f7a5da60804c (diff)
downloadgoodix_touch-0fd1a952fe2109de81a6268b94ab1ec2f879fc8c.tar.gz
goodix: Fix data racing
Bug: 229036434 Test: Be able to get fw version Change-Id: Idd2f8701fa7b984564f9df379f49eb23c8015b19 Signed-off-by: Wendly Li <wendlyli@google.com>
Diffstat (limited to 'goodix_brl_spi.c')
-rw-r--r--goodix_brl_spi.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/goodix_brl_spi.c b/goodix_brl_spi.c
index 652383c..42731c2 100644
--- a/goodix_brl_spi.c
+++ b/goodix_brl_spi.c
@@ -55,6 +55,8 @@ static int goodix_spi_read_bra(struct device *dev, unsigned int addr,
int ret = 0;
int buf_len = SPI_READ_PREFIX_LEN + len;
+ mutex_lock(&goodix_spi_bus.mutex);
+
if (buf_len <= SPI_PREALLOC_RX_BUF_SIZE &&
buf_len <= SPI_PREALLOC_TX_BUF_SIZE) {
rx_buf = goodix_spi_bus.rx_buf;
@@ -101,6 +103,8 @@ static int goodix_spi_read_bra(struct device *dev, unsigned int addr,
}
memcpy(data, &rx_buf[SPI_READ_PREFIX_LEN], len);
+ mutex_unlock(&goodix_spi_bus.mutex);
+
err_spi_transfer:
if (rx_buf != goodix_spi_bus.rx_buf)
kfree(rx_buf);
@@ -125,6 +129,8 @@ static int goodix_spi_read(struct device *dev, unsigned int addr,
buf_len = ALIGN(buf_len, 4);
}
+ mutex_lock(&goodix_spi_bus.mutex);
+
if (buf_len <= SPI_PREALLOC_RX_BUF_SIZE &&
buf_len <= SPI_PREALLOC_TX_BUF_SIZE) {
rx_buf = goodix_spi_bus.rx_buf;
@@ -171,6 +177,8 @@ static int goodix_spi_read(struct device *dev, unsigned int addr,
}
memcpy(data, &rx_buf[SPI_READ_PREFIX_LEN - 1], len);
+ mutex_unlock(&goodix_spi_bus.mutex);
+
err_spi_transfer:
if (tx_buf != goodix_spi_bus.tx_buf)
kfree(tx_buf);
@@ -207,6 +215,8 @@ static int goodix_spi_read_fast(struct device *dev, unsigned int addr,
spi_message_init(&spi_msg);
memset(&xfers, 0, sizeof(xfers));
+ mutex_lock(&goodix_spi_bus.mutex);
+
/*spi_read tx_buf format: 0xF1 + addr(4bytes) + data*/
tx_buf[0] = SPI_READ_FLAG;
tx_buf[1] = (addr >> 24) & 0xFF;
@@ -225,6 +235,9 @@ static int goodix_spi_read_fast(struct device *dev, unsigned int addr,
spi_message_add_tail(&xfers, &spi_msg);
ret = spi_sync(spi, &spi_msg);
+
+ mutex_unlock(&goodix_spi_bus.mutex);
+
if (ret < 0) {
ts_err("spi transfer error:%d", ret);
goto err_spi_transfer;
@@ -271,6 +284,8 @@ static int goodix_spi_write(struct device *dev, unsigned int addr,
spi_message_init(&spi_msg);
memset(&xfers, 0, sizeof(xfers));
+ mutex_lock(&goodix_spi_bus.mutex);
+
tx_buf[0] = SPI_WRITE_FLAG;
tx_buf[1] = (addr >> 24) & 0xFF;
tx_buf[2] = (addr >> 16) & 0xFF;
@@ -283,6 +298,9 @@ static int goodix_spi_write(struct device *dev, unsigned int addr,
xfers.bits_per_word = buf_len >= 64 ? 32 : 8;
spi_message_add_tail(&xfers, &spi_msg);
ret = spi_sync(spi, &spi_msg);
+
+ mutex_unlock(&goodix_spi_bus.mutex);
+
if (ret < 0)
ts_err("spi transfer error:%d", ret);
@@ -340,6 +358,8 @@ static int goodix_spi_probe(struct spi_device *spi)
goto err_alloc_tx_buf;
}
+ mutex_init(&goodix_spi_bus.mutex);
+
/* ts core device */
goodix_pdev = kzalloc(sizeof(struct platform_device), GFP_KERNEL);
if (!goodix_pdev) {