mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 01:32:21 +02:00
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:
parent
87ee329b0a
commit
f5f40b8281
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user