Skip to content

Commit b9644fb

Browse files
ISCAS-VulabBartosz Golaszewski
authored andcommitted
gpio: stmpe: Check return value of stmpe_reg_read in stmpe_gpio_irq_sync_unlock
The stmpe_reg_read function can fail, but its return value is not checked in stmpe_gpio_irq_sync_unlock. This can lead to silent failures and incorrect behavior if the hardware access fails. This patch adds checks for the return value of stmpe_reg_read. If the function fails, an error message is logged and the function returns early to avoid further issues. Fixes: b888fb6 ("gpio: stmpe: i2c transfer are forbiden in atomic context") Cc: stable@vger.kernel.org # 4.16+ Signed-off-by: Wentao Liang <vulab@iscas.ac.cn> Link: https://lore.kernel.org/r/20250212021849.275-1-vulab@iscas.ac.cn Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
1 parent 8743d66 commit b9644fb

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

drivers/gpio/gpio-stmpe.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,16 +191,24 @@ static void stmpe_gpio_irq_sync_unlock(struct irq_data *d)
191191
[REG_IE][CSB] = STMPE_IDX_IEGPIOR_CSB,
192192
[REG_IE][MSB] = STMPE_IDX_IEGPIOR_MSB,
193193
};
194-
int i, j;
194+
int ret, i, j;
195195

196196
/*
197197
* STMPE1600: to be able to get IRQ from pins,
198198
* a read must be done on GPMR register, or a write in
199199
* GPSR or GPCR registers
200200
*/
201201
if (stmpe->partnum == STMPE1600) {
202-
stmpe_reg_read(stmpe, stmpe->regs[STMPE_IDX_GPMR_LSB]);
203-
stmpe_reg_read(stmpe, stmpe->regs[STMPE_IDX_GPMR_CSB]);
202+
ret = stmpe_reg_read(stmpe, stmpe->regs[STMPE_IDX_GPMR_LSB]);
203+
if (ret < 0) {
204+
dev_err(stmpe->dev, "Failed to read GPMR_LSB: %d\n", ret);
205+
goto err;
206+
}
207+
ret = stmpe_reg_read(stmpe, stmpe->regs[STMPE_IDX_GPMR_CSB]);
208+
if (ret < 0) {
209+
dev_err(stmpe->dev, "Failed to read GPMR_CSB: %d\n", ret);
210+
goto err;
211+
}
204212
}
205213

206214
for (i = 0; i < CACHE_NR_REGS; i++) {
@@ -222,6 +230,7 @@ static void stmpe_gpio_irq_sync_unlock(struct irq_data *d)
222230
}
223231
}
224232

233+
err:
225234
mutex_unlock(&stmpe_gpio->irq_lock);
226235
}
227236

0 commit comments

Comments
 (0)