summaryrefslogtreecommitdiff
path: root/goodix_brl_spi.c
diff options
context:
space:
mode:
authorWendly Li <wendlyli@google.com>2022-06-30 16:59:44 +0000
committerWendly Li <wendlyli@google.com>2022-07-04 06:30:48 +0000
commit45b9a13cb2d8bebb7b62d02c5b8a69caa680775b (patch)
treef53dd9807da5ad9a2fe80dc92d9768970567a7ad /goodix_brl_spi.c
parentb8e8849b7187e5b34dadb78386a0797ce422c6dd (diff)
downloadgoodix_touch-45b9a13cb2d8bebb7b62d02c5b8a69caa680775b.tar.gz
touch/goodix: fix deadlock in edge cases
Bug: 229036434 Test: driver works fine after some edge cases Change-Id: I313db6d33cc2f60342ed5c5f169d614610213959 Signed-off-by: Wendly Li <wendlyli@google.com>
Diffstat (limited to 'goodix_brl_spi.c')
-rw-r--r--goodix_brl_spi.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/goodix_brl_spi.c b/goodix_brl_spi.c
index 42731c2..b868f8c 100644
--- a/goodix_brl_spi.c
+++ b/goodix_brl_spi.c
@@ -66,14 +66,15 @@ static int goodix_spi_read_bra(struct device *dev, unsigned int addr,
rx_buf = kzalloc(buf_len, GFP_KERNEL);
if (!rx_buf) {
ts_err("alloc rx_buf failed, size:%d", buf_len);
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto err_alloc_rx_buf;
}
tx_buf = kzalloc(buf_len, GFP_KERNEL);
if (!tx_buf) {
ts_err("alloc tx_buf failed, size:%d", buf_len);
ret = -ENOMEM;
- goto err_alloc_rx_buf;
+ goto err_alloc_tx_buf;
}
}
@@ -103,14 +104,14 @@ 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 (tx_buf != goodix_spi_bus.tx_buf)
+ kfree(tx_buf);
+err_alloc_tx_buf:
if (rx_buf != goodix_spi_bus.rx_buf)
kfree(rx_buf);
err_alloc_rx_buf:
- if (tx_buf != goodix_spi_bus.tx_buf)
- kfree(tx_buf);
+ mutex_unlock(&goodix_spi_bus.mutex);
return ret;
}
@@ -140,14 +141,15 @@ static int goodix_spi_read(struct device *dev, unsigned int addr,
rx_buf = kzalloc(buf_len, GFP_KERNEL);
if (!rx_buf) {
ts_err("alloc rx_buf failed, size:%d", buf_len);
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto err_alloc_rx_buf;
}
tx_buf = kzalloc(buf_len, GFP_KERNEL);
if (!tx_buf) {
ts_err("alloc tx_buf failed, size:%d", buf_len);
ret = -ENOMEM;
- goto err_alloc_rx_buf;
+ goto err_alloc_tx_buf;
}
}
@@ -177,14 +179,14 @@ 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);
-err_alloc_rx_buf:
+err_alloc_tx_buf:
if (rx_buf != goodix_spi_bus.rx_buf)
kfree(rx_buf);
+err_alloc_rx_buf:
+ mutex_unlock(&goodix_spi_bus.mutex);
return ret;
}