mfd: tps65910: Add error handling for dummy I2C transfer in probe

In tps65910_i2c_probe(), a dummy I2C transfer is performed to work
around silicon erratum SWCZ010. However, the return value of
i2c_master_send() is not checked.

If this dummy transfer fails, the driver continues execution without
detecting the error. This may lead to subsequent I2C operations also
failing, but the driver would incorrectly report success.

Add proper return value checking for the dummy I2C transfer. If the
transfer fails, log the error and return an appropriate error code
to the caller.

Signed-off-by: Wenyuan Li <2063309626@qq.com>
Link: https://patch.msgid.link/tencent_01102156392EC89EDF2CA22A7C8B4ABB2509@qq.com
Signed-off-by: Lee Jones <lee@kernel.org>
This commit is contained in:
Wenyuan Li 2026-04-01 13:09:31 +08:00 committed by Lee Jones
parent 87ee329b0a
commit f5f40b8281

View File

@ -21,6 +21,9 @@
#include <linux/of.h>
#include <linux/property.h>
/* Dummy I2C transfer length for SWCZ010 workaround */
#define TPS65910_DUMMY_XFER_LEN 1
static const struct resource rtc_resources[] = {
{
.start = TPS65910_IRQ_RTC_ALARM,
@ -472,7 +475,18 @@ static int tps65910_i2c_probe(struct i2c_client *i2c)
* first I2C transfer. So issue a dummy transfer before the first
* real transfer.
*/
i2c_master_send(i2c, "", 1);
ret = i2c_master_send(i2c, "", TPS65910_DUMMY_XFER_LEN);
if (ret != TPS65910_DUMMY_XFER_LEN) {
int err;
if (ret < 0)
err = ret;
else
err = -EIO;
return dev_err_probe(&i2c->dev, err, "dummy transfer failed\n");
}
tps65910->regmap = devm_regmap_init_i2c(i2c, &tps65910_regmap_config);
if (IS_ERR(tps65910->regmap)) {
ret = PTR_ERR(tps65910->regmap);